Search code examples
c++boostcmakeclangrtti

How to compile with different compile options for different files in CMAKE?


I have a project like this:

|--CMakeLists.txt(1)
|--File1.cpp -W -W-all
|--Folder1
    |--CMakeLists.txt(2)
    |--File2.cpp -W -W-all -fno-rtti

As you can see above, File2.cpp needs to compile with -fno-rtti whereas the other files should compile with rtti. This is happening because I'm using both clang and boost libraries in my project. I wrote CMakeLists.txt(1) like this:

SET (CMAKE_CXX_FLAGS "-std=c++11 -fexceptions -fno-rtti -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -Wno-long-long" )

And, in CMakeLists.txt(2) I added the following:

add_definitions( -fno-rtti ) 

The above did not work. In fact none of the following have worked for me in CMakeLists.txt(2)

set_property(SOURCE File2.cpp APPEND_STRING PROPERTY CMAKE_CXX_FLAGS " -fno-rtti ")
set_property(SOURCE File2.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " -fno-rtti ")
ADD_DEFINITIONS(CMAKE_CXX_FLAGS " -fno-rtti ")
ADD_DEFINITIONS(COMPILE_FLAGS " -fno-rtti ")
ADD_DEFINITIONS( -fno-rtti )

Am I missing anything?


Solution

  • AFAIK CMake does not allow to specify compile options per file. The best you can do is to create a target for the files you want to compile with -fno-rtti, e.g. with add_library, and add the compile options to this target.

    add_definitions is meant to add preprocessor definitions. You should consider add_compile_options instead:

    add_compile_options(-fno-rtti)
    

    To avoid global pollution and make sure you add your options only to a given target, you may consider using target_compile_options:

    target_compile_options(foo PUBLIC -fno-rtti)
    

    Unrelated, but instead of manually setting flags to enable c++11 with set(CMAKE_CXX_FLAGS "-std=c++11 ..."), let cmake do a more fine grained job with compile features, or at least with standard selection:

    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    

    EDIT:

    Looking more carefully in the documentation, you can set compile flags per source file using set_source_files_properties with COMPILE_FLAGS:

    set_source_files_properties(File2.cpp PROPERTIES COMPILE_FLAGS -fno-rtti)