2016-04-19 6 views
3

以下はCaffeMakefileのスニペットです。前提条件のコロン、理解する方法?

TEST_BIN_DIR = build/test 
$(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_CXX_BUILD_DIR)/%.o $(GTEST_OBJ) | $(DYNAMIC_NAME) $(TEST_BIN_DIR) 
    @ echo LD $< 
    $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) \ 
    -o [email protected] $(LINKFLAGS) $(LDFLAGS) -l$(LIBRARY_NAME) -Wl,-rpath,$(ORIGIN)/../lib 

の意味はTEST_CXX_BINSの前提で、コロン(:)何ですか?前提条件の中で別のルールを定義していますか?

これは、標準的な暗黙ルールまたはパターンルールではありません。私はウェブとGNU Makeマニュアルを検索しましたが、参考には何も見つかりません。

+0

良い質問。それはmakefileのバグでしょうか?それは動作しますか?実際、このマニュアルでは、[セミコロンの構文](https://www.gnu.org/software/make/manual/make.html#Rule-Syntax)または注文のみの前提条件が記載されていますが、あなたが記述したものではありません。 – kebs

+0

Makefileは問題なく動作します。 @kebs – nn0p

+1

Aha、マニュアルの説明を参照してください。[静的パターンルール](https://www.gnu.org/software/make/manual/make.html#Static-Usage)を参照してください。私はこの部分を見逃していた。この種の規則はこれまで使わなかった。 – nn0p

答えて

2

これは静的パターンルールです。最初の部分(左から最初のコロン)はターゲットのリストです。 2番目の部分は、各ターゲットと照合するパターンを定義します。一致するステムの%は、前提条件をリストする3番目の部分(2番目のコロンの右側)で使用する(または使用しない)ことができます。あなたの例では、TEST_CXX_BINSはターゲットのリストであるはずです。これらの目標の一つは、のは、$(TEST_BIN_DIR)/foo.testbinbuild/test/foo.testbinを)言わせている場合は、次のルールは、それのために使用されます。|後の前提条件は、前提条件を命じていること

$(TEST_BIN_DIR)/foo.testbin: $(TEST_CXX_BUILD_DIR)/foo.o $(GTEST_OBJ) | $(DYNAMIC_NAME) $(TEST_BIN_DIR) 
    @ echo LD $< 
    $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) \ 
    -o [email protected] $(LINKFLAGS) $(LDFLAGS) -l$(LIBRARY_NAME) -Wl,-rpath,$(ORIGIN)/../lib 

注:彼らは存在している必要があります彼らがしなければ作成されますが、そうであれば、makeはそれらがターゲットよりも最近かどうかをチェックしません。

自動変数$*のおかげで、一致したステムもレシピで参照できることにも注意してください。

関連する問題