V jakém pořadí předpoklady budou GNU dělat?

hlasů
20

Za předpokladu, že máme pravidlo:

a: b c d e

a b, c, da ejsou na sobě nezávislé.

Je pořadí tvorby b, c, d, ejsou definovány? Zdá se, že obecně budou provedeny v pořadí b, c, d, e, ale to může někdy stát, že pořadí se bude lišit?

Položena 30/10/2009 v 02:00
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
21

Ne, pořadí není definován. To je celý bod pomocí deklarativní závislost orientovaného programování: že počítač může vybrat optimální zkušební řád, nebo ve skutečnosti, vyhodnocovat je dokonce ve stejnou dobu .

Odpovězeno 30/10/2009 v 03:00
zdroj uživatelem

hlasů
12

V jakém pořadí předpoklady budou GNU dělat?

Záleží na druhu předpoklad. Podle tho na GNU Make Ruční , bod 4.2:

Ve skutečnosti existují dva různé typy předpokladů rozumějí GNU make: normální předpoklady, jako je popsáno v předchozí části, a objednávkové pouze předpoklady. Normální předpoklad je dvě prohlášení: Nejprve se ukládá pořadí, ve kterém budou vyvolány recepty: Recepty pro všechny předpoklady cíle bude dokončena před spuštěním recept na cíl. Za druhé, to ukládá vztahu závislosti: pokud existuje předpoklad je novější než cíl, pak se cíl považuje za out-of-data a musí být přestavěn.

Za normálních okolností, to je přesně to, co chcete: jestli předpoklad cílového je aktualizována, pak cíl by měl být aktualizován.

Občas, nicméně, máte situaci, kdy chcete uložit konkrétní uspořádání na pravidlech, které mají být uplatňovány , aniž by nutit cíl aktualizovat, pokud je spuštěn jeden z těchto pravidel. V takovém případě, že chcete definovat pořadí pouze předpoklady. Order-only předpoklady může být zadán tím, že umístí symbol kanálu (|) na seznamu Předpoklady: žádné požadavky na levé straně symbolu trubky jsou normální; nějaké předpoklady vpravo jsou objednávky pouze:

   targets: normal-prerequisites | order-only-prerequisites

Sekce normální předpoklady mohou být samozřejmě prázdný. Také se může ještě prohlásit více řádků předpoklady pro stejný cíl: oni jsou připojeny správně (normální předpoklady jsou připojeny k seznamu běžných předpokladů, objednávky pouze předpoklady jsou připojeny na seznam objednávek pouze předpokladů). Všimněte si, že pokud deklarovat stejný soubor být jak normální a objednávky pouze předpoklad, normální podmínkou přednost (protože mají přísný nadmnožinu chování objednávky pouze předpokladem).

Vezměme si příklad, kdy jsou vaše cíle, které mají být umístěny v samostatném adresáři, a tento adresář nemusí existovat před makespustit. V takovém případě budete chtít adresář má být vytvořen dříve, než nějaké cíle jsou umístěny do něj, ale proto, že časové údaje o adresářích změnit kdykoli je přidán soubor, odstraněny, nebo byl přejmenován, my rozhodně nechceme obnovit všechny cíle, kdykoli časové razítko změny Directory. Jeden způsob, jak zvládnout to s pořadovými pouze předpokladů: aby adresář příkaz-Jedinou podmínkou u všech cílů:

OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

$(OBJDIR)/%.o : %.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<

all: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR):
    mkdir $(OBJDIR)

Nyní pravidlo k vytvoření ‚objdir‘ adresář bude spuštěn v případě potřeby před postavena jakákoliv ‚.o‘, ale ne ‚.o‘ bude vybudováno, protože ‚objdir‘ adresář timestamp změnil.

Odpovězeno 27/07/2014 v 14:36
zdroj uživatelem

hlasů
6

V pravém pořadí, na základě pravidel, které poskytujete. Pro konkrétní příklad, který by mohl znamenat jednu z několika různých (4! = 24, z paměti) objednávek.

Všechny makeprogramy jsou zdarma zvolit pořadí se jim líbí tak dlouho, dokud se závislostí ctí. Kdyby existovala jiná pravidla ve svém příkladu, řekněme c: b, pak cby bylo předtím b(ale to není tento případ, jak poukázat na to).

Potřebujete-li spoléhat na určitém pořadí, budete potřebovat další pravidla pro její prosazování. V opačném případě makemůže dělat, co se mu zlíbí. Dokumentace pro GNU Ujistěte se uvádí pouze to, jak pravidla jsou zpracovávány, nikoli pořadí, ve kterém k závislostem v rámci pravidlo jsou zpracovávány. Nejlogičtější pořadí (pro mě, tak jako tak) bude pořadí, ve kterém jsou uvedeny, ale to není zaručeno.

Odpovězeno 30/10/2009 v 02:40
zdroj uživatelem

hlasů
4

Ne, nemůžete se spolehnout na objednání, kdy nejsou k dispozici žádné závislostní vztahy.

  • aby potřeby dělat si topologické uspořádání , protože závislostí může mít další a více vztahů. Z těch, které dělají dělá, je potenciálně velmi složité, protože uzly v grafu může souviset několikrát na různých úrovních
  • Obecně třídicí algoritmy nejsou přirozeně stabilní , a to i pro jednoduché klíčové bázi druhů
Odpovězeno 30/10/2009 v 03:16
zdroj uživatelem

hlasů
4

Jistě, pokud mohu použít make -j a, by mohly všichni se stavějí zároveň (v závislosti na tom, zda b, c, dnebo enaopak mají jiné / vzájemně souvisejících závislostí).

Odpovězeno 30/10/2009 v 02:03
zdroj uživatelem

hlasů
0

Pokud pořadí záleží, můžete selektivně vynutit jej pomocí rekurzivního make . Předpokládejme například, že je vám to jedno, v jakém pořadí b a c jsou vyrobeny, tak dlouho, jak oni jsou oba vyrobeny před d a d je vyrobena před e. Pak byste mohl napsat svůj pravidlo takto:

a: b c
    $(MAKE) d
    $(MAKE) e
    # Additional steps to make a

Uvědomte si, že v závislosti na složitosti D a E, tento přístup může dělat špatné věci do sestavení časy: viz rekurzivní uvážlivě škodlivý (PDF) pro argumenty proti dělat to tímto způsobem.

Odpovězeno 02/10/2017 v 00:54
zdroj uživatelem

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