Makefile 在自动变量展开中强制make不重新订购先决条件

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 $<

下面是我的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 $<

%.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 $@ $^