【发布时间】:2019-08-28 17:36:38
【问题描述】:
我需要知道处理这个问题的最佳方法。您也可以回答这个问题——在阅读下面的示例之后——:查看package.make 中的makelib 目标,并告诉我是否有办法强制将其视为未更新,如果配方(make -C . ./lib/ -f lib.make) 报告为无事可做(不使用有序的先决条件)?
我需要用一个例子来解释这一点。我继承了这一点,我需要最好的方法来解决这个问题。
其他目标将依赖的目标:
File lib.make
--------------
.DEFAULT_GOAL = thelib.dll
%.dll: file1.obj file2.obj
makelib file1.obj file2.obj -o thelib.dll
这本身就很可靠。您运行一次 (make -f lib.make) 并创建库。如果您随后运行它,并且没有修改过的文件,那么它会告诉您它无事可做。
现在我们将在其他地方以一种特殊的方式使用它:
File: package.make
------------------
.DEFAULT_GOAL: all
all: package
makelib:
@make -C ../lib/ -f lib.make
package: makelib file3 file4
@package_files file3 file4 ../lib/out/*.dll -o package
这就是lib.make 在package.make 中的引用方式。
问题在于,即使在您调用 make -f package.make all make 时创建了包,也假定每次都需要重建 package 目标,因为它的依赖项之一 -- makelib -- 必须重新制作
Make 认为 makelib 已过期,尽管输入 lib.make 后会发生什么。
为了纠正这个问题,我想到了几个选择:
将
makelib移动到有序的先决条件(在|之后)但这不太正确,因为在新建库的情况下,我的包不会被更新再次添加 dll (
thelib.dll) 作为对makelib目标的依赖项,但这几乎会重复逻辑并破坏封装。删除
makelib目标并将@make -C ../lib/ -f lib.make行移动到package配方内部。这有一个问题,那就是我已经删除了包和lib之间的依赖关系。如果 lib 需要更新,包将不知道它并且不会更新。使用
include lib.make,然后将package规则重写为:package: thelib.dll file3 file4。这也有问题,其中最少的是要包含一个make文件,它必须这样写。否则会引入大量覆盖/冲突的目标和定义。
除了直接将dll列为依赖之外,还有什么建议吗?
【问题讨论】: