At the beginning of my CMake project, I\'m setting general compilation flags in the variable CMAKE_CXX_FLAGS, like
set(CMAKE_CXX_FLAGS \"-W -Wall ${CMAKE_CXX
The accepted answer is still working but outdated since 2013.
This answer is based and new functions from CMake v2.8.12, v3.3 and v3.13.
Two new commands to set CMAKE_CXX_FLAGS:
The documentation of last version has not changed a lot since cmake-2.8.12:
In you case you can use:
target_compile_options(${TARGET} PRIVATE ${BUILD_FLAGS})
Or simply if you have a single target:
add_compile_options(${BUILD_FLAGS})
target_compile_options(mylib PRIVATE -O2) # only internal
target_compile_options(mylib INTERFACE -gl) # only external
target_compile_options(mylib PUBLIC -g) # same as PRIVATE + INTERFACE
# multiple targets and flags
target_compile_options(mylib1 mylib2 PRIVATE -Wall -Wextra)
target_compile_options( mylib PUBLIC -DUSEXX) # Bad
target_compile_definitions(mylib PUBLIC -DUSEXX) # OK
add_compile_options(-Wall -Wextra) # for all targets in current directory
add_compile_options(-DUSEXX) # Bad
add_definitions(-DUSEXX) # OK
COMPILE_FLAGScmake-3.0 documentation flags COMPILE_FLAGS as deprecated:
COMPILE_FLAGSAdditional flags to use when compiling this target’s sources.
The
COMPILE_FLAGSproperty sets additional compiler flags used to build sources within the target. UseCOMPILE_DEFINITIONSto pass additional preprocessor definitions.This property is deprecated. Use the
COMPILE_OPTIONSproperty or thetarget_compile_optionscommand instead.
If you still want to use set_target_properties() you may use COMPILE_OPTIONS instead of COMPILE_FLAGS:
set_target_properties(${TARGET} PROPERTIES COMPILE_OPTIONS ${BUILD_FLAGS})
Anton Petrov suggests to use generator expressions as presented in an answer of ar31.
The CMake generator expressions applies your ${BUILD_FLAGS} to:
$ (can also be C, CUDA...)$GNU for gcc, or MSVCfor Visual C++... see full list)$ instead if language is C)In you case you can use:
target_compile_options(${TARGET} PRIVATE
$<$:${BUILD_FLAGS_FOR_CXX}>
$<$:${BUILD_FLAGS_FOR_C}>)
or about compilers:
target_compile_options(${TARGET} PRIVATE
$<$:${BUILD_FLAGS_FOR_CLANG}>
$<$:${BUILD_FLAGS_FOR_GCC}>
$<$:${BUILD_FLAGS_FOR_VISUAL}>)
A new function target_link_options() allow to pass options to the linker, as mentioned by Craig Scott.
The best way is to distinguish C files and C++ files using two different targets.