2017-12-24 8 views
0

Ich habe ein C Projekt mit folgenden Struktur mit 1 Ziel (binär Endprodukt)Flags in sub-Makefile.am

main.c 
configure.in 
configure 
Makefile.am 
Makefile.in 
folder-1 
..Makefile.am 
..Makefile.in 
..<static library files .c files> 
..<static library files .h files> 
folder-2 
<some .c files> 
<some .h files> 
... 
... 

Ich bin mir bewusst, wie mein Projekt mit Autotools konfigurieren und kompilieren. In Bezug auf meine Bibliothek von folder-1: Ich ändere häufig Dateien in dieser Bibliothek mit verschiedenen Debug-Ebenen, indem Sie ein Flag namens DMYDEBUG definieren.

Compilation Zeit für das gesamte Projekt dauert eine Weile, und jetzt, ich bin in der Lage, die die Flagge von (1) modifiying die oberste Ebene configure.in Datei zu ändern:

CCONFIGFLAGS="${CCONFIGFLAGS} -DSF_BIGENDIAN -DMYDEBUG=3" 

(2) läuft make clean (3) Regenerieren configure aus dem editierten configure.in wo i DMYDEBUG (3) Lauf ./configure auf oberster Ebene (4) Lauf make

ONL modifizieren Auf diese Weise findet der gewünschte Effekt statt. Gibt es eine bessere Möglichkeit, DMYDEBUG (die nur für die statische Bibliothek in folder-1 relevant ist) zu ändern, ohne das gesamte Projekt jedes Mal neu kompilieren zu müssen?

Antwort

0

In erster Linie ist es schrecklich, dass Sie Ihre configure.in ändern, um den Flag-Wert zu ändern. Es wäre viel besser, configure ein benutzerdefiniertes Argument erkennen zu lassen, das die Information vermittelt, wie --with-debug-level=x. Das Makro AC_ARG_WITH() erfüllt diesen Zweck.

Wenn Sie jedoch das Projekt neu konfigurieren müssen (erneut ./configure ausführen, mit oder ohne es zuerst neu zu erstellen), um das Flag zu ändern, erfordert das Ändern des Flags immer eine vollständige Neuerstellung. Für eine engere Neustrukturierung müssen Sie sich auf make verlassen, um die Flag-Modifikation zu erkennen und die betroffenen Ziele neu aufzubauen.

make erkennt nur Abhängigkeiten auf Dateiebene, so dass die Strategie darauf beruht, dass Sie die Makrodefinition in eine Headerdatei schreiben, die die Dateien, die sie verwenden, #include. Da Sie Automake verwenden, können Sie sich darauf verlassen, dass Ihr Build-System Header-Abhängigkeiten automatisch erkennt, aber Sie müssen möglicherweise einen sauberen Build ausführen, um das zu erstellen.