防止变量覆盖到 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}
但是,在父 makefile 中,我使用变量 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_DIR
、CC
和 ARCH
),但似乎 TARGET
也传递给子生成文件。
我知道我可以 override TARGET=libname
进入子联编文件。
但我想知道是否有其他解决方案。
默认情况下,任何命令行变量参数都将覆盖 makefile 中的任何本地赋值。使用 override 指令可以解决这个问题:
override TARGET := libname
这将在子 makefile 中设置变量,而不管该值是否在命令行中指定。
我有一个编译共享库的 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}
但是,在父 makefile 中,我使用变量 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_DIR
、CC
和 ARCH
),但似乎 TARGET
也传递给子生成文件。
我知道我可以 override TARGET=libname
进入子联编文件。
但我想知道是否有其他解决方案。
默认情况下,任何命令行变量参数都将覆盖 makefile 中的任何本地赋值。使用 override 指令可以解决这个问题:
override TARGET := libname
这将在子 makefile 中设置变量,而不管该值是否在命令行中指定。