不必要的Ada依赖重新编译(GCC 5.3.0)

时间:2017-03-27 12:49:06

标签: gcc ada gnat

在最近的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的时间戳)正在与依赖目录的gnat.adc的时间戳进行比较,从而导致不匹配和重新编译。删除gnat.adc文件会停止重新编译,但我们在实际程序中需要这些编译指示。看起来我们以前的GCC版本(4.8.2)没有存储gnat.adc时间戳,所以这个问题从未发生过。

无论如何,我们当前的解决方法是将所有gnat.adc文件重命名为gnat.adc.tmp,然后使用gnatmake的配置文件参数(-gnatec = gnat.adc.tmp)指定该文件。 .tmp扩展名会阻止文件在.ali中编入索引,从而解决问题。不过,我真的不喜欢这种kludge,并且希望有更清洁的解决方案。

1 个答案:

答案 0 :(得分:1)

似乎是指定库目录的问题。在目录dependent中,以及在目录dependency中编译后,

$ gnatmake -m -A../dependency dependent.adb 

即,使用-Adir(在没有任何内容的情况下运行时,如gnatmake的输出中所述)。然后,

$ ls
dependent   dependent.adb   dependent.ali   dependent.o gnat.adc