Design a docker container for cross compiling native dependencies.

This commit is contained in:
H. Utku Maden 2023-07-08 13:17:14 +03:00
parent 79242127e5
commit 33427146e1
13 changed files with 212 additions and 1 deletions

1
.gitignore vendored

@ -5,3 +5,4 @@ riderModule.iml
/_ReSharper.Caches/
.idea
.vscode
nuget_repo

59
Dockerfile Normal file

@ -0,0 +1,59 @@
# This is going to create an environment for you to cross compile all the
# packages needed to build this project.
#
# As always, debian > ubuntu <3
FROM debian:stable-slim
WORKDIR /root
# Download and Install dependencies.
# Install WGET
RUN apt-get update
RUN apt-get install -y sudo wget
# Add the .NET package repository to the repository listing.
RUN wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
RUN dpkg -i packages-microsoft-prod.deb
RUN rm packages-microsoft-prod.deb
# APT dependencies.
RUN apt-get update
RUN apt-get install -y \
build-essential \
bzip2 \
cmake \
clang \
cpio \
dotnet-sdk-6.0 \
gcc-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu \
gcc-i686-linux-gnu \
git \
libssl-dev \
libxml2-dev \
lzma-dev \
mingw-w64 \
nuget \
patch \
python3 \
xz-utils \
zlib1g-dev
# Clone osxcross
# Let's do this later.
# RUN git clone https://github.com/tpoechtrager/osxcross.git osxcross
# Setup interactive shell.
# Setup sudo. Remove password prompt for group "wheel".
# RUN echo "%wheel ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/quik_sudo_conf
# Create a default user and switch.
RUN adduser --comment "" --disabled-password quik
USER quik
WORKDIR /home/quik
# Copy bashrc
RUN cp /etc/bash.bashrc ~/.bashrc
RUN echo source $HOME/src/sh/bashrc.sh >> ~/.bashrc
# Execute an interactive shell.
CMD bash

13
cmake/linux-arm.cmake Normal file

@ -0,0 +1,13 @@
# QUIK Toolchain file for Linux-arm systems.
# Copyright (C) 2023
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH "/usr/arm-linux-gnueabihf")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

13
cmake/linux-arm64.cmake Normal file

@ -0,0 +1,13 @@
# QUIK Toolchain file for Linux-arm64 (aarch64) systems.
# Copyright (C) 2023
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH "/usr/aarch64-linux-gnu")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

9
cmake/linux-x64.cmake Normal file

@ -0,0 +1,9 @@
# QUIK Toolchain file for Linux-x64 (amd64) systems.
# Copyright (C) 2023
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)
add_compile_options(-m64)

14
cmake/linux-x86.cmake Normal file

@ -0,0 +1,14 @@
# QUIK Toolchain file for Linux-x86 (i386) systems.
# Copyright (C) 2023
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER i686-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER i686-linux-gnu-g++)
add_compile_options(-m32 -march=i686)
set(CMAKE_FIND_ROOT_PATH "/usr/i686-linux-gnu")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

14
cmake/win-x64.cmake Normal file

@ -0,0 +1,14 @@
# QUIK Toolchain file for Windows-x64 systems.
# Copyright (C) 2023
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
set(CMAKE_FIND_ROOT_PATH "/usr/x86_64-w64-mingw32")
add_compile_options(-m64)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

14
cmake/win-x86.cmake Normal file

@ -0,0 +1,14 @@
# QUIK Toolchain file for Windows-x86 systems.
# Copyright (C) 2023
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
set(CMAKE_FIND_ROOT_PATH "/usr/i686-w64-mingw32")
add_compile_options(-m32)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

13
compose.yaml Normal file

@ -0,0 +1,13 @@
services:
cmdline:
image: quik/quik
user: quik
working_dir: /home/quik
volumes:
- src:/home/quik/src
volumes:
src:
driver_opts:
type: none
device: ${PWD}
o: bind

5
sh/bashrc.sh Executable file

@ -0,0 +1,5 @@
source $HOME/src/sh/init.sh
echo QUIK Project Copyright \(C\) 2023
echo
echo This is an interactive shell for QUIK build image.
echo SuperUser \(su/sudo\) commands are enabled without a password. Beware.

3
sh/build_native.sh Executable file

@ -0,0 +1,3 @@
#!/bin/bash
source $(dirname "$0")/quik_build_native.sh
quik_build_native "Quik.StbImage.redist" "linux-arm linux-arm64 linux-x64 linux-x86 win-x64 win-x86"

15
sh/init.sh Executable file

@ -0,0 +1,15 @@
#!/bin/bash
# Change to source directory
cd $HOME/src
export QUIK_SRC=$PWD
export QNUGET_LOCAL=QuikLocal
export QNUGET_LOCAL_PATH=$QUIK_SRC/nuget_repo
# export QNUGET_REMOTE=nuget
# Create nuget repository.
mkdir -p $QUIK_SRC/nuget_repo
nuget sources Add -Name $QNUGET_LOCAL -Source $QNUGET_LOCAL_PATH -NonInteractive
source sh/quik_build_native.sh

38
sh/quik_build_native.sh Executable file

@ -0,0 +1,38 @@
#!/bin/bash
# $1 Source path of the project.
# $2 Target architecture list.
quik_build_native () {
SRC=$1
NAME=$(dirname $SRC)
ARCHS=$2
cd $SRC
for ARCH in $ARCHS; do
# Output directory.
PREFIX=runtimes/$ARCH/native
# Build directory.
BUILD=out/$ARCH
# Cmake toolchain file.
TOOLCHAIN=../cmake/$ARCH.cmake
# Create directories.
mkdir -p $PREFIX $BUILD
# Configure CMAKE.
cmake -B $BUILD -S . \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$PREFIX \
-DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN
# Build and install.
make -C $BUILD all
make -C $BUILD install
done
mkdir bin
nuget pack -OutputDirectory bin
nuget push $(find bin/*.nupkg) -Source $QNUGET_LOCAL -NonInteractive
}