make-файл parse target для определения зависимостей - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть исходные файлы в нескольких каталогах, и я хочу скомпилировать их в один уникальный временный каталог, в настоящее время я использую эту цель для создания своих объектных файлов:

$(BUILD_DIR)/%.o : 
    @echo "Compiling $@"
    $(VERBOSE) $(CC) $(CFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $(shell echo "$(SOURCES)" | sed 's/ /\n/g' | sed -nr '/\/$(*F)\.c/p')

Это работает хорошо, но когда яизменить исходный файл, объект один не перекомпилирован.Поэтому я должен добавить исходный файл к зависимостям.

Но эта цель не работает:

$(BUILD_DIR)/%.o : $(shell echo "$(SOURCES)" | sed 's/ /\n/g' | sed -nr '/\/$(*F)\.c/p')
    @echo "Compiling $@"
    $(VERBOSE) $(CC) $(CFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $^

Есть ли способ использовать имя цели в зависимостях?

1 Ответ

0 голосов
/ 26 ноября 2018

Предполагается, что вы используете GNU Make ...

Используйте шаблонное правило, например:

obj/%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

, чтобы сообщить make, что объектный файл obj/<name>.o должен быть скомпилирован из исходного файла <name>.c

В сочетании с этим используйте специальную переменную VPATH , чтобы сообщить make о каталогах, в которых он должен искать любые<name>.c, если его нет в текущем каталоге.

Кроме того, добавьте обязательное условие только для заказа в правило шаблона, чтобы убедиться, что каталог (obj), к которому относится ваш каталог.Объектные файлы скомпилированы существуют при необходимости:

obj/%.o: %.c | obj
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

Так, например, со структурой проекта:

./
-- Makefile
-- aa/
    -- main.c
-- bb/
    -- foo.c
-- obj/ #<-- Compile object files in here
-- prog #<- program to be built

И:

Makefile

VPATH := aa:bb
SRCS := foo.c main.c
OBJS := $(addprefix obj/, $(SRCS:.c=.o))

.PHONY: all clean

all: prog

prog: $(OBJS)
    $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)

obj/%.o: %.c | obj
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

obj:
    mkdir $@

clean:
    $(RM) $(OBJS) prog

сборка работает так:

$ make
cc   -c -o obj/foo.o bb/foo.c
cc   -c -o obj/main.o aa/main.c
cc  -o prog obj/foo.o obj/main.o 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...