如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库
Posted
技术标签:
【中文标题】如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库【英文标题】:How to make cmake pass D argument to ar for reproducible build of a static library 【发布时间】:2021-06-02 09:21:14 【问题描述】:我的项目使用 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 兼容的解决方案
【问题讨论】:
您可以将其他选项添加到CMAKE_STATIC_LINKER_FLAGS
变量中,例如set(CMAKE_STATIC_LINKER_FLAGS "$CMAKE_STATIC_LINKER_FLAGS D")
@vre 那行不通。结果是:/usr/bin/ar qc libfoo.a D file1.o file2.o ...
.
这个问题提供了额外的信息和一个可能的解决方案***.com/questions/62339192/…
@vre 非常感谢该链接。尽管其中的方法不太奏效,但有一个指向 CMake git repo 的链接有所帮助。 set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcD <TARGET> <LINK_FLAGS> <OBJECTS>")
似乎可以解决问题
【参考方案1】:
以下工作为ar
和ranlib
设置参数以生成确定性静态库输出文件:
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcD <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
【讨论】:
以上是关于如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库的主要内容,如果未能解决你的问题,请参考以下文章