GNU autotools
GNU autotools je sada programů (aclocal, autoheader, autoconf, automake a další) pro generování skriptů pro překlad a sestavení GNU programů. Následující příklady v žádném případě nemají a nemohou nahradit dokumentaci, mají pouze posloužit pro první základní představu kde a jak začít.
Vybrané odkazy
Založení projektu
GNU projekty povinně vyžadují soubory README, NEWS, AUTHORS a ChangeLog
$ touch README NEWS AUTHORS ChangeLog
Součástí projektu jsou i instalační skripty, které v našem příkladu budeme ukládat do podadresáře config.aux
$ mkdir config.aux
Základní definice celého projektu jsou definovány v souboru configure.ac, sestavení a překlad definuje soubor (soubory) Makefile.am
configure.ac
# pozadavovan verze programu autoconf AC_PREREQ(2.61) # [projekt], [verze], [kotakt] AC_INIT([demo], [1.0], [j.pytel@nop.com]) AC_CONFIG_SRCDIR([.]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_AUX_DIR([config.aux]) AM_INIT_AUTOMAKE # priklad predavani smbolickych promennych # vystupni promenna a jeji hodnota, ktera muze # byt pouzivana napr. souborech Makefile.am a pod. AC_SUBST([PROMENNA_GNU_AUTOTOOLS], [asdfghjkl]) # definice makra v souboru config.h ([jmeno], [hodnota], [komentar]) AC_DEFINE_UNQUOTED([DEMO_CPP_MAKRO], [$PROMENNA_GNU_AUTOTOOLS], [popis makra]) # programy vyzadovane projektem AC_PROG_CXX AC_PROG_CC # obecne seznam souboru Makefile, ktere se maji vygenerovat AC_OUTPUT([Makefile])
Makefile.am
bin_PROGRAMS = demo demo_SOURCES = demo.cpp EXTRA_DIST = autogen.sh
Poslední uvedený soubor autogen.sh slouží pro vytvoření skriptu configure a byl vytvořen pouze jako pomůcka pro snazší inicializaci projektu
$ sh autogen.sh
autogen.sh
#!/bin/sh # eventually run autoreconf when it will work better # autoreconf --force --install -I config aclocal autoheader autoconf automake -a -c -f
Demo 1.0
Jako příklad použijeme program demo verze 1.0, který ukazuje, jak předat proměnné definované v souboru configure.ac do C/C++ programu.
#include <iostream> #include <string> #include "config.h" #define str(s) # s #define xstr(s) str(s) int main() { // prevod makra na c-retezec a dale na std::string std::string s = xstr(DEMO_CPP_MAKRO); std::cout << s << "\n"; }
Sestavení programu zajistí příkazy
$ ./configure $ make
Skript configure vygeneruje soubor config.h
/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* popis makra */ #define DEMO_CPP_MAKRO asdfghjkl /* Name of package */ #define PACKAGE "demo" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "j.pytel@nop.com" /* Define to the full name of this package. */ #define PACKAGE_NAME "demo" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "demo 1.0" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "demo" /* Define to the version of this package. */ #define PACKAGE_VERSION "1.0" /* Version number of package */ #define VERSION "1.0"
a soubor Makefile se standardními pravidly projektu GNU. Například vytvoření distribučního tar archivu s kontrolou všech formálních náležitostí se provede příkazem
$ make distcheck