comment définir les chemins d'inclusion avec les autotools

Je suis en train de travailler sur un projet C++ qui utilise autoconf & automake, et j'ai du mal à configurer correctement les chemins à inclure dans *CPPFLAGS. J'ai lu environ 3 heures de documents, et je ne peux pas le comprendre encore. Je ne suis pas à la recherche d'un hack, mais pour la manière correcte de le faire. Voici mon énigme.

Comme je le vois, il y a 3 complètement différentes sources pour les chemins d'inclusion:

  1. Bibliothèques externes qui doivent être installés le long de mon colis, qui sont configurés par configure --with-XXX=<PATH>.
  2. À l'intérieur de mon colis, certains fichiers source utiliser #include <file.h> même lorsque file.h fait partie de l'emballage, de sorte à les compiler, je dois définir le chemin de l'correctement. (Remarque, ce n'est pas une option permettant de modifier l'ensemble de ces fichiers).
  3. Lunatique (ou pas) des normes de spécifier l'utilisateur doit être autorisé à spécifier leurs propres (en supplément) comprennent des chemins. C'est, je ne dois pas être la mise en CPPFLAGS à tous.

Dans ma configuration actuelle:

  • De Type 1, les chemins d'accès sont définies à l'intérieur de configure.ac par AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>").
  • De Type 2 chemins d'accès sont définis à l'intérieur Makefile.am par test_CPPFLAGS = -I<path>.
  • De Type 3 ne peut pas être définie. Plus exactement, si l'utilisateur définit CPPFLAGS avant d'exécuter make, il remplace de Type 1 paramètres, provoquant la compilation échoue. Bien sûr, l'utilisateur pourrait essayer d'utiliser CXXFLAGS à la place, mais que l'on a une utilisation différente (rappelez-vous, je vous demande la bonne façon de le faire, pas un hack).

J'ai essayé de résoudre ce par Type de paramètre 1 chemins à l'aide de AM_CPPFLAGS à l'intérieur de configure.ac. (Pour référence: si vous définissez AM_CPPFLAGS au lieu de CPPFLAGS, mais vous avez encore besoin d'un tel contrôle AC_CHECK_HEADERS, vous avez besoin de mettre temporairement de CPPFLAGS et revenir ensuite pour les vérifications de travail, ce qui est expliqué ici.) Cela libère de la CPPFLAGS de Type 3 chemins, mais malheureusement, la compilation échoue parce que le Makefile-s qui est produite par configure utilisera uniquement AM_CPPFLAGS si non spécialisés <target>_CPPFLAGS existe. Donc, si test_CPPFLAGS existe avec un Type 2 chemin de la compilation test échoue, car il n'a pas obtenir le Type 1 chemin.

Un correctif serait de spécifier à l'intérieur de Makefile.am de toujours utiliser AM_CPPFLAGS. Mais est-ce "par le livre"? Puis-je faire cela de manière globale, ou dois-je modifier chaque target_CPPFLAGS? Est-il une autre solution "correcte"?

Par "lunatique", incluez-vous les officiel autoconf documentation qui indique clairement que CPPFLAGS est une variable utilisateur ne doit pas être modifié par le responsable? (Voir la section 4.8.1 gnu.org/software/autoconf/manual/autoconf.html)
Bien que moins ambigu exemple de l'officiel automake de la documentation ne peut être plus clair, qui stipule que "Vous ne devriez jamais redéfinir une variable utilisateur comme CPPFLAGS dans le Makefile.suis.", à l'article 27.6 gnu.org/software/automake/manual/html_node/...

OriginalL'auteur Matei David | 2013-11-27