[CMake] CXX flags applied to C source

Kelly Burkhart kelly.burkhart at gmail.com
Mon Jul 25 17:19:11 EDT 2011


Thanks, that seems to work.  I'm getting around to testing the windows
version of this, we have a command line arg: "-UUNICODE" which
explicitly removes a manifest constant.  I assume that should be in a
set(...) rather than an add_definitions(...) correct?

The defines for __x86__ and __linux__ are required for the omnithread
library which we use, and the gcc -W option is the old name for
-Wextra.

Thanks,

-Kelly

On Mon, Jul 25, 2011 at 8:40 AM, Michael Wild <themiwi at gmail.com> wrote:
> 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()
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake
>


More information about the CMake mailing list