further progress on docker containers

This commit is contained in:
Roland Singer 2019-01-31 15:40:04 +01:00
parent 77dea67e81
commit 2ddd255ef8
16 changed files with 365 additions and 112 deletions

View File

@ -1,8 +1,9 @@
CROSSBUILD_IMAGES = linux windows_64_static
CROSSBUILD_IMAGES = linux android windows windows_64_static windows_32_static
$(CROSSBUILD_IMAGES): %:
echo "# This file is auto-generated." > $@/Dockerfile
awk '/import common.base/{system("cat common/base");next}1' $@/Dockerfile.in >> $@/Dockerfile
$(CROSSBUILD_IMAGES): %: generate
docker build ./ -f $@/Dockerfile -t desertbit/gml:$@
generate:
go run generate.go
.PHONY: $(CROSSBUILD_IMAGES)

View File

@ -1,4 +0,0 @@
# Docker containers
## Credits
- https://github.com/therecipe/qt/tree/master/internal/docker

15
docker/android/Dockerfile Normal file
View File

@ -0,0 +1,15 @@
FROM desertbit/gml:linux
MAINTAINER team@desertbit.com
# Install dependencies.
# http://doc.qt.io/qt-5/android-getting-started.html
RUN apt-get -y update && \
apt-get -y install android-sdk && \
apt-get -y clean
# TODO: finish this
# Install android NDK
# https://developer.android.com/ndk/downloads/
RUN mkdir /tmp/ndk && cd /tmp/ndk && \
wget https://dl.google.com/android/repository/android-ndk-r19-linux-x86_64.zip && \
rm -rf /tmp/ndk

View File

@ -1,17 +1,6 @@
# Install dependencies.
RUN apt-get -y update && \
apt-get -y install sudo git wget nano make pkg-config && \
apt-get -y clean
ENV PATH="/$QT_ROOT/bin:$PATH" \
PKG_CONFIG_PATH="$QT_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH" \
LD_LIBRARY_PATH="$QT_ROOT/lib:$LD_LIBRARY_PATH"
# Install the Go compiler. We can't assure, that the go compiler is up-to-date from the base package.
RUN export GO_VERSION="1.11.4" && \
export GO_CHECKSUM="fb26c30e6a04ad937bbc657a1b5bba92f80096af1e8ee6da6430c045a8db3a5b" && \
rm -rf "$(go env GOROOT)" && \
rm -rf /usr/local/go && \
# Install the Go compiler.
RUN export GO_VERSION="1.11.5" && \
export GO_CHECKSUM="ff54aafedff961eb94792487e827515da683d61a5f9482f668008832631e5d25" && \
mkdir -p /tmp/go && \
cd /tmp/go && \
wget -O go.tar.gz https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz && \
@ -19,7 +8,8 @@ RUN export GO_VERSION="1.11.4" && \
tar -xvf go.tar.gz && \
mv go /usr/local && \
rm -rf /tmp/go
ENV GOROOT=/usr/local/go \
ENV PATH="$PATH:/usr/local/go/bin" \
GOROOT=/usr/local/go \
GOPATH=/work \
CGO_ENABLED=1
@ -39,4 +29,4 @@ WORKDIR /work
ADD common/entrypoint.sh /entrypoint
RUN chmod +x /entrypoint
ENTRYPOINT ["/entrypoint"]
CMD ["gml"]
CMD ["gml"]

12
docker/common/windows Normal file
View File

@ -0,0 +1,12 @@
RUN cd /mxe && \
export NUM_CORES="$(grep -c processor /proc/cpuinfo)" && \
make -j${NUM_CORES} MXE_TARGETS="${CROSS_TRIPLE}" qtbase qtquickcontrols2
ENV PATH="/mxe/usr/bin:/mxe/usr/${CROSS_TRIPLE}/qt5/bin:$PATH" \
PKG_CONFIG="/mxe/usr/bin/${CROSS_TRIPLE}-pkg-config" \
PKG_CONFIG_PATH="/mxe/usr/${CROSS_TRIPLE}/qt5/lib/pkgconfig:$PKG_CONFIG_PATH" \
CC="${CROSS_TRIPLE}-gcc" \
CXX="${CROSS_TRIPLE}-g++"
# Patch to include some missing libraries for cgo. Otherwise the linker fails.
RUN sed -i "s|Libs.private:|Libs.private: -lstdc++ |g" "/mxe/usr/${CROSS_TRIPLE}/qt5/lib/pkgconfig/Qt5Core.pc"

136
docker/generate.go Normal file
View File

@ -0,0 +1,136 @@
/*
* GML - Go QML
*
* The MIT License (MIT)
*
* Copyright (c) 2019 Roland Singer <roland.singer[at]desertbit.com>
* Copyright (c) 2019 Sebastian Borchers <sebastian[at]desertbit.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
"github.com/desertbit/gml/internal/utils"
)
const (
ImportPrefix = "#import"
)
func main() {
// Prepare the base dir.
baseDir, err := os.Getwd()
if err != nil {
log.Fatalln("failed to get current working dir:", err)
}
// Generate all Dockerfiles from Dockerfile.in files.
err = generate(baseDir)
if err != nil {
log.Fatalln("failed to generate Dockerfiles:", err)
}
}
func generate(baseDir string) (err error) {
var (
e bool
data []byte
)
entries, err := ioutil.ReadDir(baseDir)
if err != nil {
return
}
for _, fi := range entries {
if !fi.IsDir() {
continue
}
t := filepath.Base(fi.Name())
dockerFile := filepath.Join(baseDir, t, "Dockerfile")
dockerFileIn := dockerFile + ".in"
e, err = utils.Exists(dockerFileIn)
if err != nil {
return
} else if !e {
continue
}
fmt.Println("> generating:", t)
data, err = ioutil.ReadFile(dockerFileIn)
if err != nil {
return
}
var out *os.File
out, err = os.Create(dockerFile)
if err != nil {
return
}
defer out.Close()
lines := strings.Split(string(data), "\n")
for _, line := range lines {
if !strings.HasPrefix(strings.TrimSpace(line), ImportPrefix) {
_, err = out.WriteString(line + "\n")
if err != nil {
return
}
continue
}
line = strings.TrimSpace(strings.TrimPrefix(strings.TrimSpace(line), ImportPrefix))
if len(line) == 0 {
return fmt.Errorf("invalid import command: %s", line)
}
importFile := filepath.Join(baseDir, line)
e, err = utils.Exists(importFile)
if err != nil {
return
} else if !e {
return fmt.Errorf("invalid import command: %s", line)
}
data, err = ioutil.ReadFile(importFile)
if err != nil {
return
}
_, err = out.WriteString(string(data) + "\n")
if err != nil {
return
}
}
}
return
}

View File

@ -1,24 +1,15 @@
# This file is auto-generated.
FROM therecipe/qt:linux
ENV QT_ROOT="/opt/Qt/5.12.0/gcc_64" \
GOOS=linux \
GOARCH=amd64
FROM ubuntu:18.04
MAINTAINER team@desertbit.com
# Install dependencies.
RUN apt-get -y update && \
apt-get -y install sudo git wget nano make pkg-config && \
apt-get -y install build-essential sudo git wget nano make pkg-config \
qt5-default qttools5-dev-tools qtdeclarative5-dev && \
apt-get -y clean
ENV PATH="/$QT_ROOT/bin:$PATH" \
PKG_CONFIG_PATH="$QT_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH" \
LD_LIBRARY_PATH="$QT_ROOT/lib:$LD_LIBRARY_PATH"
# Install the Go compiler. We can't assure, that the go compiler is up-to-date from the base package.
RUN export GO_VERSION="1.11.4" && \
export GO_CHECKSUM="fb26c30e6a04ad937bbc657a1b5bba92f80096af1e8ee6da6430c045a8db3a5b" && \
rm -rf "$(go env GOROOT)" && \
rm -rf /usr/local/go && \
# Install the Go compiler.
RUN export GO_VERSION="1.11.5" && \
export GO_CHECKSUM="ff54aafedff961eb94792487e827515da683d61a5f9482f668008832631e5d25" && \
mkdir -p /tmp/go && \
cd /tmp/go && \
wget -O go.tar.gz https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz && \
@ -26,7 +17,8 @@ RUN export GO_VERSION="1.11.4" && \
tar -xvf go.tar.gz && \
mv go /usr/local && \
rm -rf /tmp/go
ENV GOROOT=/usr/local/go \
ENV PATH="$PATH:/usr/local/go/bin" \
GOROOT=/usr/local/go \
GOPATH=/work \
CGO_ENABLED=1

View File

@ -1,7 +1,10 @@
FROM therecipe/qt:linux
FROM ubuntu:18.04
MAINTAINER team@desertbit.com
ENV QT_ROOT="/opt/Qt/5.12.0/gcc_64" \
GOOS=linux \
GOARCH=amd64
# Install dependencies.
RUN apt-get -y update && \
apt-get -y install build-essential sudo git wget nano make pkg-config \
qt5-default qttools5-dev-tools qtdeclarative5-dev && \
apt-get -y clean
#import common.base
#import common/base

83
docker/windows/Dockerfile Normal file
View File

@ -0,0 +1,83 @@
FROM debian:8
MAINTAINER team@desertbit.com
# Install dependencies.
# https://mxe.cc/#requirements
RUN apt-get -y update && \
apt-get -y install \
sudo \
nano \
autoconf \
automake \
autopoint \
bash \
bison \
bzip2 \
flex \
g++ \
g++-multilib \
gettext \
git \
gperf \
intltool \
libc6-dev-i386 \
libgdk-pixbuf2.0-dev \
libltdl-dev \
libssl-dev \
libtool-bin \
libxml-parser-perl \
lzip \
make \
openssl \
p7zip-full \
patch \
perl \
pkg-config \
python \
ruby \
sed \
unzip \
wget \
xz-utils && \
apt-get -y clean
# Install the Go compiler.
RUN export GO_VERSION="1.11.5" && \
export GO_CHECKSUM="ff54aafedff961eb94792487e827515da683d61a5f9482f668008832631e5d25" && \
mkdir -p /tmp/go && \
cd /tmp/go && \
wget -O go.tar.gz https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz && \
echo "${GO_CHECKSUM} go.tar.gz" | sha256sum -c && \
tar -xvf go.tar.gz && \
mv go /usr/local && \
rm -rf /tmp/go
ENV PATH="$PATH:/usr/local/go/bin" \
GOROOT=/usr/local/go \
GOPATH=/work \
CGO_ENABLED=1
# Install the gml tool.
RUN mkdir -p /tmp/go && cd /tmp/go && \
export GOPATH="/tmp/go" && \
export GOOS=linux && \
export GOARCH=amd64 && \
go get github.com/desertbit/gml/cmd/gml && \
mv -f /tmp/go/bin/gml /bin/gml && \
rm -rf /tmp/go
RUN mkdir /work
VOLUME /work
WORKDIR /work
ADD common/entrypoint.sh /entrypoint
RUN chmod +x /entrypoint
ENTRYPOINT ["/entrypoint"]
CMD ["gml"]
# https://mxe.cc
# https://stackoverflow.com/questions/14170590/building-qt-5-on-linux-for-windows/14170591#14170591
RUN export MXE_COMMIT="744f553022aabe5c9946828235b6a5dd9416a6d0" && \
git clone https://github.com/mxe/mxe.git /mxe && \
cd /mxe && \
git checkout "${MXE_COMMIT}"

View File

@ -0,0 +1,51 @@
FROM debian:8
MAINTAINER team@desertbit.com
# Install dependencies.
# https://mxe.cc/#requirements
RUN apt-get -y update && \
apt-get -y install \
sudo \
nano \
autoconf \
automake \
autopoint \
bash \
bison \
bzip2 \
flex \
g++ \
g++-multilib \
gettext \
git \
gperf \
intltool \
libc6-dev-i386 \
libgdk-pixbuf2.0-dev \
libltdl-dev \
libssl-dev \
libtool-bin \
libxml-parser-perl \
lzip \
make \
openssl \
p7zip-full \
patch \
perl \
pkg-config \
python \
ruby \
sed \
unzip \
wget \
xz-utils && \
apt-get -y clean
#import common/base
# https://mxe.cc
# https://stackoverflow.com/questions/14170590/building-qt-5-on-linux-for-windows/14170591#14170591
RUN export MXE_COMMIT="744f553022aabe5c9946828235b6a5dd9416a6d0" && \
git clone https://github.com/mxe/mxe.git /mxe && \
cd /mxe && \
git checkout "${MXE_COMMIT}"

View File

@ -0,0 +1,15 @@
FROM desertbit/gml:windows
MAINTAINER team@desertbit.com
ENV CROSS_TRIPLE="x86_64-w64-mingw32.static" \
GOOS=windows \
GOARCH=amd64
RUN cd /mxe && \
export NUM_CORES="$(grep -c processor /proc/cpuinfo)" && \
make -j${NUM_CORES} MXE_TARGETS="${CROSS_TRIPLE}" qtbase qtquickcontrols2
ENV PATH="/mxe/usr/bin:/mxe/usr/${CROSS_TRIPLE}/qt5/bin:$PATH" \
PKG_CONFIG="/mxe/usr/bin/${CROSS_TRIPLE}-pkg-config" \
PKG_CONFIG_PATH="/mxe/usr/${CROSS_TRIPLE}/qt5/lib/pkgconfig:$PKG_CONFIG_PATH"

View File

@ -0,0 +1,8 @@
FROM desertbit/gml:windows
MAINTAINER team@desertbit.com
ENV CROSS_TRIPLE="i686-w64-mingw32.static" \
GOOS=windows \
GOARCH=386
#import common/windows

View File

@ -1,57 +1,15 @@
# This file is auto-generated.
FROM therecipe/qt:windows_64_static
FROM desertbit/gml:windows
MAINTAINER team@desertbit.com
ENV CROSS_TRIPLE="x86_64-w64-mingw32.static"
ENV QT_ROOT="/usr/lib/mxe/usr/$CROSS_TRIPLE/qt5" \
ENV CROSS_TRIPLE="x86_64-w64-mingw32.static" \
GOOS=windows \
GOARCH=amd64
# Install dependencies.
RUN apt-get -y update && \
apt-get -y install sudo git wget nano make pkg-config && \
apt-get -y clean
RUN cd /mxe && \
export NUM_CORES="$(grep -c processor /proc/cpuinfo)" && \
make -j${NUM_CORES} MXE_TARGETS="${CROSS_TRIPLE}" qtbase qtquickcontrols2
ENV PATH="/$QT_ROOT/bin:$PATH" \
PKG_CONFIG_PATH="$QT_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH" \
LD_LIBRARY_PATH="$QT_ROOT/lib:$LD_LIBRARY_PATH"
ENV PATH="/mxe/usr/bin:/mxe/usr/${CROSS_TRIPLE}/qt5/bin:$PATH" \
PKG_CONFIG="/mxe/usr/bin/${CROSS_TRIPLE}-pkg-config" \
PKG_CONFIG_PATH="/mxe/usr/${CROSS_TRIPLE}/qt5/lib/pkgconfig:$PKG_CONFIG_PATH"
# Install the Go compiler. We can't assure, that the go compiler is up-to-date from the base package.
RUN export GO_VERSION="1.11.4" && \
export GO_CHECKSUM="fb26c30e6a04ad937bbc657a1b5bba92f80096af1e8ee6da6430c045a8db3a5b" && \
rm -rf "$(go env GOROOT)" && \
rm -rf /usr/local/go && \
mkdir -p /tmp/go && \
cd /tmp/go && \
wget -O go.tar.gz https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz && \
echo "${GO_CHECKSUM} go.tar.gz" | sha256sum -c && \
tar -xvf go.tar.gz && \
mv go /usr/local && \
rm -rf /tmp/go
ENV GOROOT=/usr/local/go \
GOPATH=/work \
CGO_ENABLED=1
# Install the gml tool.
RUN mkdir -p /tmp/go && cd /tmp/go && \
export GOPATH="/tmp/go" && \
export GOOS=linux && \
export GOARCH=amd64 && \
go get github.com/desertbit/gml/cmd/gml && \
mv -f /tmp/go/bin/gml /bin/gml && \
rm -rf /tmp/go
RUN mkdir /work
VOLUME /work
WORKDIR /work
ADD common/entrypoint.sh /entrypoint
RUN chmod +x /entrypoint
ENTRYPOINT ["/entrypoint"]
CMD ["gml"]
RUN mkdir -p /cross-bin && \
for f in /usr/lib/mxe/usr/bin/${CROSS_TRIPLE}-*; do \
name="$(echo "$f" | sed -e "s|^/usr/lib/mxe/usr/bin/${CROSS_TRIPLE}-||")" ;\
ln -s "$f" "/cross-bin/${name}" ;\
done
ENV PATH="/cross-bin:$PATH"

View File

@ -1,15 +1,8 @@
FROM therecipe/qt:windows_64_static
FROM desertbit/gml:windows
MAINTAINER team@desertbit.com
ENV CROSS_TRIPLE="x86_64-w64-mingw32.static"
ENV QT_ROOT="/usr/lib/mxe/usr/$CROSS_TRIPLE/qt5" \
ENV CROSS_TRIPLE="x86_64-w64-mingw32.static" \
GOOS=windows \
GOARCH=amd64
#import common.base
RUN mkdir -p /cross-bin && \
for f in /usr/lib/mxe/usr/bin/${CROSS_TRIPLE}-*; do \
name="$(echo "$f" | sed -e "s|^/usr/lib/mxe/usr/bin/${CROSS_TRIPLE}-||")" ;\
ln -s "$f" "/cross-bin/${name}" ;\
done
ENV PATH="/cross-bin:$PATH"
#import common/windows

View File

@ -40,7 +40,7 @@ import (
)
const (
staticLibName = "libgml.a" // TODO:
staticLibName = "libgml.a"
proFileName = "gml.pro"
qmlDir = "qml"
qmlResDir = "resources"

View File

@ -58,7 +58,7 @@ CONFIG += staticlib
win32|win64 {
CONFIG += release
Release:DESTDIR =
Release:DESTDIR = {{.BuildDir}}
}
INCLUDEPATH += {{.GmlBindingDir}}/headers
@ -70,6 +70,6 @@ RESOURCES += {{.QMLResFile}}
OBJECTS_DIR = {{.BuildDir}}
MOC_DIR = {{.BuildDir}}
UI_DIR = {{.BuildDir}}
TARGET = {{.BuildDir}}/gml
DESTDIR =
DESTDIR = {{.BuildDir}}
TARGET = gml
`