Как сгенерировать CMakeLists.txt?

Мне нужны некоторые указатели / советы о том, как автоматически генерировать файлы CMakeLists.txt для CMake. Кто-нибудь знает о существующих генераторах? Я проверил те, которые перечислены в CMake Wiki , но, к сожалению, они мне не подходят.

У меня уже есть базовый скрипт Python, который просматривает структуру каталогов моего проекта и генерирует необходимые файлы, но сейчас он действительно «тупой». Я хотел бы дополнить его, чтобы учесть, например, различные платформы, для которых я создаю, компилятор \ кросс-компилятор, который я использую, или различные версии зависимостей библиотек, которые у меня могут быть. У меня нет большого опыта работы с CMake, и пример, на котором я мог бы основывать свою работу, или уже работающий генератор мог бы мне очень помочь.

50
задан celavek 2 August 2011 в 04:28
поделиться

1 ответ

Я поддерживаю программную среду C++, которая имеет больше чем 1 000 модулей (совместно использованные, статические библиотеки, программы) и использует больше чем 20 третьих лиц (повышение, openCV, QT, Qwt...). Эта программная среда размещает много программ (~50), каждый берущий некоторые библиотеки, программы и третьих лиц. Я использую CMake для генерации make-файлов, и это является действительно большим.

Однако, если Вы пишете Ваш CMakeLists.txt, поскольку рекомендуется сделать (объявляют модуль, как являющийся библиотекой/программой, импортируя исходные файлы, добавляя зависимости...). Я соглашаюсь с celavek: поддержание их CMakeLists.txt файлы является реальной болью:

  • , Когда Вы добавляете новый файл к модулю, необходимо обновить CMakeLists.txt
  • при обновлении третьего лица необходимо обновить CMakeLists.txt из всех модулей с помощью него
  • , Когда Вы добавляете новую зависимость (библиотека A теперь библиотека потребностей B), Вы, возможно, должны обновить CMakeLists.txt из всех программ с помощью A
  • , Когда Вы хотите, чтобы новые глобальные настройки были изменены (параметр компилятора, предварительно определенная переменная, используемый стандарт C++), необходимо обновить весь Ваш CMakeLists.txt

Затем я вижу две стратегии адресовать те проблемы и вероятно ту, упомянутую OP.

1-Имеют CMakeLists.txt быть правильно написанным и быть достаточно умным, чтобы не иметь замороженный behaviourto, обновляют себя на лету . Это - то, что мы имеем в нашей программной среде. Каждый модуль имеет стандартизированную структуру файлов (источники находятся в [1 112] папка, включает, находятся в [1 113] папка...), и имейте простые текстовые файлы для определения их зависимостей (с ключевыми словами, которые мы определили, как [1 114], чтобы сказать, что модуль должен связаться с [1 115]). Затем наш CMakeLists.txt файл с двумя строками и просто называет cmake макрос, который мы записали для автоматической установки модуля. Как MCVE, который был бы:

CMakeLists.txt:

include( utl.cmake )
add_module( "mylib", lib )

utl.cmake:

macro( add_module name what )
    file(GLOB_RECURSE source_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
    if ( what STREQUEL "lib" )
        add_library( ${name} SHARED ${source_files} )
    elseif ( what STREQUEL "prg" )
        add_executable( ${name} ${source_files} )
    endif()
    # TODO: Parse the simple texts files to add target_link_libraries accordingly
endmacro()

Затем для всех ситуаций, выставленных выше, просто необходимо обновить utl.cmake, не тысячу из [1 117], Вы имеете...

Честно, мы очень довольны этим подходом, система становится очень легкой поддержать, и мы можем легко добавить новые зависимости, обновить третьих лиц, изменить некоторые стратегии сборки/зависимости...

Однако там остается большим количеством из [1 118] сценарии, которые будут записаны. И CMake язык сценария сосет... инструмент, очень мощный, правильный, но переменный объем сценария, кэш, болезненное и не так хорошо зарегистрированный синтаксис (только, чтобы проверить, пуст ли список, необходимо спросить, поскольку это - размер и хранит это в переменной!), факт, это не объектно-ориентировано..., делает это реальной болью для поддержания.

Так, я теперь убежден, что очень хороший подход может быть к:

2-completly генерируют CMakeLists.txt с более мощного языка как Python. Сценарий Python сделал бы вещи, подобные тому, что делает наш utl.cmake, вместо этого он генерировал бы CMakeLists.txt готовый быть переданным инструментом CMake (с форматом, как предложено в HelloWorld, никакой переменной, никакая функция.... он только вызовет стандартную функцию CMake).

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

Это, вероятно, будет v2 нашей программной среды... однажды.

Примечание: Кроме того, если Вы хотите поддерживать и qmake и cmake, например, правильно написанный сценарий Python мог бы генерировать и CMakeLists и про файлы по требованию!

1
ответ дан 7 November 2019 в 11:07
поделиться