我想~/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角色开始。