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

Может ли CMake генерировать скрипты сборки, которые * не * используют cmake?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

SET(CMAKE_SUPPRESS_REGENERATION TRUE)

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

Ответ 3

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

Ответ 4

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

Одна из приятных вещей о CMake заключается в том, что он быстрее строит вещи. Прибегать к тому, чтобы экземпляры оболочки fork для интерпретации script действительно замедляли процесс сборки.

Ответ 5

Как насчет "атомного решения"?

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

Эквивалентный пакетный файл окон, "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)

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

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