18

に組み込まれているのと同様にtrap、 GNUで実装する方法があるかどうか疑問に思っていますか?makeBASH

ユーザーが を押した場合CTRL-C、またはそれmake自体が失敗した場合 (ゼロ以外の終了)、特定のターゲットまたはマクロを呼び出したいと思います。

4

6 に答える 6

22

現時点では、GNU make にはネイティブ サポートがありません。

ただし、信頼できる回避策があります。

.PHONY: internal-target external-target

external-target:
  bash -c "trap 'trap - SIGINT SIGTERM ERR; <DO CLEANUP HERE>; exit 1' SIGINT SIGTERM ERR; $(MAKE) internal-target"

internal-target:
  echo "doing stuff here"

これは、中断、終了、およびゼロ以外の終了コードをキャッチします。

$(MAKE)cmdline オーバーライドと make オプションが submake に渡されることに注意してください。

トラップ時:

  • トラップ ハンドラのクリア (- 付き)
  • クリーンアップを行います
  • ゼロ以外の終了ステータスで終了するため、ビルド自動化ツールは失敗したビルドを報告します。

DELETE_ON_ERROR はディレクトリに対しては機能しないためmktemp -d、たとえば、これは後でクリーンアップするための鍵となります。

<DO CLEANUP HERE>有効な CMD に置き換えます。

于 2015-09-25T18:33:56.237 に答える
17

基本的なケースには十分と思われる@kevinfの回答の簡略版:

run:
    bash -c "trap 'docker-compose down' EXIT; docker-compose up --build"

(この例には理由docker-compose upがあります:

コマンドが終了すると、すべてのコンテナーが停止します。

rmただし、停止したコンテナーはそうではないdocker run --rmため、 で引き続き表示できますdocker ps -a。)

于 2016-09-02T21:15:15.217 に答える
4

いいえ。GNU make のシグナル処理には、まだ多くの要望が残されています。printfシグナル ハンドラー内から、シグナル ハンドラー内から呼び出すのが安全ではないような関数を呼び出します。これが原因で問題が発生するのを見てきました。たとえば、が にリダイレクトされた.DELETE_ON_ERROR場合、ルールが常に実行されるわけではありません。stderrstdout

たとえば、CentOS 7.4 ボックスの場合:

  1. 以下を作成しますMakefile

    .DELETE_ON_ERROR:
    
    foo:
            touch $@
            sleep 10
    
  2. で開いてvim実行し:make

  3. 寝ている間にCtrl-を​​叩くC

Vim/make プリント

Press ENTER or type command to continue
touch foo
sleep 10
^C
shell returned 130

Interrupt: Press ENTER or type command to continue

Make に割り込みシグナルが送信されましたが、fooまだ存在しています。

于 2009-07-22T14:54:27.657 に答える
2

Make はこれをサポートしていませんが、BASH のトリックを使用すると、同様のことを実現できます。

default: complete

complete: do_mount
        echo "Do something here..."

do_mount:
        mkdir -p "$(MOUNTPOINT)"
        ( while ps -p $$PPID >/dev/null ; do \
                sleep 1 ; \
        done ; \
        unmount "$(MOUNTPOINT)" \
        ) &
        mount "$(MOUNTSOURCE)" "$(MOUNTPOINT)" -o bind

「メイク」が完了すると、「アンマウント」が実行されます。これは、ビルド中に発生する可能性がある操作をクリーンアップしようとしているが、「make」終了時に正常にクリーンアップされない場合、通常は満足のいく解決策です。

于 2010-04-13T18:32:24.977 に答える
1

いいえ。私が知る限り、そのような機能はありません。

于 2009-06-10T07:31:19.147 に答える
1

makeは戻りコードを生成します。私が今覚えている限り、成功した場合は0、失敗した場合は2を返します(ドキュメントを確認してください)。したがって、たとえばシェルスクリプト内にmakeをラップするだけで十分でしょうか?

于 2009-06-10T07:38:48.523 に答える