创建目标库时如何跳过不包含的依赖文件之一
How to skip one of the dependency file to not include while creating target library
我想创建一个库,在创建依赖文件时跳过其中一个不包含的依赖文件。
例如:-
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 实现这一目标。
解决问题的最佳方法是避免它。我认为完全没有理由重建已经存在的库并且自上次构建以来,其先决条件没有改变。如果出于某种奇怪的原因想要确保库的时间戳不早于某些相关文档文件的时间戳,那么最好的替代方法是 运行 围绕维护或分发该文件创建一个单独的过程。例如,
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)
我想创建一个库,在创建依赖文件时跳过其中一个不包含的依赖文件。
例如:-
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 实现这一目标。
解决问题的最佳方法是避免它。我认为完全没有理由重建已经存在的库并且自上次构建以来,其先决条件没有改变。如果出于某种奇怪的原因想要确保库的时间戳不早于某些相关文档文件的时间戳,那么最好的替代方法是 运行 围绕维护或分发该文件创建一个单独的过程。例如,
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)