首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为多个规则执行一个make目标

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

Stack Overflow用户
提问于 2012-07-01 22:01:07
回答 1查看 328关注 0票数 1

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

代码语言:javascript
复制
LIBS = alib blib
LIBS_SO = $(patsubst %, %.so, $(LIBS))
LIBS_DLL = $(patsubst %, %.dll, $(LIBS))

如果我把这个目标

代码语言:javascript
复制
$(LIBS_SO) $(LIBS_DSS):
    cp .....

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

如果我这样做:

代码语言:javascript
复制
all : $(LIBS_SO) $(LIBS_DSS):
$(LIBS_SO) $(LIBS_DSS):
     cp .....

我在所有情况下复制任何丢失的文件。如果缺少两个或其中一个文件alib.dll / alib.so,我希望复制alib目录;blib也是如此。

EN

回答 1

Stack Overflow用户

发布于 2012-07-01 22:17:06

在你(大概)指LIBS_DLL的地方,你有一个一致的LIBS_DSS拼写错误。

你的第一条“规则”是这样的:

代码语言:javascript
复制
alib.so:
    cp ...
blib.so:
    cp ...
alib.dll:
    cp ...
blib.dll:
    cp ...

因此,当要求构建时,make将构建文件中的第一个目标,即alib.so。这就是为什么它只做一次。

第二个版本在修复后删除了多余的冒号和拼写错误,应该可以工作:

代码语言:javascript
复制
all: $(LIBS_SO) $(LIBS_DLL)

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11282572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档