bugfix> c++ > 投稿

簡単なCMakeC ++ライブラリの例を作成し、そのビルドを決定論的にしたいと思います(つまり、同じマシンの同じコードが常に同じファイルハッシュで同じライブラリを生成します)。

Main.cpp

#include <iostream>
int main()
{
        std::cout << "Hello World!" << std::endl;
        return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(Test)
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> -rD <TARGET> <LINK_FLAGS> <OBJECTS>")
add_library(Test Main.cpp)

これをビルドすると、libTest.aファイルにタイムスタンプが含まれているため、非決定論的です。 「ar」の「D」決定的モード(CMakeLists.txtの3行目)を見つけました。アーカイブ内の各オブジェクトファイルのタイムスタンプが更新されます(0に設定されます)が、まだ1つのタイムスタンプが残っています。

相違:

user@ip:/x01/user/myWork/test/build>diff <(strings libTest.a) <(strings ../backup/libTest.a)
2c2
< /               1596642127  0     0     0       14        `
---
> /               1596641163  0     0     0       14        `

もちろん、後でアーカイブを編集してタイムスタンプを削除することはできますが、CMakeに別の方法はありますか?

ツールバージョン:

ar --version
GNU ar version 2.27-41.base.el7
gcc --version
gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
cmake --version
cmake version 3.12.2
make --version
GNU Make 3.82
Built for x86_64-redhat-linux-gnu

回答 1 件
  • CMAKE_CXX_ARCHIVE_FINISHは私のために働いた。

    CMakeLists.txt:

    cmake_minimum_required(VERSION 3.10)
    project(Test)
    SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> -crD <TARGET> <LINK_FLAGS> <OBJECTS>")
    SET(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> -rD <TARGET> <LINK_FLAGS> <OBJECTS>")
    SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
    add_library(Test Main.cpp)
    
    

あなたの答え