Может ли CMake генерировать сценарии сборки, которые * не * используют cmake? - PullRequest
16 голосов
/ 10 июля 2010

Вопрос: Может ли CMake генерировать сценарии сборки, которые никоим образом не используют CMake?Если нет, то насколько сложно потрясти сгенерированный CMake скрипт automake, чтобы не делать никаких проверок против CMake?

Я большой поклонник CMake до такой степени, что я отстаиваю идею, что мы переходим к нему вмоя текущая рабочая средаОдна вещь, которая могла бы облегчить этот переход от нашей текущей системы сборки к CMake, была бы, если бы я мог продемонстрировать, что CMake может генерировать файлы automake, которые сами не требуют cmake.

Ясно, что я бы никогда не хотел делать это в течение дняв наши дни, но возможность легко создать ветку нашего кода, которая может быть собрана из исходного кода без использования cmake, поможет мне в этом.

Ответы [ 5 ]

5 голосов
/ 19 августа 2011

Возможность сделать это зависит от вашей ОС, я полагаю, Unix / Makefile или Winderz / MSVC. Если вы используете MSVC, зависимость cmake должна быть устранена путем объявления опции CMAKE_SUPPRESS_REGENERATION в начале вашего скрипта cmake.

SET(CMAKE_SUPPRESS_REGENERATION TRUE)

В системах на основе Unix, однако, файлы Makefile явно связаны с файлами сборки cmake (CMakeFiles и т. Д.). Я подозреваю, что эта зависимость может быть обойдена стратегическим комментированием директив Makefile, хотя я не могу сказать, какими они могут быть.

5 голосов
/ 12 июля 2010

Нет, CMake не может этого сделать. Это также не имеет смысла, поскольку без поддержки CMake во время сборки не было бы никакой возможности проверить или обновить сами файлы makefiles / project-files, когда изменились файлы CMakeLists.txt.

Если вы переходите с Visual Studio на CMake, вы можете взглянуть на vcproj2cmake .

3 голосов
/ 06 сентября 2010

Сгенерированные CMake файлы зависят от cmake для различных команд, таких как create / remove / etc ... не только для регенерации make-файлов при изменении, поэтому удаление cmake не будет работать.

2 голосов
/ 10 июля 2010

Как человек, который взял большую сложную часть программного обеспечения и недавно вытащил существующую систему сборки, установив новую систему сборки вместо нее. Я могу сказать вам, что это нелегко, но я бы определенно не хотел, чтобы скрипты оболочки были частью моего процесса сборки, если бы их можно было избежать. В любом случае, все больше и больше систем будут работать с CMake, поскольку все больше и больше программных пакетов с такими громкими именами, как LLVM и KDE, начинают его использовать - это область, в которой она действительно принимает большие проекты.

Одна из приятных особенностей CMake - это то, что он строит вещи быстрее. Использование интерпретации сценариев для интерпретации сценария действительно замедляет процесс сборки.

0 голосов
/ 23 сентября 2010

А как насчет «атомного решения»?

EX - автоматически генерирует файл "QT moc" из CMakeLists.txt, а затем создает проект, который зависит от создаваемого файла .cpp

# inside project level CMakeLists.txt 
# run shell script to create the "moc_GUICreator.cpp" auto-generated source file
if(UNIX)
execute_process(COMMAND "sh" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_moc.sh  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts )
endif(UNIX)

Где файл .sh содержит:

# generate_moc.sh
echo "generating moc file:  moc ../include/GUICreator.h  -o  ../src/moc_GUICreator.cpp "
moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp

Эквивалентный пакетный файл Windows, "moc_creator_win.bat":

moc "GUICreator.h" -o "moc_GUICreator.cpp"

Не пробовал этот последний бит в окнах, но он или что-то очень близкое должно работать, сразу послеблок if (UNIX) в CMakeLists.txt:

if(WIN32)
execute_process(COMMAND "cmd" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/moc_creator_win.bat  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts )
endif(WIN32)

Итак, если вы достаточно умны, вы можете делать что угодно из скрипта и использовать переменные CMake в качестве аргументов для него, я неконечно, если вы можете попросить больше ...

смысл состоит в том, чтобы избегать «непереносимых типов сборки», если вам действительно не нужно взламывать его в специализированном компиляторе, или вы не хотите использовать QT Designer дляразместить виджеты; -)

...