Beaucoup de réponses ici sont dépassées/mauvaises. Je vais donc essayer d'y répondre mieux. Il est vrai que je réponds à cette question en 2020, donc on peut s'attendre à ce que les choses changent.
Comment puis-je exécuter CMake pour chaque type de cible (debug/release) ?
Tout d'abord, Debug/Release sont appelés des configurations dans cmake (point de détail).
Si vous utilisez un seul générateur de configuration (Ninja/Unix-Makefiles)
Ensuite, vous avez besoin d'un dossier de construction pour chaque configuration.
Comme ça :
# Configure the build
cmake -S . -B build/Debug -D CMAKE_BUILD_TYPE=Release
# Actually build the binaries
cmake --build build/Debug
Pour les générateurs de multi-configuration, c'est légèrement différent (Ninja Multi-Config, Visual Studio).
# Configure the build
cmake -S . -B build
# Actually build the binaries
cmake --build build --config Debug
Si vous vous demandez pourquoi cela est nécessaire, c'est parce que cmake n'est pas un système de construction. C'est un méta-système de construction (c'est-à-dire un système de construction qui construit des systèmes de construction). C'est essentiellement le résultat de la gestion des systèmes de compilation qui supportent plusieurs configurations dans une seule compilation. Si vous voulez une compréhension plus profonde, je vous suggère de lire un peu sur cmake dans le livre de Craig Scott "Professional CMake : A Practical Guide".
Comment puis-je spécifier les drapeaux C/C++ de débogage et de libération en utilisant CMake ?
La pratique moderne consiste à utiliser des cibles et des propriétés.
Voici un exemple :
add_library(foobar)
# Add this compile definition for debug builds, this same logic works for
# target_compile_options, target_link_options, etc.
target_compile_definitions(foobar PRIVATE
$<$<CONFIG:Debug>:
FOOBAR_DEBUG=1
>
)
NOTE : Comment j'utilise les expressions du générateur pour spécifier la configuration ! L'utilisation de CMAKE_BUILD_TYPE entraînera de mauvaises constructions pour tout générateur multi-configuration !
De plus, il est parfois nécessaire de définir les choses de manière globale et pas seulement pour un seul objectif. Utilisez add_compile_definitions, add_compile_options, etc. Ces fonctions prennent en charge les expressions de générateur. N'utilisez pas l'ancien style de cmake à moins d'y être obligé (ce chemin est une terre de cauchemars).
Comment puis-je exprimer que l'exécutable principal sera compilé avec g++ et une bibliothèque imbriquée avec gcc ?
Votre dernière question n'a vraiment aucun sens.