我有一个库的列表,每个库都有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.dll / alib.so,我希望复制alib目录;blib也是如此。
发布于 2012-07-01 22:17:06
在你(大概)指LIBS_DLL的地方,你有一个一致的LIBS_DSS拼写错误。
你的第一条“规则”是这样的:
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是最新时,它将不会重新复制。
https://stackoverflow.com/questions/11282572
复制相似问题