web-dev-qa-db-fra.com

Passer les options du compilateur cmake

Je sais comment passer les options du compilateur à l'aide de la commande cmake

set(CMAKE_CXX_FLAGS "-Wall -Wno-dev -Wl,-rpath=/home/abcd/libs/")

Existe-t-il également un moyen de passer les options depuis la ligne de commande, qui remplacerait les options CMakeList.txt, quelque chose comme:

cmake -Wl,-rpath=/home/abcd/newlibs/ path/to/CMakeLists.txt

ou

cmake -D CMAKE_CXX_FLAGS="-Wno-dev -Wl,-rpath=/home/abcd/libs/" path/to/CMakeLists.txt

Mon problème principal est que je veux savoir comment ajouter des indicateurs et comment remplacer les indicateurs existants du compilateur à partir de la ligne de commande.

25
infoclogged

Oui, vous pouvez ajouter les options du compilateur et de l'éditeur de liens. Mais il faut distinguer deux choses dans CMake: le premier appel pour générer l’environnement de construction et tous les appels consécutifs pour la régénération de cet environnement de construction après les modifications apportées à votre CMakeList.txt fichiers ou dépendances.

Voici certaines des possibilités (à l’exclusion des plus complexes chaîne d’outils variantes):

Ajouter les drapeaux du compilateur

  1. Le contenu initial de la mémoire cache CMAKE_CXX_FLAGS variable est une combinaison de CMAKE_CXX_FLAGS_INIT défini par CMake lui-même lors de la détection du système d’exploitation/de la chaîne d’outils et de ce qui est défini dans la variable d’environnement CXXFLAGS. Vous pouvez donc appeler initialement:

    cmake -E env CXXFLAGS="-Wall" cmake ..
    
  2. Plus tard, CMake s’attendrait à ce que l’utilisateur modifie le CMAKE_CXX_FLAGS variable en cache directement pour ajouter des objets, par exemple. en utilisant un éditeur comme ccmake commettez avec CMake.

  3. Vous pouvez facilement introduire votre propre type de construction comme ALL_WARNINGS. Les pièces spécifiques au type de construction sont ajoutées:

     cmake -DCMAKE_CXX_FLAGS_ALL_WARNINGS:STRING="-Wall" -DCMAKE_BUILD_TYPE=ALL_WARNINGS ..
    

Ajouter des drapeaux de lieur

Les options de l'éditeur de liens sont plus ou moins équivalentes aux options du compilateur. Les noms de variable de CMake dépendent du type de cible (EXE, SHARED ou MODULE).

  1. Le CMAKE_EXE_LINKER_FLAGS_INIT , CMAKE_SHARED_LINKER_FLAGS_INIT ou CMAKE_MODULE_LINKER_FLAGS_INIT se combine avec la variable d’environnement LDFLAGS à CMAKE_EXE_LINKER_FLAGS , CMAKE_SHARED_LINKER_FLAGS et CMAKE_MODULE_LINKER_FLAGS .

    Vous pouvez donc appeler par exemple:

    cmake -E env LDFLAGS="-rpath=/home/abcd/libs/" cmake ..
    
  2. Voir au dessus.

  3. Les pièces spécifiques au type de construction sont ajoutées:

    cmake -DCMAKE_SHARED_LINKER_FLAGS_MY_RPATH:STRING="-rpath=/home/abcd/libs/" -DCMAKE_BUILD_TYPE=MY_RPATH ..
    

Des alternatives

Sachez simplement que CMake fournit une variable spéciale pour définir les indicateurs de fournisseur/lieur de manière indépendante de la plate-forme. Vous n'avez donc pas besoin de connaître l'option spécifique du compilateur/éditeur de liens.

Voici quelques exemples:

Malheureusement, il n'y en a pas pour le niveau d'alerte du compilateur ( encore )

Références

25
Florian
cmake -D CMAKE_CXX_FLAGS="-Wno-dev -Wl,-rpath=/home/abcd/libs/" path/to/CMakeLists.txt

cela devrait fonctionner, le problème est que si vous trouvez_package () un paquet qui modifie également CMAKE_CXX_FLAGS, cela ne fonctionnera pas seulement partiellement.

4
Tomaz Canabrava