2016-12-07 13 views
1

이것은 제 메이크 파일입니다.메이크 파일은 항상 마지막 타겟을 호출합니다.

#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 만들기 또는 Mbedssl 만들기를 호출하는지 여부와 상관없이. 항상 목표 Mbedssl 만들기가 호출됩니다. 대상을 재 배열하려고 시도했는데, 명령 줄에서 전달한 대상과 관계없이 항상 마지막 위치의 대상이 호출되고 있습니다. 감사합니다. .

답변

5

패턴 규칙 %.o : %.c의 여러 인스턴스를 선언하려고 시도하는 것처럼 보이므로 makefile에 나타나는 위치에 따라 다른 영향을줍니다. 그건 불가능하다. make는 모든 대상을 처리하기 전에 전체 makefile을 먼저 읽고 모든 규칙에 대해 하나의 "범위"만 갖습니다.

패턴 규칙 %.o : %.c을 다시 정의하면 이전 규칙이 삭제되고 새 규칙이 모든 조회에 적용됩니다.

따라서 %.o : %.c 패턴의 마지막 인스턴스는 .o 대상의 모든 조회에 적용되며 이전 규칙은 모두 삭제됩니다.

구현에 도움이 될 target-specific variables을 조사하는 것이 좋습니다.

+0

감사합니다. 다른 패턴을 사용했습니다. 고맙습니다. – sg777