Je prázdný cílový pravidlo životaschopný náhrada za .DEFAULT_GOAL v GNU Make?

hlasů
2

GNU Udělat verze 3.81 zaveden speciální proměnnou s názvem .DEFAULT_GOAL který může být použit říci Udělat jehož cílem (či cíl) by měla být postavena, pokud není cíl byl zadán na příkazovém řádku. V opačném případě Udělej prostě dělat první cíl narazí.

Zvážit:

bar: abc
        $ {MAKE_BAR_COMMANDS}

foo: xyz
        $ {MAKE_FOO_COMMANDS}

S výše hypotetického Makefile, běh makebude stavět „bar“, protože se jedná o první cíl, který Udělat setkání. Ale když přidáme .DEFAULT_GOAL, tak jako ...

.DEFAULT_GOAL: = foo # Sestavit foo ve výchozím nastavení, i když to není první.

bar: abc
        $ {MAKE_BAR_COMMANDS}

foo: xyz
        $ {MAKE_FOO_COMMANDS}

... pak Značka (verze 3.81) bude stavět „foo“, pokud narazíme jen make.

Zjistil jsem to .DEFAULT_GOAL proměnná být docela užitečné v modulární, opakovaně použitelné Makefile „rámec“, který jsem postavil. Nicméně jsem zjistil, že mnohé systémy ještě GNU Udělat 3.80 nebo starší a nemají tuto proměnnou podpořit.

Během hraní si s věcmi, všiml jsem si, že stačí jednoduše zadat prázdnou cílovou pravidlo se zdá mít stejný účinek jako .DEFAULT_GOAL, a to i na pre-3.81 verze GNU Make:

foo: # Empty cílové pravidlo

bar: abc
        $ {MAKE_BAR_COMMANDS}

foo: xyz
        $ {MAKE_FOO_COMMANDS}

Já vím, že je platné a právní přidat do pravidel a / nebo prerequesites cílové to zadáním dalších cílových pravidla tímto způsobem. Nicméně, já jsem přemýšlel, jestli dělá to může představit některé potenciálně nežádoucí vedlejší účinky, které se nevyskytují při použití .DEFAULT_GOAL.

Myslím, že jsem Dumal, proč byl .DEFAULT_GOAL zaveden, pokud můžete dosáhnout totéž s jednoduchým prázdné cílové pravidlo. To je pro mě podezření, že možná nevedou přesně stejné chování.

Takže vedení otázky dolní zní: je tam externě zjistitelný rozdíl mezi použitím .DEFAULT_GOAL proti prázdné cílové pravidlo?

Položena 10/07/2009 v 19:54
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Váš „foo: # Empty cílové pravidlo“ v rozporu s předpisy double-tlustého střeva.

Máte-li vyloučit ty out (:: pravidla), funguje pouze v případě, že je první pravidlo. Takže, pokud jste „zahrnují clear-variables.mk“ na začátku, a obecně mají složitou pavučinu hlavičkové soubory, tento „.DEFAULT_GOAL“ bude dělat to zřejmý, a zkontrolovat , že pouze 1 pravidlo může být výchozí.

Odpovězeno 21/11/2011 v 10:56
zdroj uživatelem

hlasů
2

Nemohu vám dát definitivní odpověď, ale mohu navrhnout jiné důvody pro jeho zavedení:

  1. To je na první pohled zřejmé, co .DEFAULT_GOALdělá; tedy to, co je napsáno na etiketě. Přítomnost a význam jednořádkový prázdné cíl je snadno přehlíženy, a to zejména ve větším Makefile
  2. Můžete si skutečně přečíst hodnotu $(.DEFAULT_GOAL)zadní jinde v Makefile. Testy naznačují, nezáleží na tom, jestli je to explicitně nastavena, nebo jestli je to určen výběrem první pravidlo.
Odpovězeno 10/07/2009 v 22:02
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more