Pracuję nad projektem C++, który używa autoconf
& automake
i staram się poprawnie skonfigurować ścieżki dołączania w *CPPFLAGS
. Przeczytałem około 3 godzinnej wartości dokumentów i nie mogę tego jeszcze rozgryźć. Nie szukam hackera, ale poprawny sposób na zrobienie tego. Oto moja zagadka.sposób ustawiania ścieżek dołączania za pomocą autotools
Jak ja to widzę, są 3 zupełnie różne źródła obejmują ścieżki:
- zewnętrznych bibliotek, które muszą zostać zainstalowane wraz z moim pakiecie, które są skonfigurowane przez
configure --with-XXX=<PATH>
. - W moim pakiecie niektóre pliki źródłowe używają
#include <file.h>
, nawet jeślifile.h
jest częścią pakietu, więc aby skompilować je, muszę poprawnie ustawić ścieżkę dołączania. (Uwaga: edytowanie wszystkich tych plików nie jest możliwe.) - Klasyczne (lub nie) standardy określają, że użytkownik musi mieć możliwość określenia własnych (dodatkowych) ścieżek. To znaczy, nie powinienem w ogóle ustawiać
CPPFLAGS
.
W mojej obecnej konfiguracji:
- Type 1 ścieżki są ustawione wewnątrz
configure.ac
przezAC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
. - Ścieżki typu 2 są ustawione wewnątrz
Makefile.am
przeztest_CPPFLAGS = -I<path>
. - Nie można ustawić typu 3. Dokładniej, jeśli użytkownik ustawi
CPPFLAGS
przed uruchomieniemmake
, spowoduje to zastąpienie ustawień typu 1, powodując niepowodzenie kompilacji. Oczywiście, użytkownik może spróbować użyćCXXFLAGS
zamiast tego, ale ten ma inne zastosowanie (pamiętaj, proszę o poprawny sposób, aby to zrobić, a nie hack).
Próbowałem to naprawić, ustawiając ścieżki typu 1 za pomocą AM_CPPFLAGS
wewnątrz configure.ac
. (Dla odniesienia: jeśli ustawisz AM_CPPFLAGS
zamiast CPPFLAGS
, ale nadal musisz uruchomić pewne sprawdzenia, takie jak AC_CHECK_HEADERS
, musisz tymczasowo ustawić CPPFLAGS
, a następnie przywrócić je, aby kontrole działały, co zostało wyjaśnione here.) To zwalniaw przypadku ścieżek typu 3, ale niestety kompilacja kończy się niepowodzeniem, ponieważ Makefile
-s, która zostanie wyprodukowana przez configure
, będzie używać tylko AM_CPPFLAGS
, jeśli nie istnieje wyspecjalizowana <target>_CPPFLAGS
. Jeśli więc istnieje test_CPPFLAGS
ze ścieżką typu 2, kompilacja test
zakończy się niepowodzeniem, ponieważ nie ma ścieżki typu 1.
Poprawką byłoby określenie wewnątrz Makefile.am
, aby zawsze używać AM_CPPFLAGS
. Ale czy to "z książki"? Czy mogę to zrobić w sposób globalny, czy też muszę edytować każdy pojedynczy target_CPPFLAGS
? Czy istnieje inne "prawidłowe" rozwiązanie?
Przez "kapryśny", czy należy dołączyć oficjalną dokumentację autokonf, która wyraźnie stwierdza, że CPPFLAGS jest zmienną użytkownika nie powinna być modyfikowana przez opiekuna? (Patrz rozdział 4.8.1 na stronie http://www.gnu.org/software/autoconf/manual/autoconf.html) –
Chociaż mniej niejednoznaczny przykład z oficjalnej dokumentacji automake może być wyraźniejszy, co stwierdza: "Nigdy nie powinieneś redefiniować zmienna użytkownika, na przykład CPPFLAGS w pliku Makefile.am. " w sekcji 27.6 na http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html#Flag-Variables-Ordering –