电子产业一站式赋能平台

PCB联盟网

搜索
查看: 600|回复: 0
收起左侧

【HarmonyOS HiSpark Wi-Fi IoT 智能家居套件】编译脚本学习1

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2021-1-11 09:57:23 | 显示全部楼层 |阅读模式
【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脚本可能就是为了简化,标准化,跨平台等,不用记忆那些命令,格式以及参数等。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表