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?
CMake needs a way to determine which compiler to use to invoke the linker. This is determined by the LANGUAGE property of source files of the target , and in the case of static libraries, the LANGUAGE of the dependent libraries. The choice CMake makes may be overridden with the LINKER_LANGUAGE target property.
Add options to the link step for executable, shared library or module library targets in the current directory and below that are added after this command is invoked. This command can be used to add any link options, but alternative commands exist to add libraries ( target_link_libraries() or link_libraries() ).
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With