GNU autotools

Z GeoWikiCZ

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