Hlavní navigace

Makepp: nová generace make

Václav Slavík 9. 11. 2000

V poslední době získávají stále větší a větší popularitu různé náhrady tradičního maku, které poskytují větší komfort a snazší správu makefilů. Dnes se podíváme na jeden z nich, který má důležitou vlastnost: je zpětně kompatibilní s GNU Make a používá stejnou syntaxi.

Makepp (nebo také Make++) je implementován v Perlu a poskytuje spoustu zajímavých funkcí. Mnohé z nich má společné například s Jamem, ale odlišuje se právě kompatibilitou s GNU Make. Nefunguje to sice stoprocentně, občas na problémy narazíte, ale každopádně je snazší přepsat existující makefile pro Makepp, než pro Jam :)

Podívejme se nyní na ty nejzajímavější funkce Makepp:

Automatické vyhledávání závislostí v céčkových zdrojácích.

Makepp umí prohledat C a C++ soubory a sám si najde direktivy #include a doplní si podle nich závislosti, takže už nemusíte vypisovat všechny includnuté soubory do makefilu. Nevýhodou ovšem je, že toto prohledávání je časově náročné a vyžaduje načtení celých zdrojáků (takže přes NFS bych to radši nedělal :) Dalším problémem je, že tuto funkci nemůžete nijak vypnout (nebo jsem na to nepřišel). Naštěstí lze použít následující špinavý trik ke zmatení Makepp, který si bude myslet, že dané pravidlo nevolá kompilátor C:

    %.o: %.c
        @echo Compiling $< now
        @gcc -c $< $(CFLAGS) -o $@

Osobně dávám přednost standardnímu řešení se soubory .d příslušnými danému zdrojáku, které se updatují jenom když je to nezbytně nutné.

Chytré signatury

Naprostá většina maků (vlastně všechny, které znám :) překompiluje modul, pokud je zdrojový soubor novější než z něj vytvořený objektový. Takže stačí přidat jednu jedinou mezeru nebo řádek komentáře do klíčového hlavičkového souboru a už se kompiluje úplně všechno (můj oblíbený je defs.h z wxWindows, to mám pak na hodinku vystaráno :)

Makepp tenhle problém řeší velmi elegantně. Stačí přidat jedinou řádku do makefile:

    include c_compilation_md5.mk
Makepp

si potom bude u všech C/C++ zdrojáků pamatovat kontrolní součet (používá MD5), a to, pozor, z obsahu souboru po odstranění mezer (a ostatních whitespace znaků) a komentářů!

Repozitáře

Repozitáře umožňují kompilovat programy vně adresářové struktury se zdrojovým kódem. To má několik výhod: jednak se vám nebudou plést .o soubory mezi zdrojáky, jednak můžete mít například debug a release build vedle sebe a nemusíte tak všechno překompilovávat, když potřebujete vyzkoušet něco ve finální verzi. Ano, tohle umožňují třeba makefily generované pomocí automaku také, ale Makepp to umí i s neupravenými makefily. Všechno, co je potřeba, je jeden argument k Makepp:

    cd myapp
    mkdir ReleaseBuild
    mkdir DebugBuild
    cd ReleaseBuild
    makepp -R .. CFLAGS='-O2'
    cd ../DebugBuild
    makepp -R .. CFLAGS='-ggdb'

Make přes více adresářů

Tradičním řešením, když potřebujete kompilovat zdrojáky rozmístěné ve více adresářích, je rekurzivní make: make v hlavním adresáří zavolá make v podadresářích a nechá ho vytvořit např. podpůrné knihovny. Problém s tímto přístupem je v tom, že se velice těžko zachycují všechny závislosti mezi jednotlivými makefily.

Makepp přichází s lepším řešením: pokud se v makefilu odkazujete na soubor v nějakém podadresáři (který ještě ani nemusí existovat!), např. file1.o: file1.c subdir/libxxx.a, Makepp automaticky načte a zpracuje makefile v podadresáři (zde v subdir). Důležitá vlastnost je, že tento podmakefile není zpracován rekurzivně, ale načten a začleněn do hlavního makefilu, podobně jako při použití direktivy include.

Několik dalších funkcí

Nakonec už jenom stručně zmíním pár dalších vlastností Makepp:

  • Pamatuje si parametry použité při kompilaci, takže když změníte -O2 na -g, tak to pozná a vše překompiluje znovu, bez nutnosti volat makepp clean explicitně.
  • Za určitých okolností umí sám zjistit, jaké .o soubory jsou potřeba při linkování, takže není třeba používat knihovny.
  • Dokáže dobře poznat adresáře, takže ho nespletete ani používáním symlinků a střídáním absolutních a relativních cest.
  • Makepp loguje postup rozhodování o tom, co kompilovat a co ne, takže se makefily dají snadněji ladit.
  • Poskytuje $(inputs) a $(output) jako alternativu k poněkud kryptickým $ a $@ z klasického Maku.
  • Wildcardy fungují i se soubory, které ještě neexistují, ale vytvoří je nějaké pravidlo v makefilu. Můžete proto psát například
        my_program: *.o
            $(CXX) $(inputs) -o $(output)
    

Resume

Je zřejmé, že Makepp nepatří k nejrychlejším. Při kompilaci většího projektu (např. KDE 2.0) trvá počáteční fáze maku, kdy se ještě nic nedělá ale zjišťuje se, co vlastně bude třeba překompilovat, znatelně déle. To je pochopitelné: jednak se vše děje v interpretovaném Perlu, jednak se (tedy pokud jste to dovolili) počítají kontrolní součty MD5 a v céčkových zdrojácích se navíc hledají závislosti… Pro menší projekty lze Makepp rozhodně jenom doporučit, ale s nasazením na ty větší to je trošku složitější – pokud jste zvyklí na časté opakování cyklu editovat-kompilovat-vyzkoušet tak jako já, tak by vám mohl pomalý start dělat problémy.

Našli jste v článku chybu?

9. 11. 2000 9:31

Krysa (neregistrovaný)

K tem dependencim - ty neni treba rucne vypisovat, ale napr. gcc je umi vygenerovat, viz option -M ci -MM. Kdyz se na ne potom jeste pouzije vhodny ed-ovsky skript, tak je muzete vygenerovat jednou a s Makefilem pouzivat i na strojich, kde uz gcc neni.

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube