Compare commits

..

14 Commits

9 changed files with 207 additions and 70 deletions
+46 -4
View File
@@ -34,22 +34,46 @@ jobs:
run: | run: |
echo "PLATFORM=$PLATFORM" echo "PLATFORM=$PLATFORM"
echo "ROS_DISTRO=$ROS_DISTRO" 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 ───────────────────────────────────────────── # ── Stage 1: cc-base ─────────────────────────────────────────────
- name: Build 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 ───────────────────────────────────────── # ── Stage 2: cc-toolchain ─────────────────────────────────────────
- name: Build 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 ────────────────────────────────────── # ── Stage 3: vendor-packages ──────────────────────────────────────
- name: Build 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 ───────────────────────────────────────────────── # ── Stage 4: ros2 ─────────────────────────────────────────────────
- name: Build ROS 2 - name: Build ROS 2
run: docker compose -f cross_compile/compose.yaml build ros2 run: |
cd cross_compile
docker compose build ros2
# ── Summary ─────────────────────────────────────────────────────── # ── Summary ───────────────────────────────────────────────────────
- name: Image summary - name: Image summary
@@ -61,3 +85,21 @@ jobs:
--filter "reference=*/cc-*" \ --filter "reference=*/cc-*" \
--format "| \`{{.Repository}}:{{.Tag}}\` | {{.Size}} |" \ --format "| \`{{.Repository}}:{{.Tag}}\` | {{.Size}} |" \
>> $GITHUB_STEP_SUMMARY >> $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
+6
View File
@@ -9,6 +9,12 @@ PLATFORM=rk3588 docker compose build vendor-packages
PLATFORM=rk3588 ROS_DISTRO=rolling docker compose build ros2 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 # debug
DOCKER_BUILDKIT=0 PLATFORM=rk3588 ROS_DISTRO=jazzy docker compose build ros2 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-runner \
python3-pytest-timeout \ python3-pytest-timeout \
python3-future \ python3-future \
python3-lark \
python3-argcomplete \ python3-argcomplete \
autoconf automake libtool patchelf ninja-build python3.10-venv \ autoconf automake libtool patchelf ninja-build python3.10-venv \
ros-dev-tools ros-dev-tools
+2
View File
@@ -13,6 +13,8 @@ services:
build: build:
context: . # 上下文设为根目录,这样才能同时访问 rk3588 文件夹 context: . # 上下文设为根目录,这样才能同时访问 rk3588 文件夹
dockerfile: ${PLATFORM}/cc_${PLATFORM}.Dockerfile dockerfile: ${PLATFORM}/cc_${PLATFORM}.Dockerfile
args:
BUILD_JOBS: ${BUILD_JOBS:-6}
image: ${PLATFORM}/cc-toolchain:latest image: ${PLATFORM}/cc-toolchain:latest
depends_on: depends_on:
- cc-base - cc-base
+18 -6
View File
@@ -2,16 +2,28 @@ FROM cc-base:latest AS cc_rk3576
WORKDIR /opt 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 \ # 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 \ # && 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 # && 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/ 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 CC_TOOLCHAIN_FILE=/opt/cmake/rk3576.toolchain.cmake
ENV TARGET_SYSROOT=/opt/rk3576 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}"
+17 -19
View File
@@ -1,14 +1,5 @@
set(CMAKE_SYSTEM_NAME Linux) # include buildroot toolchain file
set(CMAKE_SYSTEM_PROCESSOR aarch64) include(/opt/aarch64-buildroot-linux-gnu_sdk-buildroot/share/buildroot/toolchainfile.cmake)
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++)
list(APPEND CMAKE_FIND_ROOT_PATH list(APPEND CMAKE_FIND_ROOT_PATH
$ENV{TARGET_SYSROOT} $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_C_FLAGS_RELEASE "-O3 -DNDEBUG -Wno-error=unused-variable")
# set(CMAKE_CXX_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_NumPy_INCLUDE_DIR $ENV{ROS_ROOT}/lib/python3.10/site-packages/numpy/core/include) set(Python3_EXECUTABLE /usr/bin/python3.10)
# set(Python3_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/include/python3.11)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # set(Python3_LIBRARY ${CMAKE_SYSROOT}/usr/lib/libpython3.11.so)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(Python3_NumPy_INCLUDE_DIR $ENV{TARGET_SYSROOT}/lib/python3.10/site-packages/numpy/core/include)
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)
@@ -23,6 +23,8 @@ COPY --from=vendor_images ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY ros2/${ROS_DISTRO}/patch /workspace/patch COPY ros2/${ROS_DISTRO}/patch /workspace/patch
COPY ros2/ros_cpp /workspace/src/ros_cpp COPY ros2/ros_cpp /workspace/src/ros_cpp
# COPY rk3576/rk3576.toolchain.cmake /opt/cmake/
# apply patch # apply patch
RUN patch -p1 -d /workspace/src/ros2/rclcpp < /workspace/patch/memory_strategy.patch RUN patch -p1 -d /workspace/src/ros2/rclcpp < /workspace/patch/memory_strategy.patch
@@ -32,7 +34,7 @@ RUN touch src/ros2/geometry2/tf2_bullet/COLCON_IGNORE \
&& touch src/diagnostics/diagnostic_remote_logging/COLCON_IGNORE && touch src/diagnostics/diagnostic_remote_logging/COLCON_IGNORE
# -DPYTHON_SOABI=cpython-310-aarch64-linux-gnu # -DPYTHON_SOABI=cpython-310-aarch64-linux-gnu
RUN MAKEFLAGS="-j6" ROS_ROOT=/opt/rk3576 colcon build \ RUN colcon build \
--executor parallel \ --executor parallel \
--parallel-workers 6 \ --parallel-workers 6 \
--install-base ${TARGET_SYSROOT} \ --install-base ${TARGET_SYSROOT} \
@@ -46,24 +48,7 @@ RUN MAKEFLAGS="-j6" ROS_ROOT=/opt/rk3576 colcon build \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DBUILD_TESTING=OFF \ -DBUILD_TESTING=OFF \
-DTRACETOOLS_DISABLED=ON \ -DTRACETOOLS_DISABLED=ON \
-DCV_BRIDGE_DISABLE_PYTHON=ON \ -DCV_BRIDGE_DISABLE_PYTHON=ON
-DPython3_NumPy_INCLUDE_DI=/opt/rk3576/lib/python3.10/site-packages/numpy/core/include \
-DPYTHON_SOABI=cpython-310-aarch64-linux-gnu
# 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 FROM ${CC_PLATFORM_IMAGE} AS rmw_zenoh_builder
ARG ROS_ROOT ARG ROS_ROOT
@@ -81,7 +66,14 @@ RUN mkdir rmw_zenoh_ws/src -p \
&& cd rmw_zenoh_ws/src \ && cd rmw_zenoh_ws/src \
&& git clone --depth=1 -b lyrical https://github.com/ros2/rmw_zenoh.git && 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" \ RUN . "$HOME/.cargo/env" \
&& . ${TARGET_SYSROOT}/local_setup.sh \ && . ${TARGET_SYSROOT}/local_setup.sh \
@@ -108,4 +100,20 @@ ARG ROS_ROOT
ENV ROS_ROOT=${ROS_ROOT} ENV ROS_ROOT=${ROS_ROOT}
COPY --from=rmw_zenoh_builder ${TARGET_SYSROOT} ${ROS_ROOT} COPY --from=rmw_zenoh_builder ${TARGET_SYSROOT} ${ROS_ROOT}
ENV TARGET_SYSROOT=${ROS_ROOT} 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 WORKDIR /workspace
+11 -19
View File
@@ -13,6 +13,8 @@ RUN cd workspace \
--cmake-args \ --cmake-args \
--no-warn-unused-cli \ --no-warn-unused-cli \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS="-Wno-error" \
-DCMAKE_CXX_FLAGS="-Wno-error" \
-DBUILD_TESTING=OFF \ -DBUILD_TESTING=OFF \
-DCMAKE_TOOLCHAIN_FILE=${CC_TOOLCHAIN_FILE} -DCMAKE_TOOLCHAIN_FILE=${CC_TOOLCHAIN_FILE}
@@ -61,7 +63,7 @@ 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 \ RUN tar -zxf boost_1_83_0.tar.gz \
&& cd boost_1_83_0 \ && cd boost_1_83_0 \
&& ./bootstrap.sh --prefix=${TARGET_SYSROOT} --without-libraries=python \ && ./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 && ./b2 cxxflags="-fPIC" cflags="-fPIC" link=static install
FROM ${CC_PLATFORM_IMAGE} AS pcl_vendor FROM ${CC_PLATFORM_IMAGE} AS pcl_vendor
@@ -84,7 +86,6 @@ RUN cd workspace \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${CC_TOOLCHAIN_FILE} -DCMAKE_TOOLCHAIN_FILE=${CC_TOOLCHAIN_FILE}
# OpenSSL # OpenSSL
FROM ${CC_PLATFORM_IMAGE} AS ssl_builder FROM ${CC_PLATFORM_IMAGE} AS ssl_builder
WORKDIR /tmp WORKDIR /tmp
@@ -105,7 +106,7 @@ FROM ${CC_PLATFORM_IMAGE} AS ffi_builder
RUN git clone --depth=1 https://github.com/libffi/libffi.git \ RUN git clone --depth=1 https://github.com/libffi/libffi.git \
&& cd libffi \ && cd libffi \
&& ./autogen.sh \ && ./autogen.sh \
&& ./configure --host=aarch64-none-linux-gnu --build=x86_64-linux-gnu --disable-docs --prefix=${TARGET_SYSROOT} \ && ./configure --host=${HOSTARCH} --build=x86_64-linux-gnu --disable-docs --prefix=${TARGET_SYSROOT} \
&& make -j$(nproc) && make install && make -j$(nproc) && make install
# Python 3.12 # Python 3.12
@@ -124,12 +125,6 @@ RUN wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tar.xz \
# 配置和编译 Python # 配置和编译 Python
WORKDIR /tmp/Python-3.10.12 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
ENV CPPFLAGS="-I${TARGET_SYSROOT}/include" \ ENV CPPFLAGS="-I${TARGET_SYSROOT}/include" \
LDFLAGS="-L${TARGET_SYSROOT}/lib -Wl,-rpath-link=${TARGET_SYSROOT}/lib" \ LDFLAGS="-L${TARGET_SYSROOT}/lib -Wl,-rpath-link=${TARGET_SYSROOT}/lib" \
@@ -139,10 +134,9 @@ ENV CPPFLAGS="-I${TARGET_SYSROOT}/include" \
PKG_CONFIG_SYSROOT_DIR="${TARGET_SYSROOT}" PKG_CONFIG_SYSROOT_DIR="${TARGET_SYSROOT}"
RUN ./configure \ RUN ./configure \
--host=aarch64-none-linux-gnu \ --host=${HOSTARCH} \
--build=x86_64-linux-gnu \ --build=x86_64-linux-gnu \
--prefix=${TARGET_SYSROOT} \ --prefix=${TARGET_SYSROOT} \
--enable-shared \
--disable-ipv6 \ --disable-ipv6 \
--enable-optimizations \ --enable-optimizations \
--with-openssl=${TARGET_SYSROOT} \ --with-openssl=${TARGET_SYSROOT} \
@@ -153,6 +147,8 @@ RUN ./configure \
# https://github.com/benfogle/crossenv # https://github.com/benfogle/crossenv
# cross compile python packages # cross compile python packages
FROM ${CC_PLATFORM_IMAGE} AS python_pkg_builder
WORKDIR /tmp WORKDIR /tmp
COPY vendor/extract_wheels.sh /tmp/extract_wheels.sh COPY vendor/extract_wheels.sh /tmp/extract_wheels.sh
@@ -169,7 +165,7 @@ RUN pip download --no-deps -d /wheels \
argcomplete \ argcomplete \
osrf-pycommon \ osrf-pycommon \
typing-extensions \ typing-extensions \
psutil rosdistro
# python packages with c extension # python packages with c extension
RUN pip download \ RUN pip download \
@@ -180,15 +176,10 @@ RUN pip download \
--abi cp310 \ --abi cp310 \
--platform manylinux2014_aarch64 \ --platform manylinux2014_aarch64 \
-d /wheels \ -d /wheels \
psutil psutil numpy==1.21.5
RUN chmod +x /tmp/extract_wheels.sh && \ RUN chmod +x /tmp/extract_wheels.sh && \
/tmp/extract_wheels.sh "${TARGET_SYSROOT}/lib/python3.10/site-packages" /wheels /tmp/extract_wheels.sh "${PYTHON_PKG_PATH}" /wheels
RUN python3 -m pip install crossenv \
&& python3 -m crossenv ${TARGET_SYSROOT}/bin/python3 venv \
&& . venv/bin/activate \
&& pip -v install numpy==1.21.5 --prefix=${TARGET_SYSROOT}
FROM ${CC_PLATFORM_IMAGE} AS final FROM ${CC_PLATFORM_IMAGE} AS final
@@ -197,3 +188,4 @@ COPY --from=ceres_vendor ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=opencv_vendor ${TARGET_SYSROOT} ${TARGET_SYSROOT} COPY --from=opencv_vendor ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=pcl_vendor ${TARGET_SYSROOT} ${TARGET_SYSROOT} COPY --from=pcl_vendor ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=python_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT} COPY --from=python_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT}
COPY --from=python_pkg_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT}