【问题标题】:Accessing Makefile variable in compile time shell在编译时 shell 中访问 Makefile 变量
【发布时间】:2020-12-23 12:15:49
【问题描述】:

我有一个makefile,1.mk,内容如下:

#!make

aa := x
bb := y
cc := z

export
include abc.mk

all:
    @echo $(chk1)

还有另一个makefile,abc.mk,内容如下:

#!make

chk1 := $(shell set -o posix; set | awk -F "=" 'BEGIN{ORS=" "}1 $$1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $$1}')
chk2 := $(shell env &> pqr)

export

当我检查时,没有生成文件变量:

> make all -f 1.mk | grep aa

> grep 'aa' pqr

因此我可以说,编译时 shell 没有 makefile 变量。我想要一种在编译时 shell 中访问所有 makefile 变量的方法。

约束:我事先不知道变量名称以下列方式编写代码:

chk2 := $(shell export aa=$(aa); env &> pqr)

【问题讨论】:

  • 您的要求对我来说不是 100% 清楚。 “我希望“xyz.sh”拥有所有makefile变量”是什么意思?您想(手动)在一个名为 xyz.sh 的文件中定义所有 makefile 变量吗? “我需要在编译时评估它”是什么意思?什么汇编?你的意思是要在make解析makefile的时候从xyz.sh导入变量定义?
  • 我同意这个问题不清楚。如果您要说的是您希望 shell 脚本 xyz.sh 能够访问 make 变量 abc,那么您可以在运行脚本之前添加一个 export a b c,这些make变量将被导出到环境中,shell脚本可以将它们作为环境变量$a$b$c访问。
  • 感谢您的回复。我已经更新了这个问题。请检查。

标签: shell makefile gnu-make


【解决方案1】:

据我了解 make export 生成变量的方式,它只在配方中这样做,而不是在使用 shell 函数调用的 shell 中。例如,您可以对此进行测试:

$ cat Makefile
aa := x
export
chk := $(shell echo $$aa)

.PHONY: all

all:
    @printf 'in shell function: aa = $(chk)\n'
    @printf 'in recipe:         aa = %s\n' "$$aa"

$ make
in shell function: aa = 
in recipe:         aa = x

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2014-04-09
    • 2023-01-11
    相关资源
    最近更新 更多