是什么导致错误 `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.c
和 main.dats
都存在时应用程序的优先级是什么。
我向现有项目添加了一个新目标 (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.c
和 main.dats
都存在时应用程序的优先级是什么。