web-dev-qa-db-fra.com

Remplacement d'une valeur d'option par défaut (...) dans CMake à partir d'un CMakeLists.txt parent

J'essaie d'inclure plusieurs bibliothèques tierces dans mon arbre source avec des modifications minimes de leur système de construction pour faciliter la mise à niveau. Ils utilisent tous CMake, comme moi, donc dans mon propre fichier CMakeLists.txt, je peux utiliser add_subdirectory(extern/foo) pour libfoo.

Mais le foo CMakeLists.txt compile un test harnais, construit la documentation, une bibliothèque partagée dont je n’ai pas besoin, et ainsi de suite. Les auteurs de libfoo ont eu la prévoyance de contrôler ces options via - option(FOO_BUILD_SHARED "Build libfoo shared library" ON) par exemple - ce qui signifie que je peux les définir via la ligne de commande CMake. Mais je voudrais le rendre par défaut et autorisable via la ligne de commande.

J'ai essayé de faire set(FOO_BUILD_SHARED OFF) avant add_subdirectory(extern/foo). Cela a pour effet de ne pas essayer de créer la bibliothèque partagée lors de la deuxième tentative de construction et des tentatives de construction suivantes, mais pas lors de la première, qui est celle dont j'ai vraiment besoin pour accélérer.

Est-ce possible ou dois-je conserver le fichier CMakeLists.txt avec fourche pour ces projets?

52
user79758

Essayez de définir la variable dans le CACHE

SET(FOO_BUILD_SHARED OFF CACHE BOOL "Build libfoo shared library")

Remarque: vous devez spécifier le type de variable et une description pour que CMake sache comment afficher cette entrée dans l'interface graphique.

65
pkit

Cette question est plutôt ancienne mais Google m'a amené ici.

Le problème avec SET(<variable name> <value> CACHE BOOL "" FORCE) est qu’il définira l’option tout au long du projet. Si vous souhaitez utiliser un sous-projet, qui est une bibliothèque, et que vous souhaitez définir BUILD_STATIC_LIBS pour le sous-projet (ParentLibrary) à l'aide de SET(... CACHE BOOL "" FORCE), la valeur de tous les projets sera définie.

J'utilise la structure de projet suivante:

|CMakeLists.txt (root)
|- dependencies
   | CMakeLists.txt (dependencies)
   |- ParentLibrary
      | CMakeLists.txt (parent)
|- lib
   | CMakeLists.txt (lib)

Maintenant, j'ai CMakeLists.txt (dependencies) qui ressemble à ceci:

# Copy the option you want to change from ParentLibrary here
option (BUILD_SHARED_LIBS "Build shared libraries" ON)
set(BUILD_SHARED_LIBS OFF)
add_subdirectory(ParentLibrary)

L’avantage est que je n’ai pas à modifier ParentLibrary et que je ne peux définir l’option que pour ce projet.

Il est nécessaire de copier explicitement la commande option à partir de ParentLibrary, sinon, lors de l’exécution de la configuration de CMake, la valeur de la variable serait d’abord définie par la commande set, puis remplacée par la commande option car elle cache. Lors de la deuxième exécution de la configuration de CMake, la commande option serait ignorée car le cache contient déjà une valeur et la valeur de la commande set était utilisée. Cela entraînerait un comportement étrange en ce sens que la configuration entre deux exécutions de CMake serait différente.

0
Martin Stolpe