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?

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.