不必要的 Ada 依赖重新编译 (GCC 5.3.0)
Unnecessary Ada dependency recompilations (GCC 5.3.0)
在最近的 GCC 更新后,我们注意到每次构建使用它们的应用程序时,都会重新编译一些预编译的常用函数。这似乎与我们使用 gnat.adc 文件存储编译指示有关。我确实有一个解决方法,但它不是很好,我希望有人能告诉我我是否做错了什么。
目录结构:
~/adatest
-dependency
dependency.ads
dependency.adb
gnat.adc
-dependent
dependent.adb
gnat.adc
文件:
--dependency.ads
package dependency is
procedure donothing;
end dependency;
--dependency.adb
with ada.text_io;
package body dependency is
procedure donothing is
begin
ada.text_io.put_line("Doing nothing");
end;
end dependency;
--dependent.adb
with dependency;
procedure dependent is
begin
dependency.donothing;
end dependent;
gnat.adc 个文件都是空的。
正在编译:
cd ~/adatest/dependency
/usr/gnat/bin/gnatmake -m dependency.adb
ls
dependency.adb dependency.ads dependency.ali dependency.o gnat.adc
cd ../dependent/
/usr/gnat/bin/gnatmake -m dependent.adb -I../dependency
ls
dependency.ali dependency.o dependent dependent.adb dependent.ali dependent.o gnat.adc
所以编译依赖重新编译依赖,即使依赖已经编译。使用 gnatmake 的详细标志,我明白了原因:
gcc -c -I../dependency dependent.adb
"~/adatest/dependency/dependency.ali" being checked ...
-> "gnat.adc" time stamp mismatch
似乎正在将存储在 dependency.ali 中的 gnat.adc 时间戳(即依赖目录 gnat.adc 的时间戳)与依赖目录 [=30] 的时间戳进行比较=],导致不匹配和重新编译。删除任一 gnat.adc 文件都会停止重新编译,但我们在实际程序中需要这些编译指示。看起来我们以前的 GCC 版本 (4.8.2) 没有存储 gnat.adc 时间戳,所以这个问题从未发生过。
无论如何,我们目前的解决方法是将所有 gnat.adc 文件重命名为 gnat.adc.tmp,然后使用 gnatmake 的配置文件参数 (-gnatec=gnat.adc.tmp ). .tmp 扩展名阻止文件在 .ali 中编制索引,从而解决了问题。不过,我真的不喜欢这种拼凑,希望有一个更简洁的解决方案。
好像是指定库目录的问题。在目录 dependent
中,在目录 dependency
、
中编译后
$ gnatmake -m -A../dependency dependent.adb
即,使用 -Adir
(如 gnatmake
的输出中所述,当 运行 没有任何内容时)。那么,
$ ls
dependent dependent.adb dependent.ali dependent.o gnat.adc
在最近的 GCC 更新后,我们注意到每次构建使用它们的应用程序时,都会重新编译一些预编译的常用函数。这似乎与我们使用 gnat.adc 文件存储编译指示有关。我确实有一个解决方法,但它不是很好,我希望有人能告诉我我是否做错了什么。
目录结构:
~/adatest
-dependency
dependency.ads
dependency.adb
gnat.adc
-dependent
dependent.adb
gnat.adc
文件:
--dependency.ads
package dependency is
procedure donothing;
end dependency;
--dependency.adb
with ada.text_io;
package body dependency is
procedure donothing is
begin
ada.text_io.put_line("Doing nothing");
end;
end dependency;
--dependent.adb
with dependency;
procedure dependent is
begin
dependency.donothing;
end dependent;
gnat.adc 个文件都是空的。
正在编译:
cd ~/adatest/dependency
/usr/gnat/bin/gnatmake -m dependency.adb
ls
dependency.adb dependency.ads dependency.ali dependency.o gnat.adc
cd ../dependent/
/usr/gnat/bin/gnatmake -m dependent.adb -I../dependency
ls
dependency.ali dependency.o dependent dependent.adb dependent.ali dependent.o gnat.adc
所以编译依赖重新编译依赖,即使依赖已经编译。使用 gnatmake 的详细标志,我明白了原因:
gcc -c -I../dependency dependent.adb
"~/adatest/dependency/dependency.ali" being checked ...
-> "gnat.adc" time stamp mismatch
似乎正在将存储在 dependency.ali 中的 gnat.adc 时间戳(即依赖目录 gnat.adc 的时间戳)与依赖目录 [=30] 的时间戳进行比较=],导致不匹配和重新编译。删除任一 gnat.adc 文件都会停止重新编译,但我们在实际程序中需要这些编译指示。看起来我们以前的 GCC 版本 (4.8.2) 没有存储 gnat.adc 时间戳,所以这个问题从未发生过。
无论如何,我们目前的解决方法是将所有 gnat.adc 文件重命名为 gnat.adc.tmp,然后使用 gnatmake 的配置文件参数 (-gnatec=gnat.adc.tmp ). .tmp 扩展名阻止文件在 .ali 中编制索引,从而解决了问题。不过,我真的不喜欢这种拼凑,希望有一个更简洁的解决方案。
好像是指定库目录的问题。在目录 dependent
中,在目录 dependency
、
$ gnatmake -m -A../dependency dependent.adb
即,使用 -Adir
(如 gnatmake
的输出中所述,当 运行 没有任何内容时)。那么,
$ ls
dependent dependent.adb dependent.ali dependent.o gnat.adc