cmake, perdu dans le concept de variables globales (et alternatives PARENT_SCOPE ou add_subdirectory)
J'ai un cmake projet dans lequel j'ai quelques modules et je suis aide à Trouver-*.cmake pour y compris l'partagé modules de l'application.
Pour ne pas prendre en compte tous les modules que j'ai ajouté, j'ai défini un genre de LIB
variables tor l'éditeur de liens:
# inside a Find-*.cmake or in the CMakeLists.txt of the modules:
set(LIB ${LIB} ...)
donc dans l'une des finales des applications qui utilise des modules que je peux le faire:
target_link_libraries(${APP_NAME} ${LIB})
Alors, j'aimerais avoir les modules compilés dans le /project_path/modules/foo/build
de sorte que si un module est vraiment gros pour compiler, il peut être établi une fois pour toutes les applications qui l'utilisent. La façon dont je suis atteinte de cette est de charger le CMakeLists.txt du module à partir de la Trouver-*.cmake de cette façon:
# Inside FindFoo.cmake, for loading /project_path/modules/foo/CMakeLists.txt
# and compile it in /project_path/modules/foo/build
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../modules/${PACKAGE_NAME}
${CMAKE_CURRENT_LIST_DIR}/../modules/${PACKAGE_NAME}/build
)
include_directories(${CMAKE_CURRENT_LIST_DIR}/../modules/${PACKAGE_NAME}/include)
Mais il arrivait parfois que certains module d'exiger d'un autre modules, de sorte que le add_subdirectory
crée de nouvelles étendues et peuvent charger correctement LIB
mais ne peut pas l'écrire (quand j'utilise set
c'est dans le plus profond de la portée et de ne pas les modifications de la partie supérieure de la portée). Pour contourner cela, je dois ajouter PARENT_SCOPE dans le set
).. j'ai Donc essayé de l'ajouter dans certains module qui je pense pourrait être imbriquées et cachés dans des dépendances, mais la compilation de toutes les application que j'ai tout à coup:
CMake Warning (dev) at /path_to_repo/cmake/FindFooX.cmake:6 (set):
Cannot set "LIB": current scope has no parent.
Call Stack (most recent call first):
CMakeLists.txt:14 (find_package)
This warning is for project developers. Use -Wno-dev to suppress it.
Je crains que cela peut changer d'une application à une autre à l'égard de laquelle le module j'ai besoin ou dans le respect de l'arbre avec des dépendances dans les modules de lui-même donc je suis à la recherche d'une solution plus propre.
source d'informationauteur nkint
Vous devez vous connecter pour publier un commentaire.
Toutes les variables CMake locales par défaut. Alors que vous pouvez utiliser le
PARENT_SCOPE
paramètre pour augmenter la portée d'une variable locale en une seule couche, que la plupart de sens que pour les valeurs de retour de fonctions.Pour trouver des scripts d'autre part, vous voulez généralement le comportement d'une variable globale: une Fois trouver le script est appelé par quelqu'un, vous voulez que les résultats soient disponibles partout. En particulier, un deuxième appel à même de trouver le script doit réutiliser les résultats du premier appel.
Dans CMake ceci est réalisé par le stockage des variables pour le cache. Les différents
find_*
appelle déjà le faire automatiquement, donc vous devriez préférer l'utilisation de ces le cas échéant. Pour toutes les autres variables personnalisées,set
offre la possibilité de stocker dans le cache ainsi:Noter que les variables locales peuvent masquer la mise en cache des variables de même nom dans leur champ d'application.
Vous pouvez le simuler une variable GLOBALE comportement, en utilisant les propriétés de portée MONDIALE :
Ensuite, vous pouvez extraire votre propriété globale en utilisant
Puis, MyLocalVariable contient "MyGlobalPropertyValue".
Parce que PARENT_SCOPE s'étend des définitions de variables pour le seul répertoire parent (et non pas à ses parents), il y a des cas il ne suffit pas, par exemple, si vous avez une source profonde de l'arbre...