在最近的GCC更新之後,我們注意到我們的一些預編譯的通用函數在每次構建應用程序時都會被重新編譯。它似乎與我們使用gnat.adc文件來存儲編譯指示相關。我有一個解決方法,但它並不漂亮,我希望有人能告訴我我是否做錯了什麼。不必要的Ada依賴重編譯(GCC 5.3.0)
目錄結構:
~/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中編入索引,從而解決問題。儘管如此,我並不喜歡這種混合物,並希望有一個更清潔的解決方案。
你必須小心哪些編譯指示是分區範圍的,哪些不是。 –