nushell-plugins/Dockerfile.cross

210 lines
8.9 KiB
Docker
Raw Normal View History

# Multi-Architecture Cross-Compilation Docker Image for Nushell Plugins
# Based on Ubuntu 22.04 LTS for stability and broad compatibility
FROM ubuntu:22.04
# Prevent interactive prompts during package installation
ENV DEBIAN_FRONTEND=noninteractive
# Set timezone to UTC
ENV TZ=UTC
# Install system dependencies and cross-compilation toolchains
RUN apt-get update && \
apt-get install -y \
# Build essentials
build-essential \
curl \
wget \
git \
pkg-config \
# SSL and crypto libraries
libssl-dev \
# Cross-compilation toolchains
gcc-x86-64-linux-gnu \
gcc-aarch64-linux-gnu \
gcc-arm-linux-gnueabihf \
# Additional libraries for nushell plugins
libc6-dev-amd64-cross \
libc6-dev-arm64-cross \
libc6-dev-armhf-cross \
# For clipboard plugin
libx11-dev \
libxcb1-dev \
libxcb-render0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
# For image processing
libpng-dev \
libjpeg-dev \
# General development tools
unzip \
zip \
tar \
gzip \
file \
# Clean up to reduce image size
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
# Install Rust with rustup
ENV RUST_VERSION=1.75.0
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain ${RUST_VERSION}
# Add Rust to PATH
ENV PATH="/root/.cargo/bin:$PATH"
# Install cross-compilation targets
RUN rustup target add \
x86_64-unknown-linux-gnu \
aarch64-unknown-linux-gnu \
armv7-unknown-linux-gnueabihf \
x86_64-pc-windows-gnu \
x86_64-pc-windows-msvc \
aarch64-pc-windows-msvc
# Install additional Rust components
RUN rustup component add \
rustfmt \
clippy \
rust-src
# Install cargo tools useful for cross-compilation
RUN cargo install \
cross \
cargo-audit \
cargo-outdated \
cargo-edit
# Set up cross-compilation environment variables and linkers
ENV CC_x86_64_unknown_linux_gnu=x86_64-linux-gnu-gcc
ENV CXX_x86_64_unknown_linux_gnu=x86_64-linux-gnu-g++
ENV AR_x86_64_unknown_linux_gnu=x86_64-linux-gnu-ar
ENV CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=x86_64-linux-gnu-gcc
ENV CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc
ENV CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++
ENV AR_aarch64_unknown_linux_gnu=aarch64-linux-gnu-ar
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
ENV CC_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc
ENV CXX_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++
ENV AR_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-ar
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
# Set up pkg-config for cross-compilation
ENV PKG_CONFIG_ALLOW_CROSS=1
ENV PKG_CONFIG_PATH_x86_64_unknown_linux_gnu=/usr/lib/x86_64-linux-gnu/pkgconfig
ENV PKG_CONFIG_PATH_aarch64_unknown_linux_gnu=/usr/lib/aarch64-linux-gnu/pkgconfig
ENV PKG_CONFIG_PATH_armv7_unknown_linux_gnueabihf=/usr/lib/arm-linux-gnueabihf/pkgconfig
# Install Windows cross-compilation dependencies
RUN apt-get update && \
apt-get install -y \
mingw-w64 \
wine \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
# Set up Windows cross-compilation
ENV CC_x86_64_pc_windows_gnu=x86_64-w64-mingw32-gcc
ENV CXX_x86_64_pc_windows_gnu=x86_64-w64-mingw32-g++
ENV AR_x86_64_pc_windows_gnu=x86_64-w64-mingw32-ar
ENV CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=x86_64-w64-mingw32-gcc
# Create workspace directory
WORKDIR /workspace
# Set up cargo configuration for cross-compilation
RUN mkdir -p /root/.cargo && \
echo '[target.x86_64-unknown-linux-gnu]' >> /root/.cargo/config.toml && \
echo 'linker = "x86_64-linux-gnu-gcc"' >> /root/.cargo/config.toml && \
echo '' >> /root/.cargo/config.toml && \
echo '[target.aarch64-unknown-linux-gnu]' >> /root/.cargo/config.toml && \
echo 'linker = "aarch64-linux-gnu-gcc"' >> /root/.cargo/config.toml && \
echo '' >> /root/.cargo/config.toml && \
echo '[target.armv7-unknown-linux-gnueabihf]' >> /root/.cargo/config.toml && \
echo 'linker = "arm-linux-gnueabihf-gcc"' >> /root/.cargo/config.toml && \
echo '' >> /root/.cargo/config.toml && \
echo '[target.x86_64-pc-windows-gnu]' >> /root/.cargo/config.toml && \
echo 'linker = "x86_64-w64-mingw32-gcc"' >> /root/.cargo/config.toml
# Set default environment variables for better build experience
ENV RUST_BACKTRACE=1
ENV CARGO_INCREMENTAL=0
ENV CARGO_NET_RETRY=10
ENV CARGO_NET_TIMEOUT=30
# Create a build script that can be used as entry point
RUN echo '#!/bin/bash' > /usr/local/bin/build-plugin.sh && \
echo 'set -e' >> /usr/local/bin/build-plugin.sh && \
echo 'if [ -z "$1" ]; then' >> /usr/local/bin/build-plugin.sh && \
echo ' echo "Usage: build-plugin.sh <target> [plugin_dir]"' >> /usr/local/bin/build-plugin.sh && \
echo ' echo "Available targets:"' >> /usr/local/bin/build-plugin.sh && \
echo ' rustup target list --installed' >> /usr/local/bin/build-plugin.sh && \
echo ' exit 1' >> /usr/local/bin/build-plugin.sh && \
echo 'fi' >> /usr/local/bin/build-plugin.sh && \
echo 'TARGET=$1' >> /usr/local/bin/build-plugin.sh && \
echo 'PLUGIN_DIR=${2:-.}' >> /usr/local/bin/build-plugin.sh && \
echo 'echo "Building $PLUGIN_DIR for target $TARGET..."' >> /usr/local/bin/build-plugin.sh && \
echo 'cd "$PLUGIN_DIR"' >> /usr/local/bin/build-plugin.sh && \
echo 'cargo build --release --target "$TARGET"' >> /usr/local/bin/build-plugin.sh && \
echo 'echo "Build completed successfully!"' >> /usr/local/bin/build-plugin.sh && \
chmod +x /usr/local/bin/build-plugin.sh
# Create a helper script to list available targets
RUN echo '#!/bin/bash' > /usr/local/bin/list-targets.sh && \
echo 'echo "Installed Rust targets:"' >> /usr/local/bin/list-targets.sh && \
echo 'rustup target list --installed' >> /usr/local/bin/list-targets.sh && \
echo '' >> /usr/local/bin/list-targets.sh && \
echo 'echo "Available cross-compilation linkers:"' >> /usr/local/bin/list-targets.sh && \
echo 'ls -1 /usr/bin/*-gcc | grep -E "(x86_64|aarch64|arm)-.*-gcc$" || true' >> /usr/local/bin/list-targets.sh && \
chmod +x /usr/local/bin/list-targets.sh
# Create a helper script for environment information
RUN echo '#!/bin/bash' > /usr/local/bin/env-info.sh && \
echo 'echo "=== Rust Environment ==="' >> /usr/local/bin/env-info.sh && \
echo 'rustc --version' >> /usr/local/bin/env-info.sh && \
echo 'cargo --version' >> /usr/local/bin/env-info.sh && \
echo '' >> /usr/local/bin/env-info.sh && \
echo 'echo "=== Installed Targets ==="' >> /usr/local/bin/env-info.sh && \
echo 'rustup target list --installed' >> /usr/local/bin/env-info.sh && \
echo '' >> /usr/local/bin/env-info.sh && \
echo 'echo "=== Cross-Compilation Toolchains ==="' >> /usr/local/bin/env-info.sh && \
echo 'echo "GCC versions:"' >> /usr/local/bin/env-info.sh && \
echo 'x86_64-linux-gnu-gcc --version 2>/dev/null | head -1 || echo "x86_64-linux-gnu-gcc: not found"' >> /usr/local/bin/env-info.sh && \
echo 'aarch64-linux-gnu-gcc --version 2>/dev/null | head -1 || echo "aarch64-linux-gnu-gcc: not found"' >> /usr/local/bin/env-info.sh && \
echo 'arm-linux-gnueabihf-gcc --version 2>/dev/null | head -1 || echo "arm-linux-gnueabihf-gcc: not found"' >> /usr/local/bin/env-info.sh && \
echo 'x86_64-w64-mingw32-gcc --version 2>/dev/null | head -1 || echo "x86_64-w64-mingw32-gcc: not found"' >> /usr/local/bin/env-info.sh && \
echo '' >> /usr/local/bin/env-info.sh && \
echo 'echo "=== Environment Variables ==="' >> /usr/local/bin/env-info.sh && \
echo 'env | grep -E "(CC_|CXX_|AR_|CARGO_TARGET_|PKG_CONFIG)" | sort' >> /usr/local/bin/env-info.sh && \
chmod +x /usr/local/bin/env-info.sh
# Add helpful aliases to bashrc
RUN echo 'alias ll="ls -la"' >> /root/.bashrc && \
echo 'alias targets="list-targets.sh"' >> /root/.bashrc && \
echo 'alias envinfo="env-info.sh"' >> /root/.bashrc && \
echo 'alias build="build-plugin.sh"' >> /root/.bashrc
# Verify installation and show information
RUN echo "=== Docker Image Build Complete ===" && \
echo "Rust version:" && rustc --version && \
echo "Cargo version:" && cargo --version && \
echo "Installed targets:" && rustup target list --installed && \
echo "Cross-compilation toolchains:" && \
(x86_64-linux-gnu-gcc --version | head -1) && \
(aarch64-linux-gnu-gcc --version | head -1) && \
(arm-linux-gnueabihf-gcc --version | head -1) && \
(x86_64-w64-mingw32-gcc --version | head -1) && \
echo "=== Ready for cross-compilation! ==="
# Set default command to show environment info
CMD ["env-info.sh"]
# Metadata labels
LABEL maintainer="Nushell Plugins Team"
LABEL description="Cross-compilation environment for Nushell plugins"
LABEL version="1.0.0"
LABEL rust.version="1.75.0"
LABEL targets="x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,armv7-unknown-linux-gnueabihf,x86_64-pc-windows-gnu"