管理Makefile中的退出代码

时间:2017-10-07 21:14:51

标签: makefile makefile-errors

我正在创建一个目标,可以在需要时用作钩子来添加一些额外的过程。

这是主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的退出代码?

1 个答案:

答案 0 :(得分:1)

我认为答案实际上是这样的:

if [ $$$$? -le 1 ] ; ...

call的调用将“$$$$”变为“$$”,然后当Make执行规则时,它会转换为“$$”。到“$?”并将它传递给shell。