29

Makefile を使用しています。

ただし、ターゲットが実行される前に実行したいコマンド (zsh スクリプト) があります。どうすればいいですか?

ありがとう!

4

4 に答える 4

32

ターゲットを構築する前にコードを実行するためのいくつかの手法があります。どちらを選択するかは、正確に何をしたいのか、そしてなぜそれをしたいのかによって少し異なります。(zshスクリプトは何をしますか?なぜそれを実行しなければならないのですか?)

@Johnが提案するように行うことができます。zshスクリプトを最初の依存関係として配置します。次に、ターゲットが実際に。という名前のファイルを生成しない限り、zshターゲットをマークする必要があります。.PHONYzsh

別の解決策(少なくともGNU makeでは)は$(shell ...)、変数代入の一部として関数を呼び出すことです。

ZSH_RESULT:=$(shell zsh myscript.zsh)

これにより、makefileが解析されるとすぐに、ターゲットが実行される前にスクリプトが実行されます。また、makefileを再帰的に呼び出すと、スクリプトが実行されます。

于 2010-01-23T09:38:21.857 に答える
10

それを他のターゲットの1つの依存関係にするだけです

foo.obj : zsh foo.c 
   rule for compileing foo.c

zsh: 
   rule for running zsh script.

または、最初のターゲットをそれに依存させる

goal: zsh foo.exe
于 2010-01-23T08:37:26.710 に答える
7

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..."
于 2017-01-12T02:14:06.000 に答える
3

既存のものを変更せずに解決策があります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(受け入れられた回答とのその他の違い)。

于 2018-10-10T09:25:32.640 に答える