2016-12-07 9 views
1

これは私のmakefileです。メイクファイルは常に最後のターゲットを呼び出します

#starts here 
#Openssl constants 
Openssl_include=-I/usr/local/openssl/include 
Openssl_lib=-L/usr/local/openssl/lib -lcrypto -ldl 
#Wolfssl constants 
Wolfssl_include=-I/usr/local/wolfssl/include -LLIBDIR -DWOLFSSL_SHA512 
Wolfssl_lib=-L/usr/local/wolfssl/lib -lwolfssl 
#Mbedssl constants 
Mbedssl_include=-I/usr/local/mbedssl/include 
Mbedssl_lib=-L/usr/local/mbedssl/lib -lmbedcrypto 

SRC=CAL_aes.c CAL_sha.c CAL_cmac.c CAL_rsa.c 
OBJ=$(patsubst %.c,%.o,$(SRC)) 
M_OBJ=$(patsubst %.c,M_%.o,$(SRC)) 
M_fpic_OBJ=$(patsubst %.c,M_fpic_%.o,$(SRC)) 

O_OBJ=$(patsubst %.c,O_%.o,$(SRC)) 
O_fpic_OBJ=$(patsubst %.c,O_fpic_%.o,$(SRC)) 

W_OBJ=$(patsubst %.c,W_%.o,$(SRC)) 
W_fpic_OBJ=$(patsubst %.c,W_fpic_%.o,$(SRC)) 

.PHONY: clean Openssl Wolfssl Mbedssl compile_openssl compile_wolfssl compile_mbedssl 
compile_openssl: $(OBJ) 
%.o: %.c 
    cc -c $^ -o $(patsubst [email protected],[email protected],[email protected]) $(Openssl_include) $(Openssl_lib) 
    cc -c -fpic $^ -o $(patsubst [email protected],[email protected],[email protected]) $(Openssl_include) $(Openssl_lib) 
Openssl: compile_openssl 
    ar rc libO_CAL_crypto.a $(O_OBJ) 
    cc -shared -o libO_CAL_crypto.so $(O_fpic_OBJ) 
compile_wolfssl: $(OBJ) 
%.o: %.c 
    cc -c $^ -o $(patsubst [email protected],[email protected],[email protected]) $(Wolfssl_include) $(Wolfssl_lib) 
    cc -c -fpic $^ -o $(patsubst [email protected],[email protected],[email protected]) $(Wolfssl_include) $(Wolfssl_lib) 
Wolfssl: compile_wolfssl 
     ar rc libW_CAL_crypto.a $(W_OBJ) 
     cc -shared -o libW_CAL_crypto.so $(W_fpic_OBJ) 
compile_mbedssl: $(OBJ) 
    %.o: %.c 
     cc -c $^ -o $(patsubst [email protected],[email protected],[email protected]) $(Mbedssl_include) $(Mbedssl_lib) 
     cc -c -fpic $^ -o $(patsubst [email protected],[email protected],[email protected]) $(Mbedssl_include) $(Mbedssl_lib) 
Mbedssl: compile_mbedssl 
     ar rc libM_CAL_crypto.a $(M_OBJ) 
     cc -shared -o libM_CAL_crypto.so $(M_fpic_OBJ) 
    #ends here 

私がOpensslを作るか、Wolfsslを作るかMake Mbedsslを呼び出すかにかかわらず。ターゲットMbedsslが常に呼び出されています。 ターゲットを再配置しようとしましたが、コマンドラインから渡すターゲットに関係なく、常に最後の位置のターゲットが呼び出されていました。おかげさまで

答えて

5

パターンルール%.o : %.cの複数のインスタンスを宣言しようとしているようですが、メイクファイルのどこに表示されるのかによって影響が異なります。それは可能ではありません。 Makeはすべてのターゲットを処理する前にメイクファイル全体を最初に読み込み、すべてのルールに対して1つの "スコープ"しか持たない。

パターンルール%.o : %.cを再定義すると、古いルールが削除され、新しいルールがすべてのルックアップに適用されます。

%.o : %.cパターンの最後のインスタンスは、.oターゲットのすべてのルックアップに適用され、以前のすべてのルールが削除されます。

実装に役立つtarget-specific variablesを調べることをおすすめします。

+0

ありがとう、私は別のパターンを使用し、それは働いた。どうもありがとうございました。 – sg777

関連する問題