<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 6.7 構建時記錄Git Hash值 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-6/recipe-07 中找到,其中包含一個C++例子。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 前面的示例中,在配置時記錄了代碼存儲庫(Git Hash)的狀態。然而,前一種方法有一個令人不滿意的地方,如果在配置代碼之后更改分支或提交更改,則源代碼中包含的版本記錄可能指向錯誤的Git Hash值。在這個示例中,我們將演示如何在構建時記錄Git Hash(或者,執行其他操作),以確保每次構建代碼時都運行這些操作,因為我們可能只配置一次,但是會構建多次。 ## 準備工作 我們將使用與之前示例相同的`version.hpp.in`,只會對`example.cpp`文件進行修改,以確保它打印構建時Git提交Hash值: ```c++ #include "version.hpp" #include <iostream> int main() { std::cout << "This code has been built from version " << GIT_HASH << std::endl; } ``` ## 具體實施 將Git信息保存到`version.hpp`頭文件在構建時需要進行以下操作: 1. 把前一個示例的`CMakeLists.txt`中的大部分代碼移到一個單獨的文件中,并將該文件命名為`git-hash.cmake`: ```cmake # 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 ) ``` 2. `CMakeLists.txt`熟悉的部分: ```cmake # 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 ) ``` 3. `CMakeLists.txt`的剩余部分,記錄了每次編譯代碼時的`Git Hash`: ```cmake 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) ``` ## 工作原理 示例中,在構建時執行CMake代碼。為此,定義了一個自定義命令: ```cmake 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} ) ``` 我們還定義了一個目標: ```cmake add_custom_target( get_git_hash ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/generated/version.hpp ) ``` 自定義命令調用CMake來執行`git-hash.cmake`腳本。這里使用CLI的`-P`開關,通過傳入腳本的位置實現的。請注意,可以像往常一樣使用CLI開關`-D`傳遞選項。`git-hash.cmake`腳本生成 ` ${TARGET_DIR}/generated/version.hpp `。自定義目標被添加到`ALL`目標中,并且依賴于自定義命令的輸出。換句話說,當構建默認目標時,我們確保自定義命令已經運行。此外,自定義命令將`ALL`目標作為輸出。這樣,我們就能確保每次都會生成` version.hpp`了。 ## 更多信息 我們可以改進配置,以便在記錄的`Git Hash`外,包含其他的信息。檢測構建環境是否“污染”(即是否包含未提交的更改和未跟蹤的文件),或者“干凈”。可以使用`git describe --abbrev=7 --long --always --dirty --tags `檢測這些信息。根據可重現性,甚至可以將Git的狀態,完整輸出記錄到頭文件中,我們將這些功能作為課后習題留給讀者自己完成。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看