[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