shell 如何在不运行其他任务的情况下退出makefile,并使用成功的exit-code?

yebdmbv4  于 2023-10-23  发布在  Shell
关注(0)|答案(2)|浏览(195)

我有一个makefile,它有一个“应急步骤”,如果任务在没有预先关键设置的情况下运行,可以引导环境:

bootstrap: ensure_opam_switch_once build

.ONESHELL:
$(FRONTEND_OPAM_SWITCH):
    @echo ''
    @echo "$(bold)[make bootstrap]$(sgr0) An opam-switch doesn't exist for frontend/, creating one ..."
    OPAMYES=true $(MAKE) init
    opam exec --sw="${FRONTEND_DIR}" -- $(MAKE) bootstrap
    @EXIT_CODE=$$?
    @exit $$EXIT_CODE

ensure_opam_switch_once: | $(FRONTEND_OPAM_SWITCH)

init:
    # this does critical first-time setup

build:
    # ... everything else happens here

问题是,需要为makefile的其余部分设置几个shell变量--我不能保证知道这些变量。(opameval设置了一些东西;例如rbenvnvmpyenv等)
我的计划/hack是在安装后重新执行make任务,并在make被调用的环境中配置这些shell变量。(在上面的例子中,这是opam exec行。
然而,我现在的问题是,如果子make成功退出,那么我的@exit $$EXIT_CODE不会导致Make退出!它继续运行并尝试执行其他依赖项,这显然是失败的,因为 outer Make调用没有任何必要的shell环境。
有没有一种方法可以用一个成功的退出代码停止Make?

s71maibg

s71maibg1#

你可以使用条件来隐藏或不隐藏Makefile的某些部分。使用PASS make变量定义应使用Makefile的哪一部分的示例:

$ cat Makefile
.PHONY: all

all:
ifeq ($(PASS),)
    @echo 'PASS = $(PASS), VAR = $(VAR)'
    export VAR=VAL; $(MAKE) PASS=1
else
    @echo 'PASS = $(PASS), VAR = $(VAR)'
endif

$ make
PASS = , VAR = 
export VAR=VAL; make PASS=1
make[1]: Entering directory 'foo'
PASS = 1, VAR = VAL
make[1]: Leaving directory 'foo'
apeeds0o

apeeds0o2#

Fwiw,下面的停止make,但退出代码1“失败”,不成功,因为你想:

... $(MAKE) exit-make

exit-make:
    $(error exit-make)
.PHONY: exit-make

#   example --
bigtmp=`find ~ -name 'tmp*.n*'`; \
if [[ $$bigtmp ]]; then echo $$bigtmp; $(MAKE) exit-make; fi

...mk:29: *** exit-make.  Stop.

相关问题