2014-06-18 26 views
14

Tôi muốn sử dụng cmake để đặt VERSION thành phiên bản phát hành trong trường hợp bản phát hành bản phát hành và thời gian biên dịch ngược lại.Biên dịch ngày giờ sử dụng cmake

Khi sử dụng làm cho sự phát triển xây dựng, lấy giờ biên dịch đã được dễ dàng qua

-DVERSION=`date +%Y-%m-%d_%H:%M` 

mà có thể được sử dụng thẳng về phía trước theo mã c/C++ nguồn. Thật không may, tôi đã không tìm ra cách tương tự có thể đạt được khi sử dụng cmake.

string(TIMESTAMP VERSION "%Y-%m-%d %H:%M") 
add_definitions(-DVERSION="${VERSION}") 

sets VERSION to the cmake time is taken. Làm thế nào tôi có thể thiết lập VERSION cho thời gian biên dịch khi sử dụng cmake (để tránh phải fiddle với __DATE____TIME__ trong trường hợp không có cờ RELEASE)?

+0

[Đâ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) –

+2

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

Trả lời

3

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 đó.

+1

Xác định bằng dấu gạch dưới hàng đầu * và sau đó * một chữ hoa thực sự không ổn. (Không phải chuyện này quá quan trọng.) – Praxeolitic

1

Có thể bạn có thể sử dụng macro trình biên dịch __DATE____TIME__ bên trong mã của bạn thay vì nhận từ cmake. Đáng nói rằng bạn sẽ cần phải làm sạch/thực hiện để cập nhật các giá trị này (vì GCC nhúng nó, nếu đối tượng đã được biên dịch nó sẽ không biên dịch lại, vì vậy không có thay đổi ngày/giờ)

Các vấn đề liên quan