GNU Make无法检测到明显的规则

时间:2017-12-21 22:48:43

标签: makefile gnu-make

出于某种原因,我永远不会掌握现代编程方法。作为一个68k的汇编程序员,我试图使用单个树文件来关闭最终文件的所有内容,而是遵循更典型的"构建/链接对象"方案。但是,我花了4天的时间试图找到合理的解释并解决这个问题。

我试图自动检测并构建某个文件夹中的每个文件,该文件夹的对象被打包到一个特定的对象中,该对象将其他特定的对象链接在一起。

这是makefile:https://pastebin.com/H6QE29fj

CUR = $(SRC)\lib
VPATH = $(OBJ) $(CUR)
INPUT = $(notdir $(wildcard $(CUR:\=/)/*))
$(OBJ)\library.md.o: $(INPUT:.asm=.o)
    $(VLINK) -r -o $@ $(addprefix $(OBJ)\,$(notdir $^))

问题在于上面。几天前,我使用相同的代码片段从$(SRC)\ ints文件夹生成$(OBJ)\ ints.md.o。完全没有问题,我甚至在使用$(INPUT)变量之前手动添加了一个文件名,因此它会在SECTION(引擎shenanigans)的开头汇编。

如果所说的代码"工作",为什么它不适用于图书馆?

make: *** No rule to make target `loadtilemap.o', needed by `.\src\__obj\library.md.o'.  Stop.

%.o:%。asm rule?

是不是已经足够了

1 个答案:

答案 0 :(得分:3)

首先,我建议您在使用makefile中的路径时始终使用正斜杠而不是反斜杠。几乎所有Windows命令都将接受路径中的任一样式。如果需要调用不接受正斜杠作为路径分隔符的命令,请在需要它的配方内进行转换。 make是一个UNIX / POSIX工具,因此它通常使用目录分隔符和反斜杠的正斜杠作为转义序列。在针对Windows编译时,DTRT会针对反斜杠做出一些努力,但它可能无法在任何地方使用。只需使用正斜杠,然后继续使用其他东西。

以下是makefile的提示:

%.o: %.asm
        $(V68k) $(BUILDARGS) -L $(LST)\$(notdir $(basename $@)).txt -o $(OBJ)\$@ $<

目标(几乎)永远无法正确创建$@以外的文件。这是我Second Rule of Makefiles。每当您看到构造不仅仅是$@的文件的规则时,您就知道存在问题。想要建立一个目标。它知道它想要构建什么目标,并将该目标的路径放在$@变量中。如果你在你的食谱中觉得需要创建一个而不是的文件$@,那么你就知道你并且对于一些基本的东西不同意,并且不同意make不会给你你想要的结果:)。

如果要在与源不同的目录中创建文件,则该目录必须包含在规则中:

$(OBJ)/%.o: %.asm
        $(V68k) $(BUILDARGS) -L $(LST)\$(notdir $(basename $@)).txt -o $@ $<

这也意味着您的链接配方:

$(OBJ)\library.md.o: $(INPUT:.asm=.o)
        $(VLINK) -r -o $@ $(addprefix $(OBJ)\,$(notdir $^))

不起作用。为什么?因为先决条件不包括目录。您需要将其更改为:

$(OBJ)\library.md.o: $(INPUT:%.asm=$(OBJ)/%.o)
        $(VLINK) -r -o $@ $^

您可能认为将$(OBJ)添加到VPATH将有助于解决此问题,但事实并非如此。这不是VPATH设计工作的方式; VPATH只能用于搜索文件,从不生成像目标文件这样的文件。原因很复杂,但如果您想要详细信息,则有detailed explanation here