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.mkMakepp
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.