Fix fpm install
with non-main.f90
auto executables (#1036)
#2306
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: CI | |
on: | |
push: | |
pull_request: | |
release: | |
types: [published] | |
env: | |
CI: "ON" # We can detect this in the build system and other vendors implement it | |
HOMEBREW_NO_ANALYTICS: "ON" # Make Homebrew installation a little quicker | |
HOMEBREW_NO_AUTO_UPDATE: "ON" | |
HOMEBREW_NO_BOTTLE_SOURCE_FALLBACK: "ON" | |
HOMEBREW_NO_GITHUB_API: "ON" | |
HOMEBREW_NO_INSTALL_CLEANUP: "ON" | |
jobs: | |
build: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, macos-11, windows-latest] | |
gcc_v: [10,11,12,13] # Version of GFortran we want to use. | |
include: | |
- os: ubuntu-latest | |
os-arch: linux-x86_64 | |
release-flags: --flag '--static -g -fbacktrace -O3' | |
- os: macos-11 | |
os-arch: macos-x86_64 | |
release-flags: --flag '-g -fbacktrace -O3' | |
- os: windows-latest | |
os-arch: windows-x86_64 | |
release-flags: --flag '--static -g -fbacktrace -O3' | |
exe: .exe | |
env: | |
FC: gfortran | |
GCC_V: ${{ matrix.gcc_v }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Install GFortran macOS | |
if: contains(matrix.os, 'macos') | |
run: | | |
ln -s /usr/local/bin/gfortran-${GCC_V} /usr/local/bin/gfortran | |
which gfortran-${GCC_V} | |
which gfortran | |
# Backport gfortran shared libraries to version 9 folder. This is necessary because all macOS releases of fpm | |
# have these paths hardcoded in the executable (no PIC?). As the gcc ABIs have not changed from 9 to 10, we | |
# can just create symbolic links for now. This can be removed when an updated fpm release is built with gcc-10 | |
mkdir /usr/local/opt/gcc@9 | |
mkdir /usr/local/opt/gcc@9/lib | |
mkdir /usr/local/opt/gcc@9/lib/gcc | |
mkdir /usr/local/opt/gcc@9/lib/gcc/9 | |
mkdir /usr/local/lib/gcc/9 | |
ln -fs /usr/local/opt/gcc@${GCC_V}/lib/gcc/${GCC_V}/libquadmath.0.dylib /usr/local/opt/gcc@9/lib/gcc/9/libquadmath.0.dylib | |
ln -fs /usr/local/opt/gcc@${GCC_V}/lib/gcc/${GCC_V}/libgfortran.5.dylib /usr/local/opt/gcc@9/lib/gcc/9/libgfortran.5.dylib | |
ln -fs /usr/local/lib/gcc/${GCC_V}/libgcc_s.1.dylib /usr/local/lib/gcc/9/libgcc_s.1.dylib | |
- name: Install GFortran Linux | |
if: contains(matrix.os, 'ubuntu') | |
run: | | |
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_V} 100 \ | |
--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-${GCC_V} \ | |
--slave /usr/bin/gcov gcov /usr/bin/gcov-${GCC_V} | |
- name: Install GFortran Windows | |
if: contains(matrix.os, 'windows') | |
run: | | |
Invoke-WebRequest -Uri $Env:GCC_DOWNLOAD -OutFile mingw-w64.zip | |
Expand-Archive mingw-w64.zip | |
echo "$pwd\mingw-w64\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | |
env: | |
GCC_DOWNLOAD: "https://github.com/brechtsanders/winlibs_mingw/releases/download/10.4.0-10.0.0-msvcrt-r1/winlibs-x86_64-posix-seh-gcc-10.4.0-mingw-w64msvcrt-10.0.0-r1.zip" | |
# Phase 1: Bootstrap fpm with existing version | |
- name: Install fpm | |
uses: fortran-lang/setup-fpm@v5 | |
with: | |
fpm-version: 'v0.8.0' | |
- name: Remove fpm from path | |
shell: bash | |
run: | | |
mv $(which fpm) fpm-bootstrap${{ matrix.exe }} | |
echo "BOOTSTRAP=$PWD/fpm-bootstrap" >> $GITHUB_ENV | |
- name: Build Fortran fpm (bootstrap) | |
shell: bash | |
run: | | |
${{ env.BOOTSTRAP }} build | |
- name: Run Fortran fpm (bootstrap) | |
shell: bash | |
run: | | |
${{ env.BOOTSTRAP }} run | |
${{ env.BOOTSTRAP }} run -- --version | |
${{ env.BOOTSTRAP }} run -- --help | |
- name: Test Fortran fpm (bootstrap) | |
shell: bash | |
run: | | |
${{ env.BOOTSTRAP }} test | |
- name: Install Fortran fpm (bootstrap) | |
shell: bash | |
run: | | |
${{ env.BOOTSTRAP }} install | |
# Phase 2: Bootstrap fpm with itself | |
- name: Replace bootstrapping version | |
shell: bash | |
run: | | |
${{ env.BOOTSTRAP }} run --runner cp -- fpm-debug${{ matrix.exe }} | |
rm -v ${{ env.BOOTSTRAP }} | |
echo "FPM=$PWD/fpm-debug" >> $GITHUB_ENV | |
- name: Get version (normal) | |
if: github.event_name != 'release' | |
shell: bash | |
run: | | |
VERSION=$(git rev-parse --short HEAD) | |
echo "VERSION=$VERSION" >> $GITHUB_ENV | |
- name: Get version (release) | |
if: github.event_name == 'release' | |
shell: bash | |
run: | | |
VERSION=$(echo ${{ github.ref }} | cut -dv -f2) | |
echo "VERSION=$VERSION" >> $GITHUB_ENV | |
FPM_VERSION=$(${{ env.FPM }} --version | grep -o '${{ env.REGEX }}') | |
[ "$VERSION" = "$FPM_VERSION" ] | |
env: | |
REGEX: '[0-9]\{1,4\}\.[0-9]\{1,4\}\.[0-9]\{1,4\}' | |
- name: Build example packages | |
shell: bash | |
run: | | |
ci/run_tests.sh "${{ env.FPM }}" | |
- name: Build Fortran fpm | |
shell: bash | |
run: | | |
${{ env.FPM }} build ${{ matrix.release-flags }} | |
- name: Run Fortran fpm | |
shell: bash | |
run: | | |
${{ env.FPM }} run ${{ matrix.release-flags }} | |
${{ env.FPM }} run ${{ matrix.release-flags }} -- --version | |
${{ env.FPM }} run ${{ matrix.release-flags }} -- --help | |
- name: Test Fortran fpm | |
shell: bash | |
run: | | |
${{ env.FPM }} test ${{ matrix.release-flags }} | |
- name: Install Fortran fpm | |
shell: bash | |
run: | | |
${{ env.FPM }} install ${{ matrix.release-flags }} | |
- name: Package release version | |
shell: bash | |
run: | | |
${{ env.FPM }} run ${{ matrix.release-flags }} --runner cp -- ${{ env.EXE }} | |
rm -v ${{ env.FPM }} | |
echo "FPM_RELEASE=${{ env.EXE }}" >> $GITHUB_ENV | |
env: | |
EXE: fpm-${{ env.VERSION }}-${{ matrix.os-arch }}${{ matrix.exe }} | |
- name: Run release version | |
shell: bash | |
run: | | |
ci/run_tests.sh "$PWD/${{ env.FPM_RELEASE }}" | |
- name: Upload artifact | |
uses: actions/upload-artifact@v2 | |
with: | |
name: ${{ env.FPM_RELEASE }} | |
path: ${{ env.FPM_RELEASE }} | |
make-installer: | |
if: ${{ github.event_name == 'release' && contains(github.ref, 'v') || github.event_name == 'push' }} | |
runs-on: windows-latest | |
needs: | |
- build | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Download Artifacts | |
uses: actions/download-artifact@v2 | |
with: | |
path: ${{ github.workspace }} # This will download all files | |
- name: Get version (normal) | |
if: github.event_name != 'release' | |
shell: bash | |
run: | | |
VERSION=$(git rev-parse --short HEAD) | |
echo "VERSION=$VERSION" >> $GITHUB_ENV | |
- name: Get version (release) | |
if: github.event_name == 'release' | |
shell: bash | |
run: | | |
VERSION=$(echo ${{ github.ref }} | cut -dv -f2) | |
echo "VERSION=$VERSION" >> $GITHUB_ENV | |
env: | |
REGEX: '[0-9]\{1,4\}\.[0-9]\{1,4\}\.[0-9]\{1,4\}' | |
- name: Setup MinGW (MSYS2) | |
uses: msys2/setup-msys2@v2 | |
with: | |
msystem: MINGW64 | |
update: false | |
install: >- | |
wget | |
unzip | |
- name: Fetch Windows executable | |
shell: msys2 {0} | |
run: | | |
cp fpm-*/fpm*.exe ./ci/fpm.exe | |
- name: Fetch Git for Windows | |
shell: msys2 {0} | |
run: | | |
cd ./ci | |
wget ${{ env.git_download }} -O MinGit.zip | |
unzip MinGit.zip -d MinGit | |
env: | |
git_download: "https://github.com/git-for-windows/git/releases/download/v2.33.1.windows.1/MinGit-2.33.1-64-bit.zip" | |
- name: Fetch EnVar Plugin for NSIS | |
shell: msys2 {0} | |
run: | | |
cd ./ci | |
wget ${{ env.envar_download }} -O EnVar-Plugin.zip | |
mkdir EnVar_plugin | |
unzip EnVar-Plugin.zip -d EnVar_plugin | |
env: | |
envar_download: "https://github.com/GsNSIS/EnVar/releases/download/v0.3.1/EnVar-Plugin.zip" | |
- name: Generate installer | |
run: | | |
cd ./ci | |
makensis fpm-installer.nsi | |
move fpm-installer.exe fpm-installer-${{ env.VERSION }}.exe | |
- name: Upload artifact | |
uses: actions/upload-artifact@v2 | |
with: | |
name: fpm-installer | |
path: ci/fpm-installer-${{ env.VERSION }}.exe | |
upload-artifacts: | |
if: ${{ github.event_name == 'release' && contains(github.ref, 'v') || github.event_name == 'push' }} | |
runs-on: ubuntu-latest | |
needs: | |
- build | |
- make-installer | |
steps: | |
- id: deploy-on-push | |
if: ${{ github.event_name == 'push' }} | |
run: | |
echo "::set-output name=result::${{ env.DEPLOY_BRANCH }}" | |
env: | |
DEPLOY_BRANCH: ${{ secrets.DEPLOY_BRANCH && contains(github.ref, secrets.DEPLOY_BRANCH) && 1 || 0 }} | |
- uses: actions/checkout@v4 | |
if: ${{ github.event_name == 'push' }} | |
- name: Download Artifacts | |
uses: actions/download-artifact@v2 | |
with: | |
path: ${{ github.workspace }} # This will download all files | |
- name: Normalize file names for continuous delivery | |
if: ${{ github.event_name == 'push' }} | |
run: | | |
for output in fpm-*/fpm*; do | |
pushd $(dirname "$output") | |
mv -v $(basename $output) $(basename $output | sed -E '${{ env.replace }}') | |
popd | |
done | |
env: | |
replace: 's/-([0-9]+\.[0-9]+\.[0-9]+-[0-9]+-g)?[0-9a-f]+//' | |
- name: Create SHA256 checksums | |
run: | | |
for output in fpm-*/fpm*; do | |
pushd $(dirname "$output") | |
sha256sum $(basename "$output") | tee $(basename "$output").sha256 | |
popd | |
done | |
- name: Move/Create continuous tag | |
if: ${{ github.event_name == 'push' && steps.deploy-on-push.outputs.result != 0 }} | |
run: | | |
git tag --force 'current' ${{ github.sha }} | |
git push --tags --force | |
- name: Upload assets | |
uses: svenstaro/upload-release-action@v2 | |
if: ${{ github.event_name == 'release' || steps.deploy-on-push.outputs.result != 0 }} | |
with: | |
repo_token: ${{ secrets.GITHUB_TOKEN }} | |
file: fpm-*/fpm* | |
file_glob: true | |
tag: ${{ github.event_name == 'release' && github.ref || 'current'}} | |
overwrite: true |