Comment définir les options de compilation avec CMake dans Visual Studio 2017

Visual Studio 2017 est livré avec le plein de CMake intégration. Pour en apprendre davantage sur cette combinaison, je commence avec cet échantillon de base:

# CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(foo)
add_executable(foo foo.cpp)

et

//foo.cpp
int main() {}

Cela génère des scripts de création, et les compile et les liens avec aucun problème. Cela a été facile.

Essayant de configurer les options du compilateur, d'autre part, s'est avéré être rien de trivial. Dans mon cas, j'ai été de tenter de définir le niveau d'alerte de 4.

La solution la plus évidente

add_compile_options("/W4")

n'a pas marché comme prévu. La ligne de commande passés au compilateur contient maintenant deux /W4 (comme prévu) ainsi que /W3 (repris d'ailleurs), la production de l'avertissement suivant:

cl : Command line warning D9025: overriding '/W3' with '/W4'

Pour contourner ce problème, j'aurais besoin de remplacer tout incompatible option du compilateur(s) au lieu de simplement ajouter un. CMake ne pas fournir une aide immédiate à ce, et la solution standard (comme cette Q&A suggère) semble être:

if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
    string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()

Ceci, cependant, a deux questions:

  • Il définit le mondial CMAKE_CXX_FLAGS, s'appliquant à tous C++ objectifs. Ce ne peut pas être prévu (pas un problème pour moi).
  • Il n'a pas d'échelle. Pour chaque option du compilateur à ajouter, vous aurez à lire sur les options incompatibles, et manuellement la bande de ceux du premier. Cela va inévitablement échouer1.

Ma question est double:

  1. D'où vient le CMake intégration ramasser les paramètres par défaut, et cela peut-il être contrôlé?
  2. Comment pouvez-vous définir les options du compilateur en général? (Si c'est trop large d'un sujet, je serais heureux pour obtenir de l'aide sur la configuration de l'alerte de niveau seulement).

1 d'ailleurs, la solution que j'ai répliqué ne tient pas compte de la /Wall option, ce qui est incompatible avec /W4.

Certaines options du compilateur peuvent être modifiés par la croix-plate-forme-compatible variables CMake ou des propriétés. Mais les niveaux d'alerte, malheureusement, n'ont pas ce générique de la façon de les définir. Vous pouvez prendre un coup d'oeil sur le travail de @ruslo trouvé ici et la discussion sur l'extension de CMake lui-même ici.
Merci pour la confirmation, que CMake n'est pas directement en charge le réglage du niveau d'avertissement. Encore, les liens que vous avez posté ne sont pas immédiatement utiles pour moi: Ruslo du travail prend uniquement en charge le réglage de /Wall, tandis que le second lien fonctionne en modifiant le CMAKE_CXX_FLAGS. Le répondre posté par @sakra pour remplacer la valeur par défaut des options du compilateur ressemble à une solution plus propre, permettant d'exercer un contrôle plus précis sur le réglage des options du compilateur.
Quand je travaillais sur une réponse de cette question j'ai remarqué que add_compile_options() commande ne remplacer/écrase le niveau d'avertissement de la spécification au lieu de simplement en l'ajoutant à "Options Supplémentaires" comme quand vous ajoutez à CMAKE_CXX_FLAGS. Je ne suis pas sûr de savoir pourquoi il y a une différence (à vérifier dans CMake du code), mais peut s'il vous plaît donner add_compile_options("/W4") un essai? Dans mon CMake version 3.9, je n'ai pas eu cet avertissement du compilateur plus.
add_compile_options("/W4") me donne encore un avertissement du compilateur. Je suis à l'aide de la "Ninja" générateur, à l'aide de la CMake soutien intégré de Visual Studio 2017 (15.3.3), il n'est pas .vcxproj généré le long de la route (autant que je sache). C'est à l'aide de cmake version 3.8.0-MSVC_2.

OriginalL'auteur IInspectable | 2017-09-01