6.7 构建时记录Git Hash值
准备工作
#include "version.hpp"
#include <iostream>
int main() {
std::cout << "This code has been built from version " << GIT_HASH << std::endl;
}具体实施
# in case Git is not available, we default to "unknown" set(GIT_HASH "unknown") # find Git and if available set GIT_HASH variable find_package(Git QUIET) if(GIT_FOUND) execute_process( COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h OUTPUT_VARIABLE GIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) endif() message(STATUS "Git hash is ${GIT_HASH}") # generate file version.hpp based on version.hpp.in configure_file( ${CMAKE_CURRENT_LIST_DIR}/version.hpp.in ${TARGET_DIR}/generated/version.hpp @ONLY )# set minimum cmake version cmake_minimum_required(VERSION 3.5 FATAL_ERROR) # project name and language project(recipe-07 LANGUAGES CXX) # require C++11 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD_REQUIRED ON) # example code add_executable(example example.cpp) # needs to find the generated header file target_include_directories(example PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated )add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/version.hpp ALL COMMAND ${CMAKE_COMMAND} -D TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/git-hash.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) # rebuild version.hpp every time add_custom_target( get_git_hash ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/generated/version.hpp ) # version.hpp has to be generated # before we start building example add_dependencies(example get_git_hash)
工作原理
更多信息
Last updated