OH6.0-Release的python三方库编译指南
操作流程:
1.拷贝
将python.sh拷贝到用户的编译目录下(脚本在下面)
【存在依赖的库,源码放入附件中】
2.修改
1.打开编译脚本python.sh
2.修改“用户配置路径”

3.编译
进入目录下,执行编译
chmod +x python.sh
./python.sh
编译脚本:
#!/bin/bash
set -e
# 用户配置路径
# -----------------------------------------------------------
# 工具链路径
CLANG_BIN="$HOME/opt/native/llvm/bin"
LLVM_BIN="$HOME/opt/native/llvm/bin"
# 系统根目录
SYSROOT_PATH="$HOME/opt/native/sysroot"
# armv8安装目录
PYTHON_INSTALL_DIR_armv8="$PWD/out/armv8"
# armv7安装目录
PYTHON_INSTALL_DIR_armv7="$PWD/out/armv7"
# -----------------------------------------------------------
# 临时构建目录(编译完成后自动删除)
WORK_DIR="$(pwd)"
TEMP_DIR="${WORK_DIR}/temp_build"
# 创建临时目录
mkdir -p "${TEMP_DIR}" \
cd "${TEMP_DIR}"
# 编译 openssl (armv8)
(
echo "Building zlib for armv8..."
OPENSSL_VER="3.4.1"
OPENSSL_TAR="openssl-${OPENSSL_VER}.tar.gz"
wget "https://www.openssl.org/source/${OPENSSL_TAR}"
tar -xzf ${OPENSSL_TAR}
cd openssl-${OPENSSL_VER}
export CC="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
./Configure --prefix="${PWD}/../../out/armv8" shared linux-aarch64
make -j$(nproc)
make install
make distclean
cd ..
)
# 编译 openssl (armv7)
(
echo "Building openssl for armv7..."
OPENSSL_VER="3.4.1"
cd openssl-${OPENSSL_VER}
export CC="${CLANG_BIN}/armv7-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/armv7-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
./Configure --prefix="${PWD}/../../out/armv7" shared linux-generic32
make -j$(nproc)
make install
cd ..
)
# 编译 Gettext (armv8)
(
echo "Building Gettext for armv8..."
GETTEXT_VER="0.21"
pkg="gettext-${GETTEXT_VER}"
tar_file="${pkg}.tar.gz"
[ ! -f "${tar_file}" ] && wget "https://ftp.gnu.org/pub/gnu/gettext/${tar_file}"
tar -xzf "${tar_file}"
cd ${pkg}
export CC="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
./configure --prefix="${PWD}/../../out/armv8" --host=aarch64-unknown-linux CFLAGS="-I${PWD}/../../out/armv8/include" \
LDFLAGS="-L${PWD}/../../out/armv8/lib" \
PKG_CONFIG_PATH="${PWD}/../../out/armv8/lib/pkgconfig/"
make -j$(nproc)
make install
make distclean
cd ..
)
# 编译 Gettext (armv7)
(
echo "Building Gettext for armv7..."
GETTEXT_VER="0.21"
pkg="gettext-${GETTEXT_VER}"
cd ${pkg}
export CC="${CLANG_BIN}/armv7-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/armv7-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
./configure --prefix="${PWD}/../../out/armv7" --host=armv7-unknown-linux CFLAGS="-I${PWD}/../../out/armv8/include" \
LDFLAGS="-L${PWD}/../../out/armv7/lib" \
PKG_CONFIG_PATH="${PWD}/../../out/armv7/lib/pkgconfig/"
make -j$(nproc)
make install
cd ..
)
# 编译 libff (armv8)
(
echo "Building libff for armv8..."
LIBFFI_VER="3.4.4"
pkg="libffi-${LIBFFI_VER}"
tar_file="${pkg}.tar.gz"
[ ! -f "${tar_file}" ] && \
wget "https://github.com/libffi/libffi/releases/download/v${LIBFFI_VER}/${tar_file}"
tar -xzf "${tar_file}"
cd $pkg
export CC="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
./configure --prefix="${PWD}/../../out/armv8" --host=aarch64-unknown-linux enable_multi_os_directory=no \
CFLAGS="-I${PWD}/../../out/armv8/include" \
LDFLAGS="-L${PWD}/../../out/armv8/lib" \
PKG_CONFIG_PATH="${PWD}/../../out/armv8/lib/pkgconfig/"
make -j$(nproc)
make install
make distclean
cd ..
)
# 编译 libffi (armv7)
(
echo "Building libff for armv7..."
LIBFFI_VER="3.4.4"
pkg="libffi-${LIBFFI_VER}"
cd ${pkg}
export CC="${CLANG_BIN}/armv7-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/armv7-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
./configure --prefix="${PWD}/../../out/armv7" --host=armv7-unknown-linux enable_multi_os_directory=no \
CFLAGS="-I${PWD}/../../out/armv7/include" \
LDFLAGS="-L${PWD}/../../out/armv7/lib" \
PKG_CONFIG_PATH="${PWD}/../../out/armv7/lib/pkgconfig/"
make -j$(nproc)
make install
cd ..
)
# 编译 util-linux (armv8)
(
echo "Building util-linux for armv8..."
UTILLINUX_VER="2.38"
pkg="util-linux-${UTILLINUX_VER}"
tar_file="${pkg}.tar.gz"
[ ! -f "${tar_file}" ] && \
wget "https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v${UTILLINUX_VER}/${tar_file}"
tar -xzf "${tar_file}"
cd $pkg
export CC="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
./configure --prefix="${PWD}/../../out/armv8" --host=aarch64-unknown-linux --disable-all-programs \
--enable-libuuid \
CFLAGS="-I${PWD}/../../out/armv8/include" \
LDFLAGS="-L${PWD}/../../out/armv8/lib" \
PKG_CONFIG_PATH="${PWD}/../../out/armv8/lib/pkgconfig/"
make -j$(nproc)
make install
make distclean
cd ..
)
# 编译 util-linux (armv7)
(
echo "Building util-linux for armv7..."
UTILLINUX_VER="2.38"
pkg="util-linux-${UTILLINUX_VER}"
cd ${pkg}
export CC="${CLANG_BIN}/armv7-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/armv7-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
./configure --prefix="${PWD}/../../out/armv7" --host=armv7-unknown-linux --disable-all-programs \
--enable-libuuid \
CFLAGS="-I${PWD}/../../out/armv7/include" \
LDFLAGS="-L${PWD}/../../out/armv7/lib" \
PKG_CONFIG_PATH="${PWD}/../../out/armv7/lib/pkgconfig/"
make -j$(nproc)
make install
cd ..
)
# 编译 Python (armv8)
(
echo "Building Python for armv8..."
PYTHON_VER="3.13.2"
pkg="Python-${PYTHON_VER}"
tar_file="${pkg}.tar.xz"
[ ! -f "${tar_file}" ] && \
wget "https://www.python.org/ftp/python/${PYTHON_VER}/${tar_file}"
tar -xf "${tar_file}"
cd ${pkg}
export CC="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/aarch64-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
# 配置
echo -e 'ac_cv_file__dev_ptmx=yes\nac_cv_file__dev_ptc=no' > config.site
CONFIG_SITE=config.site ./configure \
--host="aarch64-linux" \
--build="x86_64-linux-gnu" \
--target="aarch64-linux-gnu" \
--with-build-python="$(which python3.13)" \
--prefix="${PWD}/../../out/armv8" \
--disable-ipv6 \
CFLAGS="-I${PWD}/../../out/armv8/include" \
LDFLAGS="-L${PWD}/../../out/armv8/lib" \
PKG_CONFIG_PATH="${PWD}/../../out/armv8/lib/pkgconfig/"
# 编译并安装
make -j$(nproc)
make install
make distclean
cd ..
)
# 编译 Python (armv7)
(
echo "Building Python for armv7..."
PYTHON_VER="3.13.2"
pkg="Python-${PYTHON_VER}"
cd ${pkg}
export CC="${CLANG_BIN}/armv7-unknown-linux-ohos-clang"
export CXX="${CLANG_BIN}/armv7-unknown-linux-ohos-clang++"
export AR="${LLVM_BIN}/llvm-ar"
export RANLIB="${LLVM_BIN}/llvm-ranlib"
# 配置
echo -e 'ac_cv_file__dev_ptmx=yes\nac_cv_file__dev_ptc=no' > config.site
CONFIG_SITE=config.site ./configure \
--host="armv7-linux-gnu" \
--build="x86_64-linux-gnu" \
--prefix="${PWD}/../../out/armv7" \
--with-build-python="$(which python3.13)" \
--disable-ipv6 \
--enable-shared \
CFLAGS="-I${PWD}/../../out/armv7/include" \
LDFLAGS="-Wl,--allow-shlib-undefined -L${PWD}/../../out/armv7/lib" \
PKG_CONFIG_PATH="${PWD}/../../out/armv7/lib/pkgconfig/"
# 编译并安装
make -j$(nproc)
make install
# 清理源码
cd ..
)
echo "---------------------------------------------------------"
echo "双架构编译完成"
echo "armv8安装路径:${PWD}/../out/armv8"
echo "armv7安装路径:${PWD}/../out/armv7"
echo "临时目录已自动清理"
验证流程:
验证:
将armv8压缩包发送到板子的data目录,解压后进入bin目录下chmod+x *
添加临时环境变量 export LD_LIBRARY_PATH=/data/armv8/lib
创建简单测试用例:
cat >test.python <<EOF
import os
import time
import sys
import re
from collections import Counter
def test_os():
print("=== test lib os ===")
print(f"current path:{os.getcwd()}")
print()
def test_time():
print("=== test lib time ===")
print(f"local time:{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}")
print()
def test_collections():
print("=== test lib collections ===")
char_count = Counter("hello python")
print(f"string 'o' appear times:{char_count.get('o', 0)}")
print()
def test_re():
print("=== test lib re ===")
print(f"phone 13812345678 is legal or not:{re.match(r'^1[3-9]\\d{9}$', '13812345678') is not None}")
print()
def test_sys():
print("=== test sys ===")
print(f"Python version:{sys.version.split()[0]}")
print(f"running platform:{sys.platform}")
print()
if __name__ == "__main__":
test_os()
test_time()
test_collections()
test_re()
test_sys()
print("=== test all finished ===")
EOF
运行结果:

更多推荐

所有评论(0)