2009-10-26 4 views
1

기본적으로 'blah.txt'파일이 있습니다. 그 파일은 '컴파일러'에 의해 파싱되고 N 개의 출력 .c 파일을 생성합니다. 그 아무튼 분명히자동 생성 된 소스 파일을 함께 보관/링크 할 Makefile

all: dogen libmystuff.a 

dogen: source.txt 
    mycompiler $^ 

libmystuff.a: $(addsuffix .o, $(shell ls *.c)) 
    $(AR) rcs [email protected] $^ 

.PHONY: dogen 

을하지만 : 그때 나는 그들 모두를 컴파일하고 나는 이런 식으로 뭔가의 문질러서

libmystuff.a에서 그들을 보관이 .txt 인 파일에서 C 파일을 생성하는 메이크 파일을 원하는 종속성은 시작과 그 시점에서 평가되기 때문에 * .c는 아직 존재하지 않기 때문에 아무 것도 산출하지 않기 때문에 일하지 않습니다.

누구든지 생성 된 * .c 명시 적으로 나열하지 않고이를 수행하는 방법을 알고 있습니까?

+0

[makefile] 대신 [make] 태그를 지정하십시오. 자세한 내용은 http://meta.stackexchange.com/questions/24030/why-do-they-specify-makefile-tag-instead-of-make/26567#26567 –

답변

1

Pavel Shved가 맞으면 (*), Make를 다시 실행해야합니다. 여기 내가 자랑스러워하는 트릭이 있습니다. 아직 존재하지 않을 수도있는 오브젝트에 대한 종속성을 처리하며 불필요하게 실행되지 않습니다.

 
SOURCES = $(wildcard *.c) 
OBJECTS = $(SOURCES:.c=.o) 

all: libmystuff.a 

ifeq ($(MAKELEVEL),0) 
libmystuff.a: source.txt 
    mycompiler $^ 
    @$(MAKE) -s [email protected] 
else 
libmystuff.a: $(OBJECTS) 
    $(AR) rcs [email protected] $^ 
endif 

(*) 내 옛 적병, 우리는 다시 만난다.

편집 : 일부 다른 make가 메이크업을 호출하는 경우
... 내가 그 생각을하지 않았다. 하지만이 그것을 해결할 생각 :

 
SOURCES = $(wildcard *.c) 
OBJECTS = $(SOURCES:.c=.o) 

all: libmystuff.a 

libmystuff.a: source.txt 
    mycompiler $^ 
    @$(MAKE) -s phonyLib 

.PHONY: phonyLib 
phonyLib: $(OBJECTS) 
    $(AR) rcs libmystuff.a $^ 

(예, 당신이 "phonyLib"라는 파일을 구축 할 수있는 충동을 느낄 경우이 메이크 함께 할 수 없습니다, 그러나의를하지 말자 것, 알고)

+0

아, 전 그 *에 * nitpick 실 거예요!오히려, 나는 할 것입니다 ... 오, 절대 신경 쓰지 마세요 :) –

+0

고마워, 그게 잘 작동하고 '깨끗한'케이스를 더 잘 처리합니다. – 246tNt

+0

나는 소유하고 있습니다. X) –

2

.c 파일이 .txt에서만 생성되는 경우 libmystuff.a가 txt에 종속되도록하고 규칙 본문에서 $ (shell ls * .c)를 대신 평가할 수 있습니다.

+0

글쎄, 실제로 컴파일하려면 makefile이 필요합니다. .c 그리고 makefile의 다른 곳에서는 옵션과 물건을 사용하여 .c를 .o로 변환하는 방법을 나타내는 규칙이 있으며 libmystuff.a 대상 안에있는 모든 논리를 반복하지 않아도됩니다. – 246tNt

3

사용 보초 "메이크"로 메이크 파일을 다시 읽게 강제 *.c에 정확한 목록을 대체합니다 :

include sources-sentry 

sources-sentry: source.txt 
    mycompiler $^ 
    touch [email protected] 

libmystuff.a: $(addsuffix .o, $(shell ls *.c)) 
    $(AR) rcs [email protected] $^ 

include 지시어는 다른 메이크 파일을 포함하는 데 사용됩니다 (다만 C의 #include처럼). 그것은 포함하는 메이크 파일 자체가 타겟 인 경우 좋은 성질을 가지고 있습니다. make 프로그램은 먼저 타겟으로 간주하고 업데이트를 시도합니다. 최신이 아닌 경우 make는 업데이트하는 데 필요한 명령을 호출 한 다음 은 모든 변수를 다시으로 대체하여 makefile을 다시 읽습니다. source.txt 당신이 (시간이 소스 - 보초 파일의 타임 스탬프로 기록되는)를 처리 한 마지막 시간 이후 변경 한 경우

따라서, 소스가 업데이트 그리고, *.c가되고 다시 호출됩니다하게됩니다 C 파일의 업데이트 세트로 대체됩니다.

+0

훌륭한 작품, 단 한 가지 어려운 문제 : 깨끗한 표적을 만들 때 너무 발전합니다 ... – 246tNt

+0

@ 246tNt, 맞습니다.이 문제에 대한 해결책이 없습니다 :-( –

관련 문제