2017-12-04 21 views
0

makefile에 하위 디렉토리를 만들려고합니다. 각각의 하위 디렉토리에 대한 규칙을 사용하여이를 수행하는 방법을 알고 있습니다. 루프를 사용하거나 SUBDIRs 목록을 사용하여 모든 하위 디렉터리에 대해 하나의 규칙을 사용하는 구문을 찾고 있습니다. 예를 들어makefile에서 하나의 규칙을 사용하여 일부 하위 디렉토리 만들기

:

$(dst_dir)/%.o : $(M2M_GENERIC_DIR)/rm/src/%.c 
    $(TRACE_CC) 
    $(Q)$(GCC) -c $(CFLAGS) $< -o [email protected] 
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT [email protected] -MF $(subst .o,.d,[email protected]) $< -o $(subst .o,.d,[email protected]) 

$(dst_dir)/%.o : $(M2M_GENERIC_DIR)/utility/src/%.c 
    $(TRACE_CC) 
    $(Q)$(GCC) -c $(CFLAGS) $< -o [email protected] 
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT [email protected] -MF $(subst .o,.d,[email protected]) $< -o $(subst .o,.d,[email protected]) 

$(dst_dir)/%.o : $(M2M_GENERIC_DIR)/fota/src/%.c 
    $(TRACE_CC) 
    $(Q)$(GCC) -c $(CFLAGS) $< -o [email protected] 
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT [email protected] -MF $(subst .o,.d,[email protected]) $< -o $(subst .o,.d,[email protected]) 

$(dst_dir)/%.o : $(M2M_GENERIC_DIR)/fota/src/lzo/%.c 
    $(TRACE_CC) 
    $(Q)$(GCC) -c $(CFLAGS) $< -o [email protected] 
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT [email protected] -MF $(subst .o,.d,[email protected]) $< -o $(subst .o,.d,[email protected]) 
+2

무거운 반복은 당신이 성취하고자하는 것을보기가 더 어렵게 만들고, 그 자체로 반 패턴입니다. https://en.wikipedia.org/wiki/Don%27t_repeat_yourself – tripleee

+1

'mkdir -p "$ (dst_dir)"'을 찾고 계신가요? – tripleee

답변

0

좋아, 난 당신이 찾고있는 것은이 생각 :

#------------------------------------- 
define mk_subdir = 

$1/%.o : $(M2M_GENERIC_DIR)/rm/src/%.c 
    $(TRACE_CC) 
    $(Q)$(GCC) -c $(CFLAGS) $< -o [email protected] 
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT [email protected] -MF $(subst .o,.d,[email protected]) $< -o $(subst .o,.d,[email protected]) 

$1/%.o : $(M2M_GENERIC_DIR)/utility/src/%.c 
    $(TRACE_CC) 
    $(Q)$(GCC) -c $(CFLAGS) $< -o [email protected] 
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT [email protected] -MF $(subst .o,.d,[email protected]) $< -o $(subst .o,.d,[email protected]) 

$1/%.o : $(M2M_GENERIC_DIR)/fota/src/%.c 
    $(TRACE_CC) 
    $(Q)$(GCC) -c $(CFLAGS) $< -o [email protected] 
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT [email protected] -MF $(subst .o,.d,[email protected]) $< -o $(subst .o,.d,[email protected]) 

$1/%.o : $(M2M_GENERIC_DIR)/fota/src/lzo/%.c 
    $(TRACE_CC) 
    $(Q)$(GCC) -c $(CFLAGS) $< -o [email protected] 
    $(Q)$(GCC) -c $(CFLAGS) -MM -MT [email protected] -MF $(subst .o,.d,[email protected]) $< -o $(subst .o,.d,[email protected]) 

endef 
#------------------------------------- 

foreach (dir,$(SUBDIRS),$(eval $(call mk_subdir,$(dir))) 

은 자세한 내용은 eval를 참조하십시오.

물론 다른 사람들이 makefile을 이해/디버깅/유지하는 것을 어렵게 만들므로 정말 필요한 경우에만 사용하십시오 ... (부인 - 위 코드를 테스트 한 적이 없으므로 구문이있을 수 있습니다 오류 (GNU 만들)) ...이 곳에서

1

이 작업을 수행해야 숨기기 : 조금 더 자세한 설명

define DIR_RULE 
$$(dst_dir)/%.o : $$(M2M_GENERIC_DIR)/$(1)/%.c 
    $$(TRACE_CC) 
    $$(Q)$$(GCC) -c $$(CFLAGS) $$< -o [email protected] 
    $$(Q)$$(GCC) -c $$(CFLAGS) -MM -MT [email protected] -MF $$(subst .o,.d,[email protected]) $$< -o $$(subst .o,.d,[email protected]) 
endef 
SUBDIRS = rm/src utility/src fota/src fota/src/lzo 
$(foreach d,$(SUBDIRS),$(eval $(call DIR_RULE,$(d)))) 

, 예를이 other question (and answer)를 참조하십시오.