如何在 shell 脚本中从另一个 Makefile 获取变量

如何在 shell 脚本中从另一个 Makefile 获取变量

我想~/kernelbuild/linux-3.14.37在我自己的 shell 脚本中使用该目录下另一个 Makefile 中的变量。

以下是我需要的变量:

VERSION = 3
PATCHLEVEL = 14
SUBLEVEL = 37

问题是我不允许更改 Makefile,所以导出变量在这里不是一个选项。

另外,我看到有人说要有一个单独的文件,其中包含所需的所有常见变量。这很实用,但我需要将所有内容都放在我的单个 shell 脚本中

我试图包含. ~/kernelbuild/linux-3.14.37/Makefile在我的 shell 脚本中,我认为我应该能够使用这些变量,但它给了我以下错误:

/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 1: VERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 2: PATCHLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 3: SUBLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 4: EXTRAVERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 5: NAME: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 17: MAKEFLAGS: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 20: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 26: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: syntax error near unexpected token `"$(origin V)",'
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: `ifeq ("$(origin V)", "command line")'

我认为这是因为 Makefile 不遵循 shell 脚本的语法规则。那我该怎么办呢?

提前致谢!

答案1

如果您只需要简单的东西(例如您的示例),只需将grep它们从 Makefile 中取出即可。

对于更复杂的事情,GNU Make 有一个-p选项,可以在运行 Make 后打印数据库,其中包括所有变量定义(以及更多)。您可以将它与 一起使用-n,这会导致操作实际上并未运行(因此不会构建任何内容)。您可以将grep变量从-p输出中取出。

答案2

您可以尝试使用 grep 和 sed 提取值。例如:

filename="$HOME/kernelbuild/linux-3.14.37/Makefile"
version=$(grep -m 1 VERSION $filename | sed 's/^.*= //g')

此 greps 查找 Makefile 中第一次出现的“VERSION”

答案3

Make 可以从 stdin 读取 makefile,因此您可以给它一个这里的文档那是一个makefile。以下是一个 makefile,其中包含您的内核 makefile 并添加了一个新的通配符目标 ,%.var其配方将输出给定 make 变量的值。 (.var当然,这假设您没有任何以 结尾的文件或其他目标)。

showvar() {
make -f - ${1}.var <<'EOF'
include $(HOME)/kernelbuild/linux-3.14.37/Makefile

%.var:
    @echo $($*)
EOF
}

my_version=$(showvar VERSION)
patchlevel=$(showvar PATCHLEVEL)
the_sublevel=$(showvar SUBLEVEL)

Make 将替换$*为目标的主干%.var

配方@echo行以实际TAB角色开始。

相关内容