2012-01-19 11 views
40

Mam projekt, który nie został podzielony na biblioteki, ale źródło jest zorganizowane w drzewie katalogów. Nie wiem, jak powiedzieć cmake, aby przejść do katalogu, a następnie dodać źródło w tym katalogu do projektu zdefiniowanego w katalogu nadrzędnym. Próbowałem następujące:Dodaj źródło w podkatalogu do projektu cmake

w projektu/źródła/CMakeLists.txt:

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

następnie w projekcie/źródło/folder1/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 
) 

stosując pewne wiadomości() oświadczenia, znalazłem, że folder podrzędny otrzyma zawartość zmiennej SOURCE, ale nowe przypisanie do tej zmiennej nie będzie się utrzymywać po powrocie do rodzica CMakeLists.txt

Poszukując przykładów i samouczka cmake doprowadziło mnie do wniosku, że: - Struktury plików źródłowych są zwykle płaskie w ramach projektu - Jeśli kod jest podzielony na foldery, zwykle jest on podzielony na odpowiednie biblioteki.

Zastanawiam się, czy istnieje jakaś "najlepsza praktyka", z której zbaczam, próbując tej struktury.

Odpowiedz

32

Podobnie jak druga część odpowiedzi arrowdodger mówi: w projekcie/źródło/folder1/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 
) 
+0

Dzięki za składnię! To działało ładnie. – 2NinerRomeo

+0

Czy to nadal jest zalecany sposób osiągnięcia tego w najnowszej wersji cmake? – lanoxx

4

Nie możesz po prostu ustawić wszystkich swoich źródeł w projekcie/source/CMakelists.txt, a następnie?

W każdym razie potrzebna jest opcja PARENT_SCOPE lub CACHE na set command.

+0

Część pierwsza odpowiedź jest rzeczywiście to, co robiłem w międzyczasie. – 2NinerRomeo

Powiązane problemy