У меня есть make-файл, компилирующий общую библиотеку, которую я вызываю из другого make-файла.
При разработке библиотеки я использовал переменную TARGET
для именования двоичного файла библиотеки.
BUILD_DIR?=$(abspath ./build)
SRC=src/file.c
INC=-I inc
CFLAGS+=-Wall -Werror
LDFLAGS+=-Wl,--no-undefined
TARGET=libname
ifndef ARCH
$(error Undefined ARCH (Library targetted architecture))
endif
default: all
all: ${BUILD_DIR}/${ARCH}/${TARGET}
${BUILD_DIR}/${ARCH}/${TARGET}: ${BUILD_DIR}/${ARCH}
${CC} ${CFLAGS} ${LDFLAGS} -fPIC -shared -o $@.so ${SRC} ${INC}
${BUILD_DIR}/${ARCH}:
@mkdir -p $@
clean:
@rm -rf ${BUILD_DIR}/${ARCH}/${TARGET}
.PHONY: all clean ${BUILD_DIR}/${ARCH}/${TARGET} ${BUILD_DIR}/${ARCH}
Однако в родительском make-файле я использую переменную TARGET
, чтобы указать плату, на которой я развертываю приложение.
ifeq (${TARGET},target1)
# Target1 compiling
${LIB}:
scp $@ ${TARGET_USR}@${TARGET_IP}:
${SSH_CMD} make -C $@ ARCH=arm
[...]
endif
ifeq (${TARGET},target2)
# Target2 compiling
${LIB}:
make -C $@ BUILD_DIR=${BUILD_DIR} CC=${CC} ARCH=${ARCH}
[...]
endif
Я компилирую следующим образом: make TARGET=target2
и использую GNU make
Компиляция библиотеки из родительского make-файла выполнена успешно, но имя библиотеки target2.so
вместо libname.so
.
Я думал, что переменные передаются в submakefiles только в том случае, если они явно указаны при вызове команды (как для BUILD_DIR
, CC
и ARCH
), но кажется, что TARGET
также передается в вспомогательный make-файл.
Я знаю, что мог бы просто сделать override TARGET=libname
во вспомогательном make-файле.
Но я хотел бы знать, есть ли другое решение.