概要
周りに知らない人が結構いたので、メモ代わりにここに残しておきます。
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'
参考情報
- true (UNIX) - Wikipedia
- :(ヌルコマンド) – 何もしないコマンド | Linuxコマンド.NET
- Goメモ-200 (static linkedなバイナリを作る)(os/user, net, 静的リンク) - いろいろ備忘録日記
過去の記事については、以下のページからご参照下さい。
いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。