如何使 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
兼容的解决方案
以下为 ar
和 ranlib
设置参数以生成确定性静态库输出文件:
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcD <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
我的项目使用 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
兼容的解决方案以下为 ar
和 ranlib
设置参数以生成确定性静态库输出文件:
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcD <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")