Makefile для программ сборки обрабатывает исходные файлы как целевые - PullRequest
0 голосов
/ 16 июня 2020

Я новичок в GNU make . Я хотел бы скомпилировать все мои исходные файлы сборки в отдельные объектные файлы с одинаковыми именами. В будущем, если я добавлю больше исходных файлов сборки, Makefile все равно будет работать без изменений.

например, я нахожусь в root каталоге

$ ls
Makefile obj src
$ ls src
file1.s file2.s

После make Я хочу

$ ls obj
file1.o file2.o

В будущем, если я добавлю file3.s в свой src каталог, после make я хотел бы новый file3.o в моем obj каталоге.

Я читал о stati c правилах шаблонов в руководстве GNU make, и я думаю, что это то, что мне нужно. Я написал следующий Makefile:

path = /path/to/toolchain/bin
AS = $(path)/llvm-mc
ASFLAGS = -filetype=obj

srcdir = src
sources = $(srcdir)/*.s
objdir = obj
objects = $(objdir)/*.o

.PHONY: all
all: $(objects)

$(objects): $(objdir)/%.o: $(srcdir)/%.s
        $(AS) $(ASFLAGS) $< -o $@

.PHONY: clean
clean:
        rm $(objects)

После запуска make в оболочке я получил сообщение об ошибке:

make: *** No rule to make target `src/*.s', needed by `obj/*.o'.  Stop.

Кто-нибудь может сказать мне, какую ошибку я сделал? Я проверил, что использовал табуляцию перед рецептом. Заранее спасибо.

1 Ответ

5 голосов
/ 16 июня 2020

Это не может работать:

objects = $(objdir)/*.o

Когда вы запускаете make в первый раз, до чего это расширится? У вас нет объектных файлов, поэтому подстановочный знак не заменяется файлами. Или, если у вас есть объектные файлы, и вы создаете новый исходный файл, до чего он будет расширяться? Он будет расширяться только до существующих объектных файлов.

Поскольку вы просите make только создать объектные файлы, которые уже существуют, он никогда не будет создавать несуществующие.

Что вы необходимо указать программе make построить объектный файл для каждого исходного файла .

Вы можете сделать это следующим образом:

srcdir = src
sources = $(wildcard $(srcdir)/*.s)
objdir = obj
objects = $(sources:$(srcdir)/%.c=$(objdir)/%.o)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...