cmake: Selecting a generator within CMakeLists.txt

2019-02-02 05:35发布

问题:

I would like to force CMake to use the "Unix Makefiles" generator from within CMakeLists.txt.

This is the command I use now.

cmake -G "Unix Makefiles" .

I would like it to be this.

cmake .

When running on windows with VC installed and a custom tool-chain.

I would expect to be-able to set the generator in the CMakeLists.txt file.

Maybe something like this.

set(CMAKE_GENERATOR "Unix Makefiles")

回答1:

Here is what worked for me - create a file called PreLoad.cmake in your project dir containing this:

set (CMAKE_GENERATOR "Unix Makefiles" CACHE INTERNAL "" FORCE)



回答2:

It seems to me that the variable CMAKE_GENERATOR is set too late if set in the CMakeLists.txt. If you use (even at the beginning of CMakeLists.txt)

set(CMAKE_GENERATOR "Ninja")
message("generator is set to ${CMAKE_GENERATOR}")

you can see in the output something like

% cmake ../source
-- The C compiler identification is GNU 4.9.2
...
-- Detecting CXX compile features - done
generator is set to Ninja
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/build

So the variable is only set at the very end of the generation procedure. If you use something like

set(CMAKE_GENERATOR "Ninja" CACHE INTERNAL "" FORCE)

in CMakeLists.txt, then in the very first run of cmake ../source (without -G) the default generator is used. The variable CMAKE_GENERATOR is stored in the cache, though. So if you rerun cmake ../source afterwards, it will use the generator as specified in the CMAKE_GENERATOR variable in the cache.

This is surely not the most elegant solution, though ;-) Maybe use a batch file that will actually execute the cmake -G generator for the user...



回答3:

This is not what I get, when I run the same command, cmake will look for a gcc compiler / make utility. If the PATH is not set up correctly it will fail with something like:

D:\Development\build>cmake -G "Unix Makefiles" ..\source
CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles".  CMAKE_MAKE_PROGRAM is not set.
  You probably need to select a different build tool.
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_C_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_C_COMPILER
CMake Error: Could not find cmake module file:D:/Development/build/CMakeFiles/CMakeCCompiler.cmake
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_CXX_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_CXX_COMPILER
CMake Error: Could not find cmake module file:D:/Development/build/CMakeFiles/CMakeCXXCompiler.cmake
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!

when gcc / mingw is in the path then everything works fine. So could you provide more information as to your PATH variable or CMAKE version?



标签: cmake