繁体   English   中英

防止变量覆盖到submakefile中

[英]Prevent variable overwrite into submakefile

我有一个makefile,用于编译从另一个makefile调用的共享库。

开发库时,我使用变量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}

但是,在父生成文件中,我使用变量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

从父makefile编译库成功,但是库的名称是target2.so而不是libname.so

我以为变量只有在命令调用中显式精确时才传递给submakefile文件(对于BUILD_DIRCCARCH ),但是似乎TARGET也传递给sub makefile。

我知道我可以将override TARGET=libname到子makefile中。 但我想知道是否还有另一种解决方案。

默认情况下,任何命令行变量参数都将覆盖makefile中的所有本地分配。 通过使用override指令可以解决此问题:

override TARGET := libname

这将在子makefile中设置变量,而不管是否在命令行上指定了值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM