gn对于工具链的配置只到可执行文件就结束了,在我们之前配置的armcc中,最终生成axf就算结束了,但对于一些应用场景来说,bin和hex是必须的,因此还需要执行额外的步骤来实现bin和hex的生成,对于bin和hex,arm工具链中提供了fromelf来做这件事情。
构建后动作
gn提供了目标action来做工具链之外的动作,action可以接受python脚本,因此我们的选择就是在python脚本中调用fromelf来生成bin和axf。首先看gn中的配置
action("build_target") {
deps = [
":gn_demo",
]
script = "//build/py_script/axf_format.py"
sources = [
"$root_out_dir/bin/gn_demo.axf",
]
outputs = [
"$root_out_dir/bin/gn_demo.bin",
]
args = [
"--format_tool",
rebase_path("$MDK_DIR/ARM/ARMCC/bin/fromelf.exe"),
"--axf",
rebase_path("$root_out_dir/bin/gn_demo.axf"),
"--dir",
rebase_path("$root_out_dir/bin"),
"--flag",
"b",
]
}
gn指定了一个action来执行生成动作,生成动作将会调用axf_format.py文件,该部分依赖于axf的生成。即当构建完成后,将会调用该脚本来将axf转换成bin和hex。此处调用了一个脚本,脚本如下:
import os
import sys
import getopt
format_tool = ""
axf_path = ""
out_dir = ""
flag = ""
#获取命令行参数
try:
opts, args = getopt.getopt(sys.argv[1:],"",["format_tool=","axf=","dir=","flag="])
except getopt.GetoptError:
print("axf_format.py --format_tool <tool_path> --axf <axf_path> --dir <out_dir> --flag <b or h>")
sys.exit(2)
for opt, val in opts:
if opt in ("--format_tool"):
format_tool = val
if opt in ("--axf"):
axf_path = val
if opt in ("--dir"):
out_dir = val
if opt in ("--flag"):
flag = val
#获取axf的文件名,根据此文件名指定输出的文件名
(axf_name, axf_ext) = os.path.splitext(os.path.basename(axf_path))
bin_path = "%(path)s/%(name)s.bin"%{'path':out_dir,'name':axf_name}
hex_path = "%(path)s/%(name)s.hex"%{'path':out_dir,'name':axf_name}
#生成bin文件
if "b" in flag:
os.system("%(tool)s --bin --output %(bin)s %(axf)s"%{'tool':format_tool,'bin':bin_path,'axf':axf_path})
#生成hex文件
if "h" in flag:
os.system("%(tool)s --i32 --output %(hex)s %(axf)s"%{'tool':format_tool,'hex':hex_path,'axf':axf_path})
脚本主要的作用是获取传入的命令行参数,根据参数执行转换工作。
结果测试
可以看到在执行结束后看到了bin和hex文件,这样就完成了预期的所有工作。
define_me_freedom 发布了9 篇原创文章 · 获赞 10 · 访问量 1万+ 私信 关注