2013-07-18 4 views
0

메이크 파일에서 파일 이름 목록을 변수 이름 집합으로 변환하는 방법은 무엇입니까? 예를 들어파일 이름 목록을 메이크 파일에서 변수 이름 집합으로 변환하는 방법

, 나는 파일 이름의 목록을 변수로 설정합니다

filename := file1 file2 file3 ... 
    file1 := opt1 
    file2 := opt2 
    file3 := opt3 
    ... 
    ... 

을 지금은 변수의 새로운 만들려면 :

file1_opt := $(file1) 
    file2_opt := $(file2) 
    file3_opt := $(file3) 
    ... 
    ... 

어떻게 메이크에서 그것을 할 수 있습니까?

배쉬를 들어이 간단하다

for name in $(filenames) 
    do 
     $($(subst .,_,$(subst /,_,name)))_opt := $($(subst .,_,$(subst /,_,name))) 
    done 

하지만 어떻게 메이크에 그것을 만들?

예 :

./module/files.mk

C_SRC := a_file.c b_file.c 
    CPP_SRC := c_file.cpp d_file.cpp 

    a_file_c := -O2 
    b_file_c := -DN_DEBUG 

./Makefile

.... 

    SRCDIR := module 
    include makef.mk 
    .... 
    $(C_OBJ) : $(OBJDIR)/%.o : %.c 
     $(CC) -c $(C_FLAGS) $(C_FLAGS_$(subst .,_,$(subst /,_,$<))) $< -o [email protected] 
    .... 

./makef.mk

SAVE_C_SRC := $(C_SRC) 
    SAVE_CPP_SRC := $(CPP_SRC) 

    C_SRC := 
    CPP_SRC := 

    include $(SRCDIR)/files.mk 
    MK_DIRS += $(OBJDIR)/$(SRCDIR) 

    ----[ problem site ]---- 
    # this work for bash but not for make 
    for name in $(C_SRC) 
    do 
     C_FLAGS_$(SRCDIR)_$($(subst .,_,$(subst /,_,name))) := $($(subst .,_,$(subst /,_,name))) 
     $($(subst .,_,$(subst /,_,name))) := 
    done 
    ----[ end of problem site ]---- 


    SAVE_C_SRC += $(C_SRC:%=$(SRCDIR)/%) 
    SAVE_CPP_SRC += $(CPP_SRC:%=$(SRCDIR)/%) 

    C_SRC := $(SAVE_C_SRC) 
    CPP_SRC := $(SAVE_CPP_SRC) 

리아

+0

이 목록을 기반으로 새 메이크 파일을 만들 때 스크립트를 사용할 수 없습니까? –

답변

0

당신은 GNU가 만들어 사용하는 가정, 당신은 사용할 수 있습니다 : 나는 믿고

$(foreach name,$(subst .,_,$(subst /,_,$(C_SRC))),$(eval $(name)_opt := $($(name)))) 

당신이 원하는 것을 할 것입니다.

0

이 (http://www.gnu.org/software/make/manual/html_node/Foreach-Function.html)에서 "foreach 결과를 만들기 위해 [---]를 연결했습니다."라는 결과로 혼란 스러웠습니다. "그 결과 텍스트는 공백으로 구분 된 단어가 목록에있는 수만큼 확장됩니다. foreach의 결과를 만들기 위해 여러 개의 텍스트 확장이 연결됩니다. (. 나는 하나의 문자열 항상 'foreach는'의 결과입니다 생각되었다)

하지만이 :

clear_name = $(subst .,_,$(subst /,_,$(1))) 

    define rename_var 
    $(2)_$(call clear_name,$(SRCDIR))_$(call clear_name,$(1)) := $($(call clear_name,$(1))) 
    $(call clear_name,$(1)) := 
    endef 

    $(foreach name,$(C_SRC),$(eval $(call rename_var,$(name),C_FLAGS))) 

일이며 C_SRC에서 각 파일에 대해 하나 개의 변수를 확인하십시오.

일리아