1

我有一个库列表,每个库都有 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

4

2 回答 2

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; to make确保每个文件all、和都存在并且是最新的。它应该为每个丢失的目标执行一次命令。makealib.soblib.soalib.dllblib.dll

如果您运行并行程序,您可能会遇到麻烦makemake -j4或类似的东西。它可能几乎同时启动四个复制命令来创建每个目标。但在非并行构建中,它将确保alib.so是最新的(如果不是,将进行复制)。如果该副本也复制,那么当它确保是最新的alib.dll时它不会重新复制。alib.dll

于 2012-07-01T14:17:06.013 回答
1

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

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

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

编辑:感谢 Jonathan Leffler 发现错字。

于 2012-07-01T14:07:27.883 回答