2012-04-04 16 views
12

Digamos que hay siguiente estructura de directorios:cmake: añadir la dependencia no en el subdirectorio

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

prueba contiene CMakeFiles.txt y TestLib también contiene CMakeFiles.txt. "prueba" produce ejecutable y "testlib" produce biblioteca estática.

Quiero que "prueba" se vincule con "testlib" sin usar enlaces simbólicos y sin mover la biblioteca "testlib" dentro del subdirectorio dentro de "prueba".

Porque "TestLib" no es un subdirectorio de "prueba", no puedo hacer

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

En CMakeFiles.txt de prueba - cmake se quejará de "TestLib" no estar en el subdirectorio "prueba" .

Además, como el sistema tiene varios compiladores diferentes, no puedo simplemente instalar bibliotecas "testlib" en algún tipo de directorio central, así que quiero que compile copia local de testlib y enlace (es decir, como si testlib fuera un subdirectorio). También quiero que el proyecto de "prueba" reconstruya automáticamente "testlib" si se ha cambiado.

Entonces, ¿cómo puedo manejarlo? cmake 2.8.4, winxp sp3.

Respuesta

14

Puede proporcionar un CMakeLists.txt de nivel superior en root, o proporcionar un directorio binario al comando add_subdirectory; p.ej.

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

Esto crea un subdirectorio llamado testlib_build en su directorio actual de construcción que contiene los archivos de proyectos generados por TestLib, pero no la fuente.

Para más información, ejecute

cmake --help-command ADD_SUBDIRECTORY 
+0

Gracias - eso es exactamente lo que necesitaba. – SigTerm

+0

@Fraser - ¿Es posible especificar el directorio binario en el archivo CakeFile de testlib_build? – tower120

+0

@ tower120 - No, necesitaría especificarlo en la llamada 'add_subdirectory'. – Fraser

10

La única manera que veo para hacer esto - crear CMakeLists.txt en la raíz y poner allí siguiente código:

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

Cuando hecho esto, se puede hacer target_link_libraries(test testlib) en test/CMakeLists.txt y será automáticamente reconstruido si cambias algo en testlib.

Cuestiones relacionadas