2012-04-04 21 views
12

Diciamo che c'è seguente struttura di directory:cmake: aggiungere dipendenza non in sottodirectory

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

test contiene CMakeFiles.txt e testlib contiene anche CMakeFiles.txt. "test" produce eseguibile e "testlib" produce una libreria statica.

Voglio "test" per il collegamento con "testlib" senza utilizzare i collegamenti simbolici e senza spostare la libreria "testlib" nella sottodirectory all'interno di "test".

Perché "testlib" non è una sottodirectory di "test", non posso fare

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

In CMakeFiles.txt di prova - CMake si lamenterà "testlib" non essere in sottodirectory "test" .

Inoltre, poiché il sistema ha diversi compilatori diversi, non posso semplicemente installare le librerie "testlib" in una sorta di directory centrale, quindi voglio test per compilare la copia locale di testlib e link con esso (cioè come se testlib fosse una sottodirectory). Voglio anche che il progetto "test" ricostruisca automaticamente "testlib" se è stato modificato.

Quindi, come posso affrontarlo? cmake 2.8.4, winxp sp3.

risposta

14

È possibile fornire un CMakeLists.txt di livello superiore in root oppure fornire una directory binaria al comando add_subdirectory; per esempio.

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

Questo crea una sottodirectory chiamata testlib_build nella directory build attuale che contiene i file di progetto generati per testlib, ma non la fonte.

Per ulteriori informazioni, eseguire

cmake --help-command ADD_SUBDIRECTORY 
+0

Grazie - questo è esattamente quello che mi serviva. – SigTerm

+0

@Fraser - È possibile specificare la directory binaria in CMakeFile di testlib_build? – tower120

+0

@ tower120 - No, dovresti specificarlo nella chiamata 'add_subdirectory'. – Fraser

10

L'unico modo che vedo per fare questo - creare CMakeLists.txt in radice e messo lì seguente codice:

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

Quando hai fatto questo, si può fare target_link_libraries(test testlib) in test/CMakeLists.txt e sarà automaticamente ricostruito se cambi qualcosa in testlib.

Problemi correlati