Frage

Ich habe ein C ++ autoconf verwaltete Projekt, das ich auf FreeBSD Rechner zu kompilieren bin anzupassen. Das ursprüngliche System war Linux so machte ich eine AM_CONDITIONAL den Host Ich baue zu unterscheiden und den Code in systemspezifische Dateien zu trennen.

configure.ac

AC_CANONICAL_HOST
AM_CONDITIONAL([IS_FREEBSD],false)
case $host in
        *free*)    
            AC_DEFINE([IS_FREEBSD],[1],[FreeBSD Host])
            AM_CONDITIONAL([IS_FREEBSD],true)
            BP_ADD_LDFLAG([-L/usr/local/lib])
                ;;
esac

Makefile.am

lib_LTLIBRARIES=mylib.la
mylib_la_SOURCES=a.cpp \
                 b.cpp

if IS_FREEBSD
    mylib_la_SOURCES+=freebsd/c.cpp
else
    mylib_la_SOURCES+=linux/c.cpp
endif

Wenn ich auto laufe nicht mit dieser Art von Nachricht:

Makefile.am: object `c.lo' created by `linux/c.cpp' and `freebsd/c.cpp'

Alle Ideen, wie auto zu konfigurieren, dass diese Bedingung zu respektieren, auch in der Makefile.in proccess bauen?

I funktioniert dies, wenn die Dateien diferent Namen haben, aber es ist c ++ Code und ich versuche, die Dateinamen der gleiche wie der Klassenname zu halten.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Sie für die Objekte verlangen könnten mit

in ihren jeweiligen Unterverzeichnissen gebaut werden
AUTOMAKE_OPTIONS = subdir-objects

Andere Tipps

Eine weitere Möglichkeit, neben subdir-Objekte ist jedes Teilprojekt einige benutzerdefinierte geben pro-Projekt Fahnen bauen. Wenn Sie dies tun, ändert sich seine auto * Regeln .o Benennung der Zielname auf dem Modulnamen vorangestellt wird. Zum Beispiel dieses:

mylib_la_CXXFLAGS=$(AM_CXXFLAGS)
mylib_la_SOURCES=a.cpp b.cpp

wird in die Ausgabedateien führen mylib_la-a.o und mylib_la-b.o statt a.o und B. O. So können Sie zwei verschiedene Projekte mit dem gleichen Ausgabeverzeichnis haben, die jeweils etwa eine b.cpp-Datei, und nicht ihre Ausgaben Konflikt haben.

Beachten Sie, dass ich das tat durch die projektspezifischen CXXFLAGS auf die Werte auto Einstellung würde bereits verwenden, AM_CXXFLAGS. Automake ist nicht intelligent genug, um diesen Trick zu erkennen und die kürzeren * .o Namen verwenden. Wenn es passiert, dass Sie pro-Projektoptionen Build tun müssen, können Sie natürlich tun, dass anstelle dieses Hack.

Es gibt ein ganze Liste von auto Variablen, die, wenn festgelegt auf eine pro-ausführbare Basis, geben Sie diese gleiche Wirkung. So zum Beispiel, vielleicht ein Teilprojekt benötigt spezielle Link-Flags bereits, so dass Sie geben ihm so etwas wie:

mylib_la_LDFLAGS=-lfoo

Dies gibt Ihnen die Präfix * .o-Dateien ebenso wie der AM_CXXFLAGS Trick tat, nur jetzt Sie „legitim“ Verwendung dieser Funktion sind, anstelle von auto trickst in es zu tun.

By the way, ist es schlecht autoconf Stil zu ändern, wie Ihr Programm auf dem OS basiert ausschließlich Builds es gebaut ist ist. Gut autoconf Stil ist nur für bestimmte Plattformfunktionen zu überprüfen, nicht ganze Plattformen, weil Plattformen ändern. FreeBSD könnte eine bestimmte Art und Weise heute, aber vielleicht in der nächsten Version wird es ein Feature von Linux kopieren, die die Notwendigkeit löschen würde für Sie Ihr Programm zwei verschiedene Arten zu bauen. Oder vielleicht die Funktion, die Sie heute verwenden ist veraltet und wird in der nächsten Version gelöscht werden.

Es gibt 40 Jahre von tragbarer Weisheit Unix-Programmierung in den Autotool, Heuschrecke. Die „maybes“ Ich habe oben gegeben geschah in der Vergangenheit und wird es auf jeden Fall wieder tun. Einzelmerkmale testen, die flinksten Art und Weise mit ständig wechselnden Plattformen gerecht zu werden.

Sie können unerwarteten Boni von diesem Ansatz zu. Zum Beispiel, vielleicht Ihr Programm zwei nonportable Funktionen seiner Arbeit zu tun. Sagen Sie, dass auf FreeBSD, das sind die A- und B-Funktionen und auf Linux, sie sind die X- und Y-Funktionen; A und X sind ähnliche Mechanismen, aber mit unterschiedlichen Schnittstellen und das gleiche gilt für B und Y. Es könnte das Merkmal A kommt von den ursprünglichen BSDs sein und ist in Solaris, weil es BSD Wurzeln von SunOS in den 80er Jahren hat, und Solaris hat auch Funktion Y von IT-System-V-Basis Redesign in den frühen 90er Jahren ist. Durch das Testen für diese Funktionen könnte Ihr Programm auf Solaris laufen, auch, weil es die Eigenschaften Ihr Programm hat, nur nicht in der gleichen Kombination wie auf FreeBSD und Linux.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top