Pergunta

Eu tenho uma configuração onde fazer é ir através de um monte de subdiretórios e a fazer dentro desses diretórios.Eu gostaria que ele pare de o construir sobre uma falha imediatamente.O trecho de código abaixo ilustra isso.Alguém pode me apontar na direção certa sobre como o makefile deve ser definida ou alguma documentação sobre a construção de um nível superior para baixo através de subdiretórios?

SUBDIRS = \
test1 \
test2 

all clean check :
    @for dir in $(SUBDIRS); do \
        if [ -d $$dir ]; then (cd $$dir; $(MAKE) $@) fi \
    done
Foi útil?

Solução

Estou na minoria (aparente) que discorda de "recursivo torna considerado prejudicial". Eu escrevi sistemas Recursive Make para bases de código grandes e confusas e elas funcionam bem.

Veja como fazer:

all: $(SUBDIRS)

$(SUBDIRS): force
    @ $(MAKE) -s -C $@

.PHONY: force
force :;

(Eu adicionei os -s para tornar as coisas mais silenciosas.)

EDITAR: Para passar um alvo para os submarinos (eu deveria ter feito isso antes):

.PHONY: all check clean
all check clean: $(SUBDIRS)

all: TARGET=all
check: TARGET=check
clean: TARGET=clean
# No, you can't do TARGET=$@, or at least I don't know how to.

# recursive call to make
$(SUBDIRS): force
    @ $(MAKE) -s -C $@ $(TARGET)

.PHONY: force
    force :;

Outras dicas

Peço-lhe para abandonar o recursiva fazer a abordagem.Ele pode causar quantidades infinitas de dificuldades, mais tarde, como seu Makefiles crescer.Consulte o papel Recursiva Fazer Consideradas Nocivas para uma boa explicação de por que invocar o fazer de forma recursiva é uma má idéia.

Um benefício imediato que você vai perceber de mudar para não-recursiva fazer é que este problema que você está enfrentando agora vai simplesmente evaporar.Você não vai ter esse problema com um não-recursiva Makefile.

Também, sinta-se livre para verific para fora este clichê não-recursiva Makefile que eu criei.Ele requer o GNU Make 3.81, mas é realmente fácil de usar.No mínimo, ele pode agir como um bom exemplo de um não-recursiva Makefile, se você quiser criar o seu próprio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top