Понимать уровни зависимости make-файлов - PullRequest
4 голосов
/ 20 апреля 2019

Предположим, что у проекта есть следующие файлы, где первые файлы зависят от файлов из его категории в неупорядоченном списке:

  • main.c
    • global.h (содержит перечисления и #define макросы)
    • sdlevent.h (общий заголовочный файл)
      • sdlevent.c (содержит реализации sdlevent.h)
    • sdlshape.h (общий заголовочный файл)
      • sdlshape.c (содержит реализации sdlshape.h)

Теперь у меня есть следующий make-файл:

CC = gcc
CFLAGS = -g -w -std=c99
LIBS = -lSDL2 -lSDL2_image -lSDL2_ttf

SRCS = main.c sdlshape.c sdlevent.c
OBJS = $(SRCS:.c=.o)
EXE = play

all: $(EXE)

.c.o:
    $(CC) -c $(CFLAGS) $<

$(EXE): $(OBJS)
    $(CC) -o $(EXE) $(OBJS) $(LIBS)

$(OBJS): global.h sdlevent.h sdlshape.h

run : all
    ./$(EXE)

clean:
    rm -f *.o *~ $(EXE)

Цель $(EXE) зависит от цели .c.o. Обязательно ли нужно определять цель $(EXE) после цель .c.o?

Я так не думаю, потому что, хотя цель $(EXE) зависит от цели $(OBJS), цель ($EXE) объявляется до $(OBJS).

1 Ответ

2 голосов
/ 20 апреля 2019

Нужно ли обязательно определять целевой $ (EXE) после целевого .co?

Во-первых, .c.o не является целью, это правило суффикса .

Во-вторых, make не имеет значения, в каких целях последовательности написаны, поэтому ответ - «нет».Весь make-файл читается, и когда цель отсутствует, выполняется поиск правила для создания цели.Технически, make создает направленный ациклический граф (DAG) целей и зависимостей, прежде чем он решит построить что-либо.Ссылки на переменные заменяются, когда они используются, а не когда они читаются (исключение: оператор присваивания := GNU make).

Попробуйте поиграть с порядком целей.Вы даже можете переместить назначения переменных вниз.

Я уверен, что в GNU есть несколько эзотерических углов, где все работает немного по-другому, но в простом makefile, как у вас, не отклоняясь слишком далеко отMakefile для POSIX, вот как это работает.

...