Votre approche - comme @Tsyvarev a commenté être absolument parfait, simplement depuis que vous avez demandé pour la "nouvelle approche" dans CMake voici ce que votre code peut traduire:
cmake_minimum_required(VERSION 3.8)
project(HelloWorld)
string(
APPEND _opts
"$<IF:$<CXX_COMPILER_ID:MSVC>,"
"/W4;$<$<CONFIG:RELEASE>:/O2>,"
"-Wall;-Wextra;-Werror;"
"$<$<CONFIG:RELEASE>:-O3>"
"$<$<CXX_COMPILER_ID:Clang>:-stdlib=libc++>"
">"
)
add_compile_options("${_opts}")
add_executable(HelloWorld "main.cpp")
target_compile_features(HelloWorld PUBLIC cxx_lambda_init_captures)
Vous prenez add_compile_options()
, et - comme @Al.G. a commenté: "utiliser le sale générateur d'expressions".
Il ya quelques inconvénients de générateur d'expressions:
- Le très utile
$<IF:...,...,...>
expression n'est disponible que dans la version de CMake >= 3.8
- Vous devez l'écrire en une seule ligne. Pour éviter cela, j'ai utilisé l'
string(APPEND ...)
, que vous pouvez également l'utiliser pour "optimiser" votre set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ...
des appels.
- C'est difficile à lire et à comprendre. E. g. les points-virgules sont nécessaires pour en faire une liste des options de compilation (sinon CMake va le citer).
Donc mieux vaut utiliser un plus lisible et rétro-compatible avec approche add_compile_options()
:
if(MSVC)
add_compile_options("/W4" "$<$<CONFIG:RELEASE>:/O2>")
else()
add_compile_options("-Wall" "-Wextra" "-Werror" "$<$<CONFIG:RELEASE>:-O3>")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
add_compile_options("-stdlib=libc++")
else()
# nothing special for gcc at the moment
endif()
endif()
Et oui, vous n'avez pas spécifier explicitement la norme C++ plus, vous venez de nommer le C++ fonction de votre code/cible ne dépend avec target_compile_features()
des appels.
Pour cet exemple j'ai choisi cxx_lambda_init_captures
qui serait par exemple un vieux compilateur GCC donner le message d'erreur suivant (comme un exemple de ce qui se passe si un compilateur ne prend pas en charge cette fonction):
The compiler feature "cxx_lambda_init_captures" is not known to CXX compiler
"GNU"
version 4.8.4.
Et vous devez écrire un script pour construire de multiples configurations avec un "simple" configuration du générateur de makefile ou de l'utilisation d'un "multi" configuration de l'IDE Visual Studio.
Voici les références à des exemples:
J'ai donc testé la suivante avec l' Open Folder
Visual Studio 2017 CMake à allier dans cet exemple, la cl, clang et mingw compilateurs:
CMakeSettings.json
{
// See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file.
"configurations": [
{
"name": "x86-Debug",
"generator": "Visual Studio 15 2017",
"configurationType": "Debug",
"buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
"buildCommandArgs": "-m -v:minimal",
},
{
"name": "x86-Release",
"generator": "Visual Studio 15 2017",
"configurationType": "Release",
"buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
"buildCommandArgs": "-m -v:minimal",
},
{
"name": "Clang-Debug",
"generator": "Visual Studio 15 2017",
"configurationType": "Debug",
"buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
"cmakeCommandArgs": "-T\"LLVM-vs2014\"",
"buildCommandArgs": "-m -v:minimal",
},
{
"name": "Clang-Release",
"generator": "Visual Studio 15 2017",
"configurationType": "Release",
"buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
"cmakeCommandArgs": "-T\"LLVM-vs2014\"",
"buildCommandArgs": "-m -v:minimal",
},
{
"name": "GNU-Debug",
"generator": "MinGW Makefiles",
"configurationType": "Debug",
"buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
"variables": [
{
"name": "CMAKE_MAKE_PROGRAM",
"value": "${projectDir}\\mingw32-make.cmd"
}
]
},
{
"name": "GNU-Release",
"generator": "Unix Makefiles",
"configurationType": "Release",
"buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
"variables": [
{
"name": "CMAKE_MAKE_PROGRAM",
"value": "${projectDir}\\mingw32-make.cmd"
}
]
}
]
}
mingw32-make.cmd
@echo off
mingw32-make.exe %~1 %~2 %~3 %~4
Ainsi, vous pouvez utiliser n'importe quel CMake générateur dans Visual Studio 2017, il y a quelque malsaine citant passe (comme pour le mois de septembre 2017, peut-être corrigé plus tard), qui exige que l' mingw32-make.cmd
intermédiaire (en enlevant les guillemets).