2017-11-17 6 views
0

Make를 사용하여 여러 빌드의 Verilog 컴파일러를 시작합니다. 나는 make를 -j 플래그를 이용하기 위해서만 사용하고있다. 두 번째 메이크업 대상으로, 시스템 내 파일이잘못된 대상으로 Make가 즉시 실패하도록 설정합니다.

allfpga: fpga0 fpga1 fpga2 fpga3 fpga4 fpga5 fpga6 

fpga0: 
    cd fpgas/$(@)/build && $(MAKE) 
fpga1: 
    cd fpgas/$(@)/build && $(MAKE) 
fpga2: 
    cd fpgas/$(@)/build && $(MAKE) 
fpga3: 
    cd fpgas/$(@)/build && $(MAKE) 
fpga4: 
    cd fpgas/$(@)/build && $(MAKE) 
fpga5: 
    cd fpgas/$(@)/build && $(MAKE) 
fpga6: 
    cd fpgas/$(@)/build && $(MAKE) 

같이 보입니다 그리고 나는 make -j2 allfpga 하나 그러나 (예 : 내가 fpag3 준 명령 등) 오타가있는 경우

make -j2 fpga0 fpag3 fpga5 fpga6를 호출 행복하게 건물을 짓고, 일찍 멈출 것입니다.

제 질문은 목표의 일부가 실제 것이 아닌 경우 어떻게 초기에 멈출 수 있습니까?

답변

1

요청한 모든 대상을 "사전 검색"할 수있는 좋은 방법은 없습니다. make는 타겟을 빌드하려고 시도 할 때까지 타겟이 빌드 가능한지를 알 수 없다. (예를 들어, 패턴 규칙 등을 사용하여 다른 타겟을 기반으로 생성 될 수있다.)

그러나, 당신이 뭔가를 할 수 있습니다 :

ALLFPGAS := fpga0 fpga1 fpga2 fpga3 fpga4 fpga5 fpga6 

# Get any command line goal which is not one of ALLFPGAS 
unknown := $(filter-out $(ALLFPGAS),$(MAKECMDGOALS)) 

# If there are any, bail! 
$(if $(unknown),$(error Unknown FPGA: $(unknown))) 

allfpga: $(ALLFPGAS) 

$(ALLFPGAS): 
     cd fpgas/[email protected]/build && $(MAKE) 

.PHONY: allfpga $(ALLFPGAS) 
+0

감사합니다! 단지 참고 용으로,'filter-out'은 실제 명령인가요, 아니면 제가 만들 수 있도록 남아 있습니까? – portforwardpodcast

+0

표준 GNU make 기능 : https://www.gnu.org/software/make/manual/html_node/Text-Functions.html#index-filter_002dout – MadScientist