成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

移植案例與原理 - Build Lite Hb命令__Main__.Py

系統 OpenHarmony
本文介紹了Build Lite 輕量級編譯構建系統hb命令的源碼,主要分析了__Main__.Py文件。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

hb命令可以通過python pip包管理器進行安裝,應該是OpenHarmony Build的縮寫,在python包名稱是ohos-build。hb作為編譯構建子系統提供的命令行,用于編譯構建產品、芯片廠商組件或者單個組件。本文,我們來學習hb的源碼。

1、hb的安裝、卸載與簡單介紹

在源碼根目錄下執行下述命令可以進行安裝。

python3 -m pip install --user build/lite

執行hb -h有相關幫助信息,有打印信息即表示安裝成功:

usage: -c [-h] [-v] {build,set,env,clean,tool} ...
OHOS Build System version 0.4.6
positional arguments:
{build,set,env,clean,tool}
build Build source code
set OHOS build settings
env Show OHOS build env
clean Clean output
tool Call the gn command through the hb tool
optional arguments:
-h, --help show this help message and exit
-v, --version show program's version number and exit

需要注意的是,需要在OpenHarmony的源代碼目錄下才能執行hb命令,否則會提示:hb_error: Please call hb utilities inside source root directory。后文源碼分析時,會講述為啥要在源碼目錄下才能執行該hb。

卸載方法,執行下述命令即可:

python3 -m pip uninstall ohos-build

另外,需要了解的一個比較好用的命令,如下,可以查看安裝的python包的信息:

python3 -m pip show ohos-build

執行后,輸出如下信息。比較關鍵的是,可以知道hb命令對應源文件的安裝位置在...lib/python3.8/site-packages。。hb命令工具的位置可以通過which hb來查看。

zhushangyuan@DESKTOP-RPE9R4O:~$ python3 -m pip show ohos-build
Name: ohos-build
Version: 0.4.6
Summary: OHOS build command line tool
Home-page: https://gitee.com/openharmony/build_lite
Author: Huawei
Author-email: contact@openharmony.io
License: Apache 2.0
Location: /home/zhushangyuan/.local/lib/python3.8/site-packages
Requires: kconfiglib, prompt-toolkit, PyYAML, requests
Required-by:

在文件夾...lib/python3.8/site-packages/hb有3個文件,__init__.py是空文件表示python模塊,__main__.py是執行入口文件,__entry__.py事實上并沒有使用到。這3個文件和目錄build/lite/hb下的文件是一模一樣的。

zhushangyuan@DESKTOP-RPE9R4O:~$ ll /home/zhushangyuan/.local/lib/python3.8/site-packages/hb/
total 20
drwxr-xr-x 3 zhushangyuan zhushangyuan 4096 Oct 25 20:36 ./
drwx------ 33 zhushangyuan zhushangyuan 4096 Oct 25 20:36 ../
-rw-r--r-- 1 zhushangyuan zhushangyuan 3629 Oct 25 20:56 __entry__.py
-rw-r--r-- 1 zhushangyuan zhushangyuan 0 Oct 25 20:36 __init__.py
-rw-r--r-- 1 zhushangyuan zhushangyuan 2204 Oct 25 20:36 __main__.py

2、hb源碼分析

通過which hb來查看hb命令工具的位置,我的環境上,位置為~/.local/bin/hb,該文件是通過pip安裝的,其實是個python文件。我們來查看其文件內容。⑴處導入的main函數來自...lib/python3.8/site-packages/hb/__main__.py。⑵處sys.argv[0]指的是執行的程序名稱,這里等于hb,該語句表示以-script.pyw或者.exe結尾的部分去除,例如,假設sys.argv[0]為test-script.pyw,則替換后的sys.argv[0]為test。使用pip安裝的包通常都是這樣的寫法。

zhushangyuan@DESKTOP-RPE9R4O:~/openharmony$ cat ~/.local/bin/hb
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
⑴ from hb.__main__ import main
if __name__ == '__main__':
⑵ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

接下來,我們來分析下源文件...lib/python3.8/site-packages/hb/__main__.py。

zhushangyuan@DESKTOP-RPE9R4O:~/openharmony$ cat /home/zhushangyuan/.local/lib/python3.8/site-packages/hb/__main__.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import os
import sys
VERSION = "0.4.6"
# execv execution fragment
EXECV_FRAGMENT = """
import sys
import importlib
sys.path.append(sys.argv.pop())
entry = importlib.import_module("__entry__")
sys.exit(entry.main())
"""
def find_top():
cur_dir = os.getcwd()
while cur_dir != "/":
hb_internal = os.path.join(cur_dir, 'build/lite/hb_internal')
if os.path.exists(hb_internal):
return cur_dir
cur_dir = os.path.dirname(cur_dir)
raise Exception("Please call hb utilities inside source root directory")
def search(findir, target):
for root, dirs, files in os.walk(findir):
if target in files:
return root
def main():
try:
topdir = find_top()
except Exception as ex:
return print("hb_error: Please call hb utilities inside source root directory")
python_base_dir = os.path.join(topdir, 'prebuilts/python')
if os.path.exists(python_base_dir):
python_dir = search(python_base_dir, 'python3')
python_executable = os.path.join(python_dir, 'python3')
lite_dir = os.path.join(topdir, 'build/lite')
hb_dir = search(lite_dir, '__entry__.py')
param_list = ["python3", "-c", EXECV_FRAGMENT]
for arg in sys.argv[1:]:
param_list.append(arg)
param_list.append(hb_dir)
os.environ['PATH'] = python_dir + ":" + os.getenv('PATH')
os.execv(python_executable, param_list)
else:
print("please execute build/prebuilts_download.sh")
if __name__ == "__main__":
sys.exit(main())

(1)hb/main.py 動態執行python代碼片段EXECV_FRAGMENT

python -c?命令可以直接在命令行中調用python代碼, 實際上-c?就是command?的意思,就是python -c?可以在命令行中執行python代碼, 跟把代碼放置在.py文件中,然后運行這個文件是一樣的效果。

__main__.py?文件中會動態執行python代碼片段如下,解釋下⑴處的代碼。當我們導入一個模塊時:import XXX,默認情況下python解釋器會搜索當前目錄、已安裝的內置模塊和第三方模塊,如果都搜索不到,則會報錯。我們的搜索路徑存放在sys模塊中的path中,sys.path是當前路徑的一個列表。[即默認路徑可以通過sys.path來打印查看]。當我們要添加自己的引用模塊搜索目錄時,可以通過list的append方法。sys.argv.pop()表示參數列表中的最后一項,指的是?openharmony\build\lite\hb\目錄,下文會詳細解釋。

⑵處動態導入模塊對象,"entry"指的是openharmony\build\lite\hb\__entry__.py?。所以,我們只使用到了openharmony\build\lite\hb\__entry__.py?,而不是使用python3.8/site-packages/hb/__entry__.py.py。

EXECV_FRAGMENT = """
import sys
import importlib
⑴ sys.path.append(sys.argv.pop())
⑵ entry = importlib.import_module("__entry__")
sys.exit(entry.main())
"""

(2)hb/main.py find_top()函數

find_top()函數用于獲取OpenHarmony源代碼根目錄。⑴處先獲取當前工作目錄,hb命令在哪個目錄下執行,就是當前的工作目錄。⑵處開始while循環,結束條件是遍歷到系統根目錄或者return返回。⑶處判斷是否存在目錄’build/lite/hb_internal’,如果存在,即可獲得OpenHarmony源碼根目錄。如果不存在,則執行⑷獲取上一級目錄,繼續循環。遍歷的目錄不存在’build/lite/hb_internal’目錄,則拋出異常。從這些源碼可知,hb不能在非OpenHarmony源代碼目錄下執行,但又可以在OpenHarmony源碼目錄下的任何一個目錄執行。

def find_top():
cur_dir = os.getcwd()
while cur_dir != "/":
hb_internal = os.path.join(cur_dir, 'build/lite/hb_internal')
if os.path.exists(hb_internal):
return cur_dir
cur_dir = os.path.dirname(cur_dir)
raise Exception("Please call hb utilities inside source root directory")

(3)hb/main.py search()函數

search()函數從指定的目錄下查詢是否存在指定的文件,如果存在,則返回包含指定文件的目錄路徑。代碼如下,這代碼也容易被挑戰。對于不存在指定文件的情況下,就沒有return語句,這樣代碼不規范。

def search(findir, target):
for root, dirs, files in os.walk(findir):
if target in files:
return root

(4)hb/main.py main()函數

接下來,我們來看下main()函數。首先調用find_top()函數獲得OpenHarmony源碼根目錄。⑴處判斷是否存在文件’prebuilts/python’,如果不存在則打印,告知開發者需要"please execute build/prebuilts_download.sh"來完成環境準備。⑵處開始,獲取4個變量的值,如下表:

變量


說明

python_dir

openharmony/prebuilts/python/linux-x86/3.9.2/bin

包含python3執行文件的目錄

python_executable

openharmony/prebuilts/python/linux-x86/3.9.2/bin/python3

python3執行文件路徑

lite_dir

openharmony/build/lite

build lite目錄

hb_dir

openharmony/build/lite/hb

__entry__.py所在的目錄

⑶處封裝要參數列表,要動態執行的腳本EXECV_FRAGMENT,已經在前文解釋。⑷處把命令行執行hb命令時傳入的參數,添加到param_list變量,⑸處最后添加的參數是__entry__.py所在的目錄。在解釋動態執行python代碼片段EXECV_FRAGMENT時,提到的sys.argv.pop()就是剛剛添加的這個目錄。接下來,⑹處的代碼設置環境變量,然后調用函數os.execv來執行。后文再詳細分析__entry__.py。

def main():
try:
topdir = find_top()
except Exception as ex:
return print("hb_error: Please call hb utilities inside source root directory")
python_base_dir = os.path.join(topdir, 'prebuilts/python')
if os.path.exists(python_base_dir):
python_dir = search(python_base_dir, 'python3')
python_executable = os.path.join(python_dir, 'python3')
lite_dir = os.path.join(topdir, 'build/lite')
hb_dir = search(lite_dir, '__entry__.py')
param_list = ["python3", "-c", EXECV_FRAGMENT]
for arg in sys.argv[1:]:
param_list.append(arg)
param_list.append(hb_dir)
os.environ['PATH'] = python_dir + ":" + os.getenv('PATH')
os.execv(python_executable, param_list)
else:
print("please execute build/prebuilts_download.sh")

3、參考站點

4、小結

本文介紹了build lite 輕量級編譯構建系統hb命令的源碼,主要分析了__main__.py文件

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

責任編輯:jianghua 來源: 51CTO開源基礎軟件社區
相關推薦

2022-11-01 15:29:03

移植案例hb命令

2022-01-25 17:12:36

startup子系統syspara系統鴻蒙

2022-03-04 16:17:03

子系統組件鴻蒙

2022-01-26 15:16:24

utilsOpenHarmon鴻蒙

2022-02-16 15:48:26

ACTS應用XTS子系統鴻蒙

2022-02-16 15:39:30

ACTS應用XTS子系統鴻蒙

2018-01-16 09:08:00

Linux命令fmt

2014-06-17 16:17:58

Docker 1.0Docker

2009-08-03 12:02:13

linux at命令linux at命令詳使用案例

2013-03-25 17:16:11

2021-06-21 09:25:18

鴻蒙HarmonyOS應用

2022-11-04 08:15:08

LinuxLinux Lite

2016-03-21 12:56:26

2023-02-09 15:28:19

鴻蒙編譯速度

2020-07-10 09:04:55

HTTPS瀏覽器網絡協議

2023-06-27 15:12:46

C++三方庫移植

2016-03-21 10:55:43

Build2016Win10開發Win10系統

2021-05-06 08:55:24

ThreadLocal多線程多線程并發安全

2024-05-29 11:06:10

2018-05-21 09:03:00

NASSAN案例
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久久久一区 | 成人免费视频网站在线看 | 久久99精品久久久久久噜噜 | 久久久久久成人 | 国产激情91久久精品导航 | 久精品久久 | 国产一级在线 | 四虎影视在线 | 色综合久久88色综合天天 | 91精品一区二区三区久久久久久 | 青青草这里只有精品 | 亚洲国产欧美精品 | 欧美日韩1区2区 | 亚洲国产一区视频 | 自拍偷拍亚洲一区 | 国产亚洲一区二区在线观看 | 午夜在线 | 国产精品大全 | 国产精品日韩欧美一区二区三区 | 四虎影视在线 | 国产高清视频在线 | 亚洲第一成人av | 亚洲精品永久免费 | 亚洲一级在线 | 亚洲高清在线 | 欧美在线视频网站 | 欧美日韩高清在线一区 | 久久人体视频 | 一区二区三区四区av | 国产一区日韩在线 | 日本午夜网 | 欧美精品一区二区三区在线 | 欧美一级在线观看 | 小h片免费观看久久久久 | 亚洲最大av | 欧美视频二区 | 91免费观看国产 | 天天插天天操 | 亚洲天堂一区二区 | 欧美a区 | 欧美日韩电影一区二区 |