2016-04-15 3 views
3

J'essaye de migrer un système de construction boost-build pour cmake.CMAKE: ajouter automatiquement les dépendances des dépendances

L'une des fonctionnalités de boost-build est de relier automatiquement les dépendances des dépendances.

Par exemple:

boost-build:

Je construis un exécutable app. Cela dépend de lib2

exe app 
: [ glob *.cpp ] 
    /proj/lib2//lib2 
; 

À son tour, lib2 dépend lib1

lib lib2 
: [ glob *.cpp ] 
    /proj/lib1//lib1 
; 

et lib1 n'a pas de dépendances

lib lib1 
: [ glob *.cpp ] 
; 

Les deux lib1 et lib2 sont statiques libs.

boost-build ajoutera automatiquement lib1.a à la ligne de liaison pour app parce qu'il sait que lib2.a dépend de lib1.a

CMake:

Explicitement indiquant à la fois lib1 et lib2 dans les travaux de directive target_link_libraries :

lib1:

add_library(lib1 STATIC ${SOURCES}) 

lib2:

add_library(lib2 STATIC ${SOURCES}) 

app:

add_executable(app ${SOURCES}) 
target_link_libraries(app lib1 lib2) 

Comme le nombre de bibliothèques se développe cela devient lourd.

target_link_libraries(app lib1 lib2 lib3 lib4 lib5 lib6 lib7 lib8 lib9 ... libN) 

Questions:

  • Est-il possible de préciser que lib2 dépend lib1
  • Est-il possible de dire app de tirer dans lib2et tout dépend lib2?
+0

vous pouvez jeter un oeil à: http://stackoverflow.com/questions/32756195/recursive-list-of-link-libraries-in-cmake –

+1

@TomaszLewowski celui-ci est un bien meilleur: dependencies-between-libraries-cmake] (http://stackoverflow.com/questions/7970071/setting-dependencies-between-libraries-cmake) –

Répondre

3

Il est aussi simple que l'ajout target_link_libraries à lib2

lib1:

add_library(lib1 STATIC ${SOURCES}) 

lib2:

add_library(lib2 STATIC ${SOURCES}) 
target_link_libraries(lib2 lib1) 

app:

add_executable(app ${SOURCES}) 
target_link_libraries(app lib2) 
+1

Notez que cette approche vous évite également les maux de tête liés à l'ordre avec certains outils de liaison . L'éditeur de liens 'gcc' par exemple est très pointilleux à ce sujet et refusera de lier si vous ne commandez pas correctement les arguments dans une liste aplatie de bibliothèques statiques. En modélisant les dépendances de la bibliothèque comme ici, CMake est capable de comprendre tout cela pour vous. – ComicSansMS