是什么导致错误“ make:某些x对x.o没有做任何事情”?

时间:2018-07-04 15:11:36

标签: makefile ats

我向现有项目添加了新目标(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,也会发生这种情况。如果在main.dats失败后手动编译make,然后再次运行make,项目将完成构建,并且输出可执行文件可以正常运行。这是完整的Makefile.in

1 个答案:

答案 0 :(得分:2)

您需要添加一条规则,以指定makemain.o开始如何重新创建main.dats。对于C文件,知道该怎么做,但是对于.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时优先考虑的应用是什么(可能是手工指定的规则具有优先权)