いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

makeでコマンド実行中にエラーが出ても処理を継続するやり方 (--keep-going, || :)

概要

周りに知らない人が結構いたので、メモ代わりにここに残しておきます。

makeでは通常ターゲット内でエラーが発生したら、その時点で実行がエラーとなり中止となります。

でも、たまにエラーが出ても構わないときもあります。

そのような場合、--keep-going というオプションを付与して実行すると、ターゲット内でエラーが発生した場合、そのターゲット内の後続の処理はスキップされて次のターゲットに処理が移ります。

正直、このオプションはほぼ使ったことがありません。が、知っておくと便利かもしれません。

もう一つは、各コマンドの後ろに || : と付与するやり方です。

: は true コマンドと同じ意味です。なので、常に OK と返してくれるコマンド。

また、通称 null command とも呼ばれています。空ファイルを作成する際にも利用したりします。

これを OR で繋いでおいて、失敗しても結果コードを OK で返しておくというやり方です。

サンプル

default: \
   dynamiclinked \
   staticlinked \
   showinfo \
   lddinfo \
   execdynamic \
   execstatic

dynamiclinked:
  go build -o app.dynamic

staticlinked:
  CGO_ENABLED=0 go build -o app.static1
  go build -tags osusergo,netgo -o app.static2

showinfo:
   @echo '[info] app.dynamic: '; file app.dynamic | tr , '\n' | grep -F 'linked'
   @echo '[info] app.static1:  '; file app.static1  | tr , '\n' | grep -F 'linked'
   @echo '[info] app.static2:  '; file app.static2  | tr , '\n' | grep -F 'linked'

lddinfo:
   @echo '[ldd ] app.dynamic: '; ldd app.dynamic || :
   @echo '[ldd ] app.static1:  '; ldd app.static1 || :
   @echo '[ldd ] app.static2:  '; ldd app.static2 || :

execdynamic:
   @echo '[exec] app.dynamic: '; sudo chroot . ./app.dynamic || :

execstatic:
   @echo '[exec] app.static1:  '; sudo chroot . ./app.static1 || :
   @echo '[exec] app.static2:  '; sudo chroot . ./app.static2 || :

以下のようになります。

$ make -C examples/singleapp/static_linked_binary/ 
make: Entering directory '/workspace/try-golang/examples/singleapp/static_linked_binary'
go build -o app.dynamic
CGO_ENABLED=0 go build -o app.static1
go build -tags osusergo,netgo -o app.static2
[info] app.dynamic: 
 dynamically linked
[info] app.static1:  
 statically linked
[info] app.static2:  
 statically linked
[ldd ] app.dynamic: 
        linux-vdso.so.1 (0x00007ffcea5d1000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0c4e374000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0c4e182000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0c4e3a1000)
[ldd ] app.static1:  
        not a dynamic executable
[ldd ] app.static2:  
        not a dynamic executable
[exec] app.dynamic: 
chroot: failed to run command ‘./app.dynamic’: No such file or directory
[exec] app.static1:  
Username: root
[exec] app.static2:  
Username: root
make: Leaving directory '/workspace/try-golang/examples/singleapp/static_linked_binary'

参考情報


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。