操作流程:

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

运行结果:

相关文件下载
源码.rar
78.33 MB
下载
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐