linux - Makefile 匹配规则基于其他文件中的变量

标签 linux makefile gnu-make

我想创建一个 makefile 规则,只有当变量改变时才会匹配。

我有包含 KERNEL_VERSION=A0XX 变量的 Rules.make

在编译结束时,我创建了 uImage,二进制文件中包含 A0XX 字符串。

我想创建一个规则来读取 uImage 的版本(我正在使用 字符串 uImage | grep A0) 如果 KERNEL_VERSION 变量不同,则只匹配规则,否则什么也不做。

这可能吗?

最佳答案

我觉得你想要的可以这样实现:

.PHONY: aux-rule var-changed
all: aux-rule;

cmd := strings uImage | grep "\bKERNEL_VERSION=A0XX\b"
check-var = $(if $(shell $(cmd)),,var-changed)

.SECONDEXPANSION:
aux-rule: $$(check-var)

var-changed:
    @echo Variable was changed

它包括在变量发生变化时动态生成先决条件。

基本上,通过扩展check-var作为目标aux-rule的先决条件,目标aux-rule将取决于先决条件 var-changed 仅当 uImage 文件中的变量 KERNEL_VERSION 的值不是 A0XX。否则目标 aux-rule 将完全没有先决条件,因此 var-changed 的配方将不会作为先决条件执行对于 aux-rule

换句话说,如果变量发生变化,则规则将扩展为

aux-rule: var-changed

否则,如果变量没有改变,它将是:

aux-rule:

判断uImage文件中的变量KERNEL_VERSION是否有值A0XX是根据命令strings uImage | grep "\bKERNEL_VERSION=A0XX\b".

关于linux - Makefile 匹配规则基于其他文件中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48398440/

相关文章:

dependencies - 调试并行构建的 CMake/Make 依赖项

模板的 C++ 错误和推导的参数冲突类型

linux - 如何将变量传递给 Makefile 中的 foreach 函数调用的子 make?

linux - 操作系统内 2 个进程之间的双向消息传递

linux - 了解内核补丁提交检查表?与测试补丁有关?

c++ - 介子找不到交叉编译库

c++ - 将 MakeFile 导入为 MingW 项目

mingw - 使用操作系统语言安装的 gnu make

makefile - 为什么 "make"在 "make install"之前

c++ - 为多个平台构建 Linux 二进制文件