相关疑难解决方法(0)

如何在Makefile中创建模式规则依赖项可选?

当且仅当文件已经存在时,我想引用依赖项的时间戳.我有这样的模式规则:

%.pdf: %.sil
    sile $< -o $@
Run Code Online (Sandbox Code Playgroud)

这在正常情况下工作得很好,但.sil文件对同名的lua文件进行外部引用(如果存在).我如何知道这一点,以便它检查时间戳并重新生成PDF,如果lua文件更新,但如果文件根本不存在则忽略依赖关系?

这个:

%.pdf: %.sil %.lua
    sile $< -o $@
Run Code Online (Sandbox Code Playgroud)

...仅适用于文件存在的情况,如果不存在则会导致错误.

dependencies makefile gnu-make

6
推荐指数
1
解决办法
1010
查看次数

带有可选依赖项的 Makefile

我有一些 .c 和 .h 文件,它们是由基于一个 XML 文件和可选的另一个 XML 文件的脚本生成的。

从我读过的内容来看,我应该能够使用通配符,例如:

%Generated.c %Generated.h : %Compulsory.xml $(wildcard %Optional.xml)
   generation-script $< $*
Run Code Online (Sandbox Code Playgroud)

当我更改 XXXCompulsory.xml 而不是当我更改 XXXOptional.xml 时,文件 XXXGenerated.c/h 正在重新生成。有谁知道为什么?

我可以解决重复规则的问题,如下所示:

%Generated.c %Generated.h : %Compulsory.xml
   generation-script $< $*

%Generated.c %Generated.h : %Compulsory.xml %Optional.xml
   generation-script $< $*
Run Code Online (Sandbox Code Playgroud)

但我会认为有更好的方法来指定可选依赖项?

谢谢!

注意:之前已经问过同样的问题(例如,如何管理 C 头文件依赖项?)但在这种情况下,我不能让编译器生成 .d 文件。

编辑: Optional.xml 的位置很好,因为如果我只指定规则,它就可以工作:

%Generated.c %Generated.h : %Compulsory.xml %Optional.xml
   generation-script $< $*
Run Code Online (Sandbox Code Playgroud)

并尝试仅针对 Optional.xml 存在的目标进行编译。

但我注意到这不适用于括号:

%Generated.c %Generated.h : %Compulsory.xml $(%Optional.xml)
   generation-script $< $*
Run Code Online (Sandbox Code Playgroud)

dependencies makefile optional

5
推荐指数
1
解决办法
1771
查看次数

直接在目标依赖项中定义“如果出错则继续”策略

a这是一个带有 4 个目标( 、bc)的简单 Makefile all。目标b可能会失败(此处用 表示exit 1)。

a:
    echo "a"

b:
    exit 1

c:
    echo "c"

all: a b c
Run Code Online (Sandbox Code Playgroud)

运行时make allc永远不会打印为b失败,c因此目标不会运行。但就我的具体情况而言,c即使b失败,我也想继续竞选。

我想知道是否有一种方法可以直接在 target 的依赖项中定义“如果出现错误则继续”策略all

我知道可以通过以下方式达到所需的行为:

  • 运行make -i all( --ignore-errors) 或make -k all( --keep-going)
  • 使用“递归”make
  • 在失败的命令前添加前缀b--exit 1
  • 分别运行任务make a; …

makefile gnu-make

5
推荐指数
1
解决办法
1087
查看次数

标签 统计

makefile ×3

dependencies ×2

gnu-make ×2

optional ×1