Ich bin neu in CMake und ich habe ein Problem, dass ich nicht herausfinden, eine Lösung für. Ich verwende CMake, um ein Projekt mit einer Reihe von optionalen Unterverzeichnissen zu kompilieren, und es erstellt gemeinsam genutzte Bibliotheksdateien wie erwartet. Dieser Teil scheint gut zu funktionieren. Jedes dieser Unterverzeichnissen enthält eine SQL-Datei. Ich muss alle ausgewählten SQL-Dateien zu einer SQL-Header-Datei concat und installieren Sie das Ergebnis. So eine Datei wie:Mit CMake, wie kann ich concat Dateien und installieren sie
sql_header.sql
sub_dir_A.sql
sub_dir_C.sql
sub_dir_D.sql
Wenn ich das tat direkt in einer Make-Datei könnte ich so etwas wie das folgende tun nur intelligenter zu behandeln nur die ausgewählten Unter dirs:
cat sql_header.sql > "${INSTALL_PATH}/somefile.sql"
cat sub_dir_A.sql >> "${INSTALL_PATH}/somefile.sql"
cat sub_dir_C.sql >> "${INSTALL_PATH}/somefile.sql"
cat sub_dir_D.sql >> "${INSTALL_PATH}/somefile.sql"
Ich habe sort von heraus Stücke dieser, wie ich verwenden kann:
LIST(APPEND PACKAGE_SQL_FILES "some_file.sql")
, die ich nehme an, ich in jedem der Unter dirs CMakeLists.txt Dateien platzieren können die Dateinamen zu sammeln. Und ich kann einen Makro wie erstellen:
CAT(IN "${PACKAGE_SQL_FILES}" OUT "${INSTALL_PATH}/somefile.sql")
Aber ich bin verloren, wenn der zwischen CMake zunächst läuft und wenn es aus dem make install läuft. Vielleicht gibt es einen besseren Weg, dies zu tun. Ich brauche das für Windows und Linux.
Ich wäre mit einigen Hinweisen glücklich, um mich in die richtige Richtung zu zeigen.
Schöne Verwendung von configure_file ... ;-) – DLRdave
Danke, das war sehr hilfreich.Es ist schwierig, die Ergebnisse aufblühen zu lassen, wenn Sie mehrere Verzeichnisse in mehreren Tiefen haben, aber ich habe es mit Ihren sehr hilfreichen Vorschlägen zum Laufen gebracht. Vielen Dank! –
Ich habe es versucht, und es hat funktioniert ... es sei denn, die Datei hat Semikolons, an welcher Stelle es fehlschlägt, weil die Semikolons stillgelegt werden. Dies ist eine normale Folge von Semikola als Listentrennzeichen in cmake. Der einfachste Testfall, der das Problem zeigt, ist 'set (INHALT "a; b; c \ n") Datei (WRITE out.txt $ {CONTENTS}) 'Die Lösung besteht darin, Inhalte beim Schreiben anzugeben, z. '" $ {INHALT} "' –