Compare commits

..

22 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
EricX-Zhao e1bd9618bd Add comment for Python SOABI in Dockerfile 2026-06-26 18:15:56 +03:00
EricX-Zhao ac9963449d Add support for rk3576 platform: update input options and add toolchain files 2026-06-26 18:00:45 +03:00
EricXZ c20818c692 更新 .github/workflows/build-images.yaml 2026-06-25 22:02:31 +08:00
EricXZ 9d73c4ea55 更新 .github/workflows/build-images.yaml 2026-06-25 22:00:43 +08:00
EricXZ f1fbd08fea 更新 .github/workflows/build-images.yaml 2026-06-25 21:49:15 +08:00
EricXZ d2a030f5d0 更新 .github/workflows/build-images.yaml 2026-06-25 21:38:12 +08:00
62 changed files with 340 additions and 246 deletions
+53 -186
View File
@@ -2,7 +2,6 @@ name: Build Cross-Compiled ROS 2 Images
permissions: permissions:
contents: read contents: read
packages: write
on: on:
workflow_dispatch: workflow_dispatch:
@@ -11,220 +10,70 @@ on:
description: "Target platform" description: "Target platform"
required: true required: true
type: choice type: choice
options: [rk3588] options: [rk3588, rk3576]
default: rk3588 default: rk3576
ros_distro: ros_distro:
description: "ROS 2 distribution" description: "ROS 2 distribution"
required: true required: true
type: choice type: choice
options: [rolling, jazzy, lyrical] options: [rolling, jazzy, lyrical]
default: lyrical default: lyrical
push_images:
description: "Push built images to registry"
required: false
type: boolean
default: false
env:
REGISTRY: ghcr.io
jobs: jobs:
build: build:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
strategy: env:
matrix: PLATFORM: ${{ inputs.platform }}
platform: ${{ fromJSON(format('["{0}"]', inputs.platform)) }} ROS_DISTRO: ${{ inputs.ros_distro }}
ros_distro: ${{ fromJSON(format('["{0}"]', inputs.ros_distro)) }}
fail-fast: false
steps: steps:
- name: Set image namespace and tag
run: |
echo "IMAGE_NAMESPACE=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV
echo "IMAGE_TAG=$(date +%Y%m%d)" >> $GITHUB_ENV
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up Docker Buildx - name: Debug inputs
uses: docker/setup-buildx-action@v3
with:
driver: docker
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# ── Compute cache keys ────────────────────────────────────────────
# Each key = hash(own files) + upstream key, so any upstream change
# transitively invalidates all downstream stages.
- name: Compute cache keys
id: keys
run: | run: |
CC_BASE_KEY=$(sha256sum cross_compile/cc_base.Dockerfile | cut -d' ' -f1) echo "PLATFORM=$PLATFORM"
echo "ROS_DISTRO=$ROS_DISTRO"
CC_TOOLCHAIN_FILES=$(find cross_compile/${{ matrix.platform }} -type f | sort | xargs sha256sum | sha256sum | cut -d' ' -f1) NPROC=$(nproc)
CC_TOOLCHAIN_KEY=$(echo "$CC_TOOLCHAIN_FILES $CC_BASE_KEY" | sha256sum | cut -d' ' -f1) BUILD_JOBS=$(( NPROC / 2 > 0 ? NPROC / 2 : 1 ))
echo "BUILD_JOBS=$BUILD_JOBS" >> $GITHUB_ENV
VENDOR_FILES=$(find cross_compile/vendor_packages -type f | sort | xargs sha256sum | sha256sum | cut -d' ' -f1)
VENDOR_KEY=$(echo "$VENDOR_FILES $CC_TOOLCHAIN_KEY" | sha256sum | cut -d' ' -f1) # ── Stage 0: Download Buildroot SDK ────────────────────────────────
- name: Download Buildroot SDK
ROS2_FILES=$(find cross_compile/ros2/${{ matrix.ros_distro }} cross_compile/ros2/ros_cpp -type f | sort | xargs sha256sum | sha256sum | cut -d' ' -f1) env:
ROS2_KEY=$(echo "$ROS2_FILES $VENDOR_KEY" | sha256sum | cut -d' ' -f1) GITEA_TOKEN: ${{ secrets.ERIC_TOKEN }}
run: |
echo "cc_base=$CC_BASE_KEY" >> $GITHUB_OUTPUT echo "token length: ${#GITEA_TOKEN}"
echo "cc_toolchain=$CC_TOOLCHAIN_KEY" >> $GITHUB_OUTPUT cd cross_compile/${PLATFORM}
echo "vendor=$VENDOR_KEY" >> $GITHUB_OUTPUT SDK_URL="http://gitea:3000/api/packages/xixing-tech/generic/${PLATFORM}-buildroot-sdk/1.0.0/aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz"
echo "ros2=$ROS2_KEY" >> $GITHUB_OUTPUT curl --fail -u "EricXZ:${GITEA_TOKEN}" -L -OJ "$SDK_URL"
ls -lh
# 或者更清晰的层级展示
find . -maxdepth 2
# ── Stage 1: cc-base ───────────────────────────────────────────── # ── Stage 1: cc-base ─────────────────────────────────────────────
- name: Check cc-base cache
id: cc-base
run: |
EXPECTED="${{ steps.keys.outputs.cc_base }}"
if docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/cc-base:latest 2>/dev/null; then
docker tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/cc-base:latest cc-base:latest
CACHED=$(docker inspect cc-base:latest --format '{{ index .Config.Labels "cache.key" }}' 2>/dev/null || echo "")
[ "$CACHED" = "$EXPECTED" ] && echo "hit=true" >> $GITHUB_OUTPUT || echo "hit=false" >> $GITHUB_OUTPUT
else
echo "hit=false" >> $GITHUB_OUTPUT
fi
- name: Build cc-base - name: Build cc-base
if: steps.cc-base.outputs.hit != 'true'
run: | run: |
docker compose -f cross_compile/compose.yaml build cc-base cd cross_compile
TMPDIR=$(mktemp -d) docker compose build cc-base
docker build \
--label "cache.key=${{ steps.keys.outputs.cc_base }}" \
-t cc-base:latest -f - "$TMPDIR" << 'EOF'
FROM cc-base:latest
EOF
rm -rf "$TMPDIR"
- name: Push cc-base
if: inputs.push_images
run: |
docker tag cc-base:latest \
${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/cc-base:${{ env.IMAGE_TAG }}
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/cc-base:${{ env.IMAGE_TAG }}
docker tag cc-base:latest \
${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/cc-base:latest
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/cc-base:latest
# ── Stage 2: cc-toolchain ───────────────────────────────────────── # ── Stage 2: cc-toolchain ─────────────────────────────────────────
- name: Check cc-toolchain cache - name: Build cc-toolchain
id: cc-toolchain
run: | run: |
EXPECTED="${{ steps.keys.outputs.cc_toolchain }}" cd cross_compile
REMOTE="${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-toolchain:latest" docker compose build cc-toolchain
LOCAL="${{ matrix.platform }}/cc-toolchain:latest"
if docker pull "$REMOTE" 2>/dev/null; then
docker tag "$REMOTE" "$LOCAL"
CACHED=$(docker inspect "$LOCAL" --format '{{ index .Config.Labels "cache.key" }}' 2>/dev/null || echo "")
[ "$CACHED" = "$EXPECTED" ] && echo "hit=true" >> $GITHUB_OUTPUT || echo "hit=false" >> $GITHUB_OUTPUT
else
echo "hit=false" >> $GITHUB_OUTPUT
fi
- name: Build cc-toolchain (${{ matrix.platform }})
if: steps.cc-toolchain.outputs.hit != 'true'
run: |
PLATFORM=${{ matrix.platform }} docker compose -f cross_compile/compose.yaml build cc-toolchain
TMPDIR=$(mktemp -d)
docker build \
--label "cache.key=${{ steps.keys.outputs.cc_toolchain }}" \
-t ${{ matrix.platform }}/cc-toolchain:latest -f - "$TMPDIR" << 'EOF'
FROM ${{ matrix.platform }}/cc-toolchain:latest
EOF
rm -rf "$TMPDIR"
- name: Push cc-toolchain
if: inputs.push_images
run: |
docker tag ${{ matrix.platform }}/cc-toolchain:latest \
${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-toolchain:${{ env.IMAGE_TAG }}
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-toolchain:${{ env.IMAGE_TAG }}
docker tag ${{ matrix.platform }}/cc-toolchain:latest \
${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-toolchain:latest
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-toolchain:latest
# ── Stage 3: vendor-packages ────────────────────────────────────── # ── Stage 3: vendor-packages ──────────────────────────────────────
- name: Check vendor-packages cache - name: Build vendor-packages
id: vendor
run: | run: |
EXPECTED="${{ steps.keys.outputs.vendor }}" cd cross_compile
REMOTE="${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-vendor-packages:latest" docker compose build vendor-packages
LOCAL="${{ matrix.platform }}/cc-vendor-packages:latest"
if docker pull "$REMOTE" 2>/dev/null; then
docker tag "$REMOTE" "$LOCAL"
CACHED=$(docker inspect "$LOCAL" --format '{{ index .Config.Labels "cache.key" }}' 2>/dev/null || echo "")
[ "$CACHED" = "$EXPECTED" ] && echo "hit=true" >> $GITHUB_OUTPUT || echo "hit=false" >> $GITHUB_OUTPUT
else
echo "hit=false" >> $GITHUB_OUTPUT
fi
- name: Build vendor-packages (${{ matrix.platform }})
if: steps.vendor.outputs.hit != 'true'
run: |
PLATFORM=${{ matrix.platform }} docker compose -f cross_compile/compose.yaml build vendor-packages
TMPDIR=$(mktemp -d)
docker build \
--label "cache.key=${{ steps.keys.outputs.vendor }}" \
-t ${{ matrix.platform }}/cc-vendor-packages:latest -f - "$TMPDIR" << 'EOF'
FROM ${{ matrix.platform }}/cc-vendor-packages:latest
EOF
rm -rf "$TMPDIR"
- name: Push vendor-packages
if: inputs.push_images
run: |
docker tag ${{ matrix.platform }}/cc-vendor-packages:latest \
${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-vendor-packages:${{ env.IMAGE_TAG }}
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-vendor-packages:${{ env.IMAGE_TAG }}
docker tag ${{ matrix.platform }}/cc-vendor-packages:latest \
${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-vendor-packages:latest
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-vendor-packages:latest
# ── Stage 4: ros2 ───────────────────────────────────────────────── # ── Stage 4: ros2 ─────────────────────────────────────────────────
- name: Check ros2 cache - name: Build ROS 2
id: ros2
run: | run: |
EXPECTED="${{ steps.keys.outputs.ros2 }}" cd cross_compile
REMOTE="${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:latest" docker compose build ros2
LOCAL="${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:latest"
if docker pull "$REMOTE" 2>/dev/null; then
docker tag "$REMOTE" "$LOCAL"
CACHED=$(docker inspect "$LOCAL" --format '{{ index .Config.Labels "cache.key" }}' 2>/dev/null || echo "")
[ "$CACHED" = "$EXPECTED" ] && echo "hit=true" >> $GITHUB_OUTPUT || echo "hit=false" >> $GITHUB_OUTPUT
else
echo "hit=false" >> $GITHUB_OUTPUT
fi
- name: Build ROS 2 (${{ matrix.ros_distro }})
if: steps.ros2.outputs.hit != 'true'
run: |
PLATFORM=${{ matrix.platform }} ROS_DISTRO=${{ matrix.ros_distro }} docker compose -f cross_compile/compose.yaml build ros2
TMPDIR=$(mktemp -d)
docker build \
--label "cache.key=${{ steps.keys.outputs.ros2 }}" \
-t ${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:latest -f - "$TMPDIR" << 'EOF'
FROM ${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:latest
EOF
rm -rf "$TMPDIR"
- name: Push ROS 2 image
if: inputs.push_images
run: |
docker tag ${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:latest \
${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:${{ env.IMAGE_TAG }}
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:${{ env.IMAGE_TAG }}
docker tag ${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:latest \
${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:latest
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:latest
# ── Summary ─────────────────────────────────────────────────────── # ── Summary ───────────────────────────────────────────────────────
- name: Image summary - name: Image summary
@@ -236,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
+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 "depthai_examples vins_estimator" -b Release
# ./build.sh -t RK3588 -p "svo_ros" -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 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="$(dirname "$(realpath "$BASH_SOURCE")")"
# export WORKSPACE="$(realpath "$BASH_SOURCE")" # export WORKSPACE="$(realpath "$BASH_SOURCE")"
@@ -83,6 +84,13 @@ if [[ "${TARGET_PLATFORM}" = "RK3588" ]]; then
export ARM_ARCHITECTURE=arm64 export ARM_ARCHITECTURE=arm64
fi 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} export TARGET=${TARGET_PLATFORM}
INSTALL_DIR=${WORKSPACE}/output/${TARGET_PLATFORM}/install 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=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
+3 -1
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
@@ -21,7 +23,7 @@ services:
vendor-packages: vendor-packages:
build: build:
context: . context: .
dockerfile: vendor_packages/vendor_packages.Dockerfile dockerfile: vendor/vendor_packages.Dockerfile
args: args:
CC_PLATFORM_IMAGE: ${PLATFORM}/cc-toolchain:latest CC_PLATFORM_IMAGE: ${PLATFORM}/cc-toolchain:latest
image: ${PLATFORM}/cc-vendor-packages:latest image: ${PLATFORM}/cc-vendor-packages:latest
+29
View File
@@ -0,0 +1,29 @@
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
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 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
ARG BUILD_JOBS=6
ENV MAKEFLAGS="-j${BUILD_JOBS}"
@@ -0,0 +1,30 @@
# 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}
$ENV{ROS_ROOT}
${CMAKE_INSTALL_PREFIX}
)
# Set compile flags which are overwritter by android.toolchain.cmake
# 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($<$<CONFIG:Release>:-s>)
add_link_options("LINKER:-rpath-link,$ENV{TARGET_SYSROOT}/lib")
# 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)
# 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") # add_link_options("LINKER:-rpath-link,$ENV{TARGET_SYSROOT}/lib")
set(Python3_EXECUTABLE /usr/bin/python3) 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_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 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 ${VENDOR_PACKAGES_IMAGE} AS vendor_images
FROM ${CC_PLATFORM_IMAGE} AS ros_builder FROM ${CC_PLATFORM_IMAGE} AS ros_builder
ARG ROS_DISTRO ARG ROS_DISTRO
ARG ROS_ROOT
ENV ROS_ROOT=${ROS_ROOT}
WORKDIR /workspace WORKDIR /workspace
COPY --from=ros_src /workspace /workspace COPY --from=ros_src /workspace /workspace
COPY ros2/${ROS_DISTRO}/patch /workspace/patch
COPY --from=vendor_images ${TARGET_SYSROOT} ${TARGET_SYSROOT} COPY --from=vendor_images ${TARGET_SYSROOT} ${TARGET_SYSROOT}
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
@@ -29,7 +33,8 @@ RUN touch src/ros2/geometry2/tf2_bullet/COLCON_IGNORE \
&& touch src/ros-perception/image_transport_plugins/theora_image_transport/COLCON_IGNORE \ && touch src/ros-perception/image_transport_plugins/theora_image_transport/COLCON_IGNORE \
&& touch src/diagnostics/diagnostic_remote_logging/COLCON_IGNORE && touch src/diagnostics/diagnostic_remote_logging/COLCON_IGNORE
RUN MAKEFLAGS="-j6" colcon build \ # -DPYTHON_SOABI=cpython-310-aarch64-linux-gnu
RUN colcon build \
--executor parallel \ --executor parallel \
--parallel-workers 6 \ --parallel-workers 6 \
--install-base ${TARGET_SYSROOT} \ --install-base ${TARGET_SYSROOT} \
@@ -45,23 +50,9 @@ RUN MAKEFLAGS="-j6" colcon build \
-DTRACETOOLS_DISABLED=ON \ -DTRACETOOLS_DISABLED=ON \
-DCV_BRIDGE_DISABLE_PYTHON=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 FROM ${CC_PLATFORM_IMAGE} AS rmw_zenoh_builder
ARG ROS_ROOT
ENV ROS_ROOT=${ROS_ROOT}
COPY --from=ros_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT} COPY --from=ros_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT}
# rust install # rust install
@@ -75,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 \
@@ -101,4 +99,21 @@ FROM ${CC_PLATFORM_IMAGE} AS final
ARG ROS_ROOT 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}
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( FetchContent_Declare(
asio_vendor asio_vendor
GIT_REPOSITORY https://github.com/chriskohlhoff/asio.git GIT_REPOSITORY https://github.com/chriskohlhoff/asio.git
GIT_TAG asio-1-36-0 GIT_TAG asio-1-28-1
GIT_SHALLOW TRUE GIT_SHALLOW TRUE
) )
@@ -2,7 +2,7 @@ ARG CC_PLATFORM_IMAGE
FROM ${CC_PLATFORM_IMAGE} AS system_packages FROM ${CC_PLATFORM_IMAGE} AS system_packages
COPY vendor_packages workspace/src/ COPY vendor/packages workspace/src/
RUN cd workspace \ RUN cd workspace \
&& colcon build \ && colcon build \
@@ -13,18 +13,19 @@ 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}
FROM ${CC_PLATFORM_IMAGE} AS ceres_vendor 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/gflags_vendor workspace/src/gflags_vendor
# COPY vendor_packages/glog_vendor workspace/src/glog_vendor # COPY vendor_packages/glog_vendor workspace/src/glog_vendor
# COPY vendor_packages/openblas_vendor workspace/src/openblas_vendor # COPY vendor_packages/openblas_vendor workspace/src/openblas_vendor
# COPY vendor_packages/suitesparse_vendor workspace/src/suitesparse_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 \ RUN cd workspace \
&& colcon build \ && colcon build \
@@ -40,7 +41,7 @@ RUN cd workspace \
FROM ${CC_PLATFORM_IMAGE} AS opencv_vendor 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 \ RUN cd workspace \
&& colcon build \ && 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 \ 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
COPY vendor_packages/eigen3_vendor workspace/src/eigen3_vendor COPY vendor/packages/eigen3_vendor workspace/src/eigen3_vendor
COPY vendor_packages/liblz4_vendor workspace/src/liblz4_vendor COPY vendor/packages/liblz4_vendor workspace/src/liblz4_vendor
COPY vendor_packages/flann_vendor workspace/src/flann_vendor COPY vendor/packages/flann_vendor workspace/src/flann_vendor
COPY vendor_packages/pcl_vendor workspace/src/pcl_vendor COPY vendor/packages/pcl_vendor workspace/src/pcl_vendor
COPY --from=boost ${TARGET_SYSROOT} ${TARGET_SYSROOT} COPY --from=boost ${TARGET_SYSROOT} ${TARGET_SYSROOT}
@@ -85,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
@@ -101,12 +101,22 @@ RUN git clone --depth=1 https://github.com/janbar/openssl-cmake.git \
&& make -j$(($(nproc) / 2)) && make install \ && make -j$(($(nproc) / 2)) && make install \
&& rm -rf /tmp && 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 # Python 3.12
FROM ${CC_PLATFORM_IMAGE} AS python_builder FROM ${CC_PLATFORM_IMAGE} AS python_builder
WORKDIR /tmp WORKDIR /tmp
COPY --from=ssl_builder ${TARGET_SYSROOT} ${TARGET_SYSROOT} 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 . # 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 \ 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 # 配置和编译 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
# 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
RUN CFLAGS="-fPIC" LDFLAGS="-fPIC" ./configure \ ENV CPPFLAGS="-I${TARGET_SYSROOT}/include" \
--host=aarch64-none-linux-gnu \ 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 ./configure \
--host=${HOSTARCH} \
--build=x86_64-linux-gnu \ --build=x86_64-linux-gnu \
--prefix=${TARGET_SYSROOT} \ --prefix=${TARGET_SYSROOT} \
--with-build-python=python3.10 \
--disable-ipv6 \ --disable-ipv6 \
--enable-optimizations \ --enable-optimizations \
--with-openssl=${TARGET_SYSROOT} \ --with-openssl=${TARGET_SYSROOT} \
ac_cv_file__dev_ptmx=yes \ ac_cv_file__dev_ptmx=yes \
ac_cv_file__dev_ptc=yes \ ac_cv_file__dev_ptc=yes \
&& make -j$(($(nproc) / 2)) && make install && make -j$(($(nproc) / 2)) \
&& make install
# https://github.com/benfogle/crossenv # https://github.com/benfogle/crossenv
# cross compile python packages # cross compile python packages
WORKDIR /tmp FROM ${CC_PLATFORM_IMAGE} AS python_pkg_builder
# /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}
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 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=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}