ar:不保留文件修改时间
ar: not keeping file modification times
我有一个 docker 实例 运行 Ubuntu 16.4 LTS。我正在进行 C++ 构建并使用 ar/ranlib 生成我的 .a 文件。这正在丢失文件修改时间。
这是我管理归档文件的 Makefile 规则:
${LIB}: ${LIB_OBJ}
ar -cvr ${LIB} ${LIB_OBJ}
ranlib ${LIB}
之后有一点输出:
^ ar tv libmylib.a
rw-r--r-- 0/0 129000 Jan 1 00:00 1970 XMLStringWriter.o
rw-r--r-- 0/0 99664 Jan 1 00:00 1970 FileUtilities.o
...
^ ar --version
GNU ar (GNU Binutils for Ubuntu) 2.26.1
^ ranlib --version
GNU ranlib (GNU Binutils for Ubuntu) 2.26.1
系统时间正确,.o文件有正确的更新时间。此外,我在 Mac 上对 运行 进行了相同的构建,生成的 libmylib-mac.a 具有正确的更新时间和完全相同的 Makefile,只是不同的 LIB 目标。
这不会造成任何实际问题,但很烦人。我没有看到用于 ar 命令的选项,网络搜索也没有找到明显的讨论。
解决方案?
此外,我是否应该删除 ranlib 命令并添加 -s(小写 s)选项以强制构建符号 table?
Ubuntu 有一个绝妙的想法,即让 -D
选项成为 ar
的默认选项是个好主意。 AFAICS,这完全是令人讨厌的事情,为了对我没有任何好处的东西打破了 40 多年的 Unix 历史——这非常令人讨厌。
-D
选项用于'deterministic'模式,使存档中文件的UID、GID和修改时间都为0(并且对所有文件使用一致的文件模式)。 'do not operate in deterministic mode' 的备选方案是 -U
。似乎没有可以设置为在模式之间进行选择的环境变量或类似变量。
实际上,它可能不仅仅是 Ubuntu — 有关描述,请参阅 Linux 手册中的 ar(1)
。但是,Linux 手册提到:
If binutils was configured with --enable-deterministic-archives
,
then this mode is on by default. It can be disabled with the U
modifier, below.
事实上,Ubuntu 手册有相同的词,但 Ubuntu 选择将其设为默认值 — 我认为这个决定没有帮助 counter-productive。
我有一个 docker 实例 运行 Ubuntu 16.4 LTS。我正在进行 C++ 构建并使用 ar/ranlib 生成我的 .a 文件。这正在丢失文件修改时间。
这是我管理归档文件的 Makefile 规则:
${LIB}: ${LIB_OBJ}
ar -cvr ${LIB} ${LIB_OBJ}
ranlib ${LIB}
之后有一点输出:
^ ar tv libmylib.a
rw-r--r-- 0/0 129000 Jan 1 00:00 1970 XMLStringWriter.o
rw-r--r-- 0/0 99664 Jan 1 00:00 1970 FileUtilities.o
...
^ ar --version
GNU ar (GNU Binutils for Ubuntu) 2.26.1
^ ranlib --version
GNU ranlib (GNU Binutils for Ubuntu) 2.26.1
系统时间正确,.o文件有正确的更新时间。此外,我在 Mac 上对 运行 进行了相同的构建,生成的 libmylib-mac.a 具有正确的更新时间和完全相同的 Makefile,只是不同的 LIB 目标。
这不会造成任何实际问题,但很烦人。我没有看到用于 ar 命令的选项,网络搜索也没有找到明显的讨论。
解决方案?
此外,我是否应该删除 ranlib 命令并添加 -s(小写 s)选项以强制构建符号 table?
Ubuntu 有一个绝妙的想法,即让 -D
选项成为 ar
的默认选项是个好主意。 AFAICS,这完全是令人讨厌的事情,为了对我没有任何好处的东西打破了 40 多年的 Unix 历史——这非常令人讨厌。
-D
选项用于'deterministic'模式,使存档中文件的UID、GID和修改时间都为0(并且对所有文件使用一致的文件模式)。 'do not operate in deterministic mode' 的备选方案是 -U
。似乎没有可以设置为在模式之间进行选择的环境变量或类似变量。
实际上,它可能不仅仅是 Ubuntu — 有关描述,请参阅 Linux 手册中的 ar(1)
。但是,Linux 手册提到:
If binutils was configured with
--enable-deterministic-archives
, then this mode is on by default. It can be disabled with theU
modifier, below.
事实上,Ubuntu 手册有相同的词,但 Ubuntu 选择将其设为默认值 — 我认为这个决定没有帮助 counter-productive。