2011-08-22 14 views
5

Piszę plik Makefile, który wykonuje pewne generowanie zależności i muszę już zduplikować reguły, ponieważ (starsza wersja) baza kodów zawiera mieszaninę plików .cpp i .cc. Wydaje się nieco brzydki. Czy mimo to można określić, że wymagania wstępne celu mogą być plikami .cpp lub .cc?Unikaj duplikowania reguł GNU Make

Więc zamiast:

%.d : %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d : %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

Tworzenie czegoś bez powielania takich jak:

%.d : %.(cpp | cc) 
    $(CPP) -MM $(CPPFLAGS) $< 

Albo jest to egzekwowane redundancja prostu niefortunne elementem GNU Bądź na projekt?

+0

jeśli używasz Autotools GNU, z których możesz prawdopodobnie korzystać z makr m4 – Kevin

Odpowiedz

3

Pierwsza opcja, użyć zmiennej zdefiniować ciało reguły raz i używać go jako poszkodowanym:

DEPGEN=$(CPP) -MM $(CPPFLAGS) $< 
%.d: %.cpp ; $(DEPGEN) 
%.d: %.cc ; $(DEPGEN) 

drugą opcję, należy $(eval) do dynamicznego generowania reguł:

$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<)) 
+0

Opcja pierwsza jest dokładnie tym, czego szukałem. – Alastair

1

To powinno działać:

%.d :: %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d :: %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

inny pomysł:

%.d : %.c 
    $(CPP) -MM $(CPPFLAGS) $< 

%.c : %.cpp 
    ln $< [email protected] # or cp -p 

Innym pomysłem jest, aby GNU make wygenerowania dwóch reguł wzorców. Istnieje essentally dwa sposoby osiągnięcia tego celu:

  • zapisać je do makefile (%-cc.mk lub podobne), które zawierają w swoim faktycznym makefile z GNU make za include rachunku
  • generowania i ocenić je inline z GNU make na $(eval) i $(call) funkcje

Jak najbardziej wszystko w toolchain rozwoju C/Unix, techniki te są w istocie formą wstępnego przetwarzania, dzięki czemu są łatwe do zrozumienia w cenie jest naprawdę ciężko use (wiele podwójnych lub potrójnych ucieczek, naprawdę trudno jest śledzić to, co jest rozszerzane, kiedy; debugowanie może być królewskim bólem, przynajmniej z mojego doświadczenia).

Dlatego rezerwuj je na bardziej skomplikowane przypadki użycia (z których lista Stack Overflow zawiera tylko kilka).

+0

Żadna z tych opcji nie wydaje się prowadzić do bardziej zwięzłego pliku Makefile. Prawdopodobnie po prostu trzymam się oryginalnego formularza. Dziękuję za sugestie. – Alastair