我向现有项目添加了新目标(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。
答案 0 :(得分:2)
您需要添加一条规则,以指定make
从main.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.c
和main.dats
时优先考虑的应用是什么(可能是手工指定的规则具有优先权)