【问题标题】:How to skip one of the dependency file to not include while creating target library创建目标库时如何跳过不包含的依赖文件之一
【发布时间】:2020-02-18 07:09:49
【问题描述】:

我想创建一个库,在创建时跳过其中一个不包含的依赖文件。

例如:-

liba.so: a.o b.o c.o test.psm
        <command for creating liba.so, which includes all its dependencies.> 

在这里,当它的任何依赖项发生变化时,我必须创建liba.so 文件。但是.so 文件应该只包含 .o 文件而不是 test.psm 文件。

当我们尝试用非目标文件创建.so文件时会抛出错误。

请帮助我如何使用 GNUmake 实现这一目标。

【问题讨论】:

  • 有几种方法可以做到,但首先,您应该为自己回答一个初步问题:如果test.psm 不打算进入图书馆,那么为什么它是图书馆?因为最好和最惯用的方法可能是通过从先决条件列表中删除 test.psm 来回避这个问题。
  • test.psm 文件是一种 xml 格式,我们将在其中更新已知错误和警告。每次如果我们在该文件中添加任何新内容,我们都想构建库。
  • 如果对象没有改变,从它的组成对象文件重建库是没有意义的。如果源代码和编译选项都没有改变,那么从源代码重建对象是没有意义的。另一方面,给定一个正确表示所有目标的真正先决条件并提供适当构建配方的 makefile,make 将自动重新构建需要构建的所有内容以响应任何更改。所以我仍然没有看到任何充分的理由让test.psm 成为liba.so 的先决条件。
  • 好的,但我仍然想知道如何在构建 .so 时跳过先决条件之一。
  • 哪个是“错误”?我看不出会出什么问题。要创建依赖项的动态列表,只需使用变量 liba.so: $(LIBA_DEPS),尽管这会使您的 makefile 更难理解。

标签: makefile gnu-make gnu


【解决方案1】:

解决问题的最佳方法是避免它。我认为完全没有理由重建一个已经存在并且其先决条件没有改变的库,因为它是最后建造。如果出于某种奇怪的原因,想要确保库的时间戳不早于某些相关文档文件的时间戳,那么最好的替代方案就是围绕维护或分发该文件创建一个单独的过程。例如,

  • touch 文档文件更改时对应的源文件;或
  • 相应来源构建文档,例如通过 Doxygen 或类似工具,使其成为与库共享相同先决条件的构建工件;或
  • 在安装/分发过程而不是构建过程中管理时间戳。例如,在安装或分发构建文件之前制作一个不保留时间戳的副本,以便副本中的所有文件在复制时都有时间戳。

但是如果你必须服从一个不接受回击的尖头发老板的指令,那么实际问题的答案是make没有任何特殊的变量或运算符指定规则的先决条件列表的子集,但是您仍然有很多选择来适当地编写配方。这将成为规则配方的详细信息。

如果一个开头是

liba.so: a.o b.o c.o
        $(archiver_command) $(archiver_options) a.o b.o c.o

然后可以将test.psm 添加到先决条件列表中,而无需进行任何其他更改。

但是,假设以这种形式的规则开始:

liba.so: a.o b.o c.o
        $(archiver_command) $(archiver_options) $^

。该配方使用自动变量$^ 来引用(整个)先决条件列表,因此如果添加test.psm 作为新的先决条件,那么它也会被包括在内,这是您不想要的。这里有多种选择,其中有一个

  • 使用配方中的 shell 代码来处理先决条件列表并删除最后一个元素。这有点恶心。
  • 用以前的形式重写配方,在配方中使用明确的对象列表而不是变量。但是,这会带来额外的维护负担。
  • 通过用户定义的变量指定真正的先决条件,并在配方中使用它。鉴于已经存在这样一个变量是很常见的,这可能是特别自然的。

最后一个选择是我的建议。具体来说,它看起来像这样:

A_OBJS = a.o b.o c.o

# ...

liba.so: $(A_OBJS) test.psm
        $(archiver_command) $(archiver_options) $(A_OBJS)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多