Giải pháp đa nền tảng của tôi trong lần chạy đầu tiên của CMake tạo một tệp timestamp.cmake
trong thư mục nhị phân và xác định mục tiêu timestamp
chạy tệp được tạo. Các tập tin timestamp.cmake
tạo thành một chuỗi tem thời gian ISO 8601 bằng cách sử dụng lệnh STRING
CMake và ghi nó vào một tệp timestamp.h
với một chỉ thị tiền xử lý #define _TIMEZ_
được thêm vào trước (xác định với một dấu gạch dưới hàng đầu là không sao, xác định với hai dấu gạch dưới hàng đầu không nên do người dùng xác định).
Bao gồm các thông tin sau trong tệp CMake chính của bạn.
# build time in UTC ISO 8601
FILE (WRITE ${CMAKE_BINARY_DIR}/timestamp.cmake "STRING(TIMESTAMP TIMEZ UTC)\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/timestamp.cmake "FILE(WRITE timestamp.h \"#ifndef TIMESTAMP_H\\n\")\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/timestamp.cmake "FILE(APPEND timestamp.h \"#define TIMESTAMP_H\\n\\n\")\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/timestamp.cmake "FILE(APPEND timestamp.h \"#define _TIMEZ_ \\\"\${TIMEZ}\\\"\\n\\n\")\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/timestamp.cmake "FILE(APPEND timestamp.h \"#endif // TIMESTAMP_H\\n\")\n")
ADD_CUSTOM_TARGET (
timestamp
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/timestamp.cmake
ADD_DEPENDENCIES ${CMAKE_BINARY_DIR}/timestamp.cmake)
Sau đó sử dụng ADD_DEPENDENCIES
CMake lệnh để thực hiện mục tiêu chính của bạn (có lẽ là tập tin thực thi chính) phụ thuộc vào mục tiêu timestamp
. Nó luôn luôn được coi là lỗi thời bởi CMake, do đó, nó đang được làm mới mỗi khi mục tiêu chính xây dựng lại, làm mới thời gian xây dựng, theo yêu cầu.
ADD_DEPENDENCIES (${CMAKE_BINARY_DIR}/${BINARY_NAME} timestamp)
Bạn có thể chỉ định nhiều phụ thuộc bổ sung được phân cách bằng khoảng trắng với lệnh này, nếu bạn cần.
Sau đó, bạn chỉ #include "timestamp.h"
thể (giả định rằng CMake nhị phân dir là trong bao gồm đường, mà thường là Nếu không, đó là đơn giản:. INCLUDE_DIRECTORIES (${CMAKE_BINARY_DIR})
), và sử dụng _TIMEZ_
bất cứ khi nào bạn muốn có tem thời gian xây dựng trong ISO 8601 định dạng (hoặc, trên thực tế, bất cứ điều gì bạn thích: bạn có thể chỉ định nó cho mình, see CMake documentation for STRING
command usage).
Điều này có thể đã được thực hiện đơn giản hơn bằng cách trực tiếp (bằng tay) tạo tệp timestamp.cmake
và thêm nó vào kho lưu trữ mã của bạn, nhưng tôi đã coi nó là không đủ sạch. Đó là nhược điểm chung của CMake bạn không thể truy cập thủ tục tạo chuỗi tem thời gian (được sử dụng trong lệnh STRING
CMake) ở giai đoạn phụ trợ của CMake, bất kể nó là gì (ví dụ, GNU make) chạy vì vậy người ta phải sử dụng tập tin CMake riêng biệt và gọi nó ở giai đoạn đó. Điều này có thể đã được thực hiện đơn giản hơn nhiều và sạch hơn nếu bạn có thể gọi thủ tục tạo chuỗi tem thời gian CMake trong "chế độ lệnh CMake" (cmake -E
loại yêu cầu), ví dụ như: cmake -E date [format] [UTC]
, nhưng than ôi. Tôi đã filed a ticket in the CMake's Mantis bug tracker.
Bạn có thể giúp điều đó xảy ra bằng cách hỗ trợ yêu cầu tính năng của tôi đăng một số nhận xét hiển thị số tiền bạn cần trên đó.
[Đây là câu trả lời hữu ích] (http : //stackoverflow.com/questions/13419255/how-to-get-cmake-to-create-timestamp-file-after-an-actual-build-link-do-nothin) cho vấn đề của bạn. Bạn sẽ cần phải đảm bảo rằng bạn có một số lệnh như 'ngày' có sẵn với môi trường xây dựng máy chủ lưu trữ của bạn. Một giải pháp chung bằng cách sử dụng macro '__DATE__' và' __TIME__' cũng sẽ dễ dàng bằng cách chỉ cung cấp tệp tiêu đề chứa các định nghĩa cần thiết, được tạo (hoặc ít được chạm) trên mỗi bản dựng (như một hành động dựng sẵn) –
nói, mục đích của một số phiên bản là để có thể * tái tạo các tệp nguồn chính xác mà một tệp nhị phân đã được tạo với *. Như vậy, sử dụng dấu thời gian của * biên dịch * là một sự lựa chọn rất, rất ** rất kém. Chỉ định và duy trì các số phiên bản thích hợp, hoặc nếu bạn không thể làm phiền điều đó, hãy sử dụng một cái gì đó từ phần mềm điều khiển phiên bản của bạn (chi nhánh/sửa đổi cho SVN, hashcode cho GIT). Chỉ cần không sử dụng dấu thời gian biên soạn, nó thậm chí còn tồi tệ hơn là không có phiên bản nào cả, bởi vì bạn có thể có một trình biên dịch mới hơn các nguồn cũ hơn, điều này sẽ gây nhầm lẫn cho mọi người kể cả chính bạn. – DevSolar