it-swarm.com.de

Fügen Sie einem cmake-Projekt Quelle in einem Unterverzeichnis hinzu

Ich habe ein Projekt, das nicht in Bibliotheken unterteilt ist, aber die Quelle ist in einem Verzeichnisbaum organisiert. Ich weiß nicht, wie ich cmake sagen soll, dass er ein Verzeichnis heruntergehen soll, und füge dann die Quelle in diesem Verzeichnis zu dem Projekt hinzu, das im übergeordneten Verzeichnis definiert ist. Ich habe folgendes versucht:

in project/source/CMakelists.txt:

set(SOURCE
    ${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp
  )
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1")
add_executable(UnitTestRNG ${SOURCE} ${HEADERS})

dann in Projekt/Quelle/Ordner1/CMakeLists.txt:

set(SOURCE
   ${SOURCE}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
)
set(HEADERS
   ${HEADERS}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
)

mit einigen message () -Anweisungen habe ich herausgefunden, dass der untergeordnete Ordner den Inhalt der SOURCE-Variablen erhält, aber seine neue Zuweisung zu dieser Variablen bleibt bei der Rückkehr zur übergeordneten CMakeLists.txt nicht bestehen

Die Suche nach Beispielen und im cmake-Tutorial hat mich zu der Schlussfolgerung geführt, dass: - Quelldateistrukturen sind normalerweise innerhalb eines Projekts flach - Wenn Code in Ordner unterteilt ist, wird er normalerweise in entsprechende Bibliotheken unterteilt.

Ich frage mich, ob es einige "Best Practices" gibt, von denen ich abweiche, indem ich diese Struktur versuche.

45
2NinerRomeo

Wie der zweite Teil der Antwort von arrowdodger sagt: in Projekt/Quelle/Ordner1/CMakeLists.txt:

set(SOURCE
   ${SOURCE}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
   PARENT_SCOPE
)
set(HEADERS
   ${HEADERS}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
   PARENT_SCOPE
)
34

Können Sie dann nicht einfach alle Ihre Quellen in project/source/CMakelists.txt festlegen?

Was Sie brauchen, ist PARENT_SCOPE oder CACHE für den set-Befehl .

4
arrowd

Seit CMake 3.1 gibt es eine neue Möglichkeit, Quellen aus Unterverzeichnissen hinzuzufügen: target_sources

Angenommen, Sie haben root_dir und root_dir/sub_dir und Quelldateien in beiden. Mit target_sources können Sie Folgendes tun:

Definieren Sie in root_dir/CMakeLists.txt das Ziel

add_library(some_target main.cpp)
add_subdirectory(sub_dir)

Fügen Sie in root_dir/sub_dir/CMakeLists.txt Quellen hinzu:

target_sources(some_target PRIVATE more_cool_stuff.cpp)

some_target enthält jetzt beide Quelldateien.

Es ist auch möglich, andere Befehle in root_dir/sub_dir/CMakeLists.txt mit some_target zu verwenden, zum Beispiel target_compile_definitions, was sehr praktisch ist.

Ich habe etwas über target_sources hier erfahren, schau es dir an, wenn du mehr Erklärungen und Beispiele willst

1
ooak