Skip to content

Instantly share code, notes, and snippets.

@JCash
Last active March 2, 2020 13:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JCash/76a803d8b30675cef1663daa27927ed7 to your computer and use it in GitHub Desktop.
Save JCash/76a803d8b30675cef1663daa27927ed7 to your computer and use it in GitHub Desktop.
Setting up Win32 build pipeline in Docker
x86_64-win32:
env:
TMP: "{{build_folder}}"
TEMP: "{{build_folder}}"
MSVC_DIR: "{{env.WINDOWS_MSVC_2019_DIR}}"
SDK8_DIR: "{{env.WINDOWS_SDK_8_DIR}}"
SDK10_DIR: "{{env.WINDOWS_SDK_10_DIR}}"
SDK10_VERSION: "{{env.WINDOWS_SDK_10_VERSION}}"
VCINSTALLDIR: "{{env.WINDOWS_VCINSTALLDIR}}"
VSINSTALLDIR: "{{env.WINDOWS_VSINSTALLDIR}}"
context:
engineLibs: ["libengine","libengine_service","libmbedtls","libwebviewext","libprofilerext","libfacebookext","libiapext","libpushext","libiacext","librecord","libgameobject","libddf","libresource","libgamesys","libgraphics","libphysics","libBulletDynamics","libBulletCollision","libLinearMath","libBox2D","librender","libscript","libluajit-5.1","libextension","libhid","libinput","libparticle","librig","libdlib","libdmglfw","libgui","libcrashext","libliveupdate","libsound","vpx","libcares"]
libPaths: ["{{dynamo_home}}/lib/x86_64-win32", "{{dynamo_home}}/ext/lib/x86_64-win32", "{{env.MSVC_DIR}}/lib/x64", "{{env.MSVC_DIR}}/atlmfc/lib/x64", "{{env.SDK10_DIR}}/Lib/{{env.SDK10_VERSION}}/ucrt/x64", "{{env.SDK8_DIR}}/Lib/winv6.3/um/x64"]
platformIncludes: ["{{env.MSVC_DIR}}/atlmfc/include", "{{env.SDK10_DIR}}/Include/{{env.SDK10_VERSION}}/ucrt", "{{env.SDK8_DIR}}/Include/winrt", "{{env.SDK8_DIR}}/Include/um", "{{env.SDK8_DIR}}/Include/shared"]
defines: ["DM_PLATFORM_WINDOWS", "LUA_BYTECODE_ENABLE_64", "_CRT_SECURE_NO_WARNINGS", "_WINSOCK_DEPRECATED_NO_WARNINGS", "__STDC_LIMIT_MACROS", "WINVER=0x0600", "WIN32"]
flags: ["-O2", "-Wall", "-Werror=format", "-fvisibility=hidden"]
linkFlags: ["-O2", "-fuse-ld=lld", "-Wl,/entry:mainCRTStartup", "-Wl,/safeseh:no"]
libs: ["OpenGL32", "Delayimp", "User32", "shell32", "Xinput9_1_0", "OpenAL32", "WS2_32", "IPHlpApi", "DbgHelp", "AdvAPI32", "Psapi"]
symbols: []
exePrefix: ''
exeExt: '.exe'
shlibRe: '(.+).dll'
stlibRe: '(.+).lib'
sourceRe: '(?i).*(\.cpp|\.c|\.cc|\.cxx|\.c\+\+)'
writeLibPattern: '%s.lib'
writeExePattern: 'dmengine.exe'
zipContentPattern: 'dmengine.exe'
symbolsPattern: '.*pdb'
allowedLibs: ["(\\w[\\w\\.+-]+)"]
allowedFlags: ["-Wa,{{comma_separated_arg}}","-W{{warning}}","-Wno-{{warning}}","-ansi","--ansi","-std-default={{arg}}","-stdlib=(libstdc\\+\\+|libc\\+\\+)","-w","-std=(c89|c99|c\\+\\+98|c\\+\\+0x|c\\+\\+11|c\\+\\+14|c\\+\\+17)","-Wp,{{comma_separated_arg}}","--extra-warnings","--warn-{{warning}}","--warn-={{warning}}","-ferror-limit={{number}}","-O([0-4]?|fast|s|z)","-rdynamic","-Wl,[-_a-zA-Z0-9]+","-fno-rtti","-fpermissive","-Wl,/subsystem:(console|windows)","-Wl,/entry:\\w+","-f\\w[\\w-=]+"]
compileCmd: 'clang++ -target x86_64-pc-win32-msvc -m64 -g -gcodeview {{#defines}}-D{{{.}}} {{/defines}} {{#flags}}{{{.}}} {{/flags}} {{#platformIncludes}}-isystem {{{.}}} {{/platformIncludes}} {{#ext.includes}}-I{{{.}}} {{/ext.includes}} {{#includes}}-I{{{.}}} {{/includes}} {{src}} -c -o {{tgt}}'
linkCmd: 'clang++ -target x86_64-pc-win32-msvc -m64 -g -o {{tgt}} {{#linkFlags}}{{{.}}} {{/linkFlags}} {{#ext.libPaths}}-L{{{.}}} {{/ext.libPaths}} {{#libs}}-l{{{.}}} {{/libs}} {{#ext.libs}}-l{{{.}}} {{/ext.libs}} {{#libPaths}}-L{{{.}}} {{/libPaths}} {{#engineLibs}}-l{{{.}}} {{/engineLibs}} {{#src}}{{{.}}} {{/src}}'
libCmd: '/usr/bin/ar rcs {{tgt}} {{#objs}}{{{.}}} {{/objs}}'
windresCmd: 'windres -i {{dynamo_home}}/lib/x86_64-win32/engine.rc -O coff -o {{tgt}}'
FROM ubuntu:16.04
# Base stuff
RUN \
echo "LINUX TOOLS + COMPILER" && \
dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -y software-properties-common && \
add-apt-repository ppa:openjdk-r/ppa && \
apt-get update && \
apt-get install -y --no-install-recommends \
wget \
locales \
openjdk-11-jdk \
gcc \
g++ \
gcc-multilib \
g++-multilib \
libssl-dev \
openssl \
libtool \
autoconf \
automake \
uuid-dev \
libxi-dev \
libopenal-dev \
libgl1-mesa-dev \
libglw1-mesa-dev \
freeglut3-dev \
unzip \
tree \
silversearcher-ag \
less \
nano \
zlib1g:i386 && \
# cleanup
rm -rf /var/lib/apt/lists/* && \
rm -rf /var/cache/oracle-jdk8-installer
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
# Add extender user
RUN useradd -r -u 2222 extender && \
mkdir -p /var/extender && \
chown extender: /var/extender && \
chown extender: $(readlink -f /usr/bin/java) && \
chmod +s $(readlink -f /usr/bin/java)
ARG S3_URL
# Put all SDK's into a single folder (just as we do in the regular engine build)
ENV PLATFORMSDK_DIR /opt/platformsdk
RUN mkdir $PLATFORMSDK_DIR
# These packages are downloaded from here: http://releases.llvm.org/download.html
# and then uploaded as-is to S3
RUN wget -q -O - ${S3_URL}/clang%2Bllvm-9.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz | tar xJ -C /usr/local --strip-components=1
# Darwin
RUN locale-gen en_US.UTF-8
ENV LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8
RUN \
ln -s /usr/local/bin/llvm-ar /usr/local/bin/ar && \
ln -s /usr/local/bin/clang /usr/local/bin/x86_64-pc-win32-clang && \
ln -s /usr/local/bin/llvm-ar /usr/local/bin/x86_64-pc-win32-clang-ar
#
# Windows
#
ENV \
PLATFORMSDK_WIN32=$PLATFORMSDK_DIR/Win32 \
WINDOWS_SDK_10_VERSION=10.0.18362.0 \
WINDOWS_MSVC_2019_VERSION=14.23.28105
# windres: Allows for generating .res files that can be used during linking
RUN \
echo "Win32 SDK - WINDRES" && \
apt-get update && \
apt-get install -y binutils-mingw-w64-x86-64 && \
ls -la /usr/bin/x86_64-w64-mingw32-windres && \
ln -s /usr/bin/x86_64-w64-mingw32-windres /usr/local/bin/windres
RUN \
echo "WIN32 2019 SDK" && \
mkdir -p ${PLATFORMSDK_WIN32}/WindowsKits && \
wget -q -O - ${S3_URL}/WindowsKits-8.1_slim.tar.gz | tar xz -C ${PLATFORMSDK_WIN32}/WindowsKits && \
wget -q -O - ${S3_URL}/WindowsKits-${WINDOWS_SDK_10_VERSION}.tar.gz | tar xz -C ${PLATFORMSDK_WIN32}/WindowsKits && \
mkdir ${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2019 && \
wget -q -O - ${S3_URL}/Microsoft-Visual-Studio-2019-${WINDOWS_MSVC_2019_VERSION}.tar.gz | tar xz -C ${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2019
RUN \
echo "WIN32 2015 SDK" && \
wget -q -O - ${S3_URL}/Microsoft-Visual-Studio-14-0.tar.gz | tar xz -C ${PLATFORMSDK_WIN32} && \
mv ${PLATFORMSDK_WIN32}/Microsoft\ Visual\ Studio\ 14.0 ${PLATFORMSDK_WIN32}/MicrosoftVisualStudio14.0 && \
rm -rf ${PLATFORMSDK_WIN32}/MicrosoftVisualStudio14.0/Common7/IDE && \
wget -q -O - ${S3_URL}/WindowsKits-10.0.tar.gz | tar xz -C ${PLATFORMSDK_WIN32}/WindowsKits
# Due to Windows' case insensitive file system, the sources reference lib files with wrong cases
# so we solve the bulk by making the suffixes lowercase
RUN find $PLATFORMSDK_WIN32 -iname '*.Lib' -exec sh -c 'a=$(echo "$0" | sed -r "s/([^.]*)\$/\L\1/"); [ "$a" != "$0" ] && mv "$0" "$a" ' {} \;
# Make a copy of all the headers too, in lower case (e.g. Windows.h -> windows.h etc)
RUN find $PLATFORMSDK_WIN32 -iname '*.h' -exec sh -c 'd=$(dirname "$0"); a=$(basename "$0" | tr [:upper:] [:lower:]); [ "$a" != $(basename "$0") ] && cp "$0" "$d/$a" ' {} \;
# Grabbed after a starting MSVC 2019, and choosing "Tools -> Command Line -> Developer Command Prompt"
# Note: VCINSTALLDIR is special since clang will use it as the last "-internal-isystem" option
ENV \
VCINSTALLDIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio14.0/VC/" \
VSINSTALLDIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio14.0/" \
WINDOWS_MSVC_2015_DIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio14.0/VC/" \
WINDOWS_MSVC_2019_DIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2019/VC/Tools/MSVC/${WINDOWS_MSVC_2019_VERSION}/" \
WINDOWS_SDK_8_DIR="${PLATFORMSDK_WIN32}/WindowsKits/8.1/" \
WINDOWS_SDK_10_DIR="${PLATFORMSDK_WIN32}/WindowsKits/10/" \
VS140COMNTOOLS="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio14.0/Common7/Tools/" \
VS160COMNTOOLS="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2019/Common7/Tools/" \
WINDOWS_VCINSTALLDIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2019/VC/Tools/MSVC/${WINDOWS_MSVC_2019_VERSION}/" \
WINDOWS_VSINSTALLDIR="${PLATFORMSDK_WIN32}/MicrosoftVisualStudio2019/" \
WindowsLibPath="${PLATFORMSDK_WIN32}/WindowsKits/8.1/References/CommonConfiguration/Neutral" \
WindowsSdkDir="${PLATFORMSDK_WIN32}/WindowsKits/8.1/" \
WindowsSDKLibVersion="winv6.3/" \
WindowsSDKVersion="/"
# # and the rest are manually copied (or made lower case)
RUN \
echo "WIN32 SDK - Cleanup" && \
(cd ${WINDOWS_MSVC_2015_DIR}/lib/amd64 && cp oldnames.lib OLDNAMES.lib) && \
(cd ${WINDOWS_MSVC_2015_DIR}/lib && cp oldnames.lib OLDNAMES.lib) && \
(cd ${WINDOWS_MSVC_2015_DIR}/lib/amd64 && cp delayimp.lib Delayimp.lib) && \
(cd ${WINDOWS_MSVC_2015_DIR}/lib && cp delayimp.lib Delayimp.lib) && \
(cd ${WINDOWS_MSVC_2019_DIR}/lib/x64 && cp oldnames.lib OLDNAMES.lib) && \
(cd ${WINDOWS_MSVC_2019_DIR}/lib/x86 && cp oldnames.lib OLDNAMES.lib) && \
(cd ${WINDOWS_MSVC_2019_DIR}/lib/x64 && cp delayimp.lib Delayimp.lib) && \
(cd ${WINDOWS_MSVC_2019_DIR}/lib/x86 && cp delayimp.lib Delayimp.lib) && \
(cd ${WINDOWS_SDK_8_DIR}/Include/shared && cp driverspecs.h DriverSpecs.h) && \
(cd ${WINDOWS_SDK_8_DIR}/Include/shared && cp specstrings.h SpecStrings.h) && \
(cd ${WINDOWS_SDK_8_DIR}/Include/shared && cp concurrencysal.h ConcurrencySal.h) && \
(cd ${WINDOWS_SDK_8_DIR}/Lib/winv6.3/um/x64 && find . -type f -exec sh -c 'x="{}"; xl=$(echo $x | sed -e "s/\(.*\)/\L\1/"); if [ $x != $xl ]; then cp $x $xl; fi' \;) && \
(cd ${WINDOWS_SDK_8_DIR}/Lib/winv6.3/um/x86 && find . -type f -exec sh -c 'x="{}"; xl=$(echo $x | sed -e "s/\(.*\)/\L\1/"); if [ $x != $xl ]; then cp $x $xl; fi' \;)
# Always run last to minimize the size
RUN apt-get clean autoclean autoremove
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment