makefile всегда вызывает последнюю цель
Это мой make-файл.
#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 $@,O_$@,$@) $(Openssl_include) $(Openssl_lib)
cc -c -fpic $^ -o $(patsubst $@,O_fpic_$@,$@) $(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 $@,W_$@,$@) $(Wolfssl_include) $(Wolfssl_lib)
cc -c -fpic $^ -o $(patsubst $@,W_fpic_$@,$@) $(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 $@,M_$@,$@) $(Mbedssl_include) $(Mbedssl_lib)
cc -c -fpic $^ -o $(patsubst $@,M_fpic_$@,$@) $(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
Независимо от того, звоню ли я в Make Openssl, Make Wolfssl или Make Mbedssl. Всегда цель Make Mbedssl вызывается. Я пытался переставить цели, и все время цель в последней позиции вызывается независимо от цели, которую я передал, чтобы сделать из командной строки. Благодарю.
1 ответ
Вы, кажется, пытаетесь объявить несколько экземпляров правила шаблона %.o : %.c
поэтому они будут иметь разные эффекты в зависимости от того, где они появляются в make-файле. Это невозможно. Make сначала читает весь make-файл, прежде чем он начнет обрабатывать любые цели, и у него есть только одна "область видимости" для всех правил.
Если вы переопределите шаблонное правило %.o : %.c
тогда старое правило удаляется, и новое правило вступает в силу для всех поисков.
Так что последний случай %.o : %.c
шаблон является тот, который действует для всех поисков .o
цели, и все предыдущие правила удаляются.
Я рекомендую вам взглянуть на переменные, специфичные для цели, которые могут помочь вам в реализации.