コンパイルを続行するにはどうすればよいですか?


11

makeソースツリー全体を再コンパイルしなくても、いつでもプロセスを中断できることはわかっています。私が知っているようにmake、ターゲットがまだコンパイルされていない場合、または最後のコンパイル後にソースコードが変更されている場合にのみ、ターゲットをコンパイルします。
しかし、私が中断した場合make、1つ以上の(並行性レベルに応じて)ハーフレディバイナリが確実に存在します。次に実行するときに、それらはmakeどうなりますか?または、部分的にコンパイルされたバイナリを回避するためにCtrl+ を押すと、現在のターゲットが終了しCますか?


2
ほとんどの場合、コンピュータの電源が突然オフになった場合にのみ心配する必要があります。数回、Ubuntuがカーネルデッドロック(またはそれが何であれ)に対処し、ハーフレディバイナリを残して、2時間以上も無駄になりました。
Alvin Wong

回答:


12

簡単に言えば、make(おそらく)多数のステップがあると考えることができます。各ステップは、多数のファイルを入力として受け取り、1つのファイルを出力として作成します。

ステップは、「コンパイルfile.cするfile.o」または「ldリンクmain.ofile.oて使用する」を使用する場合がありprogramます。で中断するmakeCtrlC、現在実行中のステップが終了し、作業していた出力ファイルが削除されます(または削除されます)。通常、「ハーフレディバイナリ」は残されません。

を再起動makeすると、すべての入力ファイルと出力ファイルのタイムスタンプが確認され、次の手順が再実行されます。

  • 入力ファイルのタイムスタンプが出力ファイルよりも新しい
  • 出力ファイルが存在しない

これは一般に、ステップの実行に長い時間がかかる場合(最近のコンピューターではまれですが、ld大規模なプログラムのステップでmakeは、設計時に数分かかることがあります)、停止して再起動makeすると、そのステップが最初からやり直されます。

平均の現実はMakefile上記の説明よりもかなり複雑ですが、基本は同じです。


8

Ctrl+ Cは、SIGINT実行中のプロセスに送信されます。このシグナルはプロセスによってキャッチできます。makeソースコードでは、この信号のトラップを以下で見つけることができますcommands.c

  /* If we got a signal that means the user
     wanted to kill make, remove pending targets.  */

  if (sig == SIGTERM || sig == SIGINT

  ... remove childrens ...

  /* Delete any non-precious intermediate files that were made.  */

  remove_intermediates (1);

remove_intermediates()のクリーンアップ関数ですmake。ここでの定義を参照してください。

/* Remove all nonprecious intermediate files.
   If SIG is nonzero, this was caused by a fatal signal,
   meaning that a different message will be printed, and
   the message will go to stderr rather than stdout.  */

そして、後で見る関数では、それらは効果的に削除されます:

status = unlink (f->name);

結論: 通常、を使用したコンパイルの中断を恐れないでくださいmake。キャッチできないシグナル(SIGKILL, SIGSEGV, SIGSTOP)でない場合は、中間ファイルのクリーンアップを行います。


1
SIGSEGV多くのUnicesでキャッチできます。
Chris Down

1

何かが停止した場合make(Ctrl-C、シャットダウン、または失敗したコマンドなど)、すでに実行された作業はそのまま残ります。言い換えると、makeいつものように実行します。ファイルを変更したり、ファイルをmake処理する必要がないために、まだ何が必要かを判断し、ジョブを続行します。

上記の説明は、関連Makefileするが正しく実行するための依存関係とコマンドを説明していることを明確に想定しているため、(再)作成する必要があるのはすべてです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.