2017-04-18 12 views
0

defineを関数として使用してMakefileを改善しようとしていますが、Make関数の定義に少し問題があります。私はそうあなたにデモMakefile:定義引数にテキスト変換関数を適用する

OBJ=obj/main.o \ 
    obj/prompt.o 

define buildMessage 
    src="$(patsubst $(OBJ_PREFIX)/%.o,%.c,$(1))"; \ 
    obj="$(patsubst $(OBJ_PREFIX)/%.o,%.o,$(1))"; \ 
    echo "$$src => $$obj" 
endef 

$(OBJ): 
    $(call buildMessage, "[email protected]") 
    $(CC) -o [email protected] -c $(patsubst $(OBJ_PREFIX)/%.o, $(SRC_PREFIX)/%.c, [email protected]) $(CFLAGS) 

をお見せしましょう、ええ、私は派手なスタイルでビルドステップを印刷するには定義したいが、patsubstを定義して適用されていないようです。出力されます

obj/main.o => obj/main.o 
obj/prompt.o => obj/prompt.o 

patsubstが処理されたものの、変更や一致がない場合とまったく同じです。助言がありますか?

アレックス、あなたがそれを示さなかったが、私は、それを想定してい

+0

を 'SRC =' 'ではなく' OBJ_PREFIX'のSRC_PREFIX'を持っていないでしょうか? –

+0

SRCが含まれているvarを持っていません。さらに、これは本当に投稿の問題ではありません。問題は、patsubstがその仕事をしていない理由です。 –

+0

ちょっとメモ:これはmakefileを簡略化しません。結局のところ、メイクファイルに広範なマクロを使用すると、読みにくくなり、サポートしてくれるのはあなたがここで経験したことだけです。有用な時がありますが、実際の利益を提供しない限り、私はそれらを避けることを学んでいます。あなたの場合は、[静的パターンルール](https://www.gnu.org/software/make/manual/make.html#Static-Pattern)を使用して目標を達成することができます。 – blackghost

答えて

2

は、OBJ_PREFIXの値はobjでお時間をいただき、ありがとうございます。

クォートについては何も気にしません。あなたが書くとき:

$(call buildMessage, "[email protected]") 

$1の値は、文字通り、引用符を含む"obj/main.o"になります。その文字列はパターンobj/%.oと一致しないため、パターンは適用されず、元の文字列は変更されません。あなたはこの書くべき

$(call buildMessage,[email protected]) 
+0

ハハ、素晴らしい、それは働いた!本当にありがとう –

関連する問題