2012-09-06 7 views
21

  1. 最後から二番目の行の[email protected]は何の略ですか?
  2. 中段の|シンボルはどうですか?
define KERNEL_RULE 
$(DESTDIR)/$(1) : kernel_modules 
$(DEST_DIR)/$(1) : $(DESTDIR)/$(1) | $(DEST_DIR) 
    cp $(DESTDIR)/$(1) [email protected] 
endef 

答えて

52

(あなたは変数名の嘆かわしい選択肢を持っている;のはSOURCE_DIRDESTDIRを変更し、一人でDEST_DIRを残してみましょう。)

は、あなたが通常のルール書いていたとします

$(DEST_DIR)/foo : $(SOURCE_DIR)/foo 
    cp $(SOURCE_DIR)/foo $(DEST_DIR)/foo 

それは動作しますが、冗長性は面倒です。遅かれ早かれ、preqに$(DEST_DIR)/fooを変更しますが、ルール内で変更することは忘れないでください。そしてルールは読みにくいです。だから我々はautomatic variableに入れる:

$(DEST_DIR)/foo : $(SOURCE_DIR)/foo 
    cp $(SOURCE_DIR)/foo [email protected] 

をこのルールが実行されると、[email protected]は、ターゲットの名前、$(DEST_DIR)/fooに展開されます。 (私たちは、それよりもさらに良いの操作を行いますが、さんはそこに停止させることができます。)

を今、私たちはこのルールを実行する前に$(DEST_DIR)が存在するが、ので、我々は、それは正確に前提条件であることをを望んでいないことを確認しますそのディレクトリの不在は、このルールを実行させるのに十分ではないはずです。だから我々は作ることorder-only prerequisite

$(DEST_DIR)/foo : $(SOURCE_DIR)/foo | $(DEST_DIR) 
    cp $(SOURCE_DIR)/foo [email protected] 

は、今、私たちは異なるターゲットのために、このような多くのルールをしたいし、代わりにそれthe smart wayを行うので、私たちはその場でルールを作成するための"canned recipe"、ソートのテンプレートを使用します。

# This won't work 
define KERNEL_RULE 
$(SOURCE_DIR)/$(1) : kernel_modules 
$(DEST_DIR)/$(1) : $(SOURCE_DIR)/$(1) | $(DEST_DIR) 
    cp $(SOURCE_DIR)/$(1) [email protected] 
endef 

問題は、私たちが、この定義を評価する際に、[email protected]が展開されることであり、それはまだないルールがあるため、それが何に展開されます。だから我々は[email protected]のように変更します。

# This will work 
define KERNEL_RULE 
$(SOURCE_DIR)/$(1) : kernel_modules 
$(DEST_DIR)/$(1) : $(SOURCE_DIR)/$(1) | $(DEST_DIR) 
    cp $(SOURCE_DIR)/$(1) [email protected] 
endef 

メイクが[email protected][email protected]に展開、この定義を呼び出すとき、それはルールを実行する場合は、/場合は、[email protected]は、ターゲットの名前に展開されます。

+12

私はもう一度会います、そして、私は嫌なupvoteを認めなければなりません。注文のみの前提条件に関するものは特に優れています。 –

+19

@JackKelly、あなたの苦いと恨みの譲歩は、顔のない群衆から100ポイントよりも私にとって貴重です。 – Beta

関連する問題