Compare commits
22 Commits
0d7c134b1f
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 12b7f933ed | |||
| cd816d05b6 | |||
| 0ead87b247 | |||
| 9d0eb333a9 | |||
| 7e705652ee | |||
| f848464b20 | |||
| c87f936b4b | |||
| ed866eef1b | |||
| 53b16996d0 | |||
| 48dae96a1c | |||
| 8868ca2a35 | |||
| 39f628605f | |||
| 877c9c329d | |||
| 6efcd85e04 | |||
| ea0313a66d | |||
| 31d7fab23a | |||
| e1bd9618bd | |||
| ac9963449d | |||
| c20818c692 | |||
| 9d73c4ea55 | |||
| f1fbd08fea | |||
| d2a030f5d0 |
@@ -2,7 +2,6 @@ name: Build Cross-Compiled ROS 2 Images
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
@@ -11,220 +10,70 @@ on:
|
||||
description: "Target platform"
|
||||
required: true
|
||||
type: choice
|
||||
options: [rk3588]
|
||||
default: rk3588
|
||||
options: [rk3588, rk3576]
|
||||
default: rk3576
|
||||
ros_distro:
|
||||
description: "ROS 2 distribution"
|
||||
required: true
|
||||
type: choice
|
||||
options: [rolling, jazzy, lyrical]
|
||||
default: lyrical
|
||||
push_images:
|
||||
description: "Push built images to registry"
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
platform: ${{ fromJSON(format('["{0}"]', inputs.platform)) }}
|
||||
ros_distro: ${{ fromJSON(format('["{0}"]', inputs.ros_distro)) }}
|
||||
fail-fast: false
|
||||
env:
|
||||
PLATFORM: ${{ inputs.platform }}
|
||||
ROS_DISTRO: ${{ inputs.ros_distro }}
|
||||
|
||||
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
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
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
|
||||
- name: Debug inputs
|
||||
run: |
|
||||
CC_BASE_KEY=$(sha256sum cross_compile/cc_base.Dockerfile | cut -d' ' -f1)
|
||||
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
|
||||
|
||||
CC_TOOLCHAIN_FILES=$(find cross_compile/${{ matrix.platform }} -type f | sort | xargs sha256sum | sha256sum | cut -d' ' -f1)
|
||||
CC_TOOLCHAIN_KEY=$(echo "$CC_TOOLCHAIN_FILES $CC_BASE_KEY" | sha256sum | cut -d' ' -f1)
|
||||
|
||||
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)
|
||||
|
||||
ROS2_FILES=$(find cross_compile/ros2/${{ matrix.ros_distro }} cross_compile/ros2/ros_cpp -type f | sort | xargs sha256sum | sha256sum | cut -d' ' -f1)
|
||||
ROS2_KEY=$(echo "$ROS2_FILES $VENDOR_KEY" | sha256sum | cut -d' ' -f1)
|
||||
|
||||
echo "cc_base=$CC_BASE_KEY" >> $GITHUB_OUTPUT
|
||||
echo "cc_toolchain=$CC_TOOLCHAIN_KEY" >> $GITHUB_OUTPUT
|
||||
echo "vendor=$VENDOR_KEY" >> $GITHUB_OUTPUT
|
||||
echo "ros2=$ROS2_KEY" >> $GITHUB_OUTPUT
|
||||
# ── 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: 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
|
||||
if: steps.cc-base.outputs.hit != 'true'
|
||||
run: |
|
||||
docker compose -f cross_compile/compose.yaml build cc-base
|
||||
TMPDIR=$(mktemp -d)
|
||||
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
|
||||
cd cross_compile
|
||||
docker compose build cc-base
|
||||
|
||||
# ── Stage 2: cc-toolchain ─────────────────────────────────────────
|
||||
- name: Check cc-toolchain cache
|
||||
id: cc-toolchain
|
||||
- name: Build cc-toolchain
|
||||
run: |
|
||||
EXPECTED="${{ steps.keys.outputs.cc_toolchain }}"
|
||||
REMOTE="${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-toolchain:latest"
|
||||
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
|
||||
cd cross_compile
|
||||
docker compose build cc-toolchain
|
||||
|
||||
# ── Stage 3: vendor-packages ──────────────────────────────────────
|
||||
- name: Check vendor-packages cache
|
||||
id: vendor
|
||||
- name: Build vendor-packages
|
||||
run: |
|
||||
EXPECTED="${{ steps.keys.outputs.vendor }}"
|
||||
REMOTE="${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-vendor-packages:latest"
|
||||
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
|
||||
cd cross_compile
|
||||
docker compose build vendor-packages
|
||||
|
||||
# ── Stage 4: ros2 ─────────────────────────────────────────────────
|
||||
- name: Check ros2 cache
|
||||
id: ros2
|
||||
- name: Build ROS 2
|
||||
run: |
|
||||
EXPECTED="${{ steps.keys.outputs.ros2 }}"
|
||||
REMOTE="${{ env.REGISTRY }}/${{ env.IMAGE_NAMESPACE }}/${{ matrix.platform }}/cc-ros-${{ matrix.ros_distro }}:latest"
|
||||
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
|
||||
cd cross_compile
|
||||
docker compose build ros2
|
||||
|
||||
# ── Summary ───────────────────────────────────────────────────────
|
||||
- name: Image summary
|
||||
@@ -236,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}
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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/diagnostics/diagnostic_remote_logging/COLCON_IGNORE
|
||||
|
||||
RUN MAKEFLAGS="-j6" colcon build \
|
||||
# -DPYTHON_SOABI=cpython-310-aarch64-linux-gnu
|
||||
RUN colcon build \
|
||||
--executor parallel \
|
||||
--parallel-workers 6 \
|
||||
--install-base ${TARGET_SYSROOT} \
|
||||
@@ -45,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
|
||||
@@ -75,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 \
|
||||
@@ -101,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
@@ -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"
|
||||
+1
-1
@@ -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
|
||||
)
|
||||
|
||||
+64
-35
@@ -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}
|
||||
Reference in New Issue
Block a user