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?
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)