2011-09-13 3 views
40

Mam makefile, który wygląda tak:Co robi symbol procentowy w pliku Makefile?

include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS)) 

%-test: 
     Something here 

Rozumiem, co to jest przeznaczone do w linii reguły docelowej. Co robi znak % w pierwszym wierszu? Czy ma coś do zrobienia znak procentowy w linii reguły celu?

Kiedy piszę make sometarget, czy linie w pliku makefile, które nie zostały zapisane jako część jakiejkolwiek reguły (np. Pierwszego wiersza w tym pliku makefile) zostały w ogóle wykonane? Jeśli tak, to jaka jest kolejność wykonania?

Odpowiedz

33

Jak można przeczytać w the GNU make manual, procent działa jako wieloznaczny. Pierwszy argument modelu patsubstfunction tworzy wzór. Każda pozycja/słowo w ostatnim argumencie jest porównywana z tym wzorcem, a jeśli pasuje, zostaje zastąpiony drugim argumentem. Jeśli w wzorcu znajduje się symbol wieloznaczny (%), dopasuje on dowolną liczbę znaków, a te znaki zostaną skopiowane do ciągu zastępczego w miejscu% w drugim argumencie.

W twoim przykładzie wzorzec jest po prostu symbolem wieloznacznym, więc dopasuje dowolne słowo z ostatniego argumentu do funkcji, a to słowo zostanie skopiowane do ciągu zastępczego (drugi argument) w miejscu% .

Przykład może uprościć sytuację. Załóżmy, że TEST_SUBDIRS zawiera dwie nazwy.

TEST_SUBDIRS := test1 test2 
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS)) 

Jest to odpowiednik następującego po nim.

include $(src)/test1/Make.tests $(src)/test2/Make.tests 

Plik Makefile jest przetwarzany sekwencyjnie, linia po linii. Przypisania zmiennych są "internalizowane", a instrukcje włączające powodują, że zawartość innych plików jest wstawiana dosłownie w tym miejscu, po czym ta treść jest przetwarzana jako część pliku Makefile.
Graf zależności jest tworzony na podstawie reguł podczas ich odczytywania, a po przetworzeniu całego pliku wykonywane są niezbędne receptury, aby zaktualizować żądany cel.