См последний обновление статусаadd_custom_command - список зависимостей обновление через перестраивает
начальные условия
- генератор кода, который генерирует набор из C++ источников принимать один входной файл в качестве параметра
- входного файла может включать в себя другие входные файлы
уже решена задача получения списка выходных файлов, разбор входных данных co файлы degen, чтобы получить полный список входных данных codegen. I.e. add_custom_command обеспечивается правильным набором зависимостей впервые:
add_custom_command(OUTPUT ${generatedSources} COMMAND ${codegenCommand} ARGS ${codegenArgs} DEPENDS ${codegenInputFiles})
Проблема сценария
- Действующая система работает хорошо, пока кто-нибудь не изменяет один из входных Codegen файлов включить новый входной файл или удалить из существующего. Этот случай, необходимо обновить список Codegen входного файла предоставленного add_custom_command как зависимости, но я понятия не имею, как
Что недостающую
- возможность обновлять зависимости add_custom_command над проектом перестройки
Есть ли способ решить проблему без полного восстановления проекта?
UPDATE - Альтернативное описание (? Лучше) проблема
I`ve нашел подобное не ответил на вопрос о списке рассылки CMake, разместить его здесь для большей ясности: http://article.gmane.org/gmane.comp.programming.tools.cmake.user/52279
Я пытаюсь получить инструмент генерации кода, чтобы вести себя «так же, как» исходный файл C в отношении зависимостей. Под этим я подразумеваю, предположим, что у вас есть C-файл «a.c». Поскольку он может # включать файлы, каждый раз, когда изменяется содержимое a.c
, его зависимости также могут измениться. Зависимости получают rescanned с -MMD. Я хотел бы каким-то образом подражать этому для моего генератора кода. Сначала я попробовал add_custom_command, который принимает фиксированный список DEPENDS, определенный во время определения пользовательской команды. В частности, я имею в виду что-то вроде этого:
function(add_generated_library)
figure_out_dependencies(deps ${ARGN})
add_custom_command(... DEPENDS ${deps})
endfunction()
Но захватывает только зависимости во время сборки-система поколения. Каждый раз, когда запускается пользовательская команда, список DEPENDS может потребоваться изменить, поскольку изменения могут означать новые зависимости. Как мне это сделать?
UPDATE 2 - Возможное решение
После я считаю факты - есть голоса через сеть относительно Cmake поддержки динамических зависимостей, который требуется для плавной интеграции многих нетривиального кода инструменты поколения - там `нет готовых к использованию оптимальное решение, доступное, как то, что мы на самом деле нужно крюк, чтобы добавить поддержку пользовательских DSL в IMPLICIT_DEPENDS
с Cmake руководство:
Опция IMPLICIT_DEPENDS запрашивает сканирование неявных зависимостей входного файла. Указанный язык указывает язык программирования, на котором должен использоваться соответствующий сканер зависимостей. В настоящее время поддерживаются только сканеры языка C и CXX. Язык должен быть указан для каждого файла в списке IMPLICIT_DEPENDS. Зависимости, обнаруженные при сканировании, добавляются к значениям пользовательской команды во время сборки.
Решение ниже прилипает (надеюсь) следующие критерии:
- избежать не обязательно сканировании зависимости восстановления
- Чтобы не было необходимым кодом генератора работать на перестроения
- позволяют обеспечить функции CMake для клиентов, чтобы зарегистрироваться их модели и генерировать код/создавать библиотеки из этого кода без навязывания каких-либо требований к структуре проекта (т. е. никакого подпроекта, ответственного за создание кода, модели распределяются по иерархии проектов с использованием политики проекта у)
Решение Идея
Это не возможно зарегистрировать пользовательский язык сканер, но можно повторно использовать существующий. Идея состоит в том, что зависимости/иерархия пользовательских файлов моделей отражаются как иерархия файлов заголовков «С». Каждый узел иерархии добавляется при регистрации файла модели, а файл C включает файл модели соответствия. Если файл модели включает в себя изменение, файл C включает в себя изменение. Таким образом, каждый вызов-код будет зависеть только от одного сгенерированного С-заголовка, отражающего пройденную модель. Каждый отраженный файл будет иметь зависимость от файла модели и будет затронут изменение файла модели.
Подводя итог: возможно, моя формулировка не так понятна на данный момент, но в отношении потребностей других людей и сообщества помогли мне исследовать эту проблему, я опубликую общее решение (+ ссылка на github или новый cmake wiki) без моей спецификации проекта, когда она будет готова (через 1-3 дня).
Пожалуйста, посетите [Если вопросы включают «теги» в их названиях?] (Http://meta.stackexchange.com/q/19190). Вы также можете щелкнуть ссылку * Изменено прямо сейчас * или * Отредактировано XXX минут назад *, чтобы узнать, почему было сделано изменение. Он предоставляет историю изменений. – jww
Извините за путаницу, не заметил вашего комментария и решил, что название было изменено каким-то сценарием. Вернуть название, как предлагается – Konstantin
Нет проблем. На сайте есть несколько политик, которые не всегда приемлемы. Мне не нравится эта политика (я даже возражал против нее). – jww