Comment utiliser CMake ExternalProject_Add ou des solutions de rechange dans une plate-forme de chemin?
Je voudrais construire une troisième partie du projet qui a déjà CMake dans le cadre de mon projet de CMake bandes. ExternalProject_Add est pour ce but, mais j'ai trouvé qu'il ne peut être fait de travailler avec un générateur, et je voulais travailler sur de nombreuses plates-formes facilement.
Par exemple voici mon projet externe ajouter un script pour zlib, qui dispose de sa propre CMakeLists.txt:
set(USE_PROJECT_CMAKE_MODULE_PATH "-DCMAKE_MODULE_PATH=${MAKE_MODULE_PATH}")
ExternalProject_Add(ZLIB
SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/zlib
DOWNLOAD_COMMAND ""
UPDATE_COMMAND ""
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
${USE_PROJECT_CMAKE_MODULE_PATH}
INSTALL_COMMAND "")
ExternalProject_Add_Step(ZLIB installInternally
COMMAND cd <BINARY_DIR> && make install
DEPENDEES install
ALWAYS 1)
ExternalProject_Get_Property(ZLIB install_dir)
if(UNIX)
set(ZLIB_NAME libz)
else(UNIX)
set(ZLIB_NAME zlib)
endif(UNIX)
add_library(zlib UNKNOWN IMPORTED)
set_property(TARGET zlib PROPERTY IMPORTED_LOCATION ${install_dir}/lib/${ZLIB_NAME}.a)
set(ZLIB_LIBRARIES zlib)
set(ZLIB_LIBRARIES_OPTIONAL ${ZLIB_LIBRARIES})
set(ZLIB_DIR ${install_dir} CACHE INTERNAL "zlib ROOT dir")
set(ZLIB_INCLUDE_DIRS ${install_dir}/include CACHE INTERNAL "zlib include dirs")
set(ZLIB_DEFINES "-msse2 -mfpmath=sse" CACHE INTERNAL "zlib defines")
Le problème, c'est qu'il fonctionne avec faire, mais pas avec Xcode ou Visual Studio. Peut-être il ya une certaine façon de prendre le cmake construire commandes transmises à mon projet et de les transmettre à ExternalProject_Add.
Comment puis-je écrire ExternalProject_Add appels en une croix-plate-forme de chemin avec un minimum de complexité de code, ou est-il une meilleure alternative?
- Trouvé un autre outil qui peut servir à cette fin: conan.io
Vous devez vous connecter pour publier un commentaire.
Problèmes
C'est assez pour une seule configuration de projets. Mais pour Xcode et Visual Studio, vous devez définir le
CMAKE_CONFIGURATION_TYPES
plus appelbuild . --config
sur la phase de développement. Voir ma réponse.Cela fonctionne uniquement pour les Makefile générateurs de cours. À la croix-platformic vous pouvez utiliser:
--build . --target install --config
à l'intérieur deINSTALL_COMMAND
deExternalProject_Add
.Prendre un coup d'oeil à cette fichier de modèle, et en particulier la lignes suivantes:
Alternative
Avez-vous vu Hunter?
Vous pouvez ajouter zlib comme cette:
Ce code fonctionne partout. La troisième partie sera téléchargé automatiquement sur l'étape de configuration. Exemple de la construction avec les différents générateur/toolchains (build.py est juste CMake wrapper set
CMAKE_TOOLCHAIN_FILE
et-G
/-B
):Vous avez le plein contrôle de ce que options, construire des types ou nombre d'emplois vous voulez avoir pendant la construction de la 3ème partie du package. Par exemple, c'est comment vous pouvez créer 4 types de Debug, Release, MinSizeRel, RelWithDebInfo pour zlib et lien MinSizeRel des projets en cours:
-G
, répertoire de construction (-B_builds/xcode
pourxcode
de la chaîne ou-B_builds/vs-12-2013
pourvs-12-2013
de la chaîne d') ou de certaines variables d'environnement. Par exemplemingw --config Release
est égale à:set PATH=%MINGW_PATH%;%PATH%
+cmake -H. -B_builds/mingw-Release "-GMinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
Why is the build command empty?
vous dire pourquoi il n'y a pas debuild.py --configure
étape? Script vérifie qu'il n'y a pas deCMakeCache.txt
fichier et lancer CMake configurer. Depuis CMake détecte les changements de code automatiquement en outre, vous pouvez simplement exécutercmake --build
. De toute façonbuild.py
n'est pas obligatoire pour les Chasseurs, c'est juste de la bonne aliasing outil que je trouve très utile.@CMAKE_COMMAND@
... qui fait toutes ces démarches pour vousCMake ExternalProject_Add appelle travail de la croix-plate-forme par défaut, et seulement échoué à le faire si l'on utilise notamment les commandes qui ne sont disponibles que sur un sous-ensemble de systèmes d'exploitation. Généralement, CMAKE_ARGS est utilisé pour transmettre des informations à chaque cadre de l'initiative supercroissance unité au sein d'un projet externe de construire. L'CMakeLists.txt les fichiers de contrôle de chaque miniature le cadre de la construction d'ensemble de l'utilisation de CMake déclaratif de syntaxe (par exemple, "add_library(library_name PARTAGÉ fichier1.php filename1.cpp). CMake va convertir ce type de syntaxe pour les commandes qui sont spécifiques à la construction du système que vous souhaitez utiliser (par exemple, la marque, le ninja).
L'exemple ci-dessus re: zlib ne parvient pas à être multi-plateforme en partie parce que le ExternalProject_Add_Step contient la COMMANDE "cd && make install", qui, nécessairement, ne fonctionne que dans des situations où d'invoquer les "cd" est en fait la bonne manière de changer les répertoires, et où en invoquant "faire" est en fait la bonne façon de construire un logiciel. CMake est l'option-E fournit un moyen d'invoquer les opérations de base comme le changement de copier et/ou de prise/dépose de répertoires sans faire de telles hypothèses.
(En passant, si vous êtes à l'aide de l'Ide Visual Studio ou XCode, vous aurez probablement envie d'invoquer un ou plusieurs IDE générateurs lors de l'utilisation de CMake. Par exemple, en établissant
va provoquer des projets Eclipse être générés dans chaque zone de construction, et également dans le code source de la zone qui est partagée pour toutes les versions. Bien sûr, si vous êtes en utilisant XCode ou Visual Studio, vous aurez à remplacer le drapeau approprié pour ces IDEs. Alternativement, vous pourriez envisager d'utiliser Eclipse avec Ninja sur toutes les plateformes, même si au moment de la rédaction, je ne suis pas totalement certain que Ninja est prêt pour le prime-time sur la non-Linux, non-systèmes d'exploitation de Windows.)
cd <BINARY_DIR> && make install
aveccmake -E build <BINARY_DIR>
mais je ne pense pas que cela va faire l'étape d'installation que je veux réellement. Aussi, j'ai toujours le problème où Xcode, par exemple, met les fichiers dansbuildDir/bin/Debug/binary
etbuildDir/bin/Release/binary
, où faire placer les choses dansbuildDir/bin/binary
. Côté coup de gueule: C'est un peu frustrant d'avoir à rendre compte de toutes ces différences spécifiques, et j'espère que CMake est un nettoyeur de la manière de gérer ça que je suis absent pour le moment.