2012-04-04 1 views
12

Można powiedzieć, że to po strukturze katalogów:CUpewnij: dodać zależność nie w podkatalogu

root 
    | 
    +--projects 
    |  | 
    |  +-test 
    |   | 
    |   +-CMakeFiles.txt 
    | 
    +--libs 
     | 
     +-testlib 
      | 
      +-CMakeFiles.txt 

Test zawiera CMakeFiles.txt i testlib zawiera również CMakeFiles.txt. "test" produkuje plik wykonywalny, a "testlib" tworzy bibliotekę statyczną.

Chcę "test" połączyć z "testlib" bez użycia dowiązań symbolicznych i bez przenoszenia biblioteki "testlib" do podkatalogu w ramach "test".

Ponieważ „testlib” nie jest podkatalog „TEST”, nie mogę zrobić

add_subdirectory("../../libs/testlib") 

w teście za CMakeFiles.txt - CUpewnij będą narzekać „testlib” nie będąc w podkatalogu „test” .

Ponadto, ponieważ system ma kilka różnych kompilatorów, nie mogę po prostu zainstalować bibliotek "testlib" w jakimś centralnym katalogu, dlatego chcę, żeby test kompilował lokalną kopię testlib i link z nią (np. Tak jakby testlib był podkatalog). Chcę również, aby projekt "testowy" automatycznie przebudował "testlib", jeśli został zmieniony.

Jak mogę sobie z tym poradzić? cmake 2.8.4, winxp sp3.

Odpowiedz

14

Możesz podać najwyższy poziom CMakeLists.txt w root lub dostarczyć binarny katalog do polecenia add_subdirectory; na przykład

add_subdirectory("../../libs/testlib" "${CMAKE_CURRENT_BINARY_DIR}/testlib_build") 

To tworzy podkatalog o nazwie testlib_build w bieżącym katalogu build który zawiera wygenerowane pliki projektu dla testlib, ale nie źródłowy.

W celu uzyskania dalszych informacji, należy uruchomić

cmake --help-command ADD_SUBDIRECTORY 
+0

Dzięki - to jest dokładnie to, co potrzebne. – SigTerm

+0

@Fraser - Czy można określić katalog binarny w CMakeFile testlib_build? – tower120

+0

@ tower120 - Nie, musisz to określić w wywołaniu 'add_subdirectory'. – Fraser

10

Jedynym sposobem, widzę, aby to zrobić - stworzyć CMakeLists.txt root i umieścić tam następujący kod:

add_subdirectory(projects/test) 
add_subdirectory(lib/testlib) 

Gdy to zrobisz, możesz zrobić target_link_libraries(test testlib) w teście/CMakeLists.txt i będzie automatycznie przebudowany, jeśli zmienisz coś w testlib.