是什么导致错误 `make: Nothing to be done for 'x.o'.` for some x?

What is causing the error `make: Nothing to be done for 'x.o'.` for some x?

我向现有项目添加了一个新目标 (main.o):

DATS_FILES = main.dats
HFILES  = config.h es.h gc.h input.h prim.h print.h sigmsgs.h \
          stdenv.h syntax.h term.h var.h
CFILES  = access.c closure.c conv.c dict.c eval.c except.c fd.c gc.c glob.c \
          glom.c input.c heredoc.c list.c c_main.c match.c open.c opt.c \
          prim-ctl.c prim-etc.c prim-io.c prim-sys.c prim.c print.c proc.c \
          sigmsgs.c signal.c split.c status.c str.c syntax.c term.c token.c \
          tree.c util.c var.c vec.c version.c y.tab.c dump.c

src     :
        @echo ${OTHER} ${CFILES} ${HFILES} ${DATS_FILES}


list.o : list.c es.h config.h stdenv.h gc.h 
main.o : main.dats
match.o : match.c es.h config.h stdenv.h 

如上所示,我已尝试将新源 .dats 文件设置为与项目中的 .c 文件相同的状态,构建没有问题。

如果我尝试直接构建目标,我得到:

make main.o
make: Nothing to be done for 'main.o'.

即使我 运行 touch main.dats 也会发生这种情况。如果我在 make 失败后手动编译 main.dats,然后再次 运行 make,项目完成构建并且输出可执行文件 运行s 没有问题。这是完整的 Makefile.in.

您需要添加一个规则来指定 make 如何从 main.dats 开始重新创建 main.o。对于 C 文件,make 知道该做什么,但对于 .dats 文件,它不知道。特别是,您必须更改:

main.o : main.dats

main.o : main.dats
        (your-compiler) (your-compiler-options) -o main.o main.dats

(假设这是编译器中用于指定输入和输出文件的语法)

重要提示:第​​二行(及后续行)的缩进必须使用制表符而不是空格,因为 make 就是这样工作的。

你的情况(假设.dats是动态ATS语言的扩展)我认为应该是

main.o : main.dats
        patscc -c -o main.o main.dats

编辑:如果你有多个 .dats 文件要编译,你可以添加一个通用规则,教 make 为它们调用正确的编译器(感谢 Toby 的语法)

%.o : %.dats
        patscc -c -o $@ $<

我不确定当 main.cmain.dats 都存在时应用程序的优先级是什么。