Makefile 在自动变量展开中强制make不重新订购先决条件
下面是我的makefile(GNU make),用于编译一个小的OCaml程序:Makefile 在自动变量展开中强制make不重新订购先决条件,makefile,ocaml,gnu-make,Makefile,Ocaml,Gnu Make,下面是我的makefile(GNU make),用于编译一个小的OCaml程序: SUFFIXES:= OCAML=ocamlopt LD=ocamlopt OFLAGS= .PHONY: all clean all: playground playground.cmx: playground.ml lstream.cmi playground: lstream.cmx playground.cmx %.cmi: %.ml $(OCAML) $(OFLAGS) -c $<
SUFFIXES:=
OCAML=ocamlopt
LD=ocamlopt
OFLAGS=
.PHONY: all clean
all: playground
playground.cmx: playground.ml lstream.cmi
playground: lstream.cmx playground.cmx
%.cmi: %.ml
$(OCAML) $(OFLAGS) -c $<
%.cmx: %.ml
$(OCAML) $(OFLAGS) -c $<
%: %.cmx
$(LD) -o $@ $^
后缀:=
OCAML=ocamlopt
LD=ocamlopt
背囊=
.骗子:都是干净的
所有:游乐场
playery.cmx:playery.ml lstream.cmi
游乐场:lstream.cmx playery.cmx
%.cmi:%.ml
$(OCAML)$(OFLAGS)-c$<
%.cmx:%.ml
$(OCAML)$(OFLAGS)-c$<
%:%.cmx
$(LD)-o$@$^
playway
使用Lstream
模块中的函数。在这种情况下,ocaml链接器要求按照依赖关系的顺序指定要链接的文件(例如:ocamlopt-o playerlstream.cmx playerly.cmx
)
尽管我以正确的顺序定义了规则的依赖项,
make一致地对它们重新排序,并执行ocamlopt-o playery playerd.cmx lstream.cmx
,这会导致链接器错误
有没有办法强制执行正确的行为?我希望避免显式地指定link命令,让make从依赖项中推断出来。隐式规则总是强制模式匹配先决条件位于第一位,而不管它们在别处定义的顺序如何。这几乎总是您想要的,因为在大多数规则中,模式匹配的先决条件是特殊的
例如,在编译目标文件时,先决条件包括一个源文件和一组头文件;源文件是特殊的,需要在命令行中列出。Make确保对于模式规则%.o:%.c
(例如)匹配%.c
的先决条件在列表中位于第一位,因此分配给$
TARGETS = playground
$(TARGETS) : % :
$(LD) -o $@ $^