我正在创建一个目标,可以在需要时用作钩子来添加一些额外的过程。
这是主Makefile中的代码
export MSG:="Linux hook"
linux-build:
@ echo "Dependency target"
linux-build-post: linux-build
@ make -s -f linux.hook -q linux_build_post 2> /dev/null ; \
if [ $$? -le 1 ] ; then \
echo "Target exist" ; \
make -s -f linux.hook linux_build_post ; \
else \
echo "Target doesn't exist" ; \
fi
@ touch $@
这是linux.hook文件中的代码
linux_build_post:
@ echo ${MSG}
此代码可以正常工作,但现在我正在尝试在主Makefile中创建一个模板。例如:
export MSG:="Linux hook"
linux-build:
@ echo "Dependency target"
# Common hook target
# Parameters:
# 1: Target name
# 2: Dependecies
# 3: Hook name
define COMMON_HOOK_TARGET
$(1): $(2)
make -s -f $(3).hook -q $(1) 2> /dev/null ; \
if [ $$? -le 1 ] ; then \
echo "Target exist" ; \
make -s -f $(3).hook $(1) ; \
else \
echo "Target doesn't exist" ; \
fi
touch $(1)
endef
$(eval $(call COMMON_HOOK_TARGET,linux-build-post,linux-build))
但是在这种情况下,make命令失败,因为$$?
被依赖项linux-build
替换,那么if条件的计算方式就像if [ linux-build -le 1 ]
一样。
报告错误:
/bin/sh: 1: [: Illegal number: linux-build
如何更改代码以使用$$?
作为上一个命令make -s -f $(3).hook -q $(1) 2> /dev/null
的退出代码?
答案 0 :(得分:1)
我认为答案实际上是这样的:
if [ $$$$? -le 1 ] ; ...
对call
的调用将“$$$$”变为“$$”,然后当Make执行规则时,它会转换为“$$”。到“$?”并将它传递给shell。