cmake add_custom_command зависит от библиотеки объектов - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь сгенерировать файл версии, используя cmake, используя add_custom_command.Я только хочу, чтобы файл версии создавался (пере), если другая цель (библиотека объектов) имела какие-либо изменения.

Вот мой текущий упрощенный файл CMakeLists.txt:

cmake_minimum_required(VERSION 3.1)
project (version-test)

# Object file compilation target.
add_library(version-test-objects OBJECT main.cpp)

# Version object file target.
add_custom_command(OUTPUT version.cpp
    COMMAND date "+char const *getVersion\\\(\\\) { return \\\"%Y-%m-%d %H:%M:%S\\\"\; }"
    > version.cpp
    DEPENDS version-test-objects
)
add_library(version-test-version OBJECT
    version.cpp
)

# Binary target.
add_executable(version-test
    $<TARGET_OBJECTS:version-test-objects>
    $<TARGET_OBJECTS:version-test-version>
)

И дляПолнота моего упрощенного main.cpp:

#include <iostream>

extern char const *getVersion();

int main() {
    std::cout << getVersion() << std::endl;
}

version.cpp генерируется нормально вместе с первой сборкой.Однако изменения в источнике (например, touch main.cpp) перестраивают только version-test-objects и связывают исполняемый файл, без регенерации version.cpp.

Как я могу заставить cmake регенерировать version.cpp тогда и только тогда, когда version-test-objects были какие-либо изменения?

1 Ответ

0 голосов
/ 29 мая 2019

DEPENDS version-test-objects указывает только зависимость целевого уровня, что означает, что эта команда потенциально может быть запущена после построения цели version-test-objects.Вы заявили, что команда должна выполняться всякий раз, когда обновляется любая часть объектного файла version-test-objects.Так что они также должны быть перечислены в DEPENDS.Это можно считать ошибкой, касающейся различий между библиотеками OBJECT и обычными библиотеками.

# Version object file target.
add_custom_command(OUTPUT version.cpp
    COMMAND date "+char const *getVersion\\\(\\\) { return \\\"%Y-%m-%d %H:%M:%S\\\"\; }"
    > version.cpp
    DEPENDS version-test-objects $<TARGET_OBJECTS:version-test-objects>
)

Это работает для меня, используя генератор Makefile CMake 3.13.Это может не работать в версиях CMake 3.8 или более ранних, поскольку в примечаниях к выпуску говорится, что это выражение не было добавлено до 3.9.В этом случае вам, вероятно, нужно создать фиктивный архив, который использует все объекты, а затем использовать его как зависимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...