11

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?

3
  • 1
    How do you know it didn't work? What errors do you get? Have you tried this? Commented Jun 19, 2017 at 18:27
  • Duplicate of this question? Commented Sep 29, 2020 at 11:23
  • This question is similar to: Override compile flags for single files. If you believe it’s different, please edit the question, make it clear how it’s different and/or how the answers on that question are not helpful for your problem. Commented Oct 31 at 1:33

1 Answer 1

12

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)
Sign up to request clarification or add additional context in comments.

5 Comments

To avoid global pollution wouldn't it be better to use PRIVATE instead of PUBLIC target compile options?
I'm accepting this answer, but the fix was actually in the CmakeLists.txt(2). I was not building (by calling add_library) for that individual file. Once I added the add_library, and linked it at top level , it was OK. Not sure if there is a way to workaround (must be) without creating a lib out of this one file. For ex. in XCODE we can specify directly which files need to compile with which options and generates a single executable. Does Cmake allow that ? If yes, what should I add in CMakeLists.txt(2) ?
@UtkarshKumar I reread your question and the documention, set_source_files_properties should work for you. In your question, you used it on File1.cpp instead of File2.cpp: is that a typo?
Thanks for correcting. I haven't tried set_source_files_properties, I think I only tried set_property. Would verify against this command and update.
It looks like COMPILE_FLAGS is now deprecated, and COMPILE_OPTIONS should be used instead.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.