2012-06-29 2 views
16

Я хотел бы заставить CMake использовать «Unix Makefiles» генератор изнутри CMakeLists.txt.cmake: Выбор генератора в CMakeLists.txt

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

cmake -G "Unix Makefiles" . 

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

cmake . 

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

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

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

set(CMAKE_GENERATOR "Unix Makefiles") 

ответ

2

Это не то, что я получаю, когда я бегу ту же команду, CMake будет искать компилятор GCC/сделать утилиту. Если путь не установлен правильно, это не получится что-то вроде:

 
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?

+0

Поскольку я использую пользовательский инструмент цепь, и у меня есть VC++ установлен, я не могу полагаться на CMake выборе генератора. Я также не знаю, что указать в командной строке, чтобы пользователь мог клонировать и строить проект. – Ted

+1

ОК ... извините, я неправильно понял ваш вопрос.В этом случае я бы рекомендовал разместить CMakeCache.txt в каталог, который в основном пуст, но для переменной CMAKE_GENERATOR. Или вы можете иметь этот файл кеша в своем исходном репозитории и передать его, используя параметр -C cmake. – Frank

7

Мне кажется, что переменная 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 для пользователя ...

+0

Хотелось бы, чтобы пользователь установил всю конфигурацию в 'CMakeLists.txt'. Какой смысл, если вам нужен «.bat»? – Royi

+1

Похож на [ответ Ивана] (https://gitlab.kitware.com/cmake/cmake/issues/17231) делает что-то очень близкое к этому - переменная настраивается в конфигурационном файле cmake, который получен до фактического ' Загружается CMakeLists.txt'. –

8

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

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

+2

Похоже, что поведение 'Preload.cmake' не было зарегистрировано в официальной документации cmake; см. [билет 17231] (https://gitlab.kitware.com/cmake/cmake/issues/17231) - но полезно знать! –

Смежные вопросы