210 lines
8.9 KiB
Docker
210 lines
8.9 KiB
Docker
![]() |
# 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"
|