2017-12-14 23 views
0

나는 자신의 디렉토리에 여러 개의 FPGA 빌드를 관리하는 Makefile이있다. 각 변수의 이름은 CS_FPGA_FETCH입니다. 내 프로젝트의 많은 하위 폴더는이 이름을 기반으로합니다.목록에서 만들어진 Makefile 타겟에서 기본 변수를 얻는다

각 FPGA에 대한 타겟을 추가하는 방법을 깨끗하게 정리하고 싶습니다. 내가 생각해내는 것은 addprefix이며 접두어를 제거하는 것입니다.

# Every FPGA 
CS_FPGAS_FETCH := cs00 cs01 cs02 cs03 cs10 cs11 cs12 cs13 cs20 cs21 cs22 cs23 cs30 cs31 cs32 cs33 

# this is a list of variables that has the words copy_official_ prefixed 
# to all of the cs00, cs01 
COPY_OFFICIAL_CS_TARGETS=$(addprefix copy_official_,$(CS_FPGAS_FETCH)) 

# because we use add prefix, we HAVE to strip it off 
# this replases $(@) for guys with a prefix, so we can access the base variable inside the loop below 
COPY_TARGET_FPGA_NAME=$(@:copy_official_%=%) 

# this evaluates out to targets named: 
# copy_official_cs00, copy_official_cs01 etc 
$(COPY_OFFICIAL_CS_TARGETS): 
    @echo In $(@) target. Here i copy file $(COPY_TARGET_FPGA_NAME) 
    cp build/$(COPY_TARGET_FPGA_NAME)/file.bit install/$(COPY_TARGET_FPGA_NAME) 

이 방법은 나에게 뒤떨어져 있습니다. 사용할 각 접두사에 대해 COPY_TARGET_FPGA_NAME을 만들어야합니다. 이것은 매우 혼란스러워 보입니다. 다른 접두어가있는 많은 대상을 많이 추가해야합니다.

답변

2

귀하의 접두어가 귀하의 제조법에 나타나지 않아서 모든 세부 사항을 이해하고 있습니다. 그래서, 내가 그 중 몇 개를 가지고 있다는 점을 알지 못하기 때문에, 목적지 비트 스트림이 이 아니라 install/<fpga>이 아니라고 가정합니다.

목표 및 전제 조건이 실제 파일 인 경우 좀 더 make-oriented 접근 방식을 사용합니다. 예를 들어, 비트 스트림을 복사하려면 install/<prefix><fpga>을 대상으로 사용하고 build/<fpga>/file.bit을 전제 조건으로 사용하는 것이 더 자연 스럽습니다.

또한 installorder-only prerequisite으로 추가하고 규칙을 만듭니다. 돌아 가기 주요 질문에 대한

: 여러분의 필요에 적응하지만 MY_rule 변수가 확장 기억

# Every FPGA 
CS_FPGAS_FETCH := cs00 cs01 cs02 cs03 cs10 cs11 cs12 cs13 cs20 cs21 cs22 cs23 cs30 cs31 cs32 cs33 

# Every prefix 
PREFIXES = copy_official_ 

.PHONY: all 

# $(1): prefix 
# $(2): FPGA name 
define MY_rule 
all: install/$(1)$(2) 

install/$(1)$(2): build/$(2)/file.bit | install 
    @echo In [email protected] target. Here i copy file $(2) 
    cp build/$(2)/file.bit [email protected] 
endef 
$(foreach p,$(PREFIXES),$(foreach f,$(CS_FPGAS_FETCH),$(eval $(call MY_rule,$(p),$(f))))) 

install: 
    mkdir [email protected] 

을 : 당신은 GNU를 사용하는 경우 각 반복에서 구조를 만들어 목록을 반복하는 foreach-eval-call를 사용하여 인스턴스화 할 수 있도록 두 번 : 한 번만 eval으로 만들고 한 번 더 정상적인 처리를합니다. 따라서 일부 변수는 첫 번째 확장 (따라서 [email protected])으로부터 보호되어야합니다.

+0

귀하의 도움에 감사 드리며 접두사는'copy_official_'입니다! – portforwardpodcast