Co oznacza symbol% ​​w Makefile

11

Bawię się plikami makefile i natrafiłem na % .o lub % .c . Z tego, co zrozumiałem, określa wszystkie pliki c lub o . Ale dlaczego to działa:

%.o: %.c
        $(CC) -c $^  -o $@  

i to nie działa

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

Oba wyrażenia określają wszystkie pliki. więc co robi % .o: symbol w pliku make?

Mero
źródło

Odpowiedzi:

9

Oba wyrażenia określają wszystkie pliki.

Nie, pierwsza reguła mówi, makejak uzyskać .oplik, biorąc pod uwagę odpowiedni .cplik. Zwróć uwagę na liczbę pojedynczą: pojedynczy plik.

Druga reguła (jak twierdzi) mówi, makejak uzyskać wiązkę .oplików, biorąc pod uwagę kolejną wiązkę odpowiednich .cplików. Uwaga liczba mnoga: wszystkie .cpliki wynikające z *.cglobowania.

Na marginesie %.o: %cjest rozszerzenie GNU.

Z drugiej strony, nie nauczysz się korzystać makez StackOverflow. Zamiast tego powinieneś rozważyć przeczytanie książki.

Satō Katsura
źródło
RTFM, naprawdę? Myślałem, że celem wymiany stosów było oczyszczenie tej mentalności.
daknowles
12

Konstrukt:

%.o: %.c
        $(CC) -c $^  -o $@  

jest regułą wzorca , która jest rodzajem reguły niejawnej. Określa jeden cel i jedną zależność oraz powoduje jedno wywołanie $(CC)dla każdego celu. Kiedy to:

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

jest standardową regułą, ale ma (prawdopodobnie) wiele celów i wiele zależności. Mimo wszystko wywoła to tylko $(CC)raz.

Stephen Rauch
źródło