あなたがリストした最上位のメイクファイルは安全です-j
(ただし、最適ではありません)。の展開後$(foreach...)
、make
実質的に以下が表示されます。
tgt-name: deps
$(MAKE) -f $(MY_MAKEFILE) ARCH=32 mylib; $(MAKE) -f $(MY_MAKEFILE) ARCH=64 mylib; ...
これらのサブ make の 1 つが失敗した場合 (の誤った処理が原因で-j
)、その失敗は最上位の make に報告されません。次のようなものを使用する必要があります。
tgt-name: deps
$(MAKE) -f $(MY_MAKEFILE) ARCH=32 mylib && $(MAKE) -f $(MY_MAKEFILE) ARCH=64 mylib && ... && :
は&&
、前のコマンドが失敗した場合にエラーですぐに終了するように bash に指示します。(:
最後の は bash ビルトインで、正常終了を発行するだけです。これにより、 の記述が簡単になります$(foreach ...)
。)
編集:
もちろん、これに対する適切な方法は、シェルでのシリアル処理ではなく、make依存関係を使用することです。次のようなものを確認したい:
tgt-name: # default target
.PHONY: target-32
target-32: deps
$(MAKE) -f ${MY_MAKEFILE} arch=32 mylib
.PHONY: target-64
target-64: deps
$(MAKE) -f ${MY_MAKEFILE} arch=64 mylib
# etc. etc.
tgt-name: target-32 target-64
@echo $@ Success
これは-j
安全です。アンダー-j
メイクは全てtarget-%
同時に行います。良い。(この場合、あなたは安全$MY_MAKEFILE
ではないように見えますが-j
(いたずらです!))ボイラープレートを置き換えるいくつかのマクロ:
LIST_OF_TYPES := 32 64 ...
LIST_OF_TARGETS := $(add-prefix,target-,${LIST_OF_TYPES})
tgt-name: # default target
.PHONY: ${LIST_OF_TARGETS}
${LIST_OF_TARGETS}: target-%: deps # Static Pattern Rule will (conveniently) set $*
$(MAKE) -f ${MY_MAKEFILE} arch=$* mylib
tgt-name: ${LIST_OF_TARGETS}
@echo $@ Success
PS私はあなたがtgt-nameとしてマークするべきだと思う.PHONY