Я хочу запустить команду cmake, которая анализирует все исходное дерево, поэтому я не могу перечислить все возможные зависимости в командах cmake add_custom_command/add_custom_target.
Можно ли сказать cmake просто запустить команду без каких-либо условий? Я пробовал все решения, найденные в сети (включая SO), но все они предполагают, что команда зависит от нескольких известных файлов, которые находятся в актуальном состоянии.
Я нашел решение, но оно не работает надежно:
cmake_minimum_required(VERSION 2.6)
project(main)
add_custom_command(
OUTPUT file1
COMMAND echo touching file1
COMMAND touch file1
DEPENDS file2)
add_custom_target(dep ALL DEPENDS file1 file2)
# this command re-touches file2 after dep target is "built"
# and thus forces its rebuild
ADD_CUSTOM_COMMAND(TARGET dep
POST_BUILD
COMMAND echo touching file2
COMMAND touch file2
)
и это выводится:
[email protected]:~/testlib$ make
[100%] Generating file1
touching file1
touching file2
[100%] Built target dep
[email protected]:~/testlib$ make
[100%] Generating file1
touching file1
touching file2
[100%] Built target dep
[email protected]:~/testlib$ make
touching file2
[100%] Built target dep
[email protected]:~/testlib$
Как вы можете видеть, на третьем запуске он не сгенерировал файл1, хотя файл2 был тронут ранее. Иногда это происходит каждый второй раз, иногда каждый третий, иногда каждый четвертый. Это ошибка? Есть ли другой способ запустить команду без какой-либо зависимости в cmake?
Странно, но если я добавлю TWO команды для повторного касания файла2, т.е. просто скопируйте-вставьте команду post-build, она работает надежно. Или, может быть, он провалится каждый 1000-й запуск, я еще не уверен, -)