Est-ce que set_target_properties dans CMake remplace CMAKE_CXX_FLAGS?

Au début de mon projet CMake, je mets en place des drapeaux de compilation généraux dans la variable CMAKE_CXX_FLAGS, comme

set(CMAKE_CXX_FLAGS "-W -Wall ${CMAKE_CXX_FLAGS}") 

Plus tard, je dois append d’autres indicateurs de compilation spécifiques à la configuration (stockés dans BUILD_FLAGS). Puis-je utiliser la commande suivante pour cela:

 set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS}) 

ou dois-je append le CMAKE_CXX_FLAGS manuellement:

 set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BUILD_FLAGS}") 

empêcher CMAKE_CXX_FLAGS d’être remplacé par BUILD_FLAGS?

    Utilisez le premier:

     set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS}) 

    Les indicateurs stockés dans BUILD_FLAGS sont ajoutés après CMAKE_CXX_FLAGS lors de la compilation des sources de TARGET. La documentation y fait allusion, mais je viens d’essayer de m’en assurer.

    COMPILE_FLAGS

      Additional flags to use when compiling this target's sources. The COMPILE_FLAGS property sets additional comstackr flags used to build sources within the target. Use COMPILE_DEFINITIONS to pass additional preprocessor definitions. 

    La ligne de commande complète sera l’équivalent de:

     ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS} -o foo.o -c foo.cc 

    Et comme dit Ramon, vous pouvez toujours vérifier avec make VERBOSE=1 .

    La réponse de richq fonctionne toujours mais est un peu dépassée depuis 2013. Ma réponse est une mise à jour.

    Depuis CMake-2.8.12

    Deux nouvelles commandes pour définir CMAKE_CXX_FLAGS :

    • target_comstack_options() (pour une seule cible)
    • add_comstack_options() (pour toutes les cibles)

    La documentation de la dernière version n’a pas beaucoup changé depuis cmake-2.8.12 :

    • target_comstack_options()
    • add_comstack_options()

    Dans votre cas, vous pouvez utiliser:

     target_comstack_options(${TARGET} PRIVATE ${BUILD_FLAGS}) 

    Ou simplement si vous avez une seule cible:

     add_comstack_options(${BUILD_FLAGS}) 

    Plus d’exemples

     target_comstack_options(mylib PRIVATE -O2) # only internal target_comstack_options(mylib INTERFACE -gl) # only external target_comstack_options(mylib PUBLIC -g) # same as PRIVATE + INTERFACE # multiple targets and flags target_comstack_options(mylib1 mylib2 PRIVATE -Wall -Wextra) target_comstack_options( mylib PUBLIC -DUSEXX) # Bad target_comstack_definitions(mylib PUBLIC -DUSEXX) # OK add_comstack_options(-Wall -Wextra) # for all targets in current directory add_comstack_options(-DUSEXX) # Bad add_definitions(-DUSEXX) # OK 

    COMPILE_FLAGS

    La documentation de cmake-3.0 COMPILE_FLAGS que COMPILE_FLAGS est obsolète:

    COMPILE_FLAGS

    Drapeaux supplémentaires à utiliser lors de la compilation des sources de cette cible.

    La propriété COMPILE_FLAGS définit des indicateurs de compilateur supplémentaires utilisés pour créer des sources dans la cible. Utilisez COMPILE_DEFINITIONS pour transmettre des définitions de préprocesseur supplémentaires.

    Cette propriété est obsolète. Utilisez COMPILE_OPTIONS propriété COMPILE_OPTIONS ou la commande target_comstack_options .

    Si vous souhaitez toujours utiliser set_target_properties() vous pouvez utiliser COMPILE_OPTIONS au lieu de COMPILE_FLAGS :

     set_target_properties(${TARGET} PROPERTIES COMPILE_OPTIONS ${BUILD_FLAGS}) 

    Depuis CMake-3.3

    Anton Petrov suggère d’utiliser des expressions générasortingces présentées dans une réponse de ar31 .

    Les expressions du générateur CMake appliquent votre ${BUILD_FLAGS} à:

    • Langage C ++ utilisant $ (peut aussi être C , CUDA …)
    • Compilateur Clang utilisant $
      (peut également être GNU pour gcc ou MSVC pour Visual C ++ … voir la liste complète )
      (utilisez $ place si la langue est C)
    • et plus encore en tant que fonctionnalité C ++ prise en charge ou version du compilateur … (voir documentation )

    Dans votre cas, vous pouvez utiliser:

     target_comstack_options(${TARGET} PRIVATE $<$:${BUILD_FLAGS_FOR_CXX}> $<$:${BUILD_FLAGS_FOR_CXX}>) 

    ou à propos des compilateurs:

     target_comstack_options(${TARGET} PRIVATE $<$:${BUILD_FLAGS_FOR_CLANG}> $<$:${BUILD_FLAGS_FOR_GCC}> $<$:${BUILD_FLAGS_FOR_VISUAL}>)