Makefile を使用しています。
ただし、ターゲットが実行される前に実行したいコマンド (zsh スクリプト) があります。どうすればいいですか?
ありがとう!
ターゲットを構築する前にコードを実行するためのいくつかの手法があります。どちらを選択するかは、正確に何をしたいのか、そしてなぜそれをしたいのかによって少し異なります。(zshスクリプトは何をしますか?なぜそれを実行しなければならないのですか?)
@Johnが提案するように行うことができます。zshスクリプトを最初の依存関係として配置します。次に、ターゲットが実際に。という名前のファイルを生成しない限り、zsh
ターゲットをマークする必要があります。.PHONY
zsh
別の解決策(少なくともGNU makeでは)は$(shell ...)
、変数代入の一部として関数を呼び出すことです。
ZSH_RESULT:=$(shell zsh myscript.zsh)
これにより、makefileが解析されるとすぐに、ターゲットが実行される前にスクリプトが実行されます。また、makefileを再帰的に呼び出すと、スクリプトが実行されます。
それを他のターゲットの1つの依存関係にするだけです
foo.obj : zsh foo.c
rule for compileing foo.c
zsh:
rule for running zsh script.
または、最初のターゲットをそれに依存させる
goal: zsh foo.exe
MAKECMDGOALS と二重コロン ルールを使用したメイクファイルの前処理と後処理の両方のソリューション。
MAKECMDGOALS は、コマンド ラインにリストされているターゲットです。
最初のステップは、コマンド ラインから最初と最後のターゲットを取得することです。ターゲットがリストされていない場合は、デフォルトのターゲットを使用します。
ifneq ($(MAKECMDGOALS),)
FIRST_GOAL := $(word 1, $(MAKECMDGOALS))
LAST_GOAL := $(word $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))
else
FIRST_GOAL := all
LAST_GOAL := all
endif
2 つのコロン ルールを使用すると、同じターゲットに対して複数のレシピを順番に実行できます。すべてのコマンド ライン ターゲットをダブル コロン ルールに変更する必要があります。
#Dummy rule to set the default
.PHONY: all
all ::
#Preprocessing
$(FIRST_GOAL) ::
echo "Starting make..."
all :: normal_prerequistes
normal_recipe
other_stuff
#Postprocessing
$(LAST_GOAL) ::
echo "All done..."
既存のものを変更せずに解決策がありますMakefile
(受け入れられた回答との主な違い)。以下を含むものを作成するだけmakefile
です:
.PHONY: all
all:
pre-script
@$(MAKE) -f Makefile --no-print-directory $(MAKECMDGOALS) MAKE='$(MAKE) -f Makefile'
post-script
$(MAKECMDGOALS): all ;
唯一の欠点は、他に何もすることがなくても、事前スクリプトと事後スクリプトが常に実行されることです。ただし、オプションの 1 つを使用して make を呼び出すと、それらは実行されません--dry-run
(受け入れられた回答とのその他の違い)。