Ein Teil des Programms unserer Forschungsgruppe verfügt über zusätzliche Funktionen, die von der Bibliothek ctemplate zur Verfügung gestellt werden. Auf unserem datierten Cluster können wir die Software aufgrund der Kompilierung nicht erstellen, daher möchte ich diese Funktionalität trennen und steuern, ob sie über ein configure
Flag wie --disable-ctemplate
enthalten ist oder nicht.Wie fügt man Konfigurationsflags in Autotools hinzu und implementiert sie?
Die in C++ geschriebene Software verwendet das Autotools-Build-System —, von dem ich nicht viel Erfahrung habe. Mein Verständnis ist, dass diese Aufgabe zu erfüllen, muß ich folgendes tun:
ein neues Flag in dem Configure-Skript hinzu, indem Sie einen neuen Eintrag in
AC_ARG_ENABLE
configure.ac
zu schaffen.Fügen Sie einige
#ifdef
(oder möglicherweise#ifndef
) Aussagen um den Code, der diectemplate
Bibliothek verwendet, und um einen beliebigen Code, der diesen Code aufruft.
Ich denke, der erste Schritt in etwa so aussehen würde:
AC_ARG_ENABLE(ctemplate,
[ --disable-ctemplate Disable HTML output],
[case "${enableval}" in
yes) ctemplate=false ;;
no) ctemplate=true ;;
*) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
esac],[ctemplate=true])
AM_CONDITIONAL(NOCTEMPLATE, test x$ctemplate = xfalse)
obwohl ich weiß nicht, ob die Logik korrekt ist, da ich dieses Beispiel aus den Beispielen angepasst haben, die --enable-FLAG
stattdessen verwendet von --disable-FLAG
.
Für den zweiten Schritt, ich werde wickeln Abschnitte in Präprozessor Flags wie
#ifndef NOCTEMPLATE
void Class::MethodUsingCtemplate(...)
{
...
}
#endif
Wäre dies richtig „verdrahten“ alles, wenn ich configure --disable-ctemplate
tat?
Wird auch sichergestellt, dass das Programm nicht in die ctemplate
Bibliothek für die Kompilierung gehen? Wenn nicht, dann ist das alles umsonst; Es ist zwingend notwendig, dass ich die Kompilierung der ctemplate
Bibliothek und abhängigen Komponenten verhindern kann.
Ich wiederhole, dass ich sowohl mit C++ als auch mit Autotools nicht vertraut bin; Ich habe einen sehr naiven ersten Ansatz zur Lösung dieses Problems gemacht. Wenn Sie Erfahrung in diesem Bereich haben, würde ich Ihre Korrekturen und Erklärungen sehr schätzen.
Ist AC_ARG_DISABLE in Standard-Autotools? Ich habe die Dokumentation dafür von Google nicht gefunden. Im Vergleich zu AC_ARG_ENABLE in der Google-Codesuche gibt es nur sehr wenige Treffer. (Vergleichen Sie http://www.google.com/codesearch?hl=de&q=AC_ARG_ENABLE+disable). – gotgenes
+1 für "Autotools kann auf den ersten Blick sehr kompliziert erscheinen" –
Einige dieser Projekte haben ein Makro, das 'AC_ARG_DISABLE' definiert. Warum sollten sie das nicht in das Standardpaket aufnehmen? – nlucaroni