2013-07-01 2 views
0

gcc에서 생성 된 종속성 정보를 기반으로 make에서 etags 대상을 작성하려고합니다. 거기에 하나의 모든 의존성을 얻는 방법이 있습니까? 아니면 "태그"대상이 만들어지고 모든 소스 및 헤더 파일을 etags에 전달할 때만 실행되는 규칙을 작성하는 방법은 무엇입니까? 헤더 파일을 포함하여 실제로 컴파일 된 파일에 대해서만 색인을 생성하려고합니다. 나는 나 자신이 .d 파일에서 주위를 피할 수 있다는 것을 알고 있지만 좀 더 우아하고 덜 부서지기 쉬운 해결책을 찾으려고 노력 중이다.make에서 모든 의존성 목록 얻기

나는 다음 (발췌)

DEPFILES = $(OBJFILES:.o=.d) 

%.o : %.c 
    @echo "Compiling $<" 
    $(NO_ECHO) $(CC) $(CFLAGS) -MMD -MF $(@:.o=.d) -o [email protected] -c $< 

%.o : %.S 
    @echo "Compiling $<" 
    $(NO_ECHO) $(CC) $(ASFLAGS) -MMD -MF $(@:.o=.d) -o [email protected] -c $< 

$(TARGET) : $(OBJFILES) 
    @echo "Linking [email protected]" 
    $(NO_ECHO) $(LD) $(LDFLAGS) -o [email protected] $(OBJFILES) $(LIBS:%=-l%) 

.PHONY: clean 

# Order-only dependency to make Dep/obj-directories if they are not 
# present 
$(OBJFILES) : | $(ALLPATHS) 

$(ALLPATHS): 
    $(NO_ECHO) mkdir -p $(ALLPATHS) 

# Depend on the makefiles 
$(OBJFILES) : $(SRC_PATH)/Makefile $(MAKECFG) $(BUILDCFG) 

# Include dependency files 

sinclude $(DEPFILES) 

편집이 : 다음은 작동하는 것 같다하지만 난 정말 더 우아한 해결책 을 (이중 종류/UNIQ 그냥 성능입니다) 찾을 싶습니다.

답변

0

각 .d 파일에 대한 미니 태그 파일을 만든 다음 etags 파일을 업데이트해야합니다. 내가 여기에 같은 일에 대한 답을 찾고 온

TAGFILES = $(OBJFILES:.o=.t) 

# prune the .d files a bit to get a list of files for etags to scan 
%.t: %.d 
    cat $< | sed stuff > [email protected] 
    cat [email protected] | etags -a [email protected] 

.PHONY: tags 
tags: $(TAGFILES) 
+0

고양이와 가짜 타겟 변수의 쓸모없는 사용 :'sed stuff < $< > $ @'. – Jens

+0

"something like"는 "very approximate"를 의미합니다. –

+0

솔직히 말해서, "내가 쓴 것을 신경 쓰지 않고, 자신의 발췌 문장을 테스트하는 데 귀찮아서 고칠 수 없습니다. 중간에 끝나는 문장, 그래서? 나는 그것이 시험되지 않았다고 말했다. " – Jens

0

(ctags--update 옵션이 있습니다)이 오히려 제거 및 교체보다, 파일에 물건을 추가합니다, 그래서 당신은 원격 태그가 가끔 파일을해야 할 수도 있습니다 원래의 질문이지만, 적절하게 대답했다고 생각하지 않았고 sed 등이 필요없는 솔루션을 찾았습니다.

다음은 사용하는 dep 파일을 생성하는 원래 질문의 Makefile과 비슷한 Makefile을 가정합니다. 컴파일러와 그들을 포함합니다.

.d 파일이 생성되는 컴파일 규칙의 경우 컴파일러 옵션을 수정하여 태그 대상이 개체 파일의 종속성에 따라 달라 지도록 요청했습니다. 나는 옵션에 -MQ [email protected] -MQ tags을 추가했다. 이 옵션은 컴파일러에게 의존성에 대한 타겟의 이름을 명시 적으로 알려줍니다. 우리가 컴파일하고 소스 파일의 변화에 ​​따라 따라 업데이트 될 때

%.o : %.c 
    $(CC) $(CFLAGS) -MMD -MF $(@:.o=.d) -o [email protected] -c $< -MQ [email protected] -MQ tags 

이제 우리는, 그것이 생성됩니다 명시 적으로 태그 종속성 목록을 대상으로 제공 할 필요가 없습니다. 내 경우에는 내가 ctags을 이용하고 있고이 옵션은 내가 그것을 사용하는 무엇이다 :

tags: 
    echo $^ | ctags -L - -o [email protected] 

$^ 변수 의존성의 목록입니다. 이것은 각 .d 파일이 다음과 같이 표시 될 때 소스 및 헤더 파일의 목록이됩니다.

main.o tags: main.c a.h b.h 

희망이 있습니다.