web-dev-qa-db-fra.com

Quelle est la méthode moderne pour définir des drapeaux de compilation généraux dans CMake?

CMake offre de nombreux mécanismes pour obtenir des indicateurs pour le compilateur:

Y at-il une méthode qui est préférée à l’autre dans les applications modernes? Si oui, pourquoi? En outre, comment cette méthode peut-elle être utilisée avec plusieurs systèmes de configuration tels que MSVC?

75
Peter Clark

Pour CMake moderne (versions 2.8.12 et supérieures), vous devez utiliser target_compile_options , qui utilise les propriétés de la cible en interne.

CMAKE_<LANG>_FLAGS est une variable globale et la plus sujette aux erreurs. Il ne supporte pas non plus expressions du générateur , ce qui peut être très utile.

add_compile_options est basé sur les propriétés du répertoire, ce qui convient dans certaines situations, mais ne constitue généralement pas le moyen le plus naturel de spécifier des options.

target_compile_options fonctionne par cible (en définissant le COMPILE_OPTIONS et INTERFACE_COMPILE_OPTIONS propriétés de la cible), qui donne généralement le code CMake le plus propre, car les options de compilation d’un fichier source sont déterminées par le projet auquel le fichier appartient (et non par le répertoire dans lequel il est placé sur le disque dur). Cela a l’avantage supplémentaire que s’il se charge automatiquement de transmettre les options à des cibles dépendantes, le cas échéant.

Même si elles sont un peu plus détaillées, les commandes par cible permettent un contrôle assez fin des différentes options de construction et (selon mon expérience personnelle) sont les moins susceptibles de causer des maux de tête à long terme.

En théorie, vous pouvez également définir les propriétés respectives directement à l'aide de set_target_properties, mais target_compile_options est généralement plus lisible.

Par exemple, pour définir les options de compilation d'une cible foo en fonction de la configuration à l'aide d'expressions de générateur, vous pouvez écrire:

target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")
77
ComicSansMS