Co Robi *.o/Sufiksy w Makefile oznaczają?

Widziałem takie komendy na wszystkich plikach Makefile, których nie do końca rozumiem:

vpath.o: make.h config.h getopt.h gettext.h dep.h

I

.SUFFIXES:
.SUFFIXES:  .f  .o
#
# %------------------%
# | Default command. |
# %------------------%
#
.DEFAULT:
    @$(ECHO) "Unknown target $@, try:  make help"
#
# %-------------------------------------------%
# |  Command to build .o files from .f files. |
# %-------------------------------------------%
#
.f.o:
    @$(ECHO) Making $@ from $<
    @$(FC) -c $(FFLAGS) $<

Co oznaczają *.o i *.suffixes?

Uwaga: oba polecenia pochodzą z różnych części skryptu.

 20
Author: Graviton, 2010-01-06

5 answers

Pierwsza linijka w twoim pytaniu to standardowa reguła Makefile.

vpath.o: make.h config.h getopt.h gettext.h dep.h

Plik .o jest plikiem obiektowym; jest produktem pośrednim pomiędzy plikami źródłowymi a ostatecznym skompilowanym plikiem binarnym. Zawiera skompilowany kod, ale nie został jeszcze połączony w kompletną bibliotekę lub plik binarny. Ta zasada mówi tylko, że vpath.o zależy od make.h, config.h, itd. i za każdym razem, gdy są one zmieniane, należy je ponownie skompilować. Polecenia niezbędne do zbudowania {[4] } powinny następować po kolejne linie, wcięte znakiem tabulacji. (Przepraszam, jeśli powtarzam rzeczy, które już wiesz; nie byłem pewien, co do której części pierwszej linii jesteś zdezorientowany).

.SUFFIXES nie odnosi się do rzeczywistego sufiksu pliku; jest to po prostu specjalny rodzaj reguły w pliku makefile, która jest używana do konfiguracji "reguł sufiksu".

Reguły przyrostków są regułami formy .a.b, tak jak widzisz z regułą .f.o. Są sposobem na powiedzenie make, że za każdym razem, gdy widzisz, powiedzmy, .f plik ( plik źródłowy), możesz utworzyć z niego plik .o (plik docelowy), postępując zgodnie z tą regułą, gdzie $< wskazuje plik źródłowy, a $@ reprezentuje plik docelowy.

.SUFFIXES "target" to sposób na określenie, których przyrostków możesz użyć w swoich regułach przyrostków. Gdy jest używany bez warunków wstępnych, czyści wbudowaną listę sufiksów; gdy jest używany z warunkami wstępnymi, dodaje te do swojej listy znanych sufiksów, które mogą być używane w regułach sufiksów.

W GNU make, możesz użyć więcej potężne i bardziej przejrzyste % do tworzenia reguł wzorca, takich jak:

%.o: %.c
    gcc -c -o $@ $<

Który jest odpowiednikiem reguły sufiksu:

.c.o:
    gcc -c -o $@ $<

Zobacz GNU Make documentation aby uzyskać więcej informacji (ale które również wspomina o rozszerzeniach GNU), lub Single Unix Specification/POSIX dla wspólnej, przenośnej składni.

 26
Author: Brian Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-06 05:29:26

Jak już wspomniałem wiersz
.Przyrostki:
usunie wszystkie znane przyrostki. Dzieje się tak, że:

  • domyślne przyrostki nie kolidują ze specjalnymi przyrostkami.
  • różne programy make mają niezgodne listy sufiksów i reguły implicit, i to czasami powoduje zamieszanie lub złe zachowanie ogólne konwencje dla plików Makefile

Jeśli używasz GNU make to lepiej używać reguł pattern zamiast sufiksu Zasady ponieważ one (reguły sufiksu) istnieją ze względów kompatybilności.Również reguły sufiksu nie mogą mieć własne warunki wstępne.

Więc przepisałbyś regułę sufiksu formy:

.f. o:
...

Jako reguła wzorca postaci:

%.o:%.f:
...

Zauważ, że w regułach przyrostków prefiks wstępny jest pierwszy, a sufiks docelowy jest drugi, gdzie podobnie jak w regułach wzorców jest odwrotnie (i mniej mylące).

Jeśli planujesz pracować więcej z Makefile, Zobacz też Zarządzanie projektami z GNU Make który jest dostępny w Internecie.

 4
Author: sateesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 06:20:07

Składnia Makefile jest subtelna i szybka do gniewu. Proponuję rzucić okiem na dokumentację dla make , szczególnie część o regułach przyrostków.

 3
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-06 04:21:10

Pierwsza linia .SUFFIXES usuwa całą wiedzę o 'wbudowanych' przyrostkach; druga przywraca przyrostki .f (tradycyjnie Fortran) i .o (pliki obiektowe). Reguła .DEFAULT jest używana, gdy nic innego nie może być użyte. Ostatnia reguła kompiluje plik .f do pliku .o przy użyciu kompilatora $(FC). @ oznacza nie echo polecenia - i denerwuje mnie (wolę zobaczyć polecenia używane do kompilacji).

Nie widzę *.suffixes w wyciągach makefile, więc nie mogę powiedzieć ty, co to znaczy.

 2
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-06 04:26:14

Możesz również użyć łańcucha reguły sufiksu, np. w poniższej, aby wygenerować tex, a następnie pdf z pliku gnuplot:

.SUFFIXES: .plt .tex .pdf

# (notice that there should be tabs prefixing the lines after the rule)
%.tex: %.plt
gnuplot -e " \
set format '$$%g$$' ; \
set terminal epslatex standalone color ; \
set output '$@' \
" $<

%.pdf: %.tex
pdflatex $<

all: test.pdf
 0
Author: lukmac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-10 20:39:08