本文來源電子發燒友社區,作者:離北況歸, 帖子地址:https://bbs.elecfans.com/jishu_2308797_1_1.html
由于想要分享的內容較多,為避免讀者姥爺們失去看下去的耐心,分享將以連載的方式進行。
下期預告:在OpenHarmony的編譯體系下編譯speexdsp的so和測試用的可執行文件,以及編譯報錯的解決辦法。
本期為移植speexdsp到OpenHarmony標準系統
的第③期,主要內容如下:
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6eSAQhzcAAAHxIXmXik854.jpg)
speexdsp移植后已提交至openhamrony sig倉庫:https://gitee.com/openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty/speexdsp
四、將三方庫加入到OpenHarmony的編譯體系
根據上一步分析結果,編寫gn文件,將三方庫加入到OpenHarmony的編譯體系。
OpenHarmony編譯構建子系統提供了一個基于Gn和ninja的編譯構建框架。根據產品配置,編譯生成對應的鏡像包。其中編譯構建流程為:
-
使用Gn配置構建目標。
-
Gn運行后會生成ninja文件。
-
通過運行ninja來執行編譯任務。
OpenHarmony三方庫編譯環境搭建
本次移植時在openharmony3.2Beta1版本上運行的,所以需要準備openharmony3.2Beta1的源碼。
先在Widows上安裝虛擬機,在虛擬機上安裝Ubuntu18.04或者20.04。筆者使用的為Ubuntu20.04。
1.將Ubuntu Shell
環境修改為bash
sudo dpkg-reconfigure dash
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuAJNBbAABbB1soRCo266.jpg)
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuAepCcAADlICLc45U450.jpg)
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuAaruGAAGn79jL91c087.jpg)
2.下載華為集成開發環境 DevEco Device Tool Linux版本,目前最新版本號為3.1.0.200
HUAWEI DevEco Device Tool(以下簡稱DevEco Device Tool)是OpenHarmony面向智能設備開發者提供的一站式集成開發環境,支持OpenHarmony的組件按需定制,支持代碼編輯、編譯、燒錄和調試等功能,支持C/C++語言,以插件的形式部署在Visual Studio Code上。
-
直接在Ubuntu上打開firefox輸入下載地址下載
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuAS9ifAAEeTFNAOUY408.jpg)
-
解壓DevEco Device Tool安裝包,并對解壓后的文件賦權
unzip devicetool-linux-tool-3.1.0.200.zip
chmod u+x devicetool-linux-tool-3.1.0.200.sh
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuAHyuJAAC7gjV-Rng599.jpg)
-
安裝DevEco Device
-
執行命令安裝DevEco Device
sudo ./devicetool-linux-tool-3.1.0.200.sh
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuAE1s9AAFgJAByLaA809.jpg)
終端打印出這條信息說明安裝成功
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuACgSFAAA2mUKSz_M893.jpg)
3.獲取標準系統源碼
執行命令sudo apt-get install git git-lfs
安裝git客戶端和git-lfs
git config
git config
git config
git config --global credential.helper store
執行這個命令會在本地生成一個文本,上邊記錄配置。然后再拉取代碼就不用再輸入賬號信息了。
-
進入gitee官網個人主頁,個人頭像下方就是user.name
-
再進入設置點擊郵箱管理就可以得到你的your-email-address
-
安裝gitee碼云repo工具
sudo apt-get install curl
sudo curl https:
sudo chmod a+x /usr/local/bin/repo
sudo pip3 install -i https:
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuAEA9hAACM5AE6wtY025.jpg)
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuAJyICAADzQIbz-vg986.jpg)
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuANh4LAAD3qkXM_kI334.jpg)
創建源碼存放目錄
進入創建的源碼存放目錄,執行以下命令下載源碼
sudo ln -sf /usr/bin/python3 /usr/bin/python
repo init -u https:
repo sync -c
repo forall -c 'git lfs pull'
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xyANcIsAAUQmH6LjjM855.jpg)
3.在源碼目錄下執行腳本安裝編譯器及二進制工具
下載的prebuilts二進制默認存放在與OpenHarmony同目錄下的OpenHarmony_2.0_canary_prebuilts下。
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuAcUxnAAAtk2mpD0c854.jpg)
bash build/prebuilts_download.sh
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuAYMpsAAPClbqbZ20270.jpg)
4.安裝依賴工具
sudo apt-get install binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby
5.最后測試一下OpenHarmony三方庫編譯環境
在源碼根目錄下執行編譯命令
./build.sh --product-name rk3568 --ccache --build-target=要編譯的部件名 --target-cpu arm64
#其中:--product-name rk3568 指定產品名為rk3568
#其中:--ccache 編譯使用ccache
#其中:--target-cpu arm64 編譯構建64位系統
在源碼目錄下執行編譯zlib命令,生成libzlib.z.so
./build.sh --product-name rk3568 --ccache --build-target=zlib
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuAbk2fAADuKa9G_lQ237.jpg)
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuATbXwAAJbmEYrHtY901.jpg)
編譯生成了libzlib.z.so,編譯環境沒問題。
配置speexdsp源碼
下載完openharmony3.2Beta1源碼后,將speexdsp的源碼拷貝到openhamony的third_party目錄下。
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuAV4onAACKRb5AyGM779.jpg)
在OpenHarmony/sources/third_party/speexdsp和OpenHarmony/sources/third_party/speexdsp/libspeexdsp下分別編寫一份BUILD.gn文件,完成speexdsp的gn及測試用例的gn化。測試用例指的是測試speexdsp功能的程序。
speexdsp編譯gn化,新增工程構建腳本。
OpenHarmony/sources/third_party/speexdsp下添加BUILD.gn腳本文件。
OpenHarmony/sources/third_party/speexdsp/BUILD.gn內容如下:
import("http://build/ohos.gni")
config("speexdsp_nowarn_config"){
cflags = [
"-Wno-implicit-function-declaration",
"-Wno-pointer-sign",
"-Wno-unused-variable",
]
}
config("speexdsp_cflag_config"){
cflags = [
"-g",
"-O2",
"-fvisibility=hidden",
"-DHAVE_CONFIG_H",
]
ldflags = [
"-lm"
]
}
ohos_shared_library("speexdsp_share") {
sources = [
"libspeexdsp/preprocess.c",
"libspeexdsp/jitter.c",
"libspeexdsp/mdf.c",
"libspeexdsp/fftwrap.c",
"libspeexdsp/filterbank.c",
"libspeexdsp/resample.c",
"libspeexdsp/buffer.c",
"libspeexdsp/scal.c",
"libspeexdsp/smallft.c",
]
defines = [
"NL_DEBUG",
"speexdsp_EXPORTS",
]
configs = [
":speexdsp_cflag_config",
":speexdsp_nowarn_config"
]
include_dirs = [
".",
"libspeexdsp",
"include"
]
part_name = "speexdsp"
}
代碼解析
第一行:
import("http://build/ohos.gni")
import函數將ohos.gni文件導入到當前作用域。導入的文件是獨立執行的,生成的作用域被復制到當前文件中。一個.gni文件會定義構建參數和模板。build目錄下ohos.gni文件內容如下
import("http://build/config/sanitizers/sanitizers.gni")
import("http://build/ohos/ndk/ndk.gni")
import("http://build/ohos/notice/notice.gni")
import("http://build/ohos/sa_profile/sa_profile.gni")
import("http://build/ohos_var.gni")
import("http://build/toolchain/toolchain.gni")
import("http://build/templates/cxx/cxx.gni")
if (support_jsapi) {
import("http://build/ohos/ace/ace.gni")
import("http://build/ohos/app/app.gni")
}
import("http://build/templates/common/ohos_templates.gni")
import("http://build/templates/cxx/prebuilt.gni")
第三行到第九行:
config("speexdsp_nowarn_config"){
cflags = [
"-Wno-implicit-function-declaration",
"-Wno-pointer-sign",
"-Wno-unused-variable",
]
}
-
configs定義了該模塊編譯配置的環境變量speexdsp_nowarn_config,第24行ohos_shared_library定義了最終生成的模塊名,這里代表此模塊為最終生成libspeexdsp.z.so。所以在第五行到第七行中config中添加了編譯libspeexdsp.z.so需要添加的編譯器標志
-
但是"-Wno-implicit-function-declaration"、"-Wno-pointer-sign""、-Wno-unused-variable"并非是分析speexdsp原生庫得來的cflag編譯器標志。
-
而是后來在ohos上編譯驗證過程中,根據編譯報錯信息添加的。如果不添加它們,執行./build.sh --product-name rk3568 --ccache --build-target=speexdsp命令后,則無法編譯生成openharmony上的運行的libspeexdsp.z.so庫,會出現編譯警告信息-W-implicit-function-declaration、-W-pointer-sign、-W-unused-variable。解決辦法就是在gn化時添加cflag標志"-Wno-implicit-function-declaration"、"-Wno-pointer-sign""、-Wno-unused-variable"。
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuAGdlcAABwOUf2ELo520.jpg)
-
clang編譯器警告消除:
1.出現警告的就是直接在-W后面加no,比如-Wimplicit-function-declaration改為 -Wno-implicit-function-declaration
2.還有另外的一種方法:-Wimplicit-function-declaration=no
第十一到第二十二行:
config("speexdsp_cflag_config"){
cflags = [
"-g",
"-O2",
"-fvisibility=hidden",
"-DHAVE_CONFIG_H",
]
ldflags = [
"-lm"
]
}
-
configs定義了該模塊編譯配置的環境變量speexdsp_cflag_config,在第十三行到第十六行添加了編譯需要添加的編譯器標志 "-g","-O2","-fvisibility=hidden", "-DHAVE_CONFIG_H"。
-
"-g","-O2","-fvisibility=hidden"通過分析原生庫config.log和makefile文件,具體請查看第二期內容。
-
"-DHAVE_CONFIG_H"通過分析執行build命令后編譯ohos上speexdsp的so庫報錯信息得來
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuASw0KAABtn2wwuJ4129.jpg)
-
添加"-DHAVE_CONFIG_H"后仍然有報錯信息,解決辦法是把linux下編譯speexdsp原生庫./configure后生成的config.h放置在thrid_party/speexdsp下。
![image.png](https://file.elecfans.com/web2/M00/6E/CB/pYYBAGM-6xuAKfTkAAC5umBWxZE287.jpg)
第二十四行到第五十二行:
ohos_shared_library("speexdsp_share") {
sources = [
"libspeexdsp/preprocess.c",
"libspeexdsp/jitter.c",
"libspeexdsp/mdf.c",
"libspeexdsp/fftwrap.c",
"libspeexdsp/filterbank.c",
"libspeexdsp/resample.c",
"libspeexdsp/buffer.c",
"libspeexdsp/scal.c",
"libspeexdsp/smallft.c",
]
defines = [
"NL_DEBUG",
"speexdsp_EXPORTS",
]
configs = [
":speexdsp_cflag_config",
":speexdsp_nowarn_config"
]
include_dirs = [
".",
"libspeexdsp",
"include"
]
part_name = "speexdsp"
}
-
第24行ohos_shared_library定義了最終生成的模塊名,這里代表此模塊為最終生成libspeexdsp.z.so/動態庫
如果是生成靜態庫ohos_static_library(" ") { }
-
第二十五行到第三十五行sources模塊包含了需要編譯的源碼文件
-
第四十六行到五十行include_dirs模塊包含了編譯依賴的頭文件路徑
-
第五十一行part_name 該模塊編譯依賴的編譯子系統組件名。該配置項是為了模塊最終生成的so文件能在系統編譯完后自動拷貝到系統目錄中。如果沒有配置該項,系統編譯完后是不會自動將生成的so文件拷貝到系統目錄。
測試用例gn化,新增工程構建腳本
OpenHarmony/sources/third_party/speexdsp/libspeexdsp下添加BUILD.gn腳本文件。
import("http://build/ohos.gni")
config("test_nowarn_config"){
cflags = [
"-Wno-sign-compare",
"-Wno-pointer-sign"
]
}
config("speexdsp_cflag_config") {
ldflags = [ "-lm" ]
cflags_cc = [
"-g",
"-O2",
"-fvisibility=hidden",
]
}
config("speexdsp_config") {
include_dirs = [
"http://third_party/speexdsp/include"
]
}
ohos_executable("testdenoise"){
public_configs = [
":speexdsp_config",
":test_nowarn_config"
]
sources = [
"testdenoise.c"
]
configs = [
":speexdsp_cflag_config",
]
deps = [
"http://third_party/speexdsp:speexdsp_share"
]
part_name = "speexdsp"
}
ohos_executable("testecho"){
public_configs = [
":speexdsp_config",
":test_nowarn_config"
]
sources = [
"testecho.c"
]
configs = [
":speexdsp_cflag_config"
]
deps = [
"http://third_party/speexdsp:speexdsp_share"
]
part_name = "speexdsp"
}
ohos_executable("testjitter"){
public_configs = [
":speexdsp_config",
":test_nowarn_config"
]
sources = [
"testjitter.c"
]
configs = [
":speexdsp_cflag_config"
]
deps = [
"http://third_party/speexdsp:speexdsp_share"
]
part_name = "speexdsp"
}
ohos_executable("testresample"){
public_configs = [
":speexdsp_config",
":test_nowarn_config"
]
sources = [
"testresample.c"
]
configs = [
":speexdsp_cflag_config"
]
deps = [
"http://third_party/speexdsp:speexdsp_share"
]
part_name = "speexdsp"
}
ohos_executable("testresample2"){
public_configs = [
":speexdsp_config",
":test_nowarn_config"
]
sources = [
"testresample2.c"
]
configs = [
":speexdsp_cflag_config"
]
deps = [
"http://third_party/speexdsp:speexdsp_share"
]
part_name = "speexdsp"
}
代碼解析
測試用例gn化代碼解析的內容與speexdsp編譯gn化內容相似,這里不做重復解釋,只補充以下幾點。
-
測試用例是在ohos上測試libspeexdsp.z.so功能用的。
-
第28、48、68、88、108行:gn中的目標類型executable表示生成可執行文件testdenoise、testecho、testjitter、testresample、testresample2。
-
第41、61、81、101、121行:deps表示測試用例模塊編譯依賴其他模塊,這里指的是測試用例的編譯依賴。libspeexdsp.z.so庫。
-
第45、65、85、105、125行:part_name表示測試用例模塊編譯依賴的編譯子系統組件名。該配置項是為了模塊最終生成的so文件能在系統編譯完后自動拷貝到系統目錄中。如果沒有配置該項,系統編譯完后是不會自動將生成的so文件拷貝到系統目錄。
OpenHarmony/sources/third_party/speexdsp目錄下添加ohos.build。
-
定義子系統并加入到編譯框架
在系統源碼根目錄下創建一個目錄作為子系統目錄,子系統目錄可創建在OpenHarmony源碼目錄任意位置。
-
本項目以third_party/speexdsp作為為子系統目錄,子系統名字即為speexdsp。
子系統speexdsp目錄下創建ohos.build文件,build構建時會先讀取該文件。
"subsystem": "speexdsp",
"parts": {
"speexdsp": {
"module_list": [
"http://third_party/speexdsp/libspeexdsp:testdenoise",
"http://third_party/speexdsp/libspeexdsp:testecho",
"http://third_party/speexdsp/libspeexdsp:testjitter",
"http://third_party/speexdsp/libspeexdsp:testresample",
"http://third_party/speexdsp/libspeexdsp:testresample2"
],
"inner_kits": [
],
"system_kits": [
],
"test_list": [
]
}
}
}
-
build文件夾下的subsystem_config.json文件,主要包含子系統名稱與路徑信息,在preloader階段被加載,根據子系統名稱和路徑信息查找該路徑下的ohos.build文件。
-
其中需要包含module_list、inner_kits、system_kits、test_list四個部分的聲明:
-
module_list:部件包含的模塊列表
-
inner_kits:部件提供其它部件的接口
-
system_kits:部件提供給生成應用的接口
-
test_list:部件對應模塊的測試用例
修改build/subsystem_config.json,新增子系統定義。
在源碼/build/subsystem_config.json中增加子系統選項,把子系統speexdsp配置到build/subsystem_config.json。
"speexdsp": {
"path": "third_party/speexdsp",
"name": "speexdsp"
},
注意:要求符合json語法規范,要在}
前加,
(如下圖所示)
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuAMAZYAABuYb9HeS4923.jpg)
修改vendor/hihope/rk3568/config.json文件將speexdsp添加至rk3568開發板,在vendor目錄下新增產品的定義。
將子系統及其組件加入產品定義中,以rk3568為例,產品定義文件在vendor/hihope/rk3568/config.json,需要將以下內容添加到config.json中:
{
"subsystem": "speexdsp",
"components": [
{
"component": "speexdsp",
"features": []
}
]
},
下期分享內容:在OpenHarmony的編譯體系下編譯speexdsp的so和測試用的可執行文件,以及編譯報錯的解決辦法
知識點附送
本文中知識點附送
的內容并不和移植speexdsp到openharmony標準系統
直接相關,僅作為拓展閱讀的知識點,因此讀者可以不作過細的了解。
gn
generate ninja工具,在out目錄下生成ninja編譯文件*.ninja,gn的可執行文件位置在prebuilts/build-tools/linux-x86目錄里
jiajiahao@ubuntu:~/Desktop/OpenHarmony/sources/prebuilts/build-tools/linux-x86/bin$ ./gn --help
Commands (type "gn help " for more help):
analyze: Analyze which targets are affected by a list of files.
args: Display or configure arguments declared by the build.
check: Check header dependencies.
clean: Cleans the output directory.
desc: Show lots of insightful information about a target or config.
format: Format .gn files.
gen: Generate ninja files.
help: Does what you think.
ls: List matching targets.
meta: List target metadata collection results.
path: Find paths between two targets.
refs: Find stuff referencing a target or file.
Target declarations (type "gn help " for more help):
action: Declare a target that runs a script a single time.
action_foreach: Declare a target that runs a script over a set of files.
bundle_data: [iOS/macOS] Declare a target without output.
copy: Declare a target that copies files.
create_bundle: [iOS/macOS] Build an iOS or macOS bundle.
executable: Declare an executable target.
generated_file: Declare a generated_file target.
group: Declare a named group of targets.
loadable_module: Declare a loadable module target.
rust_library: Declare a Rust library target.
rust_proc_macro: Declare a Rust procedural macro target.
shared_library: Declare a shared library target.
source_set: Declare a source set target.
static_library: Declare a static library target.
target: Declare an target with the given programmatic type.
Buildfile functions (type "gn help " for more help):
assert: Assert an expression is true at generation time.
config: Defines a configuration object.
declare_args: Declare build arguments.
defined: Returns whether an identifier is defined.
exec_script: Synchronously run a script and return the output.
foreach: Iterate over a list.
forward_variables_from: Copies variables from a different scope.
get_label_info: Get an attribute from a target's label.
get_path_info: Extract parts of a file or directory name.
get_target_outputs: [file list] Get the list of outputs from a target.
getenv: Get an environment variable.
import: Import a file into the current scope.
not_needed: Mark variables from scope as not needed.
pool: Defines a pool object.
print: Prints to the console.
process_file_template: Do template expansion over a list of files.
read_file: Read a file into a variable.
rebase_path: Rebase a file or directory to another location.
set_default_toolchain: Sets the default toolchain name.
set_defaults: Set default values for a target type.
set_sources_assignment_filter: Set a pattern to filter source files.
split_list: Splits a list into N different sub-lists.
string_join: Concatenates a list of strings with a separator.
string_replace: Replaces substring in the given string.
string_split: Split string into a list of strings.
template: Define a template rule.
tool: Specify arguments to a toolchain tool.
toolchain: Defines a toolchain.
write_file: Write a file to disk.
Built-in predefined variables (type "gn help " for more help):
current_cpu: [string] The processor architecture of the current toolchain.
current_os: [string] The operating system of the current toolchain.
current_toolchain: [string] Label of the current toolchain.
default_toolchain: [string] Label of the default toolchain.
gn_version: [number] The version of gn.
host_cpu: [string] The processor architecture that GN is running on.
host_os: [string] The operating system that GN is running on.
invoker: [string] The invoking scope inside a template.
python_path: [string] Absolute path of Python.
root_build_dir: [string] Directory where build commands are run.
root_gen_dir: [string] Directory for the toolchain's generated files.
root_out_dir: [string] Root directory for toolchain output files.
target_cpu: [string] The desired cpu architecture for the build.
target_gen_dir: [string] Directory for a target's generated files.
target_name: [string] The name of the current target.
target_os: [string] The desired operating system for the build.
target_out_dir: [string] Directory for target output files.
Variables you set in targets (type "gn help " for more help):
aliased_deps: [scope] Set of crate-dependency pairs.
all_dependent_configs: [label list] Configs to be forced on dependents.
allow_circular_includes_from: [label list] Permit includes from deps.
arflags: [string list] Arguments passed to static_library archiver.
args: [string list] Arguments passed to an action.
asmflags: [string list] Flags passed to the assembler.
assert_no_deps: [label pattern list] Ensure no deps on these targets.
bundle_contents_dir: Expansion of {{bundle_contents_dir}} in create_bundle.
bundle_deps_filter: [label list] A list of labels that are filtered out.
bundle_executable_dir: Expansion of {{bundle_executable_dir}} in create_bundle
bundle_resources_dir: Expansion of {{bundle_resources_dir}} in create_bundle.
bundle_root_dir: Expansion of {{bundle_root_dir}} in create_bundle.
cflags: [string list] Flags passed to all C compiler variants.
cflags_c: [string list] Flags passed to the C compiler.
cflags_cc: [string list] Flags passed to the C++ compiler.
cflags_objc: [string list] Flags passed to the Objective C compiler.
cflags_objcc: [string list] Flags passed to the Objective C++ compiler.
check_includes: [boolean] Controls whether a target's files are checked.
code_signing_args: [string list] Arguments passed to code signing script.
code_signing_outputs: [file list] Output files for code signing step.
code_signing_script: [file name] Script for code signing.
code_signing_sources: [file list] Sources for code signing step.
complete_static_lib: [boolean] Links all deps into a static library.
configs: [label list] Configs applying to this target or config.
contents: Contents to write to file.
crate_name: [string] The name for the compiled crate.
crate_root: [string] The root source file for a binary or library.
crate_type: [string] The type of linkage to use on a shared_library.
data: [file list] Runtime data file dependencies.
data_deps: [label list] Non-linked dependencies.
data_keys: [string list] Keys from which to collect metadata.
defines: [string list] C preprocessor defines.
depfile: [string] File name for input dependencies for actions.
deps: [label list] Private linked dependencies.
externs: [scope] Set of Rust crate-dependency pairs.
framework_dirs: [directory list] Additional framework search directories.
frameworks: [name list] Name of frameworks that must be linked.
friend: [label pattern list] Allow targets to include private headers.
include_dirs: [directory list] Additional include directories.
inputs: [file list] Additional compile-time dependencies.
ldflags: [string list] Flags passed to the linker.
lib_dirs: [directory list] Additional library directories.
libs: [string list] Additional libraries to link.
metadata: [scope] Metadata of this target.
output_conversion: Data format for generated_file targets.
output_dir: [directory] Directory to put output file in.
output_extension: [string] Value to use for the output's file extension.
output_name: [string] Name for the output file other than the default.
output_prefix_override: [boolean] Don't use prefix for output name.
outputs: [file list] Output files for actions and copy targets.
partial_info_plist: [filename] Path plist from asset catalog compiler.
pool: [string] Label of the pool used by the action.
precompiled_header: [string] Header file to precompile.
precompiled_header_type: [string] "gcc" or "msvc".
precompiled_source: [file name] Source file to precompile.
product_type: [string] Product type for Xcode projects.
public: [file list] Declare public header files for a target.
public_configs: [label list] Configs applied to dependents.
public_deps: [label list] Declare public dependencies.
rebase: [boolean] Rebase collected metadata as files.
response_file_contents: [string list] Contents of .rsp file for actions.
script: [file name] Script file for actions.
sources: [file list] Source files for a target.
testonly: [boolean] Declares a target must only be used for testing.
visibility: [label list] A list of labels that can depend on a target.
walk_keys: [string list] Key(s) for managing the metadata collection walk.
write_runtime_deps: Writes the target's runtime_deps to the given path.
xcode_extra_attributes: [scope] Extra attributes for Xcode projects.
xcode_test_application_name: [string] Name for Xcode test target.
Other help topics:
all: Print all the help at once
buildargs: How build arguments work.
dotfile: Info about the toplevel .gn file.
execution: Build graph and execution overview.
grammar: Language and grammar for GN build files.
input_conversion: Processing input from exec_script and read_file.
label_pattern: Matching more than one label.
labels: About labels.
metadata_collection: About metadata and its collection.
ninja_rules: How Ninja build rules are named.
nogncheck: Annotating includes for checking.
output_conversion: Specifies how to transform a value to output.
runtime_deps: How runtime dependency computation works.
source_expansion: Map sources to outputs for scripts.
switches: Show available command-line switches.
ninja
ninja構建工具,編譯時根據gn生成的*.ninja文件進行編譯構建,ninjiad的可執行文件位置在prebuilts/build-tools/linux-x86目錄里
jiajiahao@ubuntu:~/Desktop/OpenHarmony/sources/prebuilts/build-tools/linux-x86/bin$ ./ninja --help
usage: ninja [options] [targets...]
if targets are unspecified, builds the 'default' target (see manual).
options:
--version print ninja version ("1.10.1")
-v, --verbose show all command lines while building
-C DIR change to DIR before doing anything else
-f FILE specify input build file [default=build.ninja]
-j N run N jobs in parallel (0 means infinity) [default=18 on this system]
-k N keep going until N jobs fail (0 means infinity) [default=1]
-l N do not start new jobs if the load average is greater than N
-n dry run (don't run commands but act like they succeeded)
-d MODE enable debugging (use '-d list' to list modes)
-t TOOL run a subtool (use '-t list' to list subtools)
terminates toplevel options; further flags are passed to the tool
-w FLAG adjust warnings (use '-w list' to list warnings)
關于deps、external_deps的使用
在添加一個模塊的時候,需要在BUILD.gn中聲明它的依賴,為了便于后續處理部件間依賴關系,我們將依賴分為兩種——部件內依賴deps和部件間依賴external_deps。
依賴分類:
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuAVprTAABen_BTPCM178.jpg)
如上圖所示,主要分為部件內依賴(圖左)和部件間依賴(圖右)。
部件內依賴: 現有模塊module1屬于部件part1,要添加一個屬于部件part1的模塊module2,module2依賴于module1,這種情況就屬于部件內依賴。
部件間依賴: 現有模塊module1屬于部件part1,要添加一個模塊module2,module2依賴于module1,module2屬于部件part2。模塊module2與模塊module1分屬于兩個不同的部件,這種情況就屬于部件間依賴。
部件內依賴示例:
import("http://build/ohos.gni")
ohos_shared_library("module1") {
……
part_name = "part1" # 必選,所屬部件名稱
……
}
import("http://build/ohos.gni")
ohos_shared_library("module2") {
……
deps = [
"module1的gn target",
……
] # 部件內模塊依賴
part_name = "part1" # 必選,所屬部件名稱
}
部件間依賴示例:
import("http://build/ohos.gni")
ohos_shared_library("module1") {
……
part_name = "part1" # 必選,所屬部件名稱
……
}
import("http://build/ohos.gni")
ohos_shared_library("module2") {
……
external_deps = [
"part1:module1",
……
] # 部件間模塊依賴,這里依賴的模塊必須是依賴的部件聲明在inner_kits中的模塊
part_name = "part2" # 必選,所屬部件名稱
}
注意:部件間依賴要寫在external_deps里面,格式為”部件名:模塊名"的形式,并且依賴的模塊必須是依賴的部件聲明在inner_kits中的模塊。
查看.ninja_log文件可以知道每個模塊編譯的開始和結束時間
out/rk3568/.ninja_log文件記錄了每個模塊編譯的開始和結束時間(ms),結束時間和開始時間間隔越短表示模塊的編譯時間越短,編譯性能越高。
從左到右分別表示:start time|end time|mtime|command hash。
mtime(modify time)顯示的是文件內容被修改的最后時間
![image.png](https://file.elecfans.com/web2/M00/6E/35/poYBAGM-6xuAJY3fAAOFJDbxbU4555.jpg)
評論