Скомпилируйте C исходные файлы из дерева в каталог сборки с помощью make - PullRequest
1 голос
/ 06 марта 2020

У меня есть Makefile, который похож на эту сокращенную версию:

.PHONY: all

CC  = gcc -O3 -fPIC
SRC = $(shell find src -type f -name '*.c')
OBJ = $(addprefix build/, $(notdir $(SRC:.c=.o))
TGT = build/prog

all: $(TGT)

$(TGT): $(OBJ)
    $(CC) $+ -o $@

build/%.o: src/a/%.c
    $(CC) -c $+ -o $@

build/%.o: src/b/%.c
    $(CC) -c $+ -o $@

build/%.o: src/c/d/%.c
    $(CC) -c $+ -o $@

Я хотел бы объединить правила build/%.o в одно правило, потому что настоящий make-файл имеет около двадцати из них для различных путей в каталог src. Но что бы я ни пытался, ничего не работает. Я уверен, что должно быть решение, пожалуйста, просветите меня, как это можно сделать.

1 Ответ

1 голос
/ 06 марта 2020

Как указано в комментарии, вы можете использовать директиву GNU make vpath ...

.PHONY: all

CC  = gcc -O3 -fPIC
SRC = $(shell find src -type f -name '*.c')
OBJ = $(addprefix build/, $(notdir $(SRC:.c=.o))
TGT = build/prog

all: $(TGT)

$(TGT): $(OBJ)
    $(CC) $+ -o $@

# Use vpath to give make a colon (or space) separated list
# of directories in which to look for .c files.
#
vpath %.c src/a:src/b:src/c/d

build/%.o: %.c
    $(CC) -c $+ -o $@

Поскольку вы используете find для поиска исходных файлов Вы могли бы go сделать шаг вперед и использовать результаты этого find для генерации vpath ...

.PHONY: all

CC  = gcc -O3 -fPIC
SRC = $(shell find src -type f -name '*.c')
OBJ = $(addprefix build/, $(notdir $(SRC:.c=.o))
TGT = build/prog

all: $(TGT)

$(TGT): $(OBJ)
    $(CC) $+ -o $@

# Use vpath to give make a colon (or space) separated list
# of directories in which to look for .c files.  Make use of
# the $(SRC) variable to generate the list of paths automatically.
#
SRC_DIRS := $(sort $(dir $(SRC)))
vpath %.c $(SRC_DIRS)

build/%.o: %.c
    $(CC) -c $+ -o $@
...