Подтвердить что ты не робот

Cmake: выбор генератора в CMakeLists.txt

Я хотел бы заставить CMake использовать "Unix Makefile" генератор из CMakeLists.txt.

Это команда, которую я использую сейчас.

cmake -G "Unix Makefiles" .

Я бы хотел, чтобы это было.

cmake .

При работе в Windows с установленным VC и пользовательской цепочкой инструментов.

Я ожидаю, что смогу установить генератор в файл CMakeLists.txt.

Возможно, что-то вроде этого.

set(CMAKE_GENERATOR "Unix Makefiles")
4b9b3361

Ответ 1

Мне кажется, что переменная CMAKE_GENERATOR установлена ​​слишком поздно, если она установлена ​​в CMakeLists.txt. Если вы используете (даже в начале CMakeLists.txt)

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

вы можете видеть на выходе что-то вроде

% 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

Таким образом, переменная устанавливается только в самом конце процедуры генерации. Если вы используете что-то вроде

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

в CMakeLists.txt, то в самом первом запуске cmake ../source (без -G) используется генератор по умолчанию. Однако переменная CMAKE_GENERATOR сохраняется в кеше. Поэтому, если вы повторно запустите cmake ../source после этого, он будет использовать генератор, как указано в переменной CMAKE_GENERATOR в кеше.

Это, конечно, не самое изящное решение, хотя;-) Возможно, используйте командный файл, который фактически выполнит cmake -G generator для пользователя...

Ответ 2

Вот что сработало для меня - создайте в файле проекта файл PreLoad.cmake, содержащий это:

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

Ответ 3

Это не то, что я получаю, когда я запускаю ту же команду, cmake будет искать утилиту gcc компилятор /make. Если PATH не настроен правильно, он не сработает с чем-то вроде:

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!

когда gcc/mingw находится на пути, все работает отлично. Так можете ли вы предоставить дополнительную информацию о своей переменной PATH или версии CMAKE?