[鸿蒙PC命令行移植适配] 移植ag命令到鸿蒙PC平台的完整实践

ag:比grep、ack更快的递归搜索文件内容的命令行工具。The Silver Searcher(ag)是一款用 C 编写的快速且对开发人员友好的文本搜索工具,针对源代码搜索进行了优化。它与 ack 类似,但速度更快,因此深受开发人员喜爱,可用于搜索代码库。在典型使用中,ag 比 ack 快 5-10 倍,默认情况下,ag 将忽略文件名匹配 .gitignore、.hgignore 或 .ignore。

一、前言

Silver Searcher(ag)是新一代代码搜索工具,其基于PCRE正则引擎和LZMA压缩算法,相比传统grep提速10倍以上。作为开发者的生产力利器,ag在大型代码库检索、日志分析和分布式搜索场景中表现卓越。本文将详解如何将ag-2.2.0移植到鸿蒙PC平台。

移植效果验证

1.1 核心价值

ag在即时检索速度智能忽略规则多格式支持方面优势明显,移植到鸿蒙平台将为代码审查、系统调试等场景提供高效搜索能力。

官网地址:https://github.com/ggreer/the_silver_searcher

源码仓库:https://gitcode.com/qq8864/the_silver_searcher

1.2 项目信息表
关键信息 技术参数
工具名称 ag命令(The Silver Searcher )
开源协议 Apache-2.0
源码版本 2.2.0
目标平台 OpenHarmony PC (aarch64)
核心依赖 PCRE-8.45、XZ-5.8.2 、 zlib-1.3.1

注:该库依赖了PCRE库、XZ库和libz库。移植该库前需要先移植好对应的依赖。移植方法参见猫哥前面的博文。


二、适配设计

2.0 环境准备(Ubuntu 24.04)
bash 复制代码
sudo apt update
sudo apt install -y git curl cmake ninja-build gcc g++ make autoconf automake libtool yasm nasm

sudo apt install -y gettext autopoint
sudo apt install python3 python3-pip
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
2.1配置ohos-sdk
bash 复制代码
sdk_download_url="https://cidownload.openharmony.cn/version/Daily_Version/OpenHarmony_6.1.0.27/20260111_020523/version-Daily_Version-OpenHarmony_6.1.0.27-20260111_020523-ohos-sdk-public.tar.gz"
curl -o ohos-sdk-public.tar.gz $sdk_download_url
mkdir ohos-sdk
tar -zxf ohos-sdk-public.tar.gz -C ohos-sdk

cd ~/ohos-sdk/linux
unzip native-linux-x64-6.1.0.27-Beta1.zip
unzip toolchains-linux-x64-6.1.0.27-Beta1.zip

这段代码的作用是从指定的 URL 下载 SDK 压缩包,然后创建一个名为 ohos-sdk 的目录,并将压缩包解压到该目录下。

2.2 技术挑战
  1. 双重依赖管理:PCRE正则库与XZ压缩库的兼容性验证
  2. 路径适配:鸿蒙专用文件系统路径规则适配
  3. 静态链接:多库联合静态编译的符号冲突解决
  4. 性能调优:ARM64架构下的搜索算法优化
2.3 环境校验

确认前置依赖库已完成移植:

bash 复制代码
ls /data/service/hnp/pcre.org/pcre_8.45.0/lib/libpcre.a
ls /data/service/hnp/xz.org/xz_5.8.2/lib/liblzma.a
ls /data/service/hnp/zlib.org/zlib_1.3.1/lib/libz.a

三、实现细节

3.0 环境脚本exports.sh
bash 复制代码
source exports.sh

猫哥的通用脚本(exports.sh),用于一键配置交叉编译环境:

bash 复制代码
echo "hello exports,交叉编译环境配置"

## SDK路径,你唯一需要根据实际的改的地方
SDK_PATH="/root/ohos-sdk/linux"

echo "SDK_PATH:$SDK_PATH"

export OHOS_SDK="$SDK_PATH"
export HNP_PERFIX=

export COMPILER_TOOLCHAIN=${OHOS_SDK}/native/llvm/bin/

BUILD_OS=$(uname)


PYTHON=$(python --version)
echo "python  : $PYTHON"

export CC=${COMPILER_TOOLCHAIN}clang             && echo "CC      : ${CC}"
export CXX=${COMPILER_TOOLCHAIN}clang++          && echo "CXX     : ${CXX}"
export HOSTCC=${CC}                              && echo "HOSTCC  : ${HOSTCC}"
export HOSTCXX=${CXX}                            && echo "HOSTCXX : ${HOSTCXX}"
export CPP="${CXX}  -E"                          && echo "CPP     : ${CPP}"
export AS=${COMPILER_TOOLCHAIN}llvm-as           && echo "AS      : ${AS}"
export LD=${COMPILER_TOOLCHAIN}ld.lld            && echo "LD      : ${LD}"
export STRIP=${COMPILER_TOOLCHAIN}llvm-strip     && echo "STRIP   : ${STRIP}"
export RANLIB=${COMPILER_TOOLCHAIN}llvm-ranlib   && echo "RANLIB  : ${RANLIB}"  
export OBJDUMP=${COMPILER_TOOLCHAIN}llvm-objdump && echo "OBJDUMP : ${OBJDUMP}"
export OBJCOPY=${COMPILER_TOOLCHAIN}llvm-objcopy && echo "OBJCOPY : ${OBJCOPY}"
export NM=${COMPILER_TOOLCHAIN}llvm-nm           && echo "NM      : ${NM}"
export AR=${COMPILER_TOOLCHAIN}llvm-ar           && echo "AR      : ${AR}"

export SYSROOT=${OHOS_SDK}/native/sysroot
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}/usr/lib/aarch64-linux-ohos
export PKG_CONFIG_PATH=${PKG_CONFIG_SYSROOT_DIR}
export PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_SYSROOT_DIR}

export HNP_TOOL=${OHOS_SDK}/toolchains/hnpcli
export CMAKE=${OHOS_SDK}/native/build-tools/cmake/bin/cmake
export TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake

export WORK_ROOT=${PWD}
export ARCHIVE_PATH=${WORK_ROOT}/output
export COMM_DEP_PATH=${WORK_ROOT}/deps_install

export HNP_PUBLIC_PATH=${HNP_PERFIX}/data/service/hnp/
export MAKE_QUITE_PARAM=" -s "
export CONFIGURE_QUITE_PARAM=" --quiet "

export TARGET_PLATFORM=aarch64-linux-ohos
export TARGET=aarch64-linux-ohos

export CFLAGS="-fPIC -D__MUSL__=1 -D__OHOS__  -fstack-protector-strong --target=${TARGET_PLATFORM} --ld-path=${LD} --sysroot=${SYSROOT} -stdlib=libc++ "
export CXXFLAGS="${CFLAGS} "
export LD_LIBRARY_PATH=${SYSROOT}/usr/lib:${LD_LIBRARY_PATH}
export LDFLAGS="--ld-path=${LD} -Wc,--target=${TARGET_PLATFORM} --sysroot=${SYSROOT} -fuse-ld=lld "
export HOST_TYPE="--host=aarch64-linux --build=aarch64-linux"

#export NCURSES_INSTALL_HNP_PATH="${HNP_PUBLIC_PATH}/ncurses.org/ncurses_v6.4"
mkdir -p ${HNP_PUBLIC_PATH}
mkdir -p ${ARCHIVE_PATH}

chmod 777  -R  ${HNP_PUBLIC_PATH}

mkdir -p code

echo "LDFLAGS:${LDFLAGS}"
#export PKG_CONFIG_PATH="${CUSTOM_PREFIX}/lib/pkgconfig:$PKG_CONFIG_PATH"
3.1 编译脚本(build_ohos.sh)

放置在源码的根目录下。

bash 复制代码
#!/bin/bash
export AG_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/ag.org/ag_2.2.0

make clean

# 设置依赖库路径(需预先编译完成)
#PCRE库路径
PCRE_PATH=${HNP_PUBLIC_PATH}/pcre.org/pcre_8.45.0
#XZ库路径
XZ_PATH=${HNP_PUBLIC_PATH}/xz.org/xz_5.8.2
#Zlib库路径
ZLIB_PATH=${HNP_PUBLIC_PATH}/zlib.org/zlib_1.3.1

# 配置依赖查找路径
export PKG_CONFIG_PATH="${PCRE_PATH}/lib/pkgconfig:${XZ_PATH}/lib/pkgconfig"

# ag安装目录
mkdir -p ${AG_INSTALL_HNP_PATH}

#包含依赖库的头文件
CFLAGS="-I${PCRE_PATH}/include -I${XZ_PATH}/include" 
#static静态链接,这样直接出来命令可执行文件,避免依赖问题
LDFLAGS="-static -L${PCRE_PATH}/lib -L${XZ_PATH}/lib -L${ZLIB_PATH}/lib" 

#configure 构建脚本
./configure --host=aarch64-linux-musl \
           --prefix=${AG_INSTALL_HNP_PATH}

make VERBOSE=1 -j$(nproc)
make install

# 生成鸿蒙HNP软件包
cp hnp.json ${AG_INSTALL_HNP_PATH}/
pushd ${AG_INSTALL_HNP_PATH}/../
    ${HNP_TOOL} pack -i ${AG_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
    tar -zvcf ${ARCHIVE_PATH}/ohos_ag_2.2.0.tar.gz ag_2.2.0/
popd
3.2 关键配置解析
配置项 技术作用 必要性
PKG_CONFIG_PATH 指定PCRE/XZ库的元数据查找路径 关键
-static 强制静态链接避免运行时依赖 必需
CFLAGS/LDFLAGS 显式声明头文件与库文件的物理路径 必需
--host 指定交叉编译的目标平台架构 必需

四、部署验证

4.1 文件结构
复制代码
ag_2.2.0/
├── bin/
│   └── ag            # 核心搜索工具
└── share/
    └── man/          # 使用手册
4.2 功能测试
bash 复制代码
# 版本验证
ag --version
ag version 2.2.0

# 代码搜索测试
ag -G '\.h$' HARMONY_OS
./kernel/include/HARMONY_OS.h
1:#define HARMONY_OS_VERSION "OpenHarmony 4.0"

鸿蒙容器中验证截图:

鸿蒙PC容器介绍:低成本搭建鸿蒙PC运行环境:基于 Docker 的 x86_64 服务器


五、常见问题解决

5.1 依赖库缺失错误
bash 复制代码
error: libpcre.so.1: cannot open shared object file

解决方案:确认静态链接参数生效,重新执行make clean && make

5.2 正则匹配异常

检查PCRE库版本兼容性:

bash 复制代码
ag --pcre-version
# 应显示PCRE 8.45

六、优化方向

  1. 索引加速:集成鸿蒙分布式数据库实现预索引
  2. 安全增强:支持鸿蒙权限管理系统进行访问控制
  3. 异构搜索:通过软总线实现跨设备联合搜索
  4. 算法优化:针对YAFFS2文件系统优化inode遍历

移植要点 :通过PKG_CONFIG_PATH精确控制依赖关系,-static参数可规避动态库路径问题,建议优先采用静态编译方案。


附件资源


通过移植实践,我们将专业的代码搜索工具带入鸿蒙生态。

欢迎加入鸿蒙开发者社区,共同打造开发者工具生态: 鸿蒙开发者社区

相关推荐
旭日猎鹰2 小时前
鸿蒙环境添加React Native的bundle包
react native·react.js·harmonyos
特立独行的猫a3 小时前
鸿蒙PC生态三方命令行软件移植:XZ压缩工具移植到鸿蒙PC平台的完整指南
华为·harmonyos·移植·命令行·交叉编译·xz命令
不爱吃糖的程序媛3 小时前
OpenHarmony 平台 C/C++ 三方库移植实战指南
react native·react.js·harmonyos
2501_948122633 小时前
React Native for OpenHarmony 实战:Steam 资讯 App 隐私政策实现
javascript·react native·react.js·游戏·ecmascript·harmonyos
2501_948122633 小时前
React Native for OpenHarmony 实战:Steam 资讯 App 主题设置实现
javascript·react native·react.js·游戏·ecmascript·harmonyos
funnycoffee1234 小时前
华为USG6555F 防火墙 ---华为6857交换机 光口对接无法UP故障
服务器·网络·华为·usg自协商
奋斗的小青年!!5 小时前
Flutter开发OpenHarmony打卡进度环组件:实现与跨平台兼容性实践
flutter·harmonyos·鸿蒙
奋斗的小青年!!5 小时前
Flutter跨平台开发鸿蒙应用:表情选择器组件的深度实践
flutter·harmonyos·鸿蒙