Takže v čem nám Automake pomůže? Na první pohled nijak. Opravdu pouze z jedné šablony (Makefile.am) generuje druhou šablonu (Makefile.in). Vtip je v tom, že šablona pro Automake je v drtivé většině případů mnohem jednodušší než šablona Makefile.in. Jde o to, že jakási struktura souborů Makefile se pokaždé nudně opakuje. Mění se jen konkrétní jména a nastavení. Proč tedy nezapsat jen to co je pokaždé jinak a zbytek ať se generuje.
Moje první myšlenka, když jsem s Automake přišel do kontaktu byla, že si to bude něco generovat a já nebudu mít kontrolu nad výsledkem. Z části je to pravda. Je to ústupek tomu, že nemusíme tolik věcí dělat ručně. Ale na druhou stranu je kdykoliv možné použít „staré“ konstrukce systému make a doplnit tak generovaný Makefile k obrazu svému. Nicméně hned na začátek mi připadá fér říct, že spousta (respektive „spousta“) lidí raději používá samotný Autoconf a šablony Makefile.in si píší sami, aby měli naprostou volnost. A je pravda, že jsou projekty natolik specifické, které vyžadují příliš odlišný make-systém od zaběhaného standardu, že se tam Automake nevyplatí používat. Teď to vypadá, jako že se mi ten článek nechce psát a tak se vám raději snažím namluvit, že Automake je k ničemu. Tak tomu ale určitě není. Jenom jsem přiznal známou pravdu, že jakýkoliv automatizovaný nástroj je v určitých případech příliš těžkopádný a neforemný. Pořád nám ale zbývá takových 99.9% projektů a 90% procent lidí, kteří by Automake rádi použili a činí tak k všestranné spokojenosti.
Uživatel
První dobrá zpráva je, že pro uživatele se nic nemění. Stále zůstává jen kombinace configure → make → make install. Na druhou stranu má ale uživatel „automaticky“ navíc a „zaručeny“ další standardní cíle. Jako příklad třeba:
dist | – pro vytvoření balíčku k distribuci |
clean | – a jeho různé varianty pro pročištění zdrojového stromu |
dist-clean | – vyčistí vše, co nepatří do distribuce |
maintainer-clean | – smaže i generované soubory, pak je třeba mít Autoconf a spol. |
Makefile | – ten slouží pro opětovné vygenerováni souborů Makefile |
tags | – pro vytvoření tagů |
check | – pro otestování balíčku (po překladu) |
info | – pro generování dokumentace info |
uninstall | – pro odinstalování balíčku |
install-strip | – před instalací provede strip |
Tyto cíle jsou vygenerovány automaticky a nemusíte je tudíž všechny dopodrobna popisovat jako v případě, kdy použijete pouze Autoconf. Uživatel má také jistotu, že bude mít tyto řekněme standardní cíle k dispozici a to jak v názvech, tak ve funkčnosti. Pokud si Makefile.in píšete sami, může se stát, že uživatel bude jen sedět a smutně koukat, když při překladu vašeho projektu zadá například make uninstall a ono nic.
Programátor
A teď co pro to musíme udělat. Úplně nejjednodušší Makefile.am může vypadat třeba takto:
## Process this file with automake to produce Makefile.in ## $Id: Makefile.am,v 0.0.0.1 2001/01/19 07:39:13 sioux Exp $ SUBDIRS = src
To je případ souboru Makefile.am z hlavního adresáře vašeho projektu za situace, kdy máte vlastní zdrojové soubory umístěny v podadresáři src. Tam potom může být něco takového:
## Process this file with automake to produce Makefile.in ## $Id: Makefile.am,v 0.0.0.1 2001/01/19 07:39:13 sioux Exp $ bin_PROGRAMS = netinfo netinfo_SOURCES = \ main.c
Tedy vytvoř program netinfo a to ze zdroje main.c. Jednoduché, že? V tomto případě za vás autoconf udělá opravdu spoustu práce, neboť vygenerované soubory Makefile.in mají v obou případech přes 400 řádek a obsahují všechny výše zmiňované standardní cíle. Doufám, že se vám to začíná líbit, tak jdeme dál.
Použití Automake se dá rozdělit na dvě oblasti. Jednak doplňuje další testy pro configure.in a hlavně zpracovává soubory .am. Nejprve ty testy. Pro použití Automaku je třeba na začátek configure.in zařadit makro pro inicializaci AM_INIT_AUTOMAKE(package, version). To inicializuje Automake a #definuje PACKAGE a VERSION dle zadaných argumentů. Potom je možné použít tato následující makra:
AM_CONFIG_HEADER |
Pokud používáte config.h.in, je třeba uvést, aby se automaticky přegenerovaly patřičné soubory pokud je to třeba. |
AM_PROG_CC_STDC |
Pokud překladač není ANSI C, nebo je v nějakém non-ANSI C módu, modifikuje proměnnou $CC. Např pro gcc může přidat parametr „–ansi“. |
AM_PROG_LIBTOOL |
Automake zapne zpracování pomocí libtool. To je nástroj pro podporu vytváření knihoven. Patří také do rodiny nástrojů GNU a možná se o něm také někdy něco dozvíte v některém z dalších dílů. |
AM_GNU_GETTEXT |
Zapne podporu pro GNU Gettext a otestuje některé vlastnosti balíku, a prostředí. Tedy přítomnost GNU Gettext v systému i v balíku. |
ALL_LINGUAS |
Tato proměnná říká, které jazykové mutace obsažené v balíku se mají instalovat. Jedná se o programy lokalizované pomocí gettext. Někdy bývá v systému nastavená proměnná prostředí $LINGUAS, pokud chce správce umožnit instalaci pouze určitých jazykových verzí programů a tím šetřit místo. V configure.in lze modifikací této proměnné ($LINGUAS) umožnit instalovat všechny požadované jazykové verze. Instaluje se tedy to co je zároveň v $LINGUAS a $ALL_LINGUAS. |
AM_PATH_GTK |
Další programy mohou při své instalaci doplnit makra pro svou detekci. Tato makra se nachází v adresáři /usr/share/aclocal nebo obdobném (/usr/local/…, atd). Konkrétním příkladem je často používané GTK+. Testuje přítomnost knihovny GTK a její požadované verze. Obdobné testy jsou dodávány s balíky imlib, gtk--, guile a dalšími. |
Pro makra Automake platí to samé, co pro Autoconf (viz. minulá část). Je možno je tedy modifikovat a upravovat, případně dotvářet makra vlastní. Vyplatí se prohlédnout si patřičné soubory u některých větších projektů a poučit se z nich.
A nyní k druhé funkci programu Automake. Jak tedy vytvářet šablony Makefile.am? Malou ukázku jste již viděli, tak teď něco složitějšího a s komentářem:
1 SUBDIRS = netd #pridej do distribuce! 2 EXTRA_DIST = Changelog TODO 3 INCLUDES = \ -I$(top_srcdir)/intl \ @GTK_CFLAGS@ # -DPROTOCOL_DEBUG #tohle bude vysledek 4 bin_PROGRAMS = netinfo 5 netinfo_SOURCES = \ main.c \ support.c support.h \ interface.c interface.h \ callbacks.c callbacks.h \ io.c 6 netinfo_LDADD = @GTK_LIBS@ $(INTLLIBS) #parametry pro linker 7 netinfo_LDFLAGS = -neco #jeste dokumentaci 8 netinfo_TEXINFOS = netinfo.texi
A co to znamená?
1. Náš projekt může samozřejmě obsahovat další a další podadresáře – třeba netd
2. Pokud existují soubory, které nejsou součástí programu (zdrojáky) nebo dokumentace, ale přesto je chcete zahrnout do výsledného balíku pro distribuci, je nutné je uvést na tomto místě.
3. Sem se píší direktivy -I ale v podstatě taky cokoliv jiného, co chcete předat překladači. Jako příklad zde mohou být také #definice -DCOKOLIV a podobně.
4. Základní makro, které říká, že se bude vytvářet standardní program s instalací do …/bin a jeho název bude netinfo. Je možno uvést najednou programů více. Kromě předpony bin existují také sbin, libexec a další. Kromě PROGRAMS je tu také LIBRARIES, LISP, SCRIPTS, HEADER, DATA. Je možné tvořit (smysluplné – ne bin_DATA) kombinace.
5. Zde vyjmenujete všechny zdrojáky, ze kterých se program skládá. Uvádějí se i hlavičkové soubory, aby se užily při generování závislostí pro překlad.
6. Podobné makro jako INCLUDE, ale pro knihovny. Sem přijdou parametry -L a také -llibname.
7. Každý přece potřebuje zadávat parametry pro linker, nebo ne?
8. Automaticky můžete generovat i dokumentaci. Jsou podporované manuálové stránky a texinfo dokumentace. Zadáte prostě zdroje a systém vygeneruje do Makefile vše, co je třeba pro jejich vytvoření a instalaci na správné místo.
No a několik slov obecně. Komentáře jsou jako v Makefile a shellu vymezeny pomocí ‚#‘. Jak vidno, informace se strkají do připravených proměnných. Kromě těchto dvou věcí lze napsat také kód pro klasický make, především jako modifikaci implicitních pravidel a podobně.
Jakmile máme k dispozici soubor(y) Makefile.am, je možné generovat zbytek. Protože Automake generuje soubory pro Autoconf spustíme ho před ním. Jako první však je třeba spustit program aclocal, který zajistí překopírování potřebných maker (testů) přidaných do systému dodatečně do souboru aclocal.m4 v kořenovém adresáři projektu.
top_srcdir/aclocal [--verbose] top_srcdir/automake [-a [-c]] [-v] [--gnu]
to znamená v hlavním adresáři projektu spustíme aclocal a poté Automake a případně dodáme další parametry s tímto významem:
-a |
Automaticky přidej chybějící soubory. Přidá do adresáře soubory nutné pro provoz, jako je skript mkinstalldirs a informační soubory INSTALL a COPYING. |
-c |
Vztahuje se k -a. Soubory kopíruje místo symbolických linků |
-v |
Klasická volba verbose. Pokud chcete vědět jaké soubory a v jakém pořadí Automake zpracovává. |
–gnu |
Touto (a dalšími podobnými) volbou lze nastavit přísnější pravidla pro vzhled balíku. Tato volba testuje balík, jestli je vytvořen podle zvyklostí GNU projektů. Konkrétně testuje přítomnost souborů INSTALL, NEWS, README, COPYING, AUTHORS v kořenovém adresáři projektu. |
Potom ještě spustíme Autoconf pro vygenerování skriptu configure a pokud používáme config.h.in můžeme si jeho základ nechat vygenerovat pomocí skriptu autoheader.
Velkou výhodou (pro většinu lidí) je, že generované Makefile.in už automaticky obsahují pravidla pro závislosti mezi soubory .am, .in a výslednými Makefile. Proto, jestliže se něco změní, stačí dát make a v případě nutnosti se spustí příslušný auto-skript a vygeneruje co jest třeba.
No a teď jen doufám, že jsem alespoň několik z vás přesvědčil, že GNU nástroje Auto(conf|make) mohou být velmi užitečné. Příště si povíme ještě něco o lokalizaci pomocí GNU Gettext a případně seriál dokončíme článkem o pomocných nástrojích ze sady GNU. Tak až budete tvořit váš další úžasný projekt, nezapomeňte na posloupnost:
autoheader aclocal automake autoconf configure
Ať se moc nenadřete a ušetřenou energii věnujte práci na vlastním projektu…