CMake doesn't change value of all specified cache variables at once

I am trying to build google flatbuffers (https://github.com/google/flatbuffers) in Linux. I need to change the default values of some cache variables after generating the makefile. However to change all of them I need to execute the cmake command twice. Once to change the advanced variables and then again to chance the non-advanced variables (in no particular order). I cannot change them in one go. Why is this so?
Steps:

  1. cmake … -G “Unix Makefiles”

  2. cmake -LA .
    – Configuring done
    – Generating done
    – Build files have been written to: /flatbuffers-1.10.0/linux_build
    – Cache values
    CMAKE_ADDR2LINE:FILEPATH=/bin/addr2line
    CMAKE_AR:FILEPATH=/bin/ar
    CMAKE_BUILD_TYPE:STRING=
    CMAKE_COLOR_MAKEFILE:BOOL=ON
    CMAKE_CXX_COMPILER:FILEPATH=/bin/c++
    CMAKE_CXX_COMPILER_AR:FILEPATH=/bin/gcc-ar
    CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/bin/gcc-ranlib
    CMAKE_CXX_FLAGS:STRING=
    CMAKE_CXX_FLAGS_DEBUG:STRING=-g
    CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
    CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
    CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
    CMAKE_C_COMPILER:FILEPATH=/bin/cc
    CMAKE_C_COMPILER_AR:FILEPATH=/bin/gcc-ar
    CMAKE_C_COMPILER_RANLIB:FILEPATH=/bin/gcc-ranlib
    CMAKE_C_FLAGS:STRING=
    CMAKE_C_FLAGS_DEBUG:STRING=-g
    CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
    CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
    CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
    CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND
    CMAKE_EXE_LINKER_FLAGS:STRING=
    CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=
    CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=
    CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=
    CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
    CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=
    CMAKE_INSTALL_BINDIR:PATH=bin
    CMAKE_INSTALL_DATADIR:PATH=
    CMAKE_INSTALL_DATAROOTDIR:PATH=share
    CMAKE_INSTALL_DOCDIR:PATH=
    CMAKE_INSTALL_INCLUDEDIR:PATH=include
    CMAKE_INSTALL_INFODIR:PATH=
    CMAKE_INSTALL_LIBDIR:PATH=lib64
    CMAKE_INSTALL_LIBEXECDIR:PATH=libexec
    CMAKE_INSTALL_LOCALEDIR:PATH=
    CMAKE_INSTALL_LOCALSTATEDIR:PATH=var
    CMAKE_INSTALL_MANDIR:PATH=
    CMAKE_INSTALL_OLDINCLUDEDIR:PATH=/usr/include
    CMAKE_INSTALL_PREFIX:PATH=/usr/local
    CMAKE_INSTALL_RUNSTATEDIR:PATH=
    CMAKE_INSTALL_SBINDIR:PATH=sbin
    CMAKE_INSTALL_SHAREDSTATEDIR:PATH=com
    CMAKE_INSTALL_SYSCONFDIR:PATH=etc
    CMAKE_LINKER:FILEPATH=/bin/ld
    CMAKE_MAKE_PROGRAM:FILEPATH=/bin/gmake
    CMAKE_MODULE_LINKER_FLAGS:STRING=
    CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=
    CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=
    CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=
    CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
    CMAKE_NM:FILEPATH=/bin/nm
    CMAKE_OBJCOPY:FILEPATH=/bin/objcopy
    CMAKE_OBJDUMP:FILEPATH=/bin/objdump
    CMAKE_RANLIB:FILEPATH=/bin/ranlib
    CMAKE_READELF:FILEPATH=/bin/readelf
    CMAKE_SHARED_LINKER_FLAGS:STRING=
    CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=
    CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=
    CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=
    CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=
    CMAKE_SKIP_INSTALL_RPATH:BOOL=NO
    CMAKE_SKIP_RPATH:BOOL=NO
    CMAKE_STATIC_LINKER_FLAGS:STRING=
    CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING=
    CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING=
    CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING=
    CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING=
    CMAKE_STRIP:FILEPATH=/bin/strip
    CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE
    FLATBUFFERS_BUILD_FLATC:BOOL=ON
    FLATBUFFERS_BUILD_FLATHASH:BOOL=ON
    FLATBUFFERS_BUILD_FLATLIB:BOOL=ON
    FLATBUFFERS_BUILD_GRPCTEST:BOOL=OFF
    FLATBUFFERS_BUILD_SHAREDLIB:BOOL=OFF
    FLATBUFFERS_BUILD_TESTS:BOOL=ON
    FLATBUFFERS_CODE_COVERAGE:BOOL=OFF
    FLATBUFFERS_INSTALL:BOOL=ON
    FLATBUFFERS_LIBCXX_WITH_CLANG:BOOL=ON
    GIT:FILEPATH=/bin/git

  3. cmake -DFLATBUFFERS_BUILD_FLATC=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_BUILD_SHAREDLIB=ON -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_LIBCXX_WITH_CLANG=OFF -DCMAKE_C_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/gcc -DCMAKE_CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/g++ -DCMAKE_BUILD_TYPE=Release .

At the above step only the advanced variables (marked in bold) are modified. I have to issue the command again with just the non-advanced variables to change their values

  1. cmake -DFLATBUFFERS_BUILD_FLATC=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_BUILD_SHAREDLIB=ON -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_LIBCXX_WITH_CLANG=OFF -DCMAKE_BUILD_TYPE=Release .

You’re setting the compiler after the initial configure. This causes CMake to ignore the CMakeCache.txt and start from scratch. There should be a message to this effect. You should really pass the compilers on the first configure (when you pass the -G).