Предотвратить перезапись переменных в субмаке-файл - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть 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-файле. Но я хотел бы знать, есть ли другое решение.

1 Ответ

0 голосов
/ 04 сентября 2018

По умолчанию любые аргументы переменной командной строки переопределяют все локальные назначения в файлах make. Есть способ обойти это, используя директиву override :

override TARGET := libname

Это установит переменную в дочернем make-файле независимо от того, было ли указано значение в командной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...