Makefile在bash中工作,但在zsh中失败。您能指出for循环语法中的错误吗?
下面是一个GNUMakefile的开头,它在bash下运行良好,但自从我切换到zsh(哦,我的zsh)后就失败了。我需要启动一个bashshell来执行它,这很烦人,所以您认为您可以帮助指出语法问题吗Makefile在bash中工作,但在zsh中失败。您能指出for循环语法中的错误吗?,makefile,zsh,Makefile,Zsh,下面是一个GNUMakefile的开头,它在bash下运行良好,但自从我切换到zsh(哦,我的zsh)后就失败了。我需要启动一个bashshell来执行它,这很烦人,所以您认为您可以帮助指出语法问题吗 SUBDIRS = generator geometry io management physicslist processing makeall: @echo "*********************************************************
SUBDIRS = generator geometry io management physicslist processing
makeall:
@echo "********************************************************************************"
@echo " Building Project"
@echo "********************************************************************************"
@for dir in $(SUBDIRS); do (echo; echo; echo Building $$dir...; cd $$dir; $(MAKE) "SUBDIRS=$(SUBDIRS)"); done
这将导致无限循环:
[●]% make
********************************************************************************
Building Project
********************************************************************************
Building generator...
/bin/sh: line 0: cd: generator: No such file or directory
********************************************************************************
Building Project
********************************************************************************
Building generator...
/bin/sh: line 0: cd: generator: No such file or directory
********************************************************************************
Building Project
********************************************************************************
...
...
似乎我用make's和/bin/sh's叉子炸了自己:
...
...
24921 ttys012 0:00.00 make SUBDIRS=generator geometry io management physicslist processing
24925 ttys012 0:00.00 /bin/sh -c for dir in generator geometry io management physicslist processing; do (echo; echo; echo Building $dir...; cd $dir; make "SUBDIRS=generator geometry io man
24926 ttys012 0:00.00 /bin/sh -c for dir in generator geometry io management physicslist processing; do (echo; echo; echo Building $dir...; cd $dir; make "SUBDIRS=generator geometry io man
24927 ttys012 0:00.00 make SUBDIRS=generator geometry io management physicslist processing
24931 ttys012 0:00.00 /bin/sh -c for dir in generator geometry io management physicslist processing; do (echo; echo; echo Building $dir...; cd $dir; make "SUBDIRS=generator geometry io man
24932 ttys012 0:00.00 /bin/sh -c for dir in generator geometry io management physicslist processing; do (echo; echo
...
...
编辑:
生成器内部的makefile如下所示:
name := generator
include ../ProgramConfig/Libraries.gmk
Libraries.gmk看起来像
.PHONY: all lib
all: lib
include ../ProgramConfig/BuildDirs.gmk
include $(G4INSTALL)/config/architecture.gmk
include $(G4INSTALL)/config/common.gmk
include ../ProgramConfig/ExtraDeps.gmk
include ../ProgramConfig/GEANT4.gmk
# Add the sub-directory include directories to the compilation list
CPPFLAGS += $(addprefix -I../, $(addsuffix /include, $(SUBDIRS))) -O2
cleanup:
cd $(G4WORKDIR)
rm -rf bin tmp lib
实验一。试试这个:
makeall:
@for dir in $(SUBDIRS); do (echo Building $$dir...; cd $$dir; $(MAKE) "SUBDIRS=$(SUBDIRS)" ; cd -); done
我想到的更安全的方法是:在Make中迭代,而不是在shell中
makeall: $(SUBDIRS)
.PHONY: $(SUBDIRS)
$(SUBDIRS):
@echo Building $@
@cd $@; $(MAKE) "SUBDIRS=$(SUBDIRS)"
请注意,您还可以将最后一条规则稍微简化:
$(SUBDIRS):
@echo Building $@
@$(MAKE) -C $@ "SUBDIRS=$(SUBDIRS)"
语法看起来是正确的,如果缺少一个子项,它将进入无限循环。您确定存在
生成器子目录吗?请尝试makeall:@ls | grep generator
以确保。此外,还有更安全的方法让它在子目录上迭代。@Beta:子目录都在那里,并且makefile可以与bash一起正常工作。但是,为了探索这个选项,在子目录上进行迭代的更安全的方法是什么?仍然是一个具有相同输出的无限循环,但是由于循环处于Make中,我可以^C out并避免fork炸弹。至少我可以更轻松地进一步诊断。@vgm64:等一下。您能给我们看看generator/
中的makefile吗?