Travis build hacking #1837
Workflow file for this run
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
name: Build and test GAM | |
on: | |
push: | |
defaults: | |
run: | |
shell: bash | |
working-directory: src | |
env: | |
SCRATCH_COUNTER: 1 | |
OPENSSL_CONFIG_OPTS: no-fips --api=3.0.0 | |
OPENSSL_INSTALL_PATH: ${{ github.workspace }}/bin/ssl | |
OPENSSL_SOURCE_PATH: ${{ github.workspace }}/src/openssl | |
PYTHON_INSTALL_PATH: ${{ github.workspace }}/bin/python | |
PYTHON_SOURCE_PATH: ${{ github.workspace }}/src/cpython | |
jobs: | |
build: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-24.04 | |
jid: 1 | |
goal: build | |
arch: x86_64 | |
openssl_archs: linux-x86_64 | |
- os: ubuntu-22.04 | |
jid: 2 | |
goal: build | |
arch: x86_64 | |
openssl_archs: linux-x86_64 | |
- os: ubuntu-20.04 | |
jid: 3 | |
goal: build | |
arch: x86_64 | |
openssl_archs: linux-x86_64 | |
- os: ubuntu-20.04 | |
jid: 4 | |
goal: build | |
arch: x86_64 | |
openssl_archs: linux-x86_64 | |
staticx: yes | |
- os: macos-13 | |
jid: 5 | |
goal: build | |
arch: x86_64 | |
openssl_archs: darwin64-x86_64 | |
- os: macos-14 | |
jid: 6 | |
goal: build | |
arch: arm64 | |
openssl_archs: darwin64-arm64 | |
- os: windows-2022 | |
jid: 7 | |
goal: build | |
arch: Win64 | |
openssl_archs: VC-WIN64A | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
fetch-depth: 0 | |
- name: Cache multiple paths | |
if: matrix.goal == 'build' | |
uses: actions/cache@v4 | |
id: cache-python-ssl | |
with: | |
path: | | |
cache.tar.xz | |
key: gam-${{ matrix.jid }}-20241203 | |
- name: Untar Cache archive | |
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit == 'true' | |
working-directory: ${{ github.workspace }} | |
run: | | |
tar xvvf cache.tar.xz | |
- name: Use pre-compiled Python for testing | |
if: matrix.python != '' | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python }} | |
#allow-prereleases: true | |
- name: common variables for all runs | |
env: | |
arch: ${{ matrix.arch }} | |
JID: ${{ matrix.jid }} | |
ACTIONS_CACHE: ${{ steps.cache-python-ssl.outputs.cache-hit }} | |
ACTIONS_GOAL: ${{ matrix.goal }} | |
run: | | |
echo "arch=${arch}" >> $GITHUB_ENV | |
echo "JID=${JID}" >> $GITHUB_ENV | |
echo "ACTIONS_CACHE=${ACTIONS_CACHE}" >> $GITHUB_ENV | |
echo "ACTIONS_GOAL=${ACTIONS_GOAL}" >> $GITHUB_ENV | |
curl_version=$(curl --version | head -n 1 | awk '{ print $2 }') | |
echo "cURL is ${curl_version}" | |
if [ "$curl_version" == "7.68.0" ]; then | |
export curl_retry="--retry 5 --retry-connrefused" | |
else | |
export curl_retry="--retry 5 --retry-all-errors" | |
fi | |
echo "curl_retry=${curl_retry}" >> $GITHUB_ENV | |
# GAMCFGDIR should be recreated on every run | |
GAMCFGDIR="${RUNNER_TEMP}/.gam" | |
if [ "$arch" == "Win64" ]; then | |
GAMCFGDIR=$(cygpath -u "$GAMCFGDIR") | |
fi | |
echo "GAMCFGDIR=${GAMCFGDIR}" >> $GITHUB_ENV | |
echo "GAMCFGDIR is: ${GAMCFGDIR}" | |
if [[ "${RUNNER_OS}" == "macOS" ]]; then | |
GAMOS="macos" | |
elif [[ "${RUNNER_OS}" == "Linux" ]]; then | |
GAMOS="linux" | |
elif [[ "${RUNNER_OS}" == "Windows" ]]; then | |
GAMOS="windows" | |
else | |
GAMOS='unknown' | |
fi | |
echo "GAMOS=${GAMOS}" >> $GITHUB_ENV | |
echo "GAMOS is: ${GAMOS}" | |
- name: Install necessary Github-hosted Linux packages | |
if: runner.os == 'Linux' && runner.arch == 'X64' | |
run: | | |
echo "RUNNING: apt update..." | |
sudo apt-get -qq --yes update | |
sudo apt-get -qq --yes install swig libpcsclite-dev libxslt1-dev libsqlite3-dev | |
- name: MacOS install tools | |
if: runner.os == 'macOS' | |
run: | | |
# Install latest Rust | |
curl $curl_retry -fsS -o rust.sh https://sh.rustup.rs | |
bash ./rust.sh -y | |
source $HOME/.cargo/env | |
# Install needed packages | |
# brew update | |
# brew install gpg | |
brew install swig | |
#brew install ncurses | |
- name: Windows Configure VCode | |
uses: ilammy/msvc-dev-cmd@v1 | |
if: runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
with: | |
arch: ${{ matrix.arch }} | |
- name: Set Env Variables for build | |
if: matrix.goal == 'build' | |
env: | |
openssl_archs: ${{ matrix.openssl_archs }} | |
staticx: ${{ matrix.staticx }} | |
run: | | |
echo "We are running on ${RUNNER_OS}" | |
LD_LIBRARY_PATH="${OPENSSL_INSTALL_PATH}/lib:${PYTHON_INSTALL_PATH}/lib:/usr/local/lib" | |
if [[ "${arch}" == "Win64" ]]; then | |
PYEXTERNALS_PATH="amd64" | |
PYBUILDRELEASE_ARCH="x64" | |
GAM_ARCHIVE_ARCH="x86_64" | |
WIX_ARCH="x64" | |
CHOC_OPS="" | |
fi | |
if [[ "${RUNNER_OS}" == "macOS" ]]; then | |
MAKE=make | |
MAKEOPT="-j$(sysctl -n hw.logicalcpu)" | |
PERL=perl | |
MACOSX_DEPLOYMENT_TARGET=$(sw_vers -productVersion | awk -F '.' '{print $1 "." $2}') | |
echo "MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET}" >> $GITHUB_ENV | |
echo "We are running on and targetting MacOS ${MACOSX_DEPLOYMENT_TARGET}" | |
echo "PYTHON=${PYTHON_INSTALL_PATH}/bin/python3" >> $GITHUB_ENV | |
elif [[ "${RUNNER_OS}" == "Linux" ]]; then | |
MAKE=make | |
MAKEOPT="-j$(nproc)" | |
PERL=perl | |
echo "PYTHON=${PYTHON_INSTALL_PATH}/bin/python3" >> $GITHUB_ENV | |
elif [[ "${RUNNER_OS}" == "Windows" ]]; then | |
MAKE=nmake | |
MAKEOPT="" | |
PERL="c:\strawberry\perl\bin\perl.exe" | |
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${PYTHON_SOURCE_PATH}/PCbuild/${PYEXTERNALS_PATH}" | |
echo "PYTHON=${PYTHON_SOURCE_PATH}/PCbuild/${PYEXTERNALS_PATH}/python.exe" >> $GITHUB_ENV | |
echo "GAM_ARCHIVE_ARCH=${GAM_ARCHIVE_ARCH}" >> $GITHUB_ENV | |
echo "WIX_ARCH=${WIX_ARCH}" >> $GITHUB_ENV | |
fi | |
echo "We'll run make with: ${MAKEOPT}" | |
echo "staticx=${staticx}" >> $GITHUB_ENV | |
echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> $GITHUB_ENV | |
echo "MAKE=${MAKE}" >> $GITHUB_ENV | |
echo "MAKEOPT=${MAKEOPT}" >> $GITHUB_ENV | |
echo "PERL=${PERL}" >> $GITHUB_ENV | |
echo "PYEXTERNALS_PATH=${PYEXTERNALS_PATH}" >> $GITHUB_ENV | |
echo "PYBUILDRELEASE_ARCH=${PYBUILDRELEASE_ARCH}" >> $GITHUB_ENV | |
echo "openssl_archs=${openssl_archs}" >> $GITHUB_ENV | |
- name: Get latest stable OpenSSL source | |
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
run: | | |
mkdir -vp "${GITHUB_WORKSPACE}/src" | |
cd "${GITHUB_WORKSPACE}/src" | |
git clone https://github.com/openssl/openssl.git | |
cd "${OPENSSL_SOURCE_PATH}" | |
export LATEST_STABLE_TAG=$(git tag --list openssl-* | grep -v alpha | grep -v beta | sort -Vr | head -n1) | |
echo "Checking out version ${LATEST_STABLE_TAG}" | |
git checkout "${LATEST_STABLE_TAG}" | |
export COMPILED_OPENSSL_VERSION=${LATEST_STABLE_TAG:8} # Trim the openssl- prefix | |
echo "COMPILED_OPENSSL_VERSION=${COMPILED_OPENSSL_VERSION}" >> $GITHUB_ENV | |
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then | |
for openssl_arch in $openssl_archs; do | |
ssldir="${OPENSSL_SOURCE_PATH}-${openssl_arch}" | |
mkdir -v "${ssldir}" | |
cp -vrf ${OPENSSL_SOURCE_PATH}/* "${ssldir}/" | |
done | |
rm -vrf "${OPENSSL_SOURCE_PATH}" | |
else | |
mv -v "${OPENSSL_SOURCE_PATH}" "${OPENSSL_SOURCE_PATH}-${openssl_archs}" | |
fi | |
- name: Windows NASM Install | |
uses: ilammy/setup-nasm@v1 | |
if: matrix.goal == 'build' && runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
- name: Config OpenSSL | |
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
run: | | |
for openssl_arch in $openssl_archs; do | |
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_arch}" | |
# --libdir=lib is needed so Python can find OpenSSL libraries | |
"${PERL}" ./Configure "${openssl_arch}" --libdir=lib --prefix="${OPENSSL_INSTALL_PATH}" $OPENSSL_CONFIG_OPTS | |
done | |
- name: Rename GNU link on Windows | |
if: matrix.goal == 'build' && runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
shell: bash | |
run: mv /usr/bin/link /usr/bin/gnulink | |
- name: Make OpenSSL | |
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
run: | | |
for openssl_arch in $openssl_archs; do | |
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_arch}" | |
$MAKE "${MAKEOPT}" | |
done | |
- name: Install OpenSSL | |
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
run: | | |
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then | |
for openssl_arch in $openssl_archs; do | |
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_arch}" | |
# install_sw saves us ages processing man pages :-) | |
$MAKE install_sw | |
mv "${OPENSSL_INSTALL_PATH}" "${GITHUB_WORKSPACE}/bin/ssl-${openssl_arch}" | |
done | |
mkdir -vp "${OPENSSL_INSTALL_PATH}/lib" | |
mkdir -vp "${OPENSSL_INSTALL_PATH}/bin" | |
for archlib in libcrypto.3.dylib libssl.3.dylib libcrypto.a libssl.a; do | |
lipo -create "${GITHUB_WORKSPACE}/bin/ssl-darwin64-x86_64/lib/${archlib}" \ | |
"${GITHUB_WORKSPACE}/bin/ssl-darwin64-arm64/lib/${archlib}" \ | |
-output "${GITHUB_WORKSPACE}/bin/ssl/lib/${archlib}" | |
done | |
mv ${GITHUB_WORKSPACE}/bin/ssl-darwin64-x86_64/include ${GITHUB_WORKSPACE}/bin/ssl/ | |
lipo -create "${GITHUB_WORKSPACE}/bin/ssl-darwin64-x86_64/bin/openssl" \ | |
"${GITHUB_WORKSPACE}/bin/ssl-darwin64-arm64/bin/openssl" \ | |
-output "${GITHUB_WORKSPACE}/bin/ssl/bin/openssl" | |
rm -rf ${GITHUB_WORKSPACE}/bin/ssl-darwin64-x86_64 | |
rm -rf ${GITHUB_WORKSPACE}/bin/ssl-darwin64-arm64 | |
else | |
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_archs}" | |
# install_sw saves us ages processing man pages :-) | |
$MAKE install_sw | |
fi | |
if [[ "${RUNNER_OS}" != "Windows" ]]; then | |
echo "LDFLAGS=-L${OPENSSL_INSTALL_PATH}/lib" >> $GITHUB_ENV | |
fi | |
echo "CRYPTOGRAPHY_SUPPRESS_LINK_FLAGS=1" >> $GITHUB_ENV | |
case $arch in | |
universal2) | |
echo "CFLAGS=-I${OPENSSL_INSTALL_PATH}/include -arch arm64 -arch x86_64 ${CFLAGS}" >> $GITHUB_ENV | |
echo "ARCHFLAGS=-arch x86_64 -arch arm64" >> $GITHUB_ENV | |
;; | |
x86_64) | |
echo "CFLAGS=-I${OPENSSL_INSTALL_PATH}/include ${CFLAGS}" >> $GITHUB_ENV | |
echo "ARCHFLAGS=-arch x86_64" >> $GITHUB_ENV | |
;; | |
aarch64) | |
echo "CFLAGS=-I${OPENSSL_INSTALL_PATH}/include ${CFLAGS}" >> $GITHUB_ENV | |
echo "ARCHFLAGS=-arch arm64" >> $GITHUB_ENV | |
;; | |
esac | |
- name: Run OpenSSL | |
if: matrix.goal == 'build' | |
run: | | |
"${OPENSSL_INSTALL_PATH}/bin/openssl" version -a | |
file "${OPENSSL_INSTALL_PATH}/bin/openssl" | |
- name: Get latest stable Python source | |
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
run: | | |
cd "${GITHUB_WORKSPACE}/src" | |
git clone https://github.com/python/cpython.git | |
cd "${PYTHON_SOURCE_PATH}" | |
export LATEST_STABLE_TAG=$(git tag --list | grep -v a | grep -v rc | grep -v b | sort -Vr | head -n1) | |
git checkout "${LATEST_STABLE_TAG}" | |
export COMPILED_PYTHON_VERSION=${LATEST_STABLE_TAG:1} # Trim the "v" prefix | |
echo "COMPILED_PYTHON_VERSION=${COMPILED_PYTHON_VERSION}" >> $GITHUB_ENV | |
- name: Mac/Linux Configure Python | |
if: matrix.goal == 'build' && runner.os != 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
run: | | |
cd "${PYTHON_SOURCE_PATH}" | |
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then | |
extra_args=( "--enable-universalsdk" "--with-universal-archs=universal2" ) | |
else | |
extra_args=( ) | |
fi | |
./configure --with-openssl="${OPENSSL_INSTALL_PATH}" \ | |
--prefix="${PYTHON_INSTALL_PATH}" \ | |
--enable-shared \ | |
--with-ensurepip=upgrade \ | |
--enable-optimizations \ | |
--with-lto \ | |
--disable-test-modules \ | |
"${extra_args[@]}" | |
- name: Windows Get External Python deps | |
if: matrix.goal == 'build' && runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
shell: powershell | |
run: | | |
cd "${env:PYTHON_SOURCE_PATH}" | |
PCBuild\get_externals.bat | |
- name: Windows overwrite external OpenSSL with local | |
if: matrix.goal == 'build' && runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
shell: powershell | |
run: | | |
cd "${env:PYTHON_SOURCE_PATH}" | |
$env:OPENSSL_EXT_PATH = "$(Get-Item externals\openssl-bin-* | Select -exp FullName)\" | |
echo "External OpenSSL was downloaded to ${env:OPENSSL_EXT_PATH}" | |
Remove-Item -recurse -force "${env:OPENSSL_EXT_PATH}*" | |
# Emulate what this script does: | |
# https://github.com/python/cpython/blob/main/PCbuild/openssl.vcxproj | |
$env:OPENSSL_EXT_TARGET_PATH = "${env:OPENSSL_EXT_PATH}${env:PYEXTERNALS_PATH}" | |
echo "Copying our OpenSSL to ${env:OPENSSL_EXT_TARGET_PATH}" | |
mkdir "${env:OPENSSL_EXT_TARGET_PATH}\include\openssl\" | |
Copy-Item -Path "${env:GITHUB_WORKSPACE}/src/openssl-${env:openssl_archs}\LICENSE.txt" -Destination "${env:OPENSSL_EXT_TARGET_PATH}\LICENSE" -Verbose | |
cp -v "$env:OPENSSL_INSTALL_PATH\lib\*" "${env:OPENSSL_EXT_TARGET_PATH}" | |
cp -v "$env:OPENSSL_INSTALL_PATH\bin\*" "${env:OPENSSL_EXT_TARGET_PATH}" | |
cp -v "$env:OPENSSL_INSTALL_PATH\include\openssl\*" "${env:OPENSSL_EXT_TARGET_PATH}\include\openssl\" | |
cp -v "$env:OPENSSL_INSTALL_PATH\include\openssl\applink.c" "${env:OPENSSL_EXT_TARGET_PATH}\include\" | |
- name: Windows Install sphinx-build | |
if: matrix.goal == 'build' && runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
shell: powershell | |
run: | | |
pip install --upgrade pip | |
pip install --upgrade sphinx | |
sphinx-build --version | |
- name: Windows Config/Build Python | |
if: matrix.goal == 'build' && runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
shell: powershell | |
run: | | |
cd "${env:PYTHON_SOURCE_PATH}" | |
# We need out custom openssl.props which uses OpenSSL 3 DLL names | |
Copy-Item -Path "${env:GITHUB_WORKSPACE}\src\tools\openssl.props" -Destination PCBuild\ -Verbose | |
echo "Building for ${env:PYBUILDRELEASE_ARCH}..." | |
PCBuild\build.bat -m --pgo -c Release -p "${env:PYBUILDRELEASE_ARCH}" | |
- name: Mac/Linux Build Python | |
if: matrix.goal == 'build' && runner.os != 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
run: | | |
cd "${PYTHON_SOURCE_PATH}" | |
echo "Running: ${MAKE} ${MAKEOPT}" | |
$MAKE $MAKEOPT | |
- name: Mac/Linux Install Python | |
if: matrix.goal == 'build' && runner.os != 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
run: | | |
cd "${PYTHON_SOURCE_PATH}" | |
$MAKE altinstall | |
$MAKE bininstall | |
export PATH="${PATH}:${PYTHON_INSTALL_PATH}/bin" | |
echo "PATH=${PATH}" >> $GITHUB_ENV | |
echo "PATH: ${PATH}" | |
- name: Run Python | |
run: | | |
"${PYTHON}" -V | |
"${PYTHON}" -c "import ssl; print(f'Using {ssl.OPENSSL_VERSION}')" | |
- name: Upgrade pip, wheel, etc | |
run: | | |
curl $curl_retry -O https://bootstrap.pypa.io/get-pip.py | |
"${PYTHON}" get-pip.py | |
"${PYTHON}" -m pip install --upgrade pip | |
"${PYTHON}" -m pip install --upgrade wheel | |
"${PYTHON}" -m pip install --upgrade setuptools | |
- name: Install pip requirements | |
run: | | |
echo "before anything..." | |
"${PYTHON}" -m pip list | |
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then | |
# cffi is a dep of cryptography and doesn't ship | |
# a universal2 wheel so we must build one ourself :-/ | |
export CFLAGS="-arch x86_64 -arch arm64" | |
export ARCHFLAGS="-arch x86_64 -arch arm64" | |
"${PYTHON}" -m pip install --upgrade --force-reinstall --no-binary :all: \ | |
--no-cache-dir --no-deps --use-pep517 \ | |
--use-feature=no-binary-enable-wheel-cache \ | |
cffi | |
echo "before cryptography..." | |
"${PYTHON}" -m pip list | |
# cryptography has a universal2 wheel but getting it installed | |
# on x86-64 MacOS is a royal pain in the keester. | |
"${PYTHON}" -m pip download --only-binary :all: \ | |
--dest . \ | |
--no-cache \ | |
--no-deps \ | |
--platform macosx_10_15_universal2 \ | |
cryptography | |
"${PYTHON}" -m pip install --force-reinstall --no-deps cryptography*.whl | |
echo "after cryptography..." | |
"${PYTHON}" -m pip list | |
"${PYTHON}" -m pip install --upgrade --no-binary :all: -r requirements.txt | |
else | |
"${PYTHON}" -m pip install --upgrade -r requirements.txt | |
echo "after requirements..." | |
"${PYTHON}" -m pip list | |
"${PYTHON}" -m pip install --force-reinstall --no-deps --upgrade cryptography | |
fi | |
echo "after everything..." | |
"${PYTHON}" -m pip list | |
- name: Install PyInstaller | |
if: matrix.goal == 'build' | |
run: | | |
git clone https://github.com/pyinstaller/pyinstaller.git | |
cd pyinstaller | |
export latest_release=$(git tag --list | grep -v dev | grep -v rc | sort -Vr | head -n1) | |
git checkout "${latest_release}" | |
# git checkout "v6.9.0" | |
# remove pre-compiled bootloaders so we fail if bootloader compile fails | |
rm -rvf PyInstaller/bootloader/*-*/* | |
cd bootloader | |
export PYINSTALLER_BUILD_ARGS="" | |
case "${arch}" in | |
"Win64") | |
export PYINSTALLER_BUILD_ARGS="--target-arch=64bit" | |
;; | |
esac | |
echo "PyInstaller build arguments: ${PYINSTALLER_BUILD_ARGS}" | |
"${PYTHON}" ./waf all $PYINSTALLER_BUILD_ARGS | |
cd .. | |
echo "---- Installing PyInstaller ----" | |
"${PYTHON}" -m pip install . | |
- name: Build GAM with PyInstaller | |
if: matrix.goal != 'test' | |
run: | | |
if [[ "${staticx}" == "yes" ]]; then | |
export distpath="./dist/gamadv-xtd3" | |
export gampath="${distpath}" | |
else | |
export distpath="./dist" | |
export gampath="${distpath}/gamadv-xtd3" | |
fi | |
mkdir -p -v "${gampath}" | |
if [[ "${RUNNER_OS}" == "macOS" ]]; then | |
# brew OpenSSL gets picked up by PyInstaller breaking our self-compiled version | |
brew uninstall --ignore-dependencies openssl | |
export gampath=$($PYTHON -c "import os; print(os.path.realpath('$gampath'))") | |
elif [[ "${RUNNER_OS}" == "Windows" ]]; then | |
# Work around issue where PyInstaller picks up python3.dll from other Python versions | |
# https://github.com/pyinstaller/pyinstaller/issues/7102 | |
export PATH="$(dirname ${PYTHON}):/usr/bin" | |
else | |
export gampath=$(realpath "${gampath}") | |
fi | |
export gam="${gampath}/gam" | |
echo "gampath=${gampath}" >> $GITHUB_ENV | |
# TEMP force everything back to one file. | |
export PYINSTALLER_BUILD_ONEFILE="yes" | |
export distpath="./dist/gamadv-xtd3" | |
export gampath="${distpath}" | |
"${PYTHON}" -m PyInstaller --clean --noconfirm --distpath="${distpath}" gam.spec | |
echo "WARNINGS FROM build/gam/warn-gam.txt" | |
cat build/gam/warn-gam.txt | |
echo "Analysis FROM build/gam/Analysis-00.toc" | |
cat build/gam/Analysis-00.toc | |
echo "EXE data FROM build/gam/EXE-00.toc" | |
cat build/gam/EXE-00.toc | |
if [ -x "$(command -v realpath)" ]; then | |
realpath=realpath | |
else | |
brew install coreutils | |
realpath=grealpath | |
fi | |
export gam=$(realpath "$gam") | |
if [[ "${RUNNER_OS}" == "Windows" ]]; then | |
export gam=$(cygpath -w "$gam") | |
echo "GAM on Windows at ${gam}" | |
fi | |
echo "gam=${gam}" >> $GITHUB_ENV | |
echo -e "GAM: ${gam}\nGAMPATH: ${gampath}" | |
- name: Copy extra package files | |
if: matrix.goal == 'build' | |
run: | | |
cp -v cacerts.pem $gampath | |
cp -v LICENSE $gampath | |
cp -v license.rtf $gampath | |
cp -v Gam*.txt $gampath | |
if [[ "${RUNNER_OS}" == "Windows" ]]; then | |
cp -v gam-setup.bat $gampath | |
fi | |
- name: Install StaticX | |
if: matrix.staticx == 'yes' | |
run: | | |
"${PYTHON}" -m pip install --upgrade patchelf-wrapper | |
"${PYTHON}" -m pip install --upgrade staticx | |
- name: Make StaticX | |
if: matrix.staticx == 'yes' | |
run: | | |
case $RUNNER_ARCH in | |
X64) | |
ldlib=/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 | |
;; | |
ARM64) | |
ldlib=/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 | |
;; | |
esac | |
echo "ldlib=${ldlib}" | |
$PYTHON -m staticx -l "${ldlib}" "${gam}" "${gam}-staticx" | |
rm -v "${gam}" | |
mv -v "${gam}-staticx" "${gam}" | |
- name: Basic Tests all jobs | |
id: basictests | |
run: | | |
#$PYTHON -m unittest discover --start-directory ./ --pattern "*_test.py" --buffer || if [ $? != 5 ]; then exit $?; fi # exit 5 is no tests | |
$gam version extended nooffseterror | |
export GAMVERSION=$($gam version simple) | |
echo "GAM Version ${GAMVERSION}" | |
echo "GAMVERSION=${GAMVERSION}" >> $GITHUB_ENV | |
- name: Linux/MacOS package | |
if: runner.os != 'Windows' && matrix.goal == 'build' | |
run: | | |
if [[ "${RUNNER_OS}" == "macOS" ]]; then | |
GAM_ARCHIVE="gamadv-xtd3-${GAMVERSION}-${GAMOS}-${arch}.tar.xz" | |
elif [[ "${RUNNER_OS}" == "Linux" ]]; then | |
if [[ "${staticx}" == "yes" ]]; then | |
libver="legacy" | |
else | |
libver="glibc$(ldd --version | awk '/ldd/{print $NF}')" | |
fi | |
GAM_ARCHIVE="gamadv-xtd3-${GAMVERSION}-${GAMOS}-${arch}-${libver}.tar.xz" | |
fi | |
echo "GAM Archive ${GAM_ARCHIVE}" | |
tar -C dist/ --create --verbose --exclude-from "${GITHUB_WORKSPACE}/.github/actions/package_exclusions.txt" --file $GAM_ARCHIVE --xz gamadv-xtd3 | |
- name: Windows package | |
if: runner.os == 'Windows' && matrix.goal != 'test' | |
run: | | |
cd dist/ | |
GAM_ARCHIVE="../gamadv-xtd3-${GAMVERSION}-${GAMOS}-${GAM_ARCHIVE_ARCH}.zip" | |
/c/Program\ Files/7-Zip/7z.exe a -tzip $GAM_ARCHIVE gamadv-xtd3 "-xr@${GITHUB_WORKSPACE}/.github/actions/package_exclusions.txt" -bb3 | |
cd .. | |
/c/Program\ Files\ \(x86\)/WiX\ Toolset\ v3.14/bin/candle.exe -arch "${WIX_ARCH}" gam.wxs | |
/c/Program\ Files\ \(x86\)/WiX\ Toolset\ v3.14/bin/light.exe -ext /c/Program\ Files\ \(x86\)/WiX\ Toolset\ v3.14/bin/WixUIExtension.dll gam.wixobj -o "gamadv-xtd3-${GAMVERSION}-windows-${GAM_ARCHIVE_ARCH}.msi" || true; | |
rm -v -f *.wixpdb | |
- name: Basic Tests build jobs only | |
if: matrix.goal != 'test' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
run: | | |
export voutput=$($gam version extended nooffseterror) | |
export python_line=$(echo -e "${voutput}" | grep "Python ") | |
export python_arr=($python_line) | |
export this_python=${python_arr[1]} | |
if [[ "${this_python}" != "${COMPILED_PYTHON_VERSION}" ]]; then | |
echo "ERROR: Tried to compile Python ${COMPILED_PYTHON_VERSION} but ended up with ${this_python}" | |
exit 1 | |
fi | |
export openssl_line=$(echo -e "${voutput}" | grep "OpenSSL ") | |
export openssl_arr=($openssl_line) | |
export this_openssl="${openssl_arr[1]}" | |
if [[ "${this_openssl}" != "${COMPILED_OPENSSL_VERSION}" ]]; then | |
echo "ERROR: Tried to compile OpenSSL ${COMPILED_OPENSSL_VERSION} but ended up with ${this_openssl}" | |
exit 1 | |
fi | |
echo "We successfully compiled Python ${this_python} and OpenSSL ${this_openssl}" | |
- name: Tar Cache archive | |
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true' | |
working-directory: ${{ github.workspace }} | |
run: | | |
if [[ "${RUNNER_OS}" == "Windows" ]]; then | |
tar_folders="src/cpython/ bin/ssl" | |
else | |
tar_folders="bin/" | |
fi | |
tar cJvvf cache.tar.xz $tar_folders | |
- name: Archive production artifacts | |
uses: actions/upload-artifact@v4 | |
if: github.event_name == 'push' && matrix.goal != 'test' | |
with: | |
name: gam-binaries-${{ env.GAMOS }}-${{ env.arch }}-${{ matrix.jid }} | |
path: | | |
src/gam*.tar.xz | |
src/gam*.zip | |
src/gam*.msi | |
merge: | |
runs-on: ubuntu-latest | |
needs: build | |
steps: | |
- name: Merge Artifacts | |
uses: actions/upload-artifact/merge@v4 | |
with: | |
name: gam-binaries | |
pattern: gam-binaries-* | |
- name: Delete Artifacts | |
uses: geekyeggo/delete-artifact@v4 | |
with: | |
name: gam-binaries-* |