Nie mogłem dowiedzieć się, jak to zrobić łatwo. O ile rozumiem, będziesz musiał wykonać pracę ręczną.
Jeśli chcesz użyć tej zmiennej w tekście reguły, na przykład, będziesz musiał robić sztuczki, ponieważ tekst reguły zawsze ma odroczoną ekspansję. Jeśli więc masz regułę, zawsze będzie drukować nazwę głównego pliku makefile. Zamiast tego, aby wymusić natychmiastową ekspansję, trzeba będzie utworzyć kolejną zmienną o nazwie makefile specyficzne (tj nazwy takich zmiennych powinna być różna w każdej makefile):
this_makefile_unique_name := $(current_makefile)
rule:
echo In makefile $(current_makefile):
echo Making target [email protected]
lub wykorzystać eval :.
define make_rule
rule:
echo In makefile $(1):
echo Making target [email protected]
$(eval $(call make_rule,$(current_makefile)))
Jeśli chcesz użyć nazwy bieżącego makefile tylko w celu debugowania, należy rozważyć specjalne funkcje debugowania, takie jak ostrzeżenia lub informacji :.
$(warning We're in makefile $(current_makefile))
Te funkcje używają "natychmiastowego" rozszerzenia i wyświetlają poprawną wartość.
Jak zdefiniować taką $ (current_makefile)?
Musisz ręcznie utrzymywać stos plików Makefile. Po dołączeniu pliku makefile jego nazwa jest umieszczana na szczycie stosu; po powrocie z dołączonego pliku makefile do zewnętrznego, najwyższa nazwa jest wyskakiwana ze stosu. Osiąga się to poprzez umieszczenie specjalnych połączeń na początek i koniec makefile:
# Beginning of makefile
$(eval $(makefile_names_push))
#... makefile text
$(warning $(current_makefile))
#...
$(eval $(makefile_names_pop))
#End of file
teraz definiować funkcje na początku swojej makefile korzeniowego.
lastword=$(word $(words $(1)),$(1))
define makefile_names_push
current_makefile := $$(CURDIR)/$$(call lastword,$$(MAKEFILE_LIST))
makefile_stack :=$$(makefile_stack) $$(current_makefile)
endef
define makefile_names_pop
makefile_stack := $$(filter-out $$(current_makefile),$$(makefile_stack))
current_makefile := $$(call lastword,$$(makefile_stack))
endef
Jeśli masz pewność, że makijaż jest dość nowy (wersja 3.81+), wymienić lastword
połączenia z funkcją wbudowanego :.
#inctead of $$(call lastword,$$(MAKEFILE_LIST))
$$(lastword $$(MAKEFILE_LIST))
Czy jest przydatna?
Całkowicie bezużyteczne. Użyteczne może być tylko stworzenie 100 plików makefile, które są dowiązaniami symbolicznymi do jednego pliku makefile, reguły w tych plikach makefile zależą od ich nazw. Ale można to osiągnąć w ramach jednej makefile i techniki foreach-eval opisanej w instrukcji. Więc mój post był całkowitą stratą czasu, chociaż miałem trochę zabawy :-)
Czy mogę zapytać, dlaczego tego potrzebujesz? – erelender