引言:为什么鸿蒙 PC 需要命令行?

在开发者的世界里,图形界面(GUI)决定了产品的下限,而命令行界面(CLI)则决定了生产力的上限。对于立志成为“生产力工具”的鸿蒙 PC(OpenHarmony PC)而言,如果无法提供开发者熟悉的终端体验——没有 git 管理代码,没有 vim 编辑配置,没有 openssl 生成证书——那么它将始终难以触达核心开发者群体。

目前,鸿蒙 PC 正处于生态起步的关键阶段。面对 Linux 社区积累了数十年的亿级开源工具库,我们是应该一个个手动修改源码去适配,还是寻找一种更高效的“批量移植”方案?

答案就在 OpenHarmonyPCDeveloper/build 项目中。这是一个标准化的“移植工厂”,旨在通过一套脚本体系,打通 Linux 到 OpenHarmony 的任督二脉,让适配工作变得像搭积木一样简单。

核心解密:“移植工厂”是如何工作的?

要理解这个项目的核心价值,我们需要先看懂它的工作流。简单来说,它充当了一个“中间人”的角色:左手通过 dependency.json 抓取 Linux 开源项目的源码,右手通过 build.sh 注入 OpenHarmony 的编译环境,最终产出标准的 HNP(Harmony Native Package)软件包。

输出端
鸿蒙环境
构建工厂
输入端
1. 解析依赖
2. 拉取代码
3. 注入环境
4. 提供CC/CXX/Sysroot
5. 执行构建
编译支持
6. 打包产物
备份
HNP软件包
tar.gz归档
OpenHarmony SDK
交叉编译工具链
build_dependency.py
自动化调度
build.sh
环境注入
build_ohos.sh
适配脚本
dependency.json
依赖配置
Linux开源项目
原始源码

1. 环境注入:移花接木的艺术

移植 Linux 软件最大的痛点在于“水土不服”——通常是编译工具链(Toolchain)和系统库(Sysroot)不匹配。

build.sh 中,我们通过环境变量的巧妙配置,完成了一次完美的“移花接木”。请看这段核心代码:


# build.sh 核心片段

  

# 1. 锁定目标平台:aarch64-linux-ohos

export TARGET_PLATFORM=aarch64-linux-ohos

  

# 2. 偷梁换柱:将标准编译器指向 OpenHarmony SDK

export CC=${COMPILER_TOOLCHAIN}clang

export CXX=${COMPILER_TOOLCHAIN}clang++

  

# 3. 注入灵魂:指定 OpenHarmony 的系统根目录(Sysroot)

# 这确保了编译时链接的是鸿蒙的 libc 而不是宿主机的库

export CFLAGS="-fPIC -D__MUSL__=1 -D__OHOS__ ... --sysroot=${SYSROOT}"

export LDFLAGS="${LDFLAGS} -fuse-ld=${LD} --target=${TARGET_PLATFORM} --sysroot=${SYSROOT}"

通过这几行配置,原本为 Linux 编写的 MakefileCMakeLists.txt 在调用 $CC 时,实际上是在调用鸿蒙的交叉编译器。这意味着,大多数遵循标准构建协议的开源软件,甚至不需要修改一行 C/C++ 源码,就能编译出在鸿蒙 PC 上运行的二进制文件。

2. 依赖管理:自动化调度大脑

现代软件往往不是孤岛,比如 git 依赖 opensslzlib。为了解决复杂的依赖关系,项目引入了 dependency.jsonbuild_dependency.py

dependency.json 就像一份“花名册”,记录了所有已适配软件的仓库地址和特定分支:


{

"dependency": [

{

"name": "openssl",

"branch": "openssl-3.6_ohos",

"url": "git@gitcode.com:OpenHarmonyPCDeveloper/openssl.git"

},

{

"name": "zlib",

"branch": "v1.3.1_ohos",

"url": "git@gitcode.com:OpenHarmonyPCDeveloper/zlib.git"

}

]

}

build_dependency.py 则充当调度员,它会解析这份文件,自动拉取代码,并按顺序触发各自的构建脚本。这使得构建一个复杂的工具链(如 LLVM 或 Node.js)成为可能。

实战演练:以移植 tree 命令为例

光说不练假把式。下面我们以经典的目录树查看工具 tree 为例,演示如何将其移植到鸿蒙 PC。

为了更清晰地展示构建过程,我们先看一张时序图,了解当你敲下构建命令时发生了什么:

开发者 build.sh (入口) build_dependency.py (调度) Git工具 build_ohos.sh (适配) OHOS SDK ./build.sh --sdk ... 配置交叉编译环境变量 (CC, CXX, SYSROOT) 调用依赖管理脚本 解析 dependency.json git clone (拉取源码) 执行 ./build_ohos.sh 调用交叉编译器编译 生成二进制文件 make install & hnp pack 构建完成 loop [遍历每一个依赖库] 所有任务结束 输出构建产物 (output/) 开发者 build.sh (入口) build_dependency.py (调度) Git工具 build_ohos.sh (适配) OHOS SDK

第一步:获取脚手架

首先,将构建脚手架克隆到本地:


git clone git@gitcode.com:OpenHarmonyPCDeveloper/build.git

cd build

第二步:源码适配(The Magic Moment)

我们需要在 tree 的源码目录中增加两个关键文件:build_ohos.shhnp.json

1. 增加 build_ohos.sh

这是适配工作的核心。我们需要告诉构建系统如何编译这个特定的项目。对于 tree 这样简单的项目,脚本非常直观:


# build_ohos.sh

  

# 定义安装路径,遵循 HNP 规范

export TREE_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/tree.org/tree_2.2.1

  

# 清理旧产物

make clean

  

# 编译:传入 PREFIX 变量,利用上层 build.sh 注入的交叉编译环境

make VERBOSE=1 perfix=${TREE_INSTALL_HNP_PATH}

  

# 安装:将产物安装到指定目录

make install perfix=${TREE_INSTALL_HNP_PATH}

  

# 打包:使用 hnp 工具打包

cp hnp.json ${TREE_INSTALL_HNP_PATH}/

pushd ${TREE_INSTALL_HNP_PATH}/../

${HNP_TOOL} pack -i ${TREE_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/

# 同时打一个传统的 tar.gz 包作为备份

tar -zvcf ${ARCHIVE_PATH}/ohos_tree_2.2.1.tar.gz tree_2.2.1/

popd

2. 增加 hnp.json

这是软件包的“身份证”,用于包管理器识别:


{

"type": "hnp-config",

"name": "tree",

"version": "2.2.1",

"install": {}

}

第三步:一键编译

回到 build 目录,执行构建命令(假设 SDK 已配置好):


./build.sh --sdk /path/to/your/ohos-sdk/linux

片刻之后,你将在 output 目录下看到 ohos_tree_2.2.1.tar.gz。将这个包推送到鸿蒙 PC 上解压,你就可以在终端中敲下熟悉的 tree 命令了!

进阶:生态共建的愿景

目前的 dependency.json 中已经列出了 openssl, libxml2, busybox, libuv 等基础库,但这还远远不够。

鸿蒙 PC 的命令行生态建设,不是一个人的战斗,而是一场开源社区的接力赛。

  • 如果你精通 C/C++,欢迎挑战移植 ffmpegnginx

  • 如果你是脚本高手,可以优化 build.sh 的通用性;

  • 如果你是普通开发者,哪怕只是提交一个 Issue,也是对生态的贡献。

项目地址:https://gitcode.com/OpenHarmonyPCDeveloper/build

让我们一起,把 Linux 亿级生态“搬”进鸿蒙,为 OpenHarmony PC 打造一个丰盛的开发者乐园。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新

更多推荐