Откриване на неизползвани аргументи на командния ред на makefile

Заден план

Ако имам makefile с незадължителен аргумент, обикновено ще използвам:

make target

но понякога (ако мисля, че може да има проблем с оптимизациите на асемблера) искам да предам допълнителен аргумент на командния ред, напр.

make target VERIFY_ASSEMBLY_OPTIMISATIONS=1

проблем

Понякога може да има правописна грешка в аргумента на командния ред, напр.

make target VERIFY_ASSEMBLY_OPTIMIZATIONS=1

и това може да ме накара да загубя много време, тъй като е построено грешното нещо.

Въпрос

Има ли лесен начин за проверка на аргументите на командния ред на Makefile?

С други думи, искам Makefile незабавно да генерира грешка, ако е използван неразпознат аргумент на командния ред.

Това, което съм пробвал

Опитах следния код за откриване на неочаквани променливи:

ALLOWED_VARS := foo bar
$(foreach v,                                   \
  $(filter-out $(ALLOWED_VARS),$(.VARIABLES)), \
  $(info $(v) = $($(v))))

За съжаление, това изглежда открива много допълнителни променливи (като LANG, TERM, LEX), които не съм посочил в командния ред.


person Peter de Rivaz    schedule 28.05.2014    source източник
comment
Как се дефинират неразпознати аргументи на командния ред? Горното е просто дефиниране на променлива. Как ще разберете, че това не е правилната променлива?   -  person MadScientist    schedule 28.05.2014
comment
@MadScientist Много се радвам да поставя код в моя Makefile, за да кажа кои променливи са разрешени. На повечето езици мога да получа списък с аргументи на командния ред (напр. в argv) и мога да проверя всеки от тях на свой ред дали е нещо, което разрешавам, просто не знам как да направя това в Makefile.   -  person Peter de Rivaz    schedule 28.05.2014


Отговори (1)


Има недокументирана променлива, която съдържа всички присвоявания на променливи в командния ред, -*-command-variables-*- (да, това е действителното име на променливата).

Така че, ако имате този makefile:

all:
        @echo '$(-*-command-variables-*-)'

и стартирате make, той няма да отпечата нищо. Ако стартирате make FOO=bar BIZ=baz, той ще отпечата FOO=bar BIZ=baz. Това не е 100% надеждно, защото това е недокументирана променлива и е възможно някой ден да се промени, и е малко проблематично, защото цитира интервали, така че make FOO='foo bar' с горния makefile ще отпечата FOO=foo\ bar. Но вероятно е достатъчно добър.

Ако искате да е брониран, единствената опция, която мога да предложа, е преминаване през стойността $(.VARIABLES), която съдържа списък с дефинирани променливи, предаване на всяка от функциите $(origin ...) и търсене на command line като стойност. Нещо като това:

CMDVARS := $(strip $(foreach V,$(.VARIABLES),$(if $(findstring command,$(origin $V)),$V)))
person MadScientist    schedule 28.05.2014
comment
Просто съм любопитен: ако е недокументирано, как го намерихте? Или се разровихте в make source? Както и да е, много полезно. - person kebs; 29.05.2014
comment
О, не проверих уебсайта ви, изглежда, че наистина сте дълбоко въвлечени в правенето ;-) ! - person kebs; 29.05.2014
comment
@MadScientist - много полезно - уви, вашият брониран еквивалент може да бъде подобрен като $(info COMMAND_LINE_VARIABLES: $(strip $(foreach V,$(.VARIABLES),$(if $(findstring command,$(origin $V)),$ {V}=$(стойност ${V}))))) - person malcook; 20.04.2020
comment
Това е подобрение, ако потребителят иска да вижда списъка разпечатан всеки път. Това може да е така, ако се отстраняват грешки в тази променлива, но е съмнително, че е търсена след това. - person MadScientist; 20.04.2020
comment
@malcook БЛАГОДАРЯ МНОГО! почти загубих надежда да намеря отговор на въпроса си :) - person Noname; 21.01.2021