Makefile работает в bash, но не работает в zsh.Можете ли вы указать на ошибку в синтаксисе цикла for? - PullRequest
0 голосов
/ 19 сентября 2011

Вот начало GNUMakefile, который хорошо работает в bash, но потерпел неудачу, так как я переключился на zsh (и oh-my-zsh).Раздражает, что мне нужно запустить оболочку bash для ее выполнения, так как вы думаете, вы можете помочь указать на проблему с синтаксисом?

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 и / 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
...
...

EDIT:

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

1 Ответ

2 голосов
/ 20 сентября 2011

Эксперимент 1. Попробуйте это:

makeall:
    @for dir in $(SUBDIRS); do (echo Building $$dir...; cd $$dir; $(MAKE) "SUBDIRS=$(SUBDIRS)" ; cd -); done

И более безопасный метод, который я имел в виду: итерация в Make, а не в оболочке.

makeall: $(SUBDIRS)

.PHONY: $(SUBDIRS)

$(SUBDIRS):
    @echo Building $@
    @cd $@; $(MAKE) "SUBDIRS=$(SUBDIRS)"

Обратите внимание, что вы также можетесделайте это последнее правило немного чище:

$(SUBDIRS):
    @echo Building $@
    @$(MAKE) -C $@ "SUBDIRS=$(SUBDIRS)"
...