|
【HarmonyOS HiSpark Wi-Fi IoT 智能家居套件】编译脚本学习1,
参考教程搭建好了环境后,第一步开始编译,运行`python build.py wifiiot`。突然有几个问题。
1. 为什么开始编译是运行一个python脚本,鸿蒙不是c语言写的吗?
2. 如果知道编译构建是用gn, ninja,安装过程中的确有安装这些工具,但是没有用到啊?
3. 这个脚本有啥用呢?
接下来大概看一下脚本就明白这几个问题了。
在看编译相关的东西的时候,可能猜也猜到了相关的东西是放在build文件夹里面的,但还是从用到的build.py文件开始,看构建是怎么开始的。 看下面main函数的注释。
- def main():
- if not __package__:
- # 将build文件夹加入搜索路径
- path = os.path.join(os.path.abspath(os.path.dirname(__file__)), \“build\“)
- sys.path.insert(0, path)
- parser = argparse.ArgumentParser(usage=usage())
- parser_list = []
- parser_list.append({
- \“name\“: \“compile\“,
- \“help\“: \“Build source code\“
- })
- for each in parser_list:
- # 这里导入了build/lite下面的compile文件。
- module = importlib.import_module(\“.{}\“.format(each.get(\“name\“)), \“lite\“)
- module.add_options(parser)
- # 将compile.py文件中的exec_command设为执行命令。
- parser.set_defaults(command=module.exec_command)
- args = parser.parse_args()
- try:
- # 执行compile中的exec_command函数。
- status = args.command(args)
- except KeyboardInterrupt:
- logging.warning(\“interrupted\“)
- status = -1
- except Exception as e:
- print(e)
- parser.print_help()
- status = -1
- return status
复制代码 接着看build/lite/compile.py中的exec_command函数。
- def exec_command(args):
- callback_dict = CallbackDict()
- # parse product
- if args.product:
- config = Config(args)
- # 注册 config_create函数准备配置信息,包括搜索编译构建工具gn, ninja,riscv32-unknown-elf-gcc等工具
- callback_dict.register(config.product, config_create)
- # 注册 run_build函数,开始构建。
- callback_dict.register(config.product, run_build)
- # 执行上面两个函数。
- callback_dict.excute(config.product,
- config=config,
- args=args)
- else:
- raise Exception(“Error: product not found.“)
复制代码 到这里就已经完了,再里面就是config_create,run_build的细节,但是上面的问题还是不清晰。
下面再跟进config_create看一下:
config_create(compile_process.py) -> check_build -> parse_product_json -> Compile.get_tool_path(config.py)
get_tool_path函数中,就有找riscv32-unknown-elf-gcc,gn和ninja等工具的路径。
再看一下run_build:
run_build(compile_process.py)-> Compile.compile (config.py) -> exec_command(util.py)
exec_command这里开了新的进程,用来跑上面准备好的命令和参数。
最终执行的,就是两个:
```
/usr/bin/gn gen /your_project_path/harmony/code/out/wifiiot --root=. --dotfile=build/lite/.gn --args=\“product = “wifiiot“ ohos_build_type = “release“\“
/usr/bin/ninja -w dupbuild=warn -C /your_project_path/harmony/code/out/wifiiot
```
gn根据当前的代码树及配置,产生ninja文件,并把它们放在给定的目录下,然后ninja用来编译构建
如果不用python脚本,直接执行上面两个命令,效果一样。
所以,python脚本可能就是为了简化,标准化,跨平台等,不用记忆那些命令,格式以及参数等。 |
|