如何使 cmake 将 D 参数传递给 ar 以实现静态库的可重现构建

How to make cmake pass D argument to ar for reproducible build of a static library

我的项目使用 CMake 从相同的 C++ 代码构建静态库和动态库。动态库文件 (.so) 在重建时保持不变,但静态库文件 (.a) 在每次重建时都会发生变化。我开始明白这是因为 ar 工具的行为,我需要传递 D 参数来创建确定性输出。

我发现了一个 cmake 变量 CMAKE_AR,它指向我机器上的 /usr/bin/ar。编译输出显示执行的命令为:/usr/bin/ar qc libfoo.a file1.o file2.o ....

根据 ar 文档,我应该将上述调用更改为 /usr/bin/ar qcD ... 以获得确定性输出。

如何使用 CMake 完成此操作?

我在 Linux 并且需要一个与 CMake >= v3.11

兼容的解决方案

以下为 arranlib 设置参数以生成确定性静态库输出文件:

set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcD <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")