[CMake] CXX flags applied to C source

Michael Wild themiwi at gmail.com
Mon Jul 25 09:40:40 EDT 2011


On 07/25/2011 03:20 PM, Kelly Burkhart wrote:
> Hi, I have a bunch of compiler flags specified with add_definitions as so:
> 
> if(LINUX)
>   tb_compiler_version(TB_GCC_VERSION)
>   add_definitions(${CMAKE_CXX_FLAGS} "-g")
>   add_definitions(${CMAKE_CXX_FLAGS} "-DBOOST_SIGNALS_NAMESPACE=tb_signals")
>   add_definitions(${CMAKE_CXX_FLAGS} "-D__x86__")
>   add_definitions(${CMAKE_CXX_FLAGS} "-D__linux__")
>   add_definitions(${CMAKE_CXX_FLAGS} "-D__OSVERSION__=2")
>   add_definitions(${CMAKE_CXX_FLAGS} "-D_REENTRANT")
>   add_definitions(${CMAKE_CXX_FLAGS} "-Wall")
>   add_definitions(${CMAKE_CXX_FLAGS} "-Wno-unused")
>   add_definitions(${CMAKE_CXX_FLAGS} "-Wno-comment")
>   add_definitions(${CMAKE_CXX_FLAGS} "-Wno-sign-compare")
> 
>   if("${TB_GCC_VERSION}" VERSION_GREATER "4.2")
>     add_definitions(${CMAKE_CXX_FLAGS} "-fno-strict-aliasing")
>   endif()
> 
>   if("${TB_GCC_VERSION}" VERSION_GREATER "4.3")
>     add_definitions(${CMAKE_CXX_FLAGS} "-Wno-ignored-qualifiers")
>     add_definitions(${CMAKE_CXX_FLAGS} "-Wnon-virtual-dtor")
>   endif()
> 
>   add_definitions(${CMAKE_CXX_FLAGS} "-W")
> else()
> ...
> 
> The CXX flags are applied to C compiles which is mostly what I want,
> but there are some options (-Wnon-virtual-dtor for instance) that only
> apply to C++.  How can I specifiy an option should only be applied to
> C++ but not to C?
> 
> Thanks,
> 
> -Kelly

For one, your are completely misusing add_definitions(). You should only
use it for -D flags, nothing else, and only if the definitions apply to
*all* files in that directory. If

1) the definitions should only be applied to some source files or some
targets, use the COMPILE_DEFINITIONS source/target property. See the
set_source_files_properties() and the set_target_properties() commands.

2) you want to set other compile flags, either append to the
CMAKE_CXX_FLAGS *variable* using the set() command, e.g.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") if you want this flag to
be applied to everything that follows (including sub-directories), or
use the COMPILE_FLAGS source file or target property (see point 1).


Also, it doesn't make sense to pass the CMAKE_CXX_FLAGS variable to
add_definitions(). Lastly, you can pass definitions using a single call,
e.g. add_definitions(-DFOO -DBAR -DBAZ).

So, your code might look something like the following:

if(LINUX)
  tb_compiler_version(TB_GCC_VERSION)
  # TB_C_FLAGS will be also used for C++
  set(TB_C_FLAGS "-g -Wall -Wno-unused")
  set(TB_C_FLAGS "${TB_C_FLAGS} -Wno-comment -Wno-sign-compare")
  add_definitions(
    -DBOOST_SIGNALS_NAMESPACE=tb_signals    # Doesn't hurt in C files
    -D__x86__                               # ARE YOU SURE?!
    -D__linux__                             # ARE YOU SURE?!
    -D__OSVERSION__=2
    -D_REENTRANT
    )

  if("${TB_GCC_VERSION}" VERSION_GREATER "4.2")
    set(TB_C_FLAGS "${TB_C_FLAGS} -fno-strict-aliasing")
  endif()

  if("${TB_GCC_VERSION}" VERSION_GREATER "4.3")
    set(TB_C_FLAGS "${TB_C_FLAGS} -Wno-ignored-qualifiers")
    set(TB_CXX_FLAGS "${TB_CXX_FLAGS} -Wnon-virtual-dtor")
  endif()

  # What's this?
  # add_definitions(${CMAKE_CXX_FLAGS} "-W")

  # now, assign TB_<LANG>_FLAGS to CMAKE_<LANG>_FLAGS
  set(CMAKE_C_FLAGS "${TB_C_FLAGS}")
  set(CMAKE_CXX_FLAGS "${TB_C_FLAGS} ${TB_CXX_FLAGS}")
else()


More information about the CMake mailing list