Link Time Optimization #762
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright 2013-2019 High Fidelity, Inc. | |
# Copyright 2020-2022 Vircadia contributors. | |
# Copyright 2021-2022 Overte e.V. | |
# SPDX-License-Identifier: Apache-2.0 | |
name: Pull Request CI Build | |
# Keep in mind that GitHub Actions does not allow reading secrets during PR builds. | |
on: | |
pull_request: | |
types: [opened, synchronize, reopened] | |
env: | |
APP_NAME: interface | |
BUILD_TYPE: Release | |
CI_BUILD: Github | |
GIT_COMMIT: ${{ github.event.pull_request.head.sha }} | |
# VCPKG did not build well on OSX disabling HIFI_VCPKG_BOOTSTRAP, which invokes a download to a working version of vcpkg | |
# HIFI_VCPKG_BOOTSTRAP: true | |
RELEASE_TYPE: PR | |
RELEASE_NUMBER: ${{ github.event.number }} | |
VERSION_CODE: ${{ github.event.number }} | |
# Sentry Crash Reporting | |
# We can't use secrets or actions here, so the actual value has to be hardcoded. | |
CMAKE_BACKTRACE_URL: "https://o4504831972343808.ingest.sentry.io/api/4504832427950080/minidump/?sentry_key=f511de295975461b8f92a36f4a4a4f32" | |
CMAKE_BACKTRACE_TOKEN: PR_${{ github.event.number }}_${{ github.sha }} | |
UPLOAD_BUCKET: overte-public | |
UPLOAD_REGION: fra1 | |
UPLOAD_ENDPOINT: "https://fra1.digitaloceanspaces.com" | |
# OSX specific variables | |
DEVELOPER_DIR: /Applications/Xcode_11.2.app/Contents/Developer | |
# We are using macOS SDK 10.12 to work around a lot of OpenGL issues in newer SDKs. | |
# There are crashes on startup, crashes on window resize, etc. on newer macOS SDKs. | |
MACOSX_DEPLOYMENT_TARGET: '10.12' | |
# WIN32 specific variables | |
PreferredToolArchitecture: X64 | |
# Ensure XZ always runs with muticore support | |
XZ_OPT: -T0 | |
jobs: | |
build_pr: | |
name: "${{matrix.os}}, ${{matrix.arch}}" | |
strategy: | |
matrix: | |
include: | |
- os: Windows 2019 | |
runner: windows-2019 | |
arch: x86_64 | |
build_type: full | |
#- os: macOS-10.15 | |
# build_type: full | |
- os: Ubuntu 20.04 | |
runner: ubuntu-20.04 | |
arch: amd64 | |
build_type: full | |
apt-dependencies: mesa-common-dev libegl1 libglvnd-dev libdouble-conversion3 libpulse0 libsnappy1v5 libwebpdemux2 libwebpmux3 python3-distro | |
# Android builds are currently failing | |
#- os: ubuntu-18.04 | |
# build_type: android | |
# apt-dependencies: mesa-common-dev libegl1 libglvnd-dev libdouble-conversion1 libpulse0 python3-github python3-distro | |
# Do not change the names of self-hosted runners without knowing what you are doing, as they correspond to labels that have to be set on the runner. | |
- os: Ubuntu 22.04 | |
runner: linux_aarch64 | |
arch: aarch64 | |
build_type: full | |
image: docker.io/overte/overte-full-build:0.1.1-ubuntu-22.04-aarch64 | |
fail-fast: false | |
runs-on: ${{matrix.runner}} | |
container: ${{matrix.image}} | |
steps: | |
- name: Configure Build Environment 1 | |
shell: bash | |
id: buildenv1 | |
run: | | |
# Setting short commit SHA for use as RELEASE_NAME in generated installers. | |
echo "GIT_COMMIT_SHORT=`echo $GIT_COMMIT | cut -c1-7`" >> $GITHUB_ENV | |
echo "JOB_NAME=${{matrix.os}}, ${{matrix.build_type}}" >> $GITHUB_ENV | |
echo "APP_TARGET_NAME=$APP_NAME" >> $GITHUB_ENV | |
# Linux build variables | |
if [[ "${{ matrix.os }}" = "Ubuntu"* ]]; then | |
echo "PYTHON_EXEC=python3" >> $GITHUB_ENV | |
echo "INSTALLER_EXT=*" >> $GITHUB_ENV | |
echo "CMAKE_BUILD_EXTRA=-- -j$(nproc)" >> $GITHUB_ENV | |
# Don't optimize builds to save build time. | |
echo "OVERTE_OPTIMIZE=false" >> $GITHUB_ENV | |
# Starting with Ubuntu 22.04 we can use system Qt | |
if [[ "${{ matrix.image }}" = *"ubuntu-22.04"* ]]; then | |
echo "OVERTE_USE_SYSTEM_QT=true" >> $GITHUB_ENV | |
fi | |
if [[ "${{ matrix.arch }}" = "aarch64" ]]; then | |
echo "VCPKG_FORCE_SYSTEM_BINARIES=true" >> $GITHUB_ENV | |
if [ "${{ matrix.build_type }}" = "full" ]; then | |
echo "CMAKE_EXTRA=-DOVERTE_CPU_ARCHITECTURE= -DBUILD_TOOLS:BOOLEAN=FALSE -DHIFI_PYTHON_EXEC:FILEPATH=$(which python3)" >> $GITHUB_ENV | |
else | |
echo "CMAKE_EXTRA=-DOVERTE_CPU_ARCHITECTURE= -DCLIENT_ONLY=1 -DBUILD_TOOLS:BOOLEAN=FALSE -DHIFI_PYTHON_EXEC:FILEPATH=$(which python3)" >> $GITHUB_ENV | |
fi | |
fi | |
if [[ "${{ matrix.arch }}" = "amd64" ]]; then | |
if [ "${{ matrix.build_type }}" = "full" ]; then | |
echo "CMAKE_EXTRA=-DOVERTE_CPU_ARCHITECTURE=-msse3 -DBUILD_TOOLS:BOOLEAN=FALSE -DHIFI_PYTHON_EXEC:FILEPATH=$(which python3)" >> $GITHUB_ENV | |
else | |
echo "CMAKE_EXTRA=-DOVERTE_CPU_ARCHITECTURE=-msse3 -DCLIENT_ONLY=1 -DBUILD_TOOLS:BOOLEAN=FALSE -DHIFI_PYTHON_EXEC:FILEPATH=$(which python3)" >> $GITHUB_ENV | |
fi | |
fi | |
fi | |
# Mac build variables | |
if [ "${{ matrix.os }}" = "macOS-10.15" ]; then | |
echo "PYTHON_EXEC=python3" >> $GITHUB_ENV | |
echo "INSTALLER_EXT=dmg" >> $GITHUB_ENV | |
if [ "${{ matrix.build_type }}" = "full" ]; then | |
echo "CMAKE_EXTRA=-DOVERTE_CPU_ARCHITECTURE= -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=OFF -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib -G Xcode" >> $GITHUB_ENV | |
else | |
echo "CMAKE_EXTRA=-DOVERTE_CPU_ARCHITECTURE= -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -DCLIENT_ONLY=1 -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=OFF -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib -G Xcode" >> $GITHUB_ENV | |
fi | |
echo "APP_TARGET_NAME=Overte" >> $GITHUB_ENV | |
fi | |
# Windows build variables | |
if [ "${{ matrix.os }}" = "Windows 2019" ]; then | |
echo "PYTHON_EXEC=python" >> $GITHUB_ENV | |
echo "INSTALLER_EXT=exe" >> $GITHUB_ENV | |
if [ "${{ matrix.build_type }}" = "full" ]; then | |
echo "CMAKE_EXTRA=-A x64" >> $GITHUB_ENV | |
else | |
echo "CMAKE_EXTRA=-A x64 -DCLIENT_ONLY=1" >> $GITHUB_ENV | |
fi | |
fi | |
# Android + Quest build variables | |
if [[ "${{ matrix.build_type }}" == "android" ]]; then | |
HIFI_ANDROID_PRECOMPILED="${{runner.workspace}}/dependencies" | |
echo "HIFI_ANDROID_PRECOMPILED=$HIFI_ANDROID_PRECOMPILED" >> $GITHUB_ENV | |
mkdir $HIFI_ANDROID_PRECOMPILED | |
echo "INSTALLER_EXT=apk" >> $GITHUB_ENV | |
fi | |
# Configuration is broken into two steps because you can't set an env var and also reference it in the same step | |
- name: Configure Build Environment 2 | |
shell: bash | |
run: | | |
echo "${{ steps.buildenv1.outputs.symbols_archive }}" | |
if [ "${{ matrix.build_type }}" = "full" ]; then | |
echo "ARTIFACT_PATTERN=Overte-PR${{ github.event.number }}-${GIT_COMMIT_SHORT}.$INSTALLER_EXT" >> $GITHUB_ENV | |
echo "INSTALLER=Overte-$RELEASE_NUMBER-${GIT_COMMIT_SHORT}.$INSTALLER_EXT" >> $GITHUB_ENV | |
else | |
echo "ARTIFACT_PATTERN=Overte-Interface-PR${{ github.event.number }}-${GIT_COMMIT_SHORT}.$INSTALLER_EXT" >> $GITHUB_ENV | |
echo "INSTALLER=Overte-Interface-$RELEASE_NUMBER-${GIT_COMMIT_SHORT}.$INSTALLER_EXT" >> $GITHUB_ENV | |
fi | |
- name: Clear Working Directories | |
if: contains(matrix.runner, 'linux_aarch64') | |
shell: bash | |
run: | | |
rm -rf ./* | |
rm -rf ~/overte-files | |
rm -rf ~/.cache | |
- uses: actions/checkout@v3 | |
with: | |
submodules: false | |
fetch-depth: 1 | |
- name: Install dependencies | |
shell: bash | |
if: startsWith(matrix.os, 'Ubuntu') || contains(matrix.os, 'Debian') || startsWith(matrix.os, 'macOS') | |
run: | | |
if [[ "${{ matrix.os }}" =~ "Ubuntu" || "${{ matrix.os }}" =~ "Debian" ]]; then | |
echo "Updating apt repository index" | |
sudo apt update || exit 1 | |
echo "Installing apt packages" | |
sudo apt install -y ${{ matrix.apt-dependencies }} || exit 1 | |
else # macOS | |
echo "Downloading MacOSX10.12 SDK.." | |
curl --progress-bar -L -o macOS_SDK10.12.4.tar.xz "https://data.moto9000.moe/overte_packages/macOS_SDK10.12.4.tar.xz" || exit 1 | |
echo " done\n" | |
echo "Checking MacOSX10.12 SDK.." | |
echo "c00e03cb64bed8d0d75d7a01c93de094b6ffaa3bc3318e7b29a9bdc354f0e29e363c454b7db89db8a3b78e9702668d1c661f1af279807de8db11accecb0ca498 macOS_SDK10.12.4.tar.xz" >> macOS_SDK10.12.4.tar.xz.checksum | |
shasum -a 512 -w -c macOS_SDK10.12.4.tar.xz.checksum | |
echo "Extracting MacOSX10.12 SDK.." | |
tar -xf macOS_SDK10.12.4.tar.xz || exit 1 | |
echo " done\n" | |
echo "Installing MacOSX10.12 SDK.." | |
# cp always sets an error code while copying the SDK so we return 0 when that happens. | |
sudo cp -rp MacOSX10.12.sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ || exit 0 | |
echo " done" | |
fi | |
if [[ "${{ matrix.os }}" =~ "Debian 11" ]]; then | |
echo "Installing CMake from Debian Backports" | |
echo deb http://deb.debian.org/debian bullseye-backports main > /etc/apt/sources.list.d/bullseye-backports.list | |
sudo apt update | |
sudo apt-get -t bullseye-backports install -y cmake | |
fi | |
- name: Override NSIS | |
shell: pwsh | |
if: startsWith(matrix.os, 'Windows') | |
run: choco install nsis --version=3.06.1 | |
- name: Install Python modules | |
if: startsWith(matrix.os, 'Windows') || startsWith(matrix.os, 'macOS') | |
shell: bash | |
run: $PYTHON_EXEC -m pip install boto3 PyGithub | |
- name: Create Build Environment | |
shell: bash | |
run: cmake -E make_directory ./build | |
- name: Configure CMake | |
working-directory: build | |
shell: bash | |
run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DVCPKG_BUILD_TYPE=release $CMAKE_EXTRA | |
- name: Compress cmake logs | |
if: always() | |
shell: bash | |
run: | | |
if [ "${{ matrix.os }}" == "macOS-10.15" ]; then | |
TAR=gtar | |
else | |
TAR=tar | |
fi | |
find "$HOME/overte-files/vcpkg" -name '*log' -type f -print0 | $TAR --null --force-local -T - -c --xz -v -f "./cmake-logs-${{ matrix.os }}-${{ github.event.number }}.tar.xz" | |
- name: Archive cmake logs | |
if: always() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: cmake-logs-${{ matrix.os }}-${{ github.event.number }}.tar.xz | |
path: ./cmake-logs-${{ matrix.os }}-${{ github.event.number }}.tar.xz | |
if-no-files-found: error | |
- name: Build Application | |
if: matrix.build_type == 'full' || matrix.build_type == 'client' | |
working-directory: build | |
shell: bash | |
run: cmake --build . --config $BUILD_TYPE --target $APP_TARGET_NAME $CMAKE_BUILD_EXTRA | |
- name: Build Domain Server | |
if: matrix.build_type == 'full' | |
working-directory: build | |
shell: bash | |
run: cmake --build . --config $BUILD_TYPE --target domain-server $CMAKE_BUILD_EXTRA | |
- name: Build Assignment Client | |
if: matrix.build_type == 'full' | |
working-directory: build | |
shell: bash | |
run: cmake --build . --config $BUILD_TYPE --target assignment-client $CMAKE_BUILD_EXTRA | |
- name: Build Console | |
if: matrix.build_type == 'full' && matrix.arch != 'aarch64' || startsWith(matrix.os, 'windows') | |
working-directory: build | |
shell: bash | |
run: | | |
cmake --build . --config $BUILD_TYPE --target packaged-server-console $CMAKE_BUILD_EXTRA | |
- name: Build Installer | |
if: matrix.build_type != 'android' && matrix.arch != 'aarch64' | |
working-directory: build | |
shell: bash | |
run: | | |
echo "Retry code from https://unix.stackexchange.com/a/137639" | |
function fail { | |
echo $1 >&2 | |
exit 1 | |
} | |
function retry { | |
local n=1 | |
local max=5 | |
local delay=15 | |
while true; do | |
"$@" && break || { | |
if [[ $n -lt $max ]]; then | |
((n++)) | |
echo "Command failed. Attempt $n/$max:" | |
sleep $delay; | |
else | |
fail "The command has failed after $n attempts." | |
fi | |
} | |
done | |
} | |
retry cmake --build . --config $BUILD_TYPE --target package $CMAKE_BUILD_EXTRA | |
# As of 05/17/21 GitHub Virtual Environments changed their "Ubuntu 18.04.5 LTS" image to include two versions of CMake for Android | |
# https://github.com/actions/virtual-environments/blob/ubuntu18/20210517.1/images/linux/Ubuntu1804-README.md | |
# Removing 3.18.1 version of CMake as its not compatible with our Android build. | |
# It will fall back to 3.10.2 which is already installed | |
- name: Nuke CMake 3.18.1-g262b901 | |
if: matrix.build_type == 'android' | |
shell: bash | |
run: | | |
/usr/local/lib/android/sdk/tools/bin/sdkmanager --uninstall 'cmake;3.18.1' | |
- name: Build for Android + Quest | |
if: matrix.build_type == 'android' | |
shell: bash | |
working-directory: ${{runner.workspace}}/overte | |
run: | | |
echo "Pre-cache the vcpkg managed dependencies" | |
$PYTHON_EXEC prebuild.py --build-root ${{runner.workspace}}/build --android interface | |
cd android | |
# Pre-cache the gradle dependencies | |
./gradlew -m tasks -PHIFI_ANDROID_PRECOMPILED=$HIFI_ANDROID_PRECOMPILED | |
# Build! | |
./build_android.sh | |
- name: Output system stats | |
if: ${{ always() }} | |
working-directory: build | |
shell: bash | |
run: | | |
echo "Disk usage:" | |
df -h | |
- name: Output Installer Logs | |
if: failure() && startsWith(matrix.os, 'Windows') | |
shell: bash | |
working-directory: build | |
run: cat ./_CPack_Packages/win64/NSIS/NSISOutput.log | |
- name: Upload Artifact | |
if: startsWith(matrix.os, 'Windows') || startsWith(matrix.os, 'macOS') | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ env.ARTIFACT_PATTERN }} | |
path: ./build/${{ env.ARTIFACT_PATTERN }} | |
if-no-files-found: error | |
- name: Clear Working Directories | |
if: contains(matrix.runner, 'linux_aarch64') | |
shell: bash | |
run: | | |
rm -rf ./* | |
rm -rf ~/overte-files | |
rm -rf ~/.cache |