2017-03-27 36 views
1

在最近的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中編入索引,從而解決問題。儘管如此,我並不喜歡這種混合物,並希望有一個更清潔的解決方案。

+0

你必須小心哪些編譯指示是分區範圍的,哪些不是。 –

回答

1

這似乎是指定庫目錄的問題。在目錄dependent,和編譯後,在目錄dependency

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

即,使用-Adir(如當沒有任何運行中的gnatmake輸出描述)。然後,

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