ja przeniesiony moje pokolenie ciąg wersji do własnego scenariusza CMake że nazywam się ${CMAKE_COMMAND} -P ...
w add_custom_command()
/add_custom_target()
i uczynić mój cel stosując to zależy od niego.
W twoim przypadku powiedzmy masz DateToVersionH.cmake
skrypt tak:
string(TIMESTAMP _date "%d %m %Y %H:%M")
file(WRITE ${VERSION_FILE_NAME} "#define MY_VERSION \"Bla-bla-bla ${FOOBAR} built on ${_date}\"\n")
można zrobić coś takiego:
add_custom_command(
TARGET MyExe
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -DVERSION_FILE_NAME=Version.h -DFOOBAR="${FOOBAR}" -P "${CMAKE_CURRENT_LIST_DIR}/DateToVersionH.cmake"
)
Zobacz także use CMake to get build-time svn revision
To może nie wystarczyć, jeśli twoje środowisko make sprawdza wszystkie "potrzeby przebudowania" przed wywołaniem niezbędnych kroków (np. w Ninja tylko wyjścia poleceń niestandardowych są ponownie skanowane; aby uzyskać więcej informacji, zobacz Ninja documentation dla zmiennej reguły i this discussion, co doprowadziło do wprowadzenia opcji BYPRODUCTS
w add_custom_command()).
Można więc po prostu dodać do skryptu powłoki kompilacji - przed wywołaniem faktycznego make - usunięcie pliku obiektu zawierającego informacje o wersji.
Albo wymuszasz ponowną kompilację obiektu przed połączeniem. Byłoby to - przy założeniu, że masz Version.c
który zawiera Version.h
- wyglądać tak:
include_directories(${CMAKE_CURRENT_BINARY_DIR})
execute_process(COMMAND "${CMAKE_COMMAND}" -DVERSION_FILE_NAME=Version.h -DFOOBAR="${FOOBAR}" -P "${CMAKE_CURRENT_LIST_DIR}/DateToVersionH.cmake")
add_library(MyVersionObj OBJECT Version.c)
add_executable(MyExe ... $<TARGET_OBJECTS:MyVersionObj>)
add_custom_command(
TARGET MyExe
PRE_LINK
COMMAND "${CMAKE_COMMAND}" -DVERSION_FILE_NAME=Version.h -DFOOBAR="${FOOBAR}" -P "${CMAKE_CURRENT_LIST_DIR}/DateToVersionH.cmake"
COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_BINARY_DIR}" --config $<CONFIG> --target "MyVersionObj"
)
Myśląc o tym, po prostu usuwając plik obiektowy i wykorzystując aktualna __DATE__
rozwiązanie jest najprostszym rozwiązaniem.
Dla innej wersji rozwiązania "git" zobaczyć CMake: Automatically use git tags as version strings i How can I pass git SHA1 to compiler as definition using cmake?
Witam @uranix !!! Czy mógłbym zapytać cię o kalkulację błędu zastosowanej metody? http://chat.stackexchange.com/rooms/31813/calculation-of-error –