Barry
Barry

Reputation: 304142

cmake cache variables deleted when some change

I have a part of my CMakeLists.txt that sets the C++ standard:

if(NOT CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 11)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

This seems to work fine... mostly. I have a build directory, which I set up via:

$ cmake -G Ninja -DCMAKE_CXX_COMPILER=$(which clang++) -DCMAKE_BUILD_TYPE=Release \
                 -DCMAKE_CXX_STANDARD=17  ../gw3

Built my project on clang, fixed a few things, normal work stuff. Then I wanted to check to see if I broke the gcc build, so, in the same directory, I ran:

$ cmake -G Ninja -DCMAKE_CXX_COMPILER=$(which g++) -DCMAKE_BUILD_TYPE=Release \
                 -DCMAKE_CXX_STANDARD=17  ../gw3

This emited:

-- Configuring done
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_CXX_COMPILER= /path/to/bin/g++
CMAKE_CXX_COMPILER= /path/to/bin/g++
CMAKE_CXX_COMPILER= /path/to/bin/g++
CMAKE_CXX_COMPILER= /path/to/bin/g++
... like 20 more times ...

-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 7.2.0
... more cmake stuff here ...

At this point though, CMAKE_CXX_STANDARD is set to 11 in the cache! Why? I set it on the command line to 17. If I rereun the same cmake command again (verbatim, just up-arrow, enter), then the CMAKE_CXX_STANDARD variable gets set to 17 as desired. What gives?

Upvotes: 0

Views: 2746

Answers (1)

user167921
user167921

Reputation: 330

The conventional way to avoid this error is to set the compiler via an environmental variable, i.e:

$ CXX=clang++ cmake .. -DCMAKE_CXX_STANDARD=17
# ...
$ cat CMakeCache.txt | grep STANDARD
CMAKE_CXX_STANDARD:STRING=17
$ env CXX=g++ cmake .. -DCMAKE_CXX_STANDARD=17
# ...
$ cat CMakeCache.txt | grep STANDARD
CMAKE_CXX_STANDARD:STRING=17 

CMake doesn't like it when you try to change CMAKE_CXX_COMPILER. From the FAQ:

I change CMAKE_C_COMPILER in the GUI but it changes back on the next configure step. Why?

Once a build tree is created with a given compiler it cannot be changed. There are a variety of implementation reasons for this policy.

Upvotes: 3

Related Questions