为多个规则执行一个make目标

时间:2012-07-01 14:01:07

标签: makefile

我有一个库列表,其中每个库都有2个文件(.so.dll)。 我应该如何创建一个make规则,如果两个文件都丢失或者其中一个文件丢失,它只会执行一次配方。

LIBS = alib blib
LIBS_SO = $(patsubst %, %.so, $(LIBS))
LIBS_DLL = $(patsubst %, %.dll, $(LIBS))

如果我制作此目标

$(LIBS_SO) $(LIBS_DSS):
    cp .....

它只为所有可能性复制一次。

如果我这样做:

all : $(LIBS_SO) $(LIBS_DSS):
$(LIBS_SO) $(LIBS_DSS):
     cp .....

我复制所有丢失文件的所有情况。 如果缺少alib / alib.dll个文件或其中一个,我想复制alib.so目录;该 与blib相同。

2 个答案:

答案 0 :(得分:1)

你没有给我们太多的信息,但我认为这会做你想做的事情:

all : $(LIBS_SO) $(LIBS_DLL):
%.so %.dll:
    cp $* directory ...

如果alib.soalib.dll都缺失,则Make只会执行一次此规则。

编辑:感谢Jonathan Leffler抓住错字。

答案 1 :(得分:1)

您有LIBS_DSS的一致错字,其中(大概)意味着LIBS_DLL

你的第一个“规则”是:

的简写
alib.so:
    cp ...
blib.so:
    cp ...
alib.dll:
    cp ...
blib.dll:
    cp ...

因此,当要求构建时,make会在文件中构建第一个目标,即alib.so。这就是它曾经做过一次的原因。

第二个版本,当修复以删除额外的冒号和拼写错误时,应该有效:

all: $(LIBS_SO) $(LIBS_DLL)

$(LIBS_SO) $(LIBS_DLL):
     cp .....

默认规则为all;要allmake确保每个文件alib.soblib.soalib.dllblib.dll都存在并且是最新的。它应该为每个丢失的目标执行一次命令。

如果你运行并行make,你可能会遇到麻烦; make -j4或类似的东西。它可能几乎同时启动四个复制命令来制作每个目标。但是在非并行构建中,它将确保alib.so是最新的(如果不是,则会执行复制)。如果该副本也会复制alib.dll,则在确保alib.dll为最新版时,它不会重新复制。