使用 CMake 构建确定性库

Deterministic Library Build Using CMake

我创建了一个简单的 CMake C++ 库示例,我想让它的构建具有确定性(即同一台机器上的相同代码总是生成具有相同文件哈希的相同库)。

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)存档中每个目标文件的时间戳,但仍然保留一个时间戳。

差异:

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

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)