我有一个库列表,其中每个库都有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
相同。
答案 0 :(得分:1)
你没有给我们太多的信息,但我认为这会做你想做的事情:
all : $(LIBS_SO) $(LIBS_DLL):
%.so %.dll:
cp $* directory ...
如果alib.so
和alib.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
;要all
,make
确保每个文件alib.so
,blib.so
,alib.dll
和blib.dll
都存在并且是最新的。它应该为每个丢失的目标执行一次命令。
如果你运行并行make
,你可能会遇到麻烦; make -j4
或类似的东西。它可能几乎同时启动四个复制命令来制作每个目标。但是在非并行构建中,它将确保alib.so
是最新的(如果不是,则会执行复制)。如果该副本也会复制alib.dll
,则在确保alib.dll
为最新版时,它不会重新复制。