2010-07-09 6 views
16

Frage: Kann CMake Build-Skripte generieren, die CMake in keiner Weise verwenden? Wenn nicht, wie schwer ist es, ein von CMake erstelltes Automake-Skript auszugeben, um keine Prüfungen gegen CMake durchzuführen?Kann CMake Build-Skripte generieren, die CMake * nicht * verwenden?

Ich bin ein großer Fan von CMake bis zu dem Punkt, wo ich die Idee, dass wir in meiner aktuellen Arbeitsumgebung darauf einsteigen, verfechten. Eine Sache, die diesen Übergang von unserem aktuellen Build-System zu CMake erleichtern könnte, wäre, wenn ich zeigen könnte, dass CMake Automake-Dateien erzeugen kann, die selbst keine CMake benötigen.

Natürlich würde ich dies nie für den täglichen Gebrauch tun wollen, aber die Fähigkeit zu haben, einfach einen Zweig unseres Codes zu erstellen, der aus der Quelle ohne Notwendigkeit gebaut werden kann, würde einen langen Weg in mir helfen, meine zu machen Fall.

+0

Ich finde es seltsam, dass die Antworten hier "Nein" sind. Ich komme gerade auf den Punkt mit CMake, dass ich anfange zu verstehen, wie man es benutzt (anstatt es zu etwas zu zwingen, für das es nicht bestimmt ist), wie das Verwenden von Out-of-Source-Builds usw. Aber ich Wissen Sie, dass cmake mit cpack gebündelt ist, das unter Linux und ähnlichen Tarballs generieren kann. Wenn ein Tarball CMake zum Bauen benötigt, bin ich nicht überzeugt, dass es ein Tarball ist. – Steve314

+0

Ich werde CPack genauer betrachten;) – Voltaire

+3

Die von CPack generierten Tarballs sind in der Regel keine Quell-Tarballs zum Erstellen, sondern binäre Tarballs zum Ausführen des Systems. – JesperE

Antwort

5

Nein, CMake kann dies nicht tun. Es macht auch keinen Sinn, denn ohne CMake-Unterstützung zur Build-Zeit gäbe es keine Möglichkeit, die Makefiles/Projekt-Dateien selbst zu überprüfen oder zu aktualisieren, wenn sich die CMakeLists.txt-Dateien geändert haben. Wenn Sie von Visual Studio zu CMake wechseln, sollten Sie einen Blick auf vcproj2cmake werfen.

+1

Das ist eigentlich eine "gewünschte" Konsequenz - ich bin daran interessiert, eine Auto-Tools "bereit zu verteilen" Art von Build, wo make verwendet werden könnte, um das Projekt ohne cmake Abhängigkeiten jeglicher Art zu bauen - zu diesem Zeitpunkt ist es in Ordnung wenn Änderungen nicht in CMake reflektiert werden. – Voltaire

+5

Das ist ein Anwendungsfall, den CMake nicht anspricht. – JesperE

2

Als jemand, der ein großes komplexes Stück Software genommen hat und vor kurzem sein bestehendes Build-System herausgezogen hat und ein neues Build-System an seiner Stelle installiert hat. Ich kann Ihnen sagen, dass es nicht einfach ist, aber ich möchte definitiv keine Shell-Skripte als Teil meines Build-Prozesses, wenn sie vermieden werden können. Mehr und mehr Systeme werden sich sowieso mit CMake auf ihnen befinden, da mehr große Namenssoftware-Pakete wie LLVM und KDE damit beginnen - Dies ist ein Bereich, in dem große Projekte wirklich akzeptiert werden.

Eines der schönen Dinge an CMake ist, dass es Dinge schneller baut. Der Rückgriff auf Shell-Instanzen zum Interpretieren eines Skripts verlangsamt den Build-Prozess.

3

CMake generierte Dateien sind abhängig von cmake für verschiedene Befehle wie create/remove/etc ... nicht nur um die Makefiles bei einer Änderung zu regenerieren, daher wird das Entfernen von cmake nicht funktionieren.

+2

+1 CMake kann auch als Skriptsprache verwendet werden (siehe Option "-P" in der CMake-Manpage), und viele Projekte verwenden CMake als Ersatz für Shell-Skripte, zum Kopieren von Dateien oder zum Aufruf von Hilfsprogrammen. Diese Projekte benötigen CMake zur Build-Zeit, nicht nur zum Generieren des Makefiles. – sleske

-1

Was ist mit der "atomaren Lösung"?

EX- automatisch generiert eine "QT moc" Datei aus CMakeLists.txt, dann Projekt erstellen, das

auf der CPP-Datei hängt
# inside project level CMakeLists.txt 
# run shell script to create the "moc_GUICreator.cpp" auto-generated source file 
if(UNIX) 
execute_process(COMMAND "sh" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_moc.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts) 
endif(UNIX) 

Wo die .sh-Datei enthält erzeugt wird:

# generate_moc.sh 
echo "generating moc file: moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp " 
moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp 

Equivalent Windows-Batch-Datei "moc_creator_win.bat":

moc "GUICreator.h" -o "moc_GUICreator.cpp" 

nicht diesen l versucht haben, ast Bit in den Fenstern, aber es oder etwas ganz in der Nähe arbeiten soll, kurz nach dem if (UNIX) Block in CMakeLists.txt:

if(WIN32) 
execute_process(COMMAND "cmd" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/moc_creator_win.bat WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts) 
endif(WIN32) 

Also, im Grunde, wenn Sie klug sind, können Sie tun, was Sie von einem wollen Skript und benutze CMake-Variablen als Argument dafür, ich bin mir nicht sicher, ob du mehr verlangen kannst ...

der Punkt ist, ‚nicht-portable Build-Typen‘ zu vermeiden, es sei denn Du es wirklich zu einem spezialisierten Compiler müssen hacken, oder fühlt sich nicht wie QT Designer mit den

+0

Ich bin mir nicht sicher, ob dies für die ursprüngliche Frage relevant ist. –

+0

Der Punkt, an dem Sie CMake wie vorgesehen verwenden können, oder am entgegengesetzten Ende des Spektrums, wickeln Sie es einfach um beliebige Skripte herum. Es gibt nichts, was Sie davon abhält, die CMake-Variablen zu analysieren und die von Ihnen gewünschten Makefiles zu erzeugen ... –

4

Die Fähigkeit ;-) Widgets zu platzieren Um dies zu tun hängt es von Ihrem Betriebssystem ab, ich nehme Unix/Makefile oder Winderz/MSVC an. Wenn Sie MSVC verwenden, sollte die cmake-Abhängigkeit beseitigt werden, indem Sie die Option CMAKE_SUPPRESS_REGENERATION am Anfang Ihres cmake-Skripts deklarieren.

SET(CMAKE_SUPPRESS_REGENERATION TRUE) 

Auf Unix-basierten Systemen, jedoch sind die Makefiles tied explizit auf die cmake Dateien erstellen (CMakeFiles, etc). Ich vermute, dass diese Abhängigkeit durch das strategische Auskommentieren von Makefile-Direktiven umgangen werden könnte, obwohl ich nicht sagen kann, was sie sein könnten.