2015-07-21 3 views
0

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

По некоторым причинам (описанным ниже для любопытных) у меня уже есть набор файлов include, содержащих информацию об исходных файлах, необходимых для каждого целевого объекта CMake (lib или exe), и на данный момент я предпочитаю (re) использовать эти файлы (причина также описана ниже)

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

Но теперь проблема: Очевидно, что я хочу, чтобы каждая цель CMakeLists.txt зависела от конкретного файла include, который генерирует список исходных файлов, так что изменения во включенном файле будут обнаружены, как если бы они были изменения в самом CMakeLists.txt, но я просто не могу найти ссылок на то, как это сделать.

N.B .: Я нашел AddFileDependencies, но это для добавления зависимостей к исходным файлам, а не к CMakeLists.txt. Тем не менее, сам CMake может определить зависимости от включенного файла .cmake, поэтому, как я понял, должно быть что-то сделать.

Фон для любопытных:
Для этого проекта (достаточно большое количество библиотек, используемых довольно многих исполняемых целей, все организовано как подпроектов) Я использую QMAKE (без фактического использования самого Qt) для создания мейкфайлы , Сделав это, я смог использовать Qt Creator, все еще имея возможность генерировать файлы Visual Studio Solution/Project автоматически. Мы также продолжаем оценивать различные IDE, и выбор еще не сделан. Но самая важная причина использования генератора, такого как QMake/CMake, не была принудительно настроена для VS-файлов для всех этих подпроектов вручную.

Несмотря на то, что иногда мне приходилось обходиться с QMake, чтобы делать то, что я хотел, дела обстояли довольно хорошо - даже для решения VS - за исключением одного: Visual Studio зависает зависимостями от Flex/Bison и других файлов, используя пользовательские правила сборки , Он продолжает перекомпилировать Flex/Bison/другие файлы, говорящие «изменение командной строки» - это я отказался от попытки исправить.

По этой причине я бы попробовал CMake как генератор, который выглядит очень многообещающим до сих пор - хотя в наши дни не было встроенной предварительно скомпилированной поддержки заголовков в CMake, (в отличие от темы, я знаю).

С поддержкой Qt Creators поддержка CMake на сегодняшний день не так хороша, как поддержка проектов QMake. Я использовал finggured, используя подход анализа файлов .pri, содержащих список исходных файлов, позволит мне использовать QMake и CMake бок о бок - тем более, что остальные параметры проекта довольно сложны, чем в большинстве проектов с открытым исходным кодом.

+0

Если вы хотите, чтобы исполняемый файл перекомпилировался, когда его файл прямого или косвенного включения был изменен, он автоматически выполняет CMake (по крайней мере, для языков C и C++). – Tsyvarev

ответ

0

Есть хороший трюк, который делает именно то, что вам нужно.Она основана на идее, которую я обнаружил в ГИТ-ревизии модуля @rpavlik see this so question

Это общая идея:

  • Создание фиктивной временной метки файла
  • Добавить пользовательскую команду, которая затрагивает метку времени когда это входные .pri файла изменяется
  • включить файл временной метки в вашем CMakeLists.txt

возможных осущий ementation:

set(input_pri_file <path-to-the-input-pri-file>) 
set(timestamp_file ${CMAKE_CURRENT_BINARY_DIR}/timestamp.cmake) 

add_custom_command(
    OUTPUT ${timestamp_file} 
    COMMAND ${CMAKE_COMMAND} -E touch ${timestamp_file} 
    MAIN_DEPENDENCY ${input_pri_file} 
    VERBATIM 
    COMMENT "Updating timestamp.cmake" 
) 

if(NOT EXISTS "${timestamp_file}") 
    file(WRITE ${timestamp_file} "") # create initial empty file 
endif() 
include(${timestamp_file}) 

# create the file list from input_pri_file 
.... 
# use the file list 
add_executable(main ${filelist}) 

Вот что происходит, когда .pri изменения файла:

  • изменение вызывает выполнение пользовательской команды
  • который обновляет метку времени
  • потому что CMakeLists включает метку времени это зависит от него
  • поэтому обновление временной метки вызывает повторную настройку CMakeLists.txt
0

Я использую configure_file(), если у меня есть вход, который должен перезапустить процесс настройки CMake. См. How to make CMake reconfiguration depend on custom file? и configure_file()'s unit test

Так что в вашем случае это будет выглядеть примерно так:

configure_file(SomeInput.pri ${CMAKE_CURRENT_BINARY_DIR}/SomeInput.pri) 

Затем вы используете ${CMAKE_CURRENT_BINARY_DIR}/SomeInput.pri для создания источников. Просто убедитесь, что вы делаете не добавьте COPYONLY, потому что тогда конфигурация не будет перезапускаться при изменениях SomeInput.pri.

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