Почему Ninja & CMake выдает ошибку, когда мы создаем файл с неуказанным правилом сборки?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему Ninja & CMake выдает ошибку, когда мы создаем файл с неуказанным правилом сборки?

Сообщение Anonymous »

Мы хотим встроить текущее время сборки нашего проекта C/C++ в наш исполняемый файл (для его регистрации). Поэтому мы генерируем собственный файл cpp при каждой сборке, содержащий временную метку в виде строки, и используем его для создания библиотеки для компоновки. Мы используем CMake с ninja и, поигравшись с CmakeLists.txt, обнаружили что-то странное между этими двумя версиями:

Код: Выделить всё

# version A
find_package(Python3 REQUIRED COMPONENTS Interpreter)

set(TIMESTAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated_timestamp)
set(TIMESTAMP_H ${TIMESTAMP_DIR}/timestamp.h)
set(TIMESTAMP_CPP ${TIMESTAMP_DIR}/timestamp.cpp)
set(TIMESTAMP_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/generate_timestamp.py)

file(MAKE_DIRECTORY ${TIMESTAMP_DIR})

add_custom_target(generate_timestamp_files ALL
BYPRODUCTS ${TIMESTAMP_CPP} ${TIMESTAMP_H}
COMMAND ${Python3_EXECUTABLE} ${TIMESTAMP_SCRIPT} ${TIMESTAMP_H} ${TIMESTAMP_CPP}
DEPENDS ${TIMESTAMP_SCRIPT}
COMMENT "Generating timestamp source and header"
)

set_source_files_properties(
${TIMESTAMP_CPP}
${TIMESTAMP_H}
PROPERTIES
GENERATED TRUE
)

add_library(timestamp_lib
${TIMESTAMP_CPP}
)

add_dependencies(timestamp_lib generate_timestamp_files)

target_include_directories(timestamp_lib
INTERFACE
${TIMESTAMP_DIR}
)

target_link_libraries(
timestamp_lib
)
который запускает:

Код: Выделить всё

cc1plus: fatal error: /home/abertulli//build/generated_timestamp/timestamp.cpp: No such file or directory
compilation terminated.
пока

Код: Выделить всё

# version B

find_package(Python3 REQUIRED COMPONENTS Interpreter)

set(TIMESTAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated_timestamp)
set(TIMESTAMP_CPP ${TIMESTAMP_DIR}/timestamp.cpp)
set(TIMESTAMP_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/generate_timestamp.py)

file(MAKE_DIRECTORY ${TIMESTAMP_DIR})

add_custom_target(generate_timestamp_files
COMMAND ${Python3_EXECUTABLE} ${TIMESTAMP_SCRIPT} ${TIMESTAMP_CPP}
DEPENDS ${TIMESTAMP_SCRIPT}
COMMENT "Generating timestamp source and header"
)

set_source_files_properties(
${TIMESTAMP_CPP}
PROPERTIES
GENERATED TRUE
)

add_library(timestamp_lib
${TIMESTAMP_CPP}
)

add_dependencies(timestamp_lib generate_timestamp_files)

target_include_directories(timestamp_lib
PUBLIC
include
)

target_link_libraries(
timestamp_lib
)
успешно компилируется. Насколько я понимаю, ниндзя требует, чтобы каждый сгенерированный файл имел определенное правило сборки, поэтому версия А дает сбой. Мой вопрос: почему версия B работает?

Подробнее здесь: https://stackoverflow.com/questions/798 ... unspecifie
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»