最近の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
をだから、依存関係がすでにコンパイルされたにもかかわらず、依存再コンパイル依存関係をコンパイルします。 (依存関係のディレクトリのgnat.adcのタイムスタンプである)dependency.aliに保存されているgnat.adcタイムスタンプは、タイムスタンプの比較されていることが表示されます
gcc -c -I../dependency dependent.adb
"~/adatest/dependency/dependency.ali" being checked ...
-> "gnat.adc" time stamp mismatch
:なぜgnatmakeの冗長フラグを使用して、私が見ることができます依存ディレクトリのgnat.adcは、不一致と再コンパイルの原因となります。いずれかのgnat.adcファイルを削除すると再コンパイルは停止しますが、実際のプログラムではこれらのプラグマが必要です。以前のGCCバージョン(4.8.2)にはgnat.adcタイムスタンプが保存されていなかったようで、この問題は発生しませんでした。
私たちの現在の回避策は、すべてのgnat.adcファイルの名前をgnat.adc.tmpに変更し、gnatmakeの設定ファイルパラメータ(-gnatec = gnat.adc.tmp)でファイルを指定することです。 .tmp拡張子はファイルが.aliで索引付けされるのを止め、問題を解決します。私はこのkludgeが本当に好きではありませんし、よりクリーンなソリューションがあることを望んでいました。
どのプラグマがパーティション全体であり、どのプラグマがそうでないかを注意する必要があります。 –