Atelier empaquetage façon GNU

Author: Benjamin Cama <benoar@dolka.fr>
Date: 2016-06-14
License:CC BY-SA 3.0 ou GFDL 1.3+
ui/default/logo-actux.png

Plan

Les raisons de l'empaquetage

Les raisons de l'empaquetage façon GNU

Les désavantages de la façon GNU

Choses non abordées aujourd'hui

Les choses à réaliser avant de commencer

Attribuer une licence à notre projet

Licence publique générale GNU

Si vous utilisez la GNU GPL v3+ :

wget -O COPYING \
  http://www.gnu.org/licenses/gpl.txt

La manière de l'utiliser est à la fin du texte.

Écrire un « README »

La configuration selon le système utilisé (autoconf)

Le schéma de génération des autotools

Les fichiers générés et dépendants :

aaa2.png

http://ymettier.free.fr/articles_lmag/lmag75/images/aaa2.png

Premier jet avec autoscan

Configuration de base

Ajustez les macros :

AC_INIT([nom_de_votre_projet], [0.42],
      [moi+bug@chezmoi.fr])
AC_CONFIG_FILES([Makefile …])

Éventuellement :

AC_CONFIG_SRCDIR([où_sont_mes_sources])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([foo], [chmod +x foo])

La dernière macro générera un fichier depuis foo.in.

Génération du configure

Utilisation d'une bibliothèque à travers pkg-config

Deux macros à utiliser :

PKG_PROG_PKG_CONFIG
PKG_CHECK_MODULES([foo], [libfoo >= 1.2.3])

(d'abord pour détecter pkg-config puis pour détecter libfoo avec la version adéquate, sous le préfixe foo)

La fabrication et l'installation du programme (automake)

Les « GNU Coding Standards »

Les « GNU Coding Standards », suite

Ce qui nous intéresse pour automake :

Premier Makefile.am

Préparation d'automake

Pour initier automake, ajoutez au configure.ac

AM_INIT_AUTOMAKE

Pour plus de souplesse, vous pouvez éventuellement utiliser :

AM_INIT_AUTOMAKE([foreign])

Le schéma de nommage d'automake

Variables nommées en deux parties (séparées par un underscore) :

C.f. http://www.gnu.org/software/automake/manual/html_node/Uniform.html#Uniform

La définition d'un programme

La première partie d'une variable peut également être le nom d'un programme objet d'un autre primaire PROGRAMS, pour lequel on utilisera alors un primaire SOURCES ou LDADD par exemple :

bin_PROGRAMS = bar
bar_SOURCES = fichier_a.c fichier_b.c
bar_LDADD = -lpthread

Le schéma de nommage d'automake, suite

Passer de l'information depuis autoconf

Peaufiner la distribution

Si vous souhaitez modifier la distribution avant qu'elle soit empaquetée, vous pouvez utiliser dans le Makefile.am

dist-hook:
      touch […]

La distribution

Normalement, à ce point, vous avez tout ce qu'il faut pour faire un :

make distcheck

Si ce test passe, c'est que vous avez une distribution correcte ! Vous obtiendrez une archive (tar compressée) que vous pouvez distribuer à vos utilisateurs.

Conseils sur la distribution

Conclusion

Vous pouver maintenant normalement effectuer dans une distribution de votre programme le fameux :

./configure
make
make install

Félicitations ! Vous facilitez ainsi la vie de ceux qui veulent l'utiliser. Vous permettez également de bien identifier votre logiciel, et vous assurez la disponibilité des sources de tout ce que vous distribuez.

Ressources

Annexe : Utiliser la GPL (dans les sources)

Au début de chaque fichier source :

Copyright 2013 John Doe

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License […]

Si le copyright n'est pas personnel, on peut ajouter à la fin de l'entête :

Author(s):
    Anne O'Nymous <anne.onymous@example.com>

Annexe : Utiliser la GPL (dans le README)

Dans le README, mettre :

Foobar is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License; see COPYING for
more informations.

Et bien mettre un fichier COPYING avec la licence en entier.

Annexe : Fichier bootstrap minimal

#!/bin/sh
test -n "$srcdir" || srcdir=`dirname "$0"`
test -n "$srcdir" || srcdir=.

cd "$srcdir"
autoreconf --install --verbose

Ce fichier tient compte des constructions hors des sources (avec VPATH).

Annexe : Substituer des variables dans un Makefile

edit = sed -e 's|@datadir[@]|$(datadir)|g' \
        -e 's|@bindir[@]|$(bindir)|g' \
        -e 's|@VERSION[@]|$(VERSION)|g' \
        …

subst_in = rm -f $(1).tmp \
        srcdir='.'; \
        test -f ./$(1).in || srcdir=$(srcdir); \
        $(edit) $${srcdir}/$(1).in > $(1).tmp && \
        mv -f $(1).tmp $(1)

# example use
baz: $(srcdir)/baz.in Makefile
          $(call subst_in,$@)
          chmod +x $@
          chmod a-w $@

À propos de ce document

Ce document pourra se retrouver à l'adresse : http://dolka.fr/bazar/atelier_empaquetage_facon_GNU

Il est distribué selon les termes de la CC BY-SA 3.0 ou la GFDL 1.3+.

Les sources sont rédigées en reStructuredText et le HTML généré par rst2s5.