我是新来的 GNU make. 我想把所有的汇编源文件编译成名称相同的独立对象文件。将来,如果我增加了更多的装配体源文件,就会出现 Makefile 应该不需要修改也能正常工作。
例如,我在根目录下
$ ls
Makefile obj src
$ ls src
file1.s file2.s
之后 make
我想
$ ls obj
file1.o file2.o
将来如果我增加一个 file3.s
对我 src
目录,在 make
我想要一个新的 file3.o
在我 obj
目录。
我读过关于 静态模式规则 在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
在shell中,我得到了错误。
make: *** No rule to make target `src/*.s', needed by `obj/*.o'. Stop.
谁能告诉我我犯了什么错误?我已经检查了,我使用的食谱前面的标签。先谢谢你。
这是不可能的。
objects = $(objdir)/*.o
当你第一次运行make的时候 这个文件会扩展成什么? 你没有对象文件,所以通配符会扩展为没有文件。 或者,如果你有一些对象文件,并创建一个新的源文件,它将扩展到什么? 它将只扩展到现有的对象文件。
由于你只要求make建立已经存在的对象文件,所以它绝不会建立不存在的对象文件。
你需要做的是告诉make建立一个对象文件。对于每个源文件.
你可以这样做。
srcdir = src
sources = $(wildcard $(srcdir)/*.s)
objdir = obj
objects = $(sources:$(srcdir)/%.c=$(objdir)/%.o)