Как мы можем заставить CMake генерировать файл .cpp и компилировать библиотеку при каждой сборке?C++

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

Сообщение Anonymous »

В нашем проекте (C++ + CMake) мы пытаемся встроить в строку журнала метку времени сборки проекта. Мы подумали об использовании специальной команды CMake, и нам удалось заставить ее заново генерировать файл .cpp при каждой сборке:

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

####################
# Embed build time #
####################

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
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
)
с помощью простого файлаgenerate_timestamp.py:

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

# generate_timestamp.py
import datetime
import sys

header_file = sys.argv[1]
source_file = sys.argv[2]

now = str(datetime.datetime.now())

h_content = f"""
#pragma once
// File generato automaticamente, non modificare!

extern const char* BUILD_TIMESTAMP;
"""

cpp_content = f"""
#include "timestamp.h"

const char* BUILD_TIMESTAMP = "{now}";
"""

try:
with open(header_file, "w") as f:
f.write(h_content)

with open(source_file, "w") as f:
f.write(cpp_content)

except Exception as e:
print(f"Error: {e}")
sys.exit(1)
Насколько я понимаю, целевой объектgenerate_timestamp_files при вызове повторно создает файл timestamp.cpp; затем его использует библиотека timestamp_lib; наконец, библиотека подключается к нашему основному исполняемому файлу. Теперь файлы .cpp регенерируются, но библиотека, которая их использует, не перекомпилируется каждый раз, и мы не можем понять, почему. Если запустить сборку дважды, всё в порядке (проверка по строкам build/libtimestamp_lib.a | grep 2025), но зачем нам запускать её дважды? Спасибо!


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

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

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

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

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

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