Compare commits

..

16 Commits

Author SHA1 Message Date
EricX-Zhao 12b7f933ed 将 Gitea 注册表地址从 gitea:3000 改为 localhost:3000 并新增推送镜像 workflow 2026-07-12 22:04:06 +03:00
EricX-Zhao cd816d05b6 简化构建命令,移除 -f 参数 2026-07-12 21:12:14 +03:00
EricX-Zhao 0ead87b247 移除 MAKEFLAGS 环境变量 2026-07-12 20:00:13 +03:00
EricX-Zhao 9d0eb333a9 移除冗余的 numpy 安装步骤 2026-07-12 19:54:41 +03:00
EricXZ 7e705652ee 更新 cross_compile/ros2/lyrical/ros_lyrical.Dockerfile 2026-07-13 00:38:46 +08:00
EricXZ f848464b20 更新 .github/workflows/build-images.yaml 2026-07-13 00:32:48 +08:00
EricXZ c87f936b4b 更新 .github/workflows/build-images.yaml 2026-07-12 04:12:56 +08:00
EricXZ ed866eef1b 更新 .github/workflows/build-images.yaml 2026-07-12 03:57:56 +08:00
EricXZ 53b16996d0 更新 .github/workflows/build-images.yaml 2026-07-12 03:51:13 +08:00
EricXZ 48dae96a1c 更新 .github/workflows/build-images.yaml 2026-07-12 03:40:00 +08:00
EricX-Zhao 8868ca2a35 Switch RK3576 toolchain to Buildroot SDK and migrate to Python 3.10 2026-07-11 20:29:12 +03:00
EricX-Zhao 39f628605f Switch RK3576 toolchain to Buildroot SDK and migrate to Python 3.11 2026-07-10 17:08:18 +03:00
EricX-Zhao 877c9c329d Fix ROS_ROOT variable and add RK3576 build instructions to README 2026-07-07 16:39:37 +03:00
EricX-Zhao 6efcd85e04 Refactor vendor packages Dockerfile to build numpy natively and correct package dependencies 2026-07-07 14:40:32 +03:00
EricX-Zhao ea0313a66d Add support for RK3576 platform and restructure vendor packages directory 2026-07-07 10:07:30 +03:00
EricX-Zhao 31d7fab23a Comment out NumPy include directory setting
Comment out the Python3_NumPy_INCLUDE_DIR setting.
2026-07-05 10:22:13 +03:00
62 changed files with 309 additions and 90 deletions
+46 -4
View File
@@ -34,22 +34,46 @@ jobs:
run: |
echo "PLATFORM=$PLATFORM"
echo "ROS_DISTRO=$ROS_DISTRO"
NPROC=$(nproc)
BUILD_JOBS=$(( NPROC / 2 > 0 ? NPROC / 2 : 1 ))
echo "BUILD_JOBS=$BUILD_JOBS" >> $GITHUB_ENV
# ── Stage 0: Download Buildroot SDK ────────────────────────────────
- name: Download Buildroot SDK
env:
GITEA_TOKEN: ${{ secrets.ERIC_TOKEN }}
run: |
echo "token length: ${#GITEA_TOKEN}"
cd cross_compile/${PLATFORM}
SDK_URL="http://gitea:3000/api/packages/xixing-tech/generic/${PLATFORM}-buildroot-sdk/1.0.0/aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz"
curl --fail -u "EricXZ:${GITEA_TOKEN}" -L -OJ "$SDK_URL"
ls -lh
# 或者更清晰的层级展示
find . -maxdepth 2
# ── Stage 1: cc-base ─────────────────────────────────────────────
- name: Build cc-base
run: docker compose -f cross_compile/compose.yaml build cc-base
run: |
cd cross_compile
docker compose build cc-base
# ── Stage 2: cc-toolchain ─────────────────────────────────────────
- name: Build cc-toolchain
run: docker compose -f cross_compile/compose.yaml build cc-toolchain
run: |
cd cross_compile
docker compose build cc-toolchain
# ── Stage 3: vendor-packages ──────────────────────────────────────
- name: Build vendor-packages
run: docker compose -f cross_compile/compose.yaml build vendor-packages
run: |
cd cross_compile
docker compose build vendor-packages
# ── Stage 4: ros2 ─────────────────────────────────────────────────
- name: Build ROS 2
run: docker compose -f cross_compile/compose.yaml build ros2
run: |
cd cross_compile
docker compose build ros2
# ── Summary ───────────────────────────────────────────────────────
- name: Image summary
@@ -61,3 +85,21 @@ jobs:
--filter "reference=*/cc-*" \
--format "| \`{{.Repository}}:{{.Tag}}\` | {{.Size}} |" \
>> $GITHUB_STEP_SUMMARY
# ── Stage 5: push to Gitea container registry ──────────────────
- name: Log in to Gitea Container Registry
env:
GITEA_TOKEN: ${{ secrets.ERIC_TOKEN }}
run: |
echo "${GITEA_TOKEN}" | docker login localhost:3000 -u EricXZ --password-stdin
- name: Tag image for registry
run: |
docker tag rk3576/cc-ros-lyrical:latest localhost:3000/xixing-tech/cc-ros-lyrical:${PLATFORM}-${ROS_DISTRO}-latest
# 建议同时打一个带 commit sha 的版本tag,方便追溯具体是哪次构建产物
docker tag rk3576/cc-ros-lyrical:latest localhost:3000/xixing-tech/cc-ros-lyrical:${PLATFORM}-${ROS_DISTRO}-${GITHUB_SHA::8}
- name: Push image to Gitea registry
run: |
docker push localhost:3000/xixing-tech/cc-ros-lyrical:${PLATFORM}-${ROS_DISTRO}-latest
docker push localhost:3000/xixing-tech/cc-ros-lyrical:${PLATFORM}-${ROS_DISTRO}-${GITHUB_SHA::8}
+76
View File
@@ -0,0 +1,76 @@
name: Push Cross-Compiled Image to Gitea Registry
permissions:
contents: read
on:
workflow_dispatch:
inputs:
platform:
description: "Target platform"
required: true
type: choice
options: [rk3588, rk3576]
default: rk3576
ros_distro:
description: "ROS 2 distribution"
required: true
type: choice
options: [rolling, jazzy, lyrical]
default: lyrical
jobs:
push:
runs-on: ubuntu-22.04 # 换成你实际能正常调度的label
env:
PLATFORM: ${{ inputs.platform }}
ROS_DISTRO: ${{ inputs.ros_distro }}
steps:
- name: Check local image exists
run: |
IMAGE="${PLATFORM}/cc-ros-${ROS_DISTRO}:latest"
echo "IMAGE=${IMAGE}" >> $GITHUB_ENV
if ! docker image inspect "${IMAGE}" > /dev/null 2>&1; then
echo "❌ 本地找不到镜像 ${IMAGE},请先跑构建 workflow"
exit 1
fi
echo "✅ 找到本地镜像 ${IMAGE}"
docker inspect --format='Size: {{.Size}} bytes' "${IMAGE}"
- name: Check token is set
env:
GITEA_TOKEN: ${{ secrets.ERIC_TOKEN }}
run: |
if [ -z "$GITEA_TOKEN" ]; then
echo "❌ ERIC_TOKEN 是空的,检查secret名字"
exit 1
fi
echo "✅ token长度: ${#GITEA_TOKEN}"
- name: Log in to Gitea Container Registry
env:
GITEA_TOKEN: ${{ secrets.ERIC_TOKEN }}
run: |
echo "${GITEA_TOKEN}" | docker login localhost:3000 -u EricXZ --password-stdin
- name: Tag image for registry
run: |
SHA8=$(echo "${GITHUB_SHA}" | cut -c1-8)
echo "SHA8=${SHA8}" >> $GITHUB_ENV
docker tag "${IMAGE}" "localhost:3000/xixing-tech/cc-ros-${ROS_DISTRO}:${PLATFORM}-latest"
docker tag "${IMAGE}" "localhost:3000/xixing-tech/cc-ros-${ROS_DISTRO}:${PLATFORM}-${SHA8}"
- name: Push image to Gitea registry
run: |
docker push "localhost:3000/xixing-tech/cc-ros-${ROS_DISTRO}:${PLATFORM}-latest"
docker push "localhost:3000/xixing-tech/cc-ros-${ROS_DISTRO}:${PLATFORM}-${SHA8}"
- name: Summary
if: always()
run: |
echo "### Pushed Image 🚀" >> $GITHUB_STEP_SUMMARY
echo "| tag | size |" >> $GITHUB_STEP_SUMMARY
echo "|---|---|" >> $GITHUB_STEP_SUMMARY
echo "| \`localhost:3000/xixing-tech/cc-ros-${ROS_DISTRO}:${PLATFORM}-latest\` | $(docker inspect --format='{{.Size}}' "${IMAGE}") bytes |" >> $GITHUB_STEP_SUMMARY
echo "| \`localhost:3000/xixing-tech/cc-ros-${ROS_DISTRO}:${PLATFORM}-${SHA8}\` | 同上 |" >> $GITHUB_STEP_SUMMARY
+8
View File
@@ -7,6 +7,7 @@ set -x
# ./build.sh -t RK3588 -p "depthai_examples vins_estimator" -b Release
# ./build.sh -t RK3588 -p "svo_ros" -b Release
# ./build.sh -t DESKTOP -p "ov_core ov_init ov_msckf" -b RelWithDebInfo -l 1
# ./build.sh -t RK3576 -p "mavros mavros_extras" -b Release
# export WORKSPACE="$(dirname "$(realpath "$BASH_SOURCE")")"
# export WORKSPACE="$(realpath "$BASH_SOURCE")"
@@ -83,6 +84,13 @@ if [[ "${TARGET_PLATFORM}" = "RK3588" ]]; then
export ARM_ARCHITECTURE=arm64
fi
if [[ "${TARGET_PLATFORM}" = "RK3576" ]]; then
# in rk3588_dev container
TOOLCHAIN_FILE=/opt/cmake/rk3576.toolchain.cmake
CMAKE_ARGS+=" -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE}"
export ARM_ARCHITECTURE=arm64
fi
export TARGET=${TARGET_PLATFORM}
INSTALL_DIR=${WORKSPACE}/output/${TARGET_PLATFORM}/install
+6
View File
@@ -9,6 +9,12 @@ PLATFORM=rk3588 docker compose build vendor-packages
PLATFORM=rk3588 ROS_DISTRO=rolling docker compose build ros2
PLATFORM=rk3576 docker compose build cc-toolchain
PLATFORM=rk3576 docker compose build vendor-packages
PLATFORM=rk3576 ROS_DISTRO=lyrical docker compose build ros2
# debug
DOCKER_BUILDKIT=0 PLATFORM=rk3588 ROS_DISTRO=jazzy docker compose build ros2
```
+1
View File
@@ -33,6 +33,7 @@ RUN apt update && apt install -y \
python3-pytest-runner \
python3-pytest-timeout \
python3-future \
python3-lark \
python3-argcomplete \
autoconf automake libtool patchelf ninja-build python3.10-venv \
ros-dev-tools
+3 -1
View File
@@ -13,6 +13,8 @@ services:
build:
context: . # 上下文设为根目录,这样才能同时访问 rk3588 文件夹
dockerfile: ${PLATFORM}/cc_${PLATFORM}.Dockerfile
args:
BUILD_JOBS: ${BUILD_JOBS:-6}
image: ${PLATFORM}/cc-toolchain:latest
depends_on:
- cc-base
@@ -21,7 +23,7 @@ services:
vendor-packages:
build:
context: .
dockerfile: vendor_packages/vendor_packages.Dockerfile
dockerfile: vendor/vendor_packages.Dockerfile
args:
CC_PLATFORM_IMAGE: ${PLATFORM}/cc-toolchain:latest
image: ${PLATFORM}/cc-vendor-packages:latest
+18 -6
View File
@@ -2,16 +2,28 @@ FROM cc-base:latest AS cc_rk3576
WORKDIR /opt
RUN wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz \
&& tar -xJf arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz \
&& rm /opt/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
# RUN wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz \
# && tar -xJf arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz \
# && rm /opt/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
COPY rk3576/aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz /opt/
RUN tar -zxf aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz \
&& rm /opt/aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz
COPY rk3576/rk3576.toolchain.cmake /opt/cmake/
ENV PATH="/opt/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu/bin:${PATH}"
ENV CC_TOOLCHAIN_FILE=/opt/cmake/rk3576.toolchain.cmake
ENV TARGET_SYSROOT=/opt/rk3576
ENV PATH="${PATH}:/opt/aarch64-buildroot-linux-gnu_sdk-buildroot/bin"
ENV PYTHON_PKG_PATH=${TARGET_SYSROOT}/lib/python3.10/site-packages
ENV CC=aarch64-buildroot-linux-gnu-gcc \
CXX=aarch64-buildroot-linux-gnu-g++ \
AR=aarch64-buildroot-linux-gnu-ar \
RANLIB=aarch64-buildroot-linux-gnu-ranlib \
HOSTARCH=aarch64-buildroot-linux-gnu \
BUILDARCH=x86_64-linux-gnu
WORKDIR /root
ARG BUILD_JOBS=6
ENV MAKEFLAGS="-j${BUILD_JOBS}"
+16 -18
View File
@@ -1,14 +1,5 @@
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(SYSROOT /opt/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu)
set(CMAKE_SYSROOT
${SYSROOT}/aarch64-none-linux-gnu/libc
)
set(CMAKE_C_COMPILER ${SYSROOT}/bin/aarch64-none-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${SYSROOT}/bin/aarch64-none-linux-gnu-g++)
# include buildroot toolchain file
include(/opt/aarch64-buildroot-linux-gnu_sdk-buildroot/share/buildroot/toolchainfile.cmake)
list(APPEND CMAKE_FIND_ROOT_PATH
$ENV{TARGET_SYSROOT}
@@ -20,13 +11,20 @@ list(APPEND CMAKE_FIND_ROOT_PATH
# set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG -Wno-error=unused-variable")
# set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -Wno-error=unused-variable")
# add_link_options("LINKER:-rpath-link,$ENV{TARGET_SYSROOT}/lib")
add_link_options($<$<CONFIG:Release>:-s>)
add_link_options("LINKER:-rpath-link,$ENV{TARGET_SYSROOT}/lib")
set(Python3_EXECUTABLE /usr/bin/python3)
# use buildroot sdk python3.11
set(Python3_EXECUTABLE /usr/bin/python3.10)
# set(Python3_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/include/python3.11)
# set(Python3_LIBRARY ${CMAKE_SYSROOT}/usr/lib/libpython3.11.so)
set(Python3_NumPy_INCLUDE_DIR $ENV{TARGET_SYSROOT}/lib/python3.10/site-packages/numpy/core/include)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# use cross compile packages
set(LZ4_INCLUDE_DIR $ENV{TARGET_SYSROOT}/include)
set(LZ4_LIBRARY $ENV{TARGET_SYSROOT}/lib/liblz4.so)
set(flann_DIR $ENV{TARGET_SYSROOT}/lib/cmake/flann)
set(FLANN_INCLUDE_DIR $ENV{TARGET_SYSROOT}/include)
set(FLANN_LIBRARY $ENV{TARGET_SYSROOT}/lib/libflann.so)
set(yaml-cpp_DIR $ENV{TARGET_SYSROOT}/lib/cmake/yaml-cpp)
set(OpenCV_DIR $ENV{TARGET_SYSROOT}/lib/cmake/opencv4)
+1 -1
View File
@@ -23,7 +23,7 @@ list(APPEND CMAKE_FIND_ROOT_PATH
# add_link_options("LINKER:-rpath-link,$ENV{TARGET_SYSROOT}/lib")
set(Python3_EXECUTABLE /usr/bin/python3)
set(Python3_NumPy_INCLUDE_DIR $ENV{TARGET_SYSROOT}/lib/python3.10/site-packages/numpy/core/include)
set(Python3_NumPy_INCLUDE_DIR $ENV{ROS_ROOT}/lib/python3.10/site-packages/numpy/core/include)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
@@ -13,14 +13,18 @@ RUN echo "Build ros ${ROS_DISTRO}"
FROM ${VENDOR_PACKAGES_IMAGE} AS vendor_images
FROM ${CC_PLATFORM_IMAGE} AS ros_builder
ARG ROS_DISTRO
ARG ROS_ROOT
ENV ROS_ROOT=${ROS_ROOT}
WORKDIR /workspace
COPY --from=ros_src /workspace /workspace
COPY ros2/${ROS_DISTRO}/patch /workspace/patch
COPY --from=vendor_images ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY ros2/${ROS_DISTRO}/patch /workspace/patch
COPY ros2/ros_cpp /workspace/src/ros_cpp
# COPY rk3576/rk3576.toolchain.cmake /opt/cmake/
# apply patch
RUN patch -p1 -d /workspace/src/ros2/rclcpp < /workspace/patch/memory_strategy.patch
@@ -30,7 +34,7 @@ RUN touch src/ros2/geometry2/tf2_bullet/COLCON_IGNORE \
&& touch src/diagnostics/diagnostic_remote_logging/COLCON_IGNORE
# -DPYTHON_SOABI=cpython-310-aarch64-linux-gnu
RUN MAKEFLAGS="-j6" colcon build \
RUN colcon build \
--executor parallel \
--parallel-workers 6 \
--install-base ${TARGET_SYSROOT} \
@@ -46,23 +50,9 @@ RUN MAKEFLAGS="-j6" colcon build \
-DTRACETOOLS_DISABLED=ON \
-DCV_BRIDGE_DISABLE_PYTHON=ON
# pybind11 python soabi issue
WORKDIR ${TARGET_SYSROOT}/lib/python3.10/site-packages/rclpy
RUN mv _rclpy_pybind11.cpython-310-x86_64-linux-gnu.so _rclpy_pybind11.cpython-310-aarch64-linux-gnu.so
WORKDIR ${TARGET_SYSROOT}/lib/python3.10/site-packages/rosbag2_py
RUN mv _transport.cpython-310-x86_64-linux-gnu.so _transport.cpython-310-aarch64-linux-gnu.so
RUN mv _info.cpython-310-x86_64-linux-gnu.so _info.cpython-310-aarch64-linux-gnu.so
RUN mv _compression_options.cpython-310-x86_64-linux-gnu.so _compression_options.cpython-310-aarch64-linux-gnu.so
RUN mv _storage.cpython-310-x86_64-linux-gnu.so _storage.cpython-310-aarch64-linux-gnu.so
RUN mv _reindexer.cpython-310-x86_64-linux-gnu.so _reindexer.cpython-310-aarch64-linux-gnu.so
RUN mv _writer.cpython-310-x86_64-linux-gnu.so _writer.cpython-310-aarch64-linux-gnu.so
RUN mv _message_definitions.cpython-310-x86_64-linux-gnu.so _message_definitions.cpython-310-aarch64-linux-gnu.so
RUN mv _reader.cpython-310-x86_64-linux-gnu.so _reader.cpython-310-aarch64-linux-gnu.so
WORKDIR ${TARGET_SYSROOT}/lib/python3.10/site-packages/rosidl_buffer
RUN mv _rosidl_buffer_py.cpython-310-x86_64-linux-gnu.so _rosidl_buffer_py.cpython-310-aarch64-linux-gnu.so
FROM ${CC_PLATFORM_IMAGE} AS rmw_zenoh_builder
ARG ROS_ROOT
ENV ROS_ROOT=${ROS_ROOT}
COPY --from=ros_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT}
# rust install
@@ -76,7 +66,14 @@ RUN mkdir rmw_zenoh_ws/src -p \
&& cd rmw_zenoh_ws/src \
&& git clone --depth=1 -b lyrical https://github.com/ros2/rmw_zenoh.git
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-none-linux-gnu-gcc
# --- 给 cargo/cc-rs 补上明确的区分 ---
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-buildroot-linux-gnu-gcc \
CC_aarch64_unknown_linux_gnu=aarch64-buildroot-linux-gnu-gcc \
CXX_aarch64_unknown_linux_gnu=aarch64-buildroot-linux-gnu-g++ \
AR_aarch64_unknown_linux_gnu=aarch64-buildroot-linux-gnu-ar \
HOST_CC=gcc \
HOST_CXX=g++ \
HOST_AR=ar
RUN . "$HOME/.cargo/env" \
&& . ${TARGET_SYSROOT}/local_setup.sh \
@@ -102,4 +99,21 @@ FROM ${CC_PLATFORM_IMAGE} AS final
ARG ROS_ROOT
ENV ROS_ROOT=${ROS_ROOT}
COPY --from=rmw_zenoh_builder ${TARGET_SYSROOT} ${ROS_ROOT}
WORKDIR /opt
ENV TARGET_SYSROOT=${ROS_ROOT}
# pybind11 python soabi issue
RUN cd ${ROS_ROOT}/lib/python3.10/site-packages/rclpy \
&& mv _rclpy_pybind11.cpython-310-x86_64-linux-gnu.so _rclpy_pybind11.cpython-310-aarch64-linux-gnu.so
RUN cd ${ROS_ROOT}/lib/python3.10/site-packages/rosbag2_py \
&& mv _transport.cpython-310-x86_64-linux-gnu.so _transport.cpython-310-aarch64-linux-gnu.so \
&& mv _info.cpython-310-x86_64-linux-gnu.so _info.cpython-310-aarch64-linux-gnu.so \
&& mv _compression_options.cpython-310-x86_64-linux-gnu.so _compression_options.cpython-310-aarch64-linux-gnu.so \
&& mv _storage.cpython-310-x86_64-linux-gnu.so _storage.cpython-310-aarch64-linux-gnu.so \
&& mv _reindexer.cpython-310-x86_64-linux-gnu.so _reindexer.cpython-310-aarch64-linux-gnu.so \
&& mv _writer.cpython-310-x86_64-linux-gnu.so _writer.cpython-310-aarch64-linux-gnu.so \
&& mv _message_definitions.cpython-310-x86_64-linux-gnu.so _message_definitions.cpython-310-aarch64-linux-gnu.so \
&& mv _reader.cpython-310-x86_64-linux-gnu.so _reader.cpython-310-aarch64-linux-gnu.so
RUN cd ${ROS_ROOT}/lib/python3.10/site-packages/rosidl_buffer \
&& mv _rosidl_buffer_py.cpython-310-x86_64-linux-gnu.so _rosidl_buffer_py.cpython-310-aarch64-linux-gnu.so
WORKDIR /workspace
+31
View File
@@ -0,0 +1,31 @@
#!/bin/bash
set -euo pipefail
SITE_PACKAGES="${1:?usage: extract_wheels.sh <site-packages-dir> <wheels-dir>}"
WHEELS_DIR="${2:?usage: extract_wheels.sh <site-packages-dir> <wheels-dir>}"
mkdir -p "$SITE_PACKAGES"
for f in "$WHEELS_DIR"/*; do
case "$f" in
*.whl)
python3 -m zipfile -e "$f" "$SITE_PACKAGES/"
;;
*.tar.gz|*.tar.bz2)
tmpdir=$(mktemp -d)
tar xf "$f" -C "$tmpdir"
for pkgdir in "$tmpdir"/*/; do
for inner in "$pkgdir"*/; do
if [ -f "${inner}__init__.py" ]; then
cp -r "$inner" "$SITE_PACKAGES/"
fi
done
find "$pkgdir" -maxdepth 1 -name "*.py" -exec cp {} "$SITE_PACKAGES/" \;
done
rm -rf "$tmpdir"
;;
esac
done
echo "Extraction done. Contents of $SITE_PACKAGES:"
ls "$SITE_PACKAGES"
@@ -13,7 +13,7 @@ include(FetchContent)
FetchContent_Declare(
asio_vendor
GIT_REPOSITORY https://github.com/chriskohlhoff/asio.git
GIT_TAG asio-1-36-0
GIT_TAG asio-1-28-1
GIT_SHALLOW TRUE
)
@@ -2,7 +2,7 @@ ARG CC_PLATFORM_IMAGE
FROM ${CC_PLATFORM_IMAGE} AS system_packages
COPY vendor_packages workspace/src/
COPY vendor/packages workspace/src/
RUN cd workspace \
&& colcon build \
@@ -13,18 +13,19 @@ RUN cd workspace \
--cmake-args \
--no-warn-unused-cli \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS="-Wno-error" \
-DCMAKE_CXX_FLAGS="-Wno-error" \
-DBUILD_TESTING=OFF \
-DCMAKE_TOOLCHAIN_FILE=${CC_TOOLCHAIN_FILE}
FROM ${CC_PLATFORM_IMAGE} AS ceres_vendor
COPY vendor_packages/eigen3_vendor workspace/src/eigen3_vendor
COPY vendor/packages/eigen3_vendor workspace/src/eigen3_vendor
# COPY vendor_packages/gflags_vendor workspace/src/gflags_vendor
# COPY vendor_packages/glog_vendor workspace/src/glog_vendor
# COPY vendor_packages/openblas_vendor workspace/src/openblas_vendor
# COPY vendor_packages/suitesparse_vendor workspace/src/suitesparse_vendor
COPY vendor_packages/ceres_vendor workspace/src/ceres_vendor
COPY vendor/packages/ceres_vendor workspace/src/ceres_vendor
RUN cd workspace \
&& colcon build \
@@ -40,7 +41,7 @@ RUN cd workspace \
FROM ${CC_PLATFORM_IMAGE} AS opencv_vendor
COPY vendor_packages/opencv_vendor workspace/src/opencv_vendor
COPY vendor/packages/opencv_vendor workspace/src/opencv_vendor
RUN cd workspace \
&& colcon build \
@@ -62,15 +63,15 @@ RUN wget https://archives.boost.io/release/1.83.0/source/boost_1_83_0.tar.gz
RUN tar -zxf boost_1_83_0.tar.gz \
&& cd boost_1_83_0 \
&& ./bootstrap.sh --prefix=${TARGET_SYSROOT} --without-libraries=python \
&& sed -i "/using gcc/c using gcc : arm64 : aarch64-none-linux-gnu-gcc ;" project-config.jam \
&& sed -i "/using gcc/c using gcc : arm64 : ${CC} ;" project-config.jam \
&& ./b2 cxxflags="-fPIC" cflags="-fPIC" link=static install
FROM ${CC_PLATFORM_IMAGE} AS pcl_vendor
COPY vendor_packages/eigen3_vendor workspace/src/eigen3_vendor
COPY vendor_packages/liblz4_vendor workspace/src/liblz4_vendor
COPY vendor_packages/flann_vendor workspace/src/flann_vendor
COPY vendor_packages/pcl_vendor workspace/src/pcl_vendor
COPY vendor/packages/eigen3_vendor workspace/src/eigen3_vendor
COPY vendor/packages/liblz4_vendor workspace/src/liblz4_vendor
COPY vendor/packages/flann_vendor workspace/src/flann_vendor
COPY vendor/packages/pcl_vendor workspace/src/pcl_vendor
COPY --from=boost ${TARGET_SYSROOT} ${TARGET_SYSROOT}
@@ -85,7 +86,6 @@ RUN cd workspace \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${CC_TOOLCHAIN_FILE}
# OpenSSL
FROM ${CC_PLATFORM_IMAGE} AS ssl_builder
WORKDIR /tmp
@@ -101,12 +101,22 @@ RUN git clone --depth=1 https://github.com/janbar/openssl-cmake.git \
&& make -j$(($(nproc) / 2)) && make install \
&& rm -rf /tmp
# ffi
FROM ${CC_PLATFORM_IMAGE} AS ffi_builder
RUN git clone --depth=1 https://github.com/libffi/libffi.git \
&& cd libffi \
&& ./autogen.sh \
&& ./configure --host=${HOSTARCH} --build=x86_64-linux-gnu --disable-docs --prefix=${TARGET_SYSROOT} \
&& make -j$(nproc) && make install
# Python 3.12
FROM ${CC_PLATFORM_IMAGE} AS python_builder
WORKDIR /tmp
COPY --from=ssl_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=system_packages ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=ffi_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT}
# COPY vendor_packages/Python-3.10.12.tar.xz .
RUN wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tar.xz \
@@ -115,43 +125,61 @@ RUN wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tar.xz \
# 配置和编译 Python
WORKDIR /tmp/Python-3.10.12
ENV CC=aarch64-none-linux-gnu-gcc \
CXX=aarch64-none-linux-gnu-g++ \
AR=aarch64-none-linux-gnu-ar \
RANLIB=aarch64-none-linux-gnu-ranlib \
HOSTARCH=aarch64-none-linux-gnu \
BUILDARCH=x86_64-linux-gnu
# export CC=aarch64-none-linux-gnu-gcc
# export CXX=aarch64-none-linux-gnu-g++
# export AR=aarch64-none-linux-gnu-ar
# export RANLIB=aarch64-none-linux-gnu-ranlib
# export HOSTARCH=aarch64-none-linux-gnu
# export BUILDARCH=x86_64-linux-gn
ENV CPPFLAGS="-I${TARGET_SYSROOT}/include" \
LDFLAGS="-L${TARGET_SYSROOT}/lib -Wl,-rpath-link=${TARGET_SYSROOT}/lib" \
CFLAGS="-fPIC" \
PKG_CONFIG_PATH="" \
PKG_CONFIG_LIBDIR="${TARGET_SYSROOT}/lib/pkgconfig" \
PKG_CONFIG_SYSROOT_DIR="${TARGET_SYSROOT}"
RUN CFLAGS="-fPIC" LDFLAGS="-fPIC" ./configure \
--host=aarch64-none-linux-gnu \
RUN ./configure \
--host=${HOSTARCH} \
--build=x86_64-linux-gnu \
--prefix=${TARGET_SYSROOT} \
--with-build-python=python3.10 \
--disable-ipv6 \
--enable-optimizations \
--with-openssl=${TARGET_SYSROOT} \
ac_cv_file__dev_ptmx=yes \
ac_cv_file__dev_ptc=yes \
&& make -j$(($(nproc) / 2)) && make install
&& make -j$(($(nproc) / 2)) \
&& make install
# https://github.com/benfogle/crossenv
# cross compile python packages
WORKDIR /tmp
# /opt/python3.10/venv/build/bin/pip install 'setuptools==68.2.2' wheel
RUN python3 -m pip install crossenv \
&& python3 -m crossenv ${TARGET_SYSROOT}/bin/python3 venv \
&& . venv/bin/activate \
&& pip -v install numpy==1.21.5 lark==1.1.1 packaging typing-extensions --prefix=${TARGET_SYSROOT} \
&& ./venv/build/bin/pip install 'setuptools==68.2.2' wheel \
&& pip -v install empy==3.3.4 pyyaml psutil argcomplete --prefix=${TARGET_SYSROOT}
FROM ${CC_PLATFORM_IMAGE} AS python_pkg_builder
WORKDIR /tmp
COPY vendor/extract_wheels.sh /tmp/extract_wheels.sh
# python packages
RUN pip download --no-deps -d /wheels \
empy==3.3.4 \
lark \
pyyaml \
catkin_pkg \
setuptools \
packaging \
pyparsing \
argcomplete \
osrf-pycommon \
typing-extensions \
rosdistro
# python packages with c extension
RUN pip download \
--no-deps \
--only-binary=:all: \
--python-version 310 \
--implementation cp \
--abi cp310 \
--platform manylinux2014_aarch64 \
-d /wheels \
psutil numpy==1.21.5
RUN chmod +x /tmp/extract_wheels.sh && \
/tmp/extract_wheels.sh "${PYTHON_PKG_PATH}" /wheels
FROM ${CC_PLATFORM_IMAGE} AS final
@@ -160,3 +188,4 @@ COPY --from=ceres_vendor ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=opencv_vendor ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=pcl_vendor ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=python_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=python_pkg_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT}