不必要的 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