Sto lavorando a un progetto C++ che utilizza autoconf
& automake
e non riesco a impostare correttamente i percorsi di inclusione in *CPPFLAGS
. Ho letto circa 3 ore di documenti e non riesco ancora a capirlo. Non sto cercando un trucco, ma per il modo corretto di farlo. Ecco il mio enigma.come impostare i percorsi con gli autotools
come la vedo io, ci sono 3 fonti completamente diverse per percorsi di inclusione:
- librerie esterne che devono essere installati insieme con il mio pacchetto, che sono configurati per
configure --with-XXX=<PATH>
. - All'interno del mio pacchetto, alcuni file di origine usano
#include <file.h>
anche quandofile.h
fa parte del pacchetto, quindi per compilarli, devo impostare correttamente il percorso di inclusione. (Nota, non è un'opzione per modificare tutti questi file.) - Gli stravaganti standard (o non) specificano che l'utente deve essere autorizzato a specificare i propri percorsi di inclusione (extra). Cioè, non dovrei impostare
CPPFLAGS
affatto.
Nella mia configurazione attuale:
- tipo 1 percorsi sono impostati all'interno
configure.ac
daAC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
. - I percorsi di tipo 2 sono impostati all'interno di
Makefile.am
entro iltest_CPPFLAGS = -I<path>
. - Il tipo 3 non può essere impostato. Più esattamente, se l'utente imposta
CPPFLAGS
prima di eseguiremake
, sostituisce le impostazioni di Tipo 1, causando il fallimento della compilazione. Ovviamente, l'utente potrebbe provare a utilizzareCXXFLAGS
invece, ma quello ha un uso diverso (ricorda, sto chiedendo il modo corretto di farlo, non un trucco).
Ho provato a risolvere questo problema impostando i percorsi di tipo 1 utilizzando AM_CPPFLAGS
all'interno di configure.ac
. (Per riferimento: se si imposta CPPFLAGS
invece di CPPFLAGS
, ma è necessario eseguire alcuni controlli, ad esempio AC_CHECK_HEADERS
, è necessario impostare temporaneamente CPPFLAGS
e quindi ripristinarlo affinché gli assegni funzionino, questo è spiegato here.) Questo libera CPPFLAGS
per i percorsi di tipo 3, ma sfortunatamente la compilazione fallisce perché il Makefile
-s che viene prodotto da configure
utilizza solo AM_CPPFLAGS
se non esiste uno special <target>_CPPFLAGS
specializzato. Quindi, se test_CPPFLAGS
esiste con un percorso di tipo 2, la compilazione di test
avrà esito negativo perché non ottiene il percorso di tipo 1.
Una correzione sarebbe specificare all'interno di Makefile.am
per utilizzare sempre AM_CPPFLAGS
. Ma è questo "dal libro"? Posso farlo in modo globale o devo modificare ogni singolo target_CPPFLAGS
? Esiste un'altra soluzione "corretta"?
Con "capriccioso", si include la documentazione ufficiale di autoconf che indica chiaramente che CPPFLAGS è una variabile utente non dovrebbe essere modificata dal manutentore? (Vedere la sezione 4.8.1 a http://www.gnu.org/software/autoconf/manual/autoconf.html) –
Anche se un esempio meno ambiguo dalla documentazione di automake ufficiale può essere più chiaro, che afferma "Non si dovrebbe mai ridefinire un variabile utente come CPPFLAGS in Makefile.am. " nella sezione 27.6 di http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html#Flag-Variables-Ordering –