自動スケジュールでコードをコンパイルし、コードがコードでコンパイルされた時刻を使用する必要があります。現在私は__DATE__
、__TIME__
のマクロを使用してコンパイル時の日付と時刻を取得しています。しかし、これは、ソースに変更が加えられていなくても(コンパイル時にマクロが膨らんでしまう)、バイナリが変更されてしまいます。これは、変更がなければバイナリが変更されたと思うようにはしませんソースに)。
ソースを変更する手段を使用せずにコンパイル時間を取得することは可能ですか?
おかげ
自動スケジュールでコードをコンパイルし、コードがコードでコンパイルされた時刻を使用する必要があります。現在私は__DATE__
、__TIME__
のマクロを使用してコンパイル時の日付と時刻を取得しています。しかし、これは、ソースに変更が加えられていなくても(コンパイル時にマクロが膨らんでしまう)、バイナリが変更されてしまいます。これは、変更がなければバイナリが変更されたと思うようにはしませんソースに)。
ソースを変更する手段を使用せずにコンパイル時間を取得することは可能ですか?
おかげ
標準__DATE__
と__TIME__
マクロは、あなたが観察する何を、時間依存の文字列を返します。
これはシステム(とおそらくコンパイラ)、特にビルドシステム(GNU makeなど)に依存します。
可能アイデアは、別々のタイムスタンプファイルに(make
構文で)のようなものをリンクすることができ
timestamp.c:
date +'const char timestamp[]="%c";' > [email protected]
program: $(OBJECTS) timestamp.c
$(LINKER.cc) $^ -o [email protected] $(LIBES)
rm -f timestamp.c
timestamp.o
はその後に再生されるだろうし、あなたのprogram
は、すべてのmake
で再リンク(このように生成されますプログラムは実際に変更されますが、コードの大部分 - $(OBJECTS)
を通して変数は変更されません)。
いくつかのデータベースまたはテキストログファイルの中に、リンクする時間を記録する。
program: $(OBJECTS)
$(LINKER.cc) $^ -o [email protected] $(LIBES)
date +'[email protected] built at %c' >> /var/log/build.log
(あなたはsyslogにログに記録されたものを取得するためにlogger
の代わりdate
を使用する場合があります)
その後、生成されたprogram
は変わりませんが、あなたはどこか、ビルドのタイムスタンプを記録しています。バイナリプログラムのチェックサム(例:$(shell md5sum program)
、make
)もログに記録できます。
ええと、結果として得られるバイナリファイルがビルドからビルドに変わることはありませんか? timestamp.cファイルも変更されるので、timestamp.0ファイルはバイナリにリンクされますか? –
ソースに実際の変更がない限り、最終的なバイナリが変更されないようにする必要があります。 –
@ user1322488最初のmakefileスニペットを実行しますが、timestamp.c行に依存関係を追加して変更します。例えば'timestamp.c:$(OBJECTS)'これは、オブジェクトのどれより古いときにtimestamp.cを再生成するだけです。 –
コンパイル時のIN YOURバイナリを使用すると、バイナリの変更が行われます。
いくつかの解決策がありますが、主なポイントは、定期的にバイナリを再構築すると、実際にはいくつかの変更(ビルドシステムまたはソースコード)。変更があるかどうかを確認するビルドシステムの一部にして、変更がなければ何もビルドしないでください。これを行う簡単な方法は、ソースコードのバージョン管理システムの「最新バージョン」が何であるかをチェックすることです。最新のバージョンが以前のビルドで使用されていたものと同じ場合は、何も構築する必要はありません。これにより、ビルドタイムスタンプとは別に同一のビルドを生成する手間を省くことができ、バイナリにstorgin __DATE__
と__TIME__
の問題が解決されます。
あなたが望むものは私には分かりません。最後にファイルの が変更された場合は、システムに依存し、 などのビルドシステムが使用されます。 の場合は、 をコンパイラ呼び出しのGNU makeで使用できます。もちろん、インクルードファイルが であってもソースは変更されていない場合、時刻と日付には が反映されません。
ビルドの一部ではない追加のファイルに保存する以外に、私はそうは考えていません。 – Nbr44
この場合、変更があった場合にのみビルドシステムを構築することができます。どのソースにも変更がない場合、再コンパイルのために再コンパイルするだけでは意味がありません。 –
(注:ポストを編集し、マクロ名の前後にバッククイックを追加する必要があります: "... \\ __DATE __ \'、\ '__TIME __ \'マクロ... '"、現在は太字で、 ) –