49

I'm in a situation where I should not disturb the existing CMakeLists.txt files, but I still should add some g++ system include directory to my build.

In other words, I need -isystem /path/to/my/include added to my compiler flags, but when calling something like cmake ...

Maybe something like cmake .. -DCMAKE_CXX_FLAGS="$CMAKE_CXX_FLAGS -isystem /path/to/my/include"? Is there a way to do this?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ayberk Özgür
  • 4,986
  • 4
  • 38
  • 58

4 Answers4

35

I have the same problem. I found two solutions:

  1. The one proposed by sakra in a previous answer, i.e. setting an environment variable with C++ flags:

    export CXXFLAGS=-isystem\ /path/to/my/include
    cmake <path to my sources>
    

    OR the same thing, but environment variable are set only for this CMake call:

    CXXFLAGS=-isystem\ /path/to/my/include cmake <path to my sources>
    

    IMPORTANT: you must clean your build directory (i.e. clean the CMake cache) before launching any of this form. Without cleaning the cache, CMake will continue using your cached CMAKE_CXX_FLAGS from the previous run.

  2. Directly setting CMAKE_CXX_FLAGS in cmake string:

    cmake -DCMAKE_CXX_FLAGS=-isystem\ /path/to/my/include <path to my sources>
    

I believe that it can be done by a more 'native' way, but I didn't find a variable responsible for paths to headers in CMake.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
avtomaton
  • 4,725
  • 1
  • 38
  • 42
17

You can set the environment variable CXXFLAGS before invoking CMake.

$ export CXXFLAGS=-isystem\ /path/to/my/include
$ cmake ..

CMake will the initialize the cache variable CMAKE_CXX_FLAGS with the flags from the environment variable. The variable affects all build types.

sakra
  • 62,199
  • 16
  • 168
  • 151
11

Using -DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES=<something> worked for me even without toolchain file. This avoids cluttering compiler flags.

scrutari
  • 1,378
  • 2
  • 17
  • 33
  • I don't think you should override this. It is meant to be set by toolchain files. If you override it you might end up not being able to find standard C++ headers. – Timmmm Jun 16 '20 at 11:31
  • 2
    This still can be used as a workaround for loading Cmake-based projects into IDEs. Also when LLVM toolchain is used, this option helps force Cmake to see standard headers from LLVM rather than those installed in the system (typically from GNU toolchain of a different version). – scrutari Jun 16 '20 at 12:01
3

Just an additional note to the other answers: with CMake 3.15.3 on macOS 10.14.5, only the solution using the CMake flag seems to work properly.

So, in my case, only this solution worked fine:

cmake -DCMAKE_CXX_FLAGS=-I\ /path/to/include <path/to/source>
rmbianchi
  • 6,241
  • 6
  • 26
  • 27