2010-07-22 11 views
5

Chodzi o to, że projekt ma pojedynczy plik z __DATE__ i __TIME__ w nim. Może być fajnie mieć to zrekompilowane bez wyraźnej zmiany daty modyfikacji.Jak wymusić ponowną kompilację pojedynczego pliku w pliku Makefile?

edit: $ (shell touch -c ..) może być dobrym rozwiązaniem, jeśli tylko nieporęczne.

+1

To może być złe rozwiązanie Twojego problemu. Niektóre narzędzia do zarządzania wersjami mogą zrzucać szczegóły dotyczące wersji źródła. Trochę oszukańczych skryptów w procesie kompilacji i te detale są wbudowane w twój kod. Nie ma znaczenia, czy musisz sprawdzić źródło i ponownie zbudować za dziesięć lat - informacje o wersji będą nadal odzwierciedlały szczegóły tego tagu. – Steve314

+0

@ Steve314: Bardziej prawdopodobne jest, że chce o polu, które wspomina numer kompilacji i datę kompilacji. –

+0

@Ken - jeśli tak, sztuczka narzędzia wersjonowania jest właściwą drogą. Nie ma powodu, dla którego hackery skryptowe nie umieściłoby szczegółów wersji w kodzie (lub pliku zasobów) w polu o polu, a uzyskanie numeru kompilacji w polu o prawdopodobnie wymagałoby łatwo zapomnianej ręcznej interwencji w przeciwnym razie. Ani make, ani kompilator, ani system plików nie zna twojego numeru kompilacji. – Steve314

Odpowiedz

8

Standardowa idiom ma mieć plik obiektowy (nie pliku źródłowego!) Zależą od celu, który nie istnieje i nie ma zasad ani zależności (cel ten jest powszechnie nazywany FORCE), jak to

always-recompile.o: FORCE 
FORCE: 

Spowoduje to przerwanie, jeśli jakoś zostanie utworzony plik o nazwie "FORCE". Z GNU make można zamiast tego użyć specjalnego .PHONY docelowej, która nie ma tego ograniczenia, ale nie wymaga, aby mieć wyraźne reguły odbudować ten plik:

always-recompile.o: 
     $(CC) $(CFLAGS) -c -o always-recompile.o always-recompile.c 

.PHONY: always-recompile.o 

Zobacz http://www.gnu.org/software/make/manual/html_node/Phony-Targets.html więcej szczegółów.

+1

Powinieneś zrobić ".PHONY: FORCE", ponieważ always-recompile.o nie jest fałszywym celem. Z ".PHONY: FORCE" nie powinno mieć znaczenia, czy zostanie utworzony plik o nazwie FORCE. – camh

+0

Czy to faktycznie działa? GNU sprawia, że ​​ręczne dźwięki, takie jak fałszywe cele, nie działają jako zależności rzeczywistych celów. – zwol

1

Jednym ze sposobów jest usunięcie odpowiedniego pliku obiektu (.o lub .obj) przed uruchomieniem make. Spowoduje to rekompilację (i ponowne połączenie) bez zmiany daty modyfikacji pliku źródłowego.

Powiązane problemy