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. Více viz
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