Digamos que hay siguiente estructura de directorios:dependencias de solapamiento entre las bibliotecas de CMake
projects
|
+--lib1
| |
| +-CMakeFiles.txt
|
+--lib2
| |
| +-CMakeFiles.txt
|
+--test
|
+-CMakeFiles.txt
LIB1/CMakeFiles.txt:
cmake_minimum_required(VERSION 2.0)
add_library(lib1 STATIC lib1.cpp)
LIB2/CMakeFiles.txt:
cmake_minimum_required(VERSION 2.0)
add_subdirectory(../lib1 ${CMAKE_CURRENT_BINARY_DIR}/lib1)
add_library(lib2 STATIC lib2.cpp)
target_link_libraries(lib2 lib1)
prueba /CMakeFiles.txt:
cmake_minimum_required(VERSION 2.0)
project(test)
add_subdirectory(../lib1 ${CMAKE_CURRENT_BINARY_DIR}/lib1)
add_subdirectory(../lib2 ${CMAKE_CURRENT_BINARY_DIR}/lib2)
add_executable(test main.cpp)
target_link_libraries(test lib1 lib2)
I.e. lib2
depende de lib1
y test
depende de ambos. (Sé que las bibliotecas técnicamente estáticas no "vinculan", pero eso es solo un ejemplo).
El problema es que con la configuración actual lib1 compila dos veces: la primera vez en el directorio de compilación "prueba" y una segunda vez en "test/build_directory/lib2/build_directory". Me gustaría evitar eso.
Quiero poder agregar la dependencia en lib1, lib2 o ambos (usando add_subdirectory) a cualquier proyecto que se encuentre en otro lugar. Así que mover CMakeFiles no es una opción. También quiero evitar compilar cualquier biblioteca varias veces.
¿Cómo puedo hacer eso?
cmake-2.8.4 WinXP SP3
--EDIT-- cmakelists de nivel superior no es una opción, porque yo quiero seguir directorio de nivel superior limpia y ser capaz de incluir bibliotecas de otros proyectos que puede estar ubicado en otro lugar. Debido a que es Windows, no puedo "instalar el paquete en todo el sistema". No quiero perder la capacidad de cambiar el compilador sobre la marcha. Las bibliotecas de utilidades compiladas con diferentes compiladores utilizarán diferentes bibliotecas de tiempo de ejecución de C/ABI y, como resultado, serán incompatibles.
Puede haber casos en los que pueda asignar de forma única la dependencia lib1 a lib2 o viceversa. Pero también hay casos comunes en los que tiene módulos acoplados de forma flexible que desea construir (piense en diferentes complementos) que comparten dependencias. Entonces, por ejemplo, tiene prog1 que tiene la dependencia lib1 y lib2 y tiene prog2 que tiene la dependencia lib2 y lib3. Y ahora, si quiere tener combinaciones diferentes (por ejemplo, no necesita prog2 en este caso, por lo que no lo incluye), puede ser un problema si lib2 es una dependencia de prog2 porque ya no está disponible . – user518450
user518450 tiene un punto válido; en mi caso, tengo una situación donde tanto la aplicación (llamada test en el ejemplo) como lib2 contienen código usando lib1, pero la dependencia de lib2 a lib1 es condicional, ya que depende de las características habilitadas en lib2. Entonces lib2 puede o no tener una dependencia en lib1. Huelga decir que me encantaría encontrar una solución a esto. – psyill
@psyill compruebe mi respuesta a continuación con encabezados-guardias. funciona como un encanto para este tipo de situaciones. – user518450