Merge pull request #204 from rouson/file_t-issues #316
This file contains hidden or 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 | |
| on: | |
| push: | |
| paths-ignore: &paths_ignore | |
| - 'doc/**' | |
| - '**.txt' | |
| - '**.md' | |
| pull_request: | |
| paths-ignore: *paths_ignore | |
| concurrency: | |
| # De-duplicate concurrent workflow runs on the same branch/ref | |
| group: ${{ github.workflow }}-${{ github.head_ref || github.ref_name }} | |
| cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} | |
| defaults: | |
| run: | |
| shell: bash --noprofile --norc -e -x -o pipefail {0} | |
| jobs: | |
| build: | |
| name: ${{ matrix.compiler }}-${{ matrix.version }} (${{ matrix.os }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ macos-14, macos-15, macos-15-intel, macos-26, macos-26-intel, ubuntu-24.04, ubuntu-26.04-arm ] | |
| compiler: [ gfortran ] | |
| version: [ 13, 14, 15, 16 ] | |
| extra_flags: [ -g -O3 ] | |
| include: | |
| # --- LLVM flang coverage --- | |
| - os: macos-14 | |
| compiler: flang | |
| version: 22 | |
| - os: macos-15 | |
| compiler: flang | |
| version: 22 | |
| - os: macos-15-intel | |
| compiler: flang | |
| version: 22 | |
| - os: macos-26 | |
| compiler: flang | |
| version: 22 | |
| - os: macos-26-intel | |
| compiler: flang | |
| version: 22 | |
| # https://hub.docker.com/r/snowstep/llvm/tags | |
| - os: ubuntu-24.04 | |
| compiler: flang | |
| version: latest | |
| container: snowstep/llvm:ubuntu-24.04-latest | |
| - os: ubuntu-22.04 | |
| compiler: flang | |
| version: latest | |
| container: snowstep/llvm:ubuntu-22.04-latest | |
| # https://hub.docker.com/r/phhargrove/llvm-flang/tags | |
| - os: ubuntu-24.04 | |
| compiler: flang | |
| version: 23 | |
| container: phhargrove/llvm-flang:23.1.0_rc2-latest | |
| - os: ubuntu-24.04 | |
| compiler: flang | |
| version: 22 | |
| container: phhargrove/llvm-flang:22.1.0-latest | |
| - os: ubuntu-24.04 | |
| compiler: flang | |
| version: 21 | |
| container: phhargrove/llvm-flang:21.1.0-latest | |
| - os: ubuntu-24.04 | |
| compiler: flang | |
| version: 20 | |
| container: phhargrove/llvm-flang:20.1.0-latest | |
| - os: ubuntu-24.04 | |
| compiler: flang | |
| version: 19 | |
| extra_flags: -g -mmlir -allow-assumed-rank -O3 | |
| container: phhargrove/llvm-flang:19.1.1-latest | |
| # --- Intel coverage --- | |
| # Julienne requires 2025.2.0 or later | |
| # https://hub.docker.com/r/intel/oneapi-toolkit/tags | |
| - os: ubuntu-24.04 | |
| compiler: ifx | |
| version: latest-coarray | |
| container: intel/oneapi-toolkit:latest | |
| - os: ubuntu-24.04 | |
| compiler: ifx | |
| version: latest | |
| container: intel/oneapi-toolkit:latest | |
| - os: ubuntu-24.04 | |
| compiler: ifx | |
| version: 2026.0.0 | |
| container: intel/oneapi-toolkit:2026.0.0-devel-ubuntu24.04 | |
| # https://hub.docker.com/r/intel/fortran-essentials/tags | |
| - os: ubuntu-24.04 | |
| compiler: ifx | |
| version: 2025.3.0 | |
| container: intel/fortran-essentials:2025.3.0-0-devel-ubuntu24.04 | |
| - os: ubuntu-24.04 | |
| compiler: ifx | |
| version: 2025.2.2 | |
| container: intel/fortran-essentials:2025.2.2-0-devel-ubuntu24.04 | |
| - os: ubuntu-24.04 | |
| compiler: ifx | |
| version: 2025.2.0 | |
| container: intel/fortran-essentials:2025.2.0-0-devel-ubuntu24.04 | |
| # --- LFortran coverage --- | |
| # https://hub.docker.com/r/phhargrove/lfortran/tags | |
| - os: ubuntu-24.04 | |
| compiler: lfortran | |
| version: 0.61.0 | |
| container: phhargrove/lfortran:0.61.0-1 | |
| - os: ubuntu-24.04 | |
| compiler: lfortran | |
| version: 0.62.0 | |
| container: phhargrove/lfortran:0.62.0-1 | |
| - os: ubuntu-24.04 | |
| compiler: lfortran | |
| version: 0.63.0 | |
| container: phhargrove/lfortran:0.63.0-1 | |
| # https://github.com/lfortran/lfortran/pkgs/container/lfortran | |
| - os: ubuntu-22.04 | |
| compiler: lfortran | |
| version: 0.63.0 | |
| container: ghcr.io/lfortran/lfortran:v0.63.0 | |
| - os: ubuntu-22.04 | |
| compiler: lfortran | |
| version: 0.64.0 | |
| container: ghcr.io/lfortran/lfortran:v0.64.0 | |
| - os: ubuntu-22.04 | |
| compiler: lfortran | |
| version: latest | |
| container: ghcr.io/lfortran/lfortran:latest | |
| container: | |
| image: ${{ matrix.container }} | |
| env: | |
| COMPILER_VERSION: ${{ matrix.version }} | |
| FC: ${{ matrix.compiler }} | |
| FFLAGS: ${{ matrix.extra_flags }} | |
| FPM_FLAGS: --profile release --verbose | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v6 | |
| - name: Install Ubuntu Native Dependencies | |
| if: ${{ contains(matrix.os, 'ubuntu') && matrix.container == '' && matrix.compiler == 'gfortran' }} | |
| run: | | |
| sudo apt-get update | |
| #sudo apt list -a 'gfortran-*' | |
| sudo apt install -y build-essential | |
| if [[ ${COMPILER_VERSION} -lt 15 ]] || type -p gfortran-${COMPILER_VERSION} ; then | |
| sudo apt install -y gfortran-${COMPILER_VERSION} | |
| else | |
| curl -L https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh -o install-homebrew.sh | |
| chmod +x install-homebrew.sh | |
| env CI=1 ./install-homebrew.sh | |
| HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew" | |
| ${HOMEBREW_PREFIX}/bin/brew install -v gcc@${COMPILER_VERSION} binutils | |
| ls -al ${HOMEBREW_PREFIX}/bin | |
| echo "PATH=${HOMEBREW_PREFIX}/bin:${PATH}" >> "$GITHUB_ENV" | |
| : Homebrew GCC@15 needs binutils 2.44+ | |
| HOMEBREW_BINUTILS=$(ls -d ${HOMEBREW_PREFIX}/Cellar/binutils/2.*/bin ) | |
| ls -al ${HOMEBREW_BINUTILS} | |
| echo "FFLAGS=$FFLAGS -B ${HOMEBREW_BINUTILS}" >> "$GITHUB_ENV" | |
| echo "CFLAGS=$CFLAGS -B ${HOMEBREW_BINUTILS}" >> "$GITHUB_ENV" | |
| echo "CXXFLAGS=$CXXFLAGS -B ${HOMEBREW_BINUTILS}" >> "$GITHUB_ENV" | |
| fi | |
| - name: Install Ubuntu Container Dependencies | |
| if: ${{ contains(matrix.os, 'ubuntu') && matrix.container != '' && !contains(matrix.container, 'phhargrove') }} | |
| run: | | |
| apt update | |
| apt install -y build-essential pkg-config make git curl | |
| # Add container lfortran to PATH: | |
| if test "$FC" = "lfortran"; then | |
| echo "/app/bin" >> "$GITHUB_PATH" | |
| ls -alh /app/bin | |
| ls -alh /app/share/lfortran/lib/ | |
| fi | |
| - name: Install macOS Dependencies | |
| if: contains(matrix.os, 'macos') | |
| run: | | |
| # silence Homebrew tap trust warnings: | |
| (set +e ; brew untap -f aws/tap hashicorp/tap 2>&1 | perl -pe 's/#*.warning./warn: /' ; brew trust azure/bicep ) | |
| brew update | |
| # fpm binary distribution for macOS requires gfortran shared libraries from gcc@12 | |
| brew install gcc@12 | |
| if [[ ${{ matrix.compiler }} == 'gfortran' && ${COMPILER_VERSION} -gt 15 ]] ; then | |
| brew install gcc@${COMPILER_VERSION} | |
| fi | |
| - name: Install LLVM flang on macOS | |
| if: contains(matrix.os, 'macos') && matrix.compiler == 'flang' | |
| run: | | |
| brew install llvm@${COMPILER_VERSION} flang | |
| # workaround issue #228: clang cannot find homebrew flang's C header | |
| for p in /opt/homebrew /usr/local $(brew --prefix) ; do find $p/Cellar/flang -name ISO_Fortran_binding.h 2>/dev/null || true ; done | |
| echo "CFLAGS=-I$(dirname $(find $(brew --prefix)/Cellar/flang -name ISO_Fortran_binding.h | head -1)) ${CFLAGS}" >> "$GITHUB_ENV" | |
| # Prepend homebrew clang to PATH: | |
| echo "PATH=$(brew --prefix)/opt/llvm/bin:${PATH}" >> "$GITHUB_ENV" | |
| - name: Setup Compilers | |
| run: | | |
| if test "$FC" = "flang" ; then | |
| echo "FPM_FC=flang-new" >> "$GITHUB_ENV" | |
| elif test "$FC" = "ifx" ; then | |
| echo "FPM_FC=ifx" >> "$GITHUB_ENV" | |
| if [[ "$COMPILER_VERSION" = "latest-coarray" ]] ; then | |
| echo "FOR_COARRAY_NUM_IMAGES=4" >> "$GITHUB_ENV" | |
| echo "FFLAGS=-coarray -fpp -g -traceback $FFLAGS" >> "$GITHUB_ENV" | |
| #echo "FOR_COARRAY_MPI_VERBOSE=1" >> "$GITHUB_ENV" | |
| #echo "FOR_COARRAY_DEBUG_STARTUP=1" >> "$GITHUB_ENV" | |
| else | |
| # issue #162: ifx coarray support is usually disabled because it hides runtime failures | |
| echo "FFLAGS=-DHAVE_MULTI_IMAGE_SUPPORT=0 -fpp -g -traceback $FFLAGS" >> "$GITHUB_ENV" | |
| fi | |
| elif test "$FC" = "lfortran" ; then | |
| echo "FPM_FC=lfortran" >> "$GITHUB_ENV" | |
| echo "FFLAGS=--cpp --separate-compilation --realloc-lhs-arrays $FFLAGS" >> "$GITHUB_ENV" | |
| echo "FPM_FLAGS=--profile debug --verbose" >> "$GITHUB_ENV" ; : fpm 0.13 workaround | |
| else | |
| echo "FPM_FC=gfortran-${COMPILER_VERSION}" >> "$GITHUB_ENV" | |
| echo "FFLAGS=-ffree-line-length-0 $FFLAGS" >> "$GITHUB_ENV" | |
| fi | |
| if [[ "${{ matrix.container }}" =~ "snowstep/llvm" ]] ; then | |
| echo "LD_LIBRARY_PATH=/usr/lib/llvm-22/lib:$LD_LIBRARY_PATH" >> "$GITHUB_ENV" | |
| fi | |
| - name: Setup FPM | |
| if: ${{ !(runner.os == 'Linux' && runner.arch == 'ARM64') }} | |
| uses: fortran-lang/setup-fpm@main | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| fpm-version: latest | |
| - name: Build FPM | |
| if: ${{ runner.os == 'Linux' && runner.arch == 'ARM64' }} | |
| run: | | |
| export FPM_VERSION=0.13.0 | |
| curl --retry 5 -LOsS https://github.com/fortran-lang/fpm/releases/download/v$FPM_VERSION/fpm-$FPM_VERSION.F90 | |
| mkdir fpm-temp | |
| gfortran-14 -o fpm-temp/fpm fpm-$FPM_VERSION.F90 | |
| echo "PATH=`pwd`/fpm-temp:${PATH}" >> "$GITHUB_ENV" | |
| - name: Version info | |
| run: | | |
| set +x | |
| echo == TOOL VERSIONS == | |
| echo Platform version info: | |
| uname -a | |
| if test -r /etc/os-release ; then grep -e NAME -e VERSION /etc/os-release ; fi | |
| if test -x /usr/bin/sw_vers ; then /usr/bin/sw_vers ; fi | |
| echo | |
| echo PATH="$PATH" | |
| for tool in ${FPM_FC} fpm ; do | |
| ( echo ; set -x ; w=$(which $tool) ; ls -al $w ; ls -alhL $w ; $tool --version ) | |
| done | |
| - name: Build and Test (Assertions ON) | |
| env: | |
| FPM_FLAGS: ${{ env.FPM_FLAGS }} --flag -DASSERTIONS | |
| run: | | |
| fpm test ${FPM_FLAGS} --target driver --flag "$FFLAGS" -- --test command_line_t --type | |
| - name: Build and Test (Assertions OFF) | |
| run: | | |
| fpm test ${FPM_FLAGS} --target driver --flag "$FFLAGS" -- --test command_line_t --type | |
| - name: Run Examples (Assertions ON) | |
| env: | |
| FPM_FLAGS: ${{ env.FPM_FLAGS }} --flag -DASSERTIONS | |
| run: | | |
| fpm run --example create-markdown-table ${FPM_FLAGS} --flag "$FFLAGS" 2>&1 | tee output | |
| grep -q "|c_size_t|c_int64_t|c_intptr_t|" output | |
| fpm run --example get-command-line-flag-value ${FPM_FLAGS} --flag "$FFLAGS" -- --foo bar 2>&1 | tee output | |
| grep -q "foo=bar" output | |
| fpm run --example check-for-command-line-argument ${FPM_FLAGS} --flag "$FFLAGS" -- --foo bar 2>&1 | tee output | |
| grep -q "not present" output | |
| ( set +e | |
| fpm run --example assertions ${FPM_FLAGS} --flag "$FFLAGS" 2>&1 | tee output | |
| test ${PIPESTATUS[0]} > 0 && grep -q "expected 2; actual value is 1" output | |
| ) | |
| - name: Run Stop-and-Print Example (Assertions ON) | |
| if: ${{ matrix.compiler == 'gfortran' || | |
| (matrix.compiler == 'flang' && (matrix.version >= 20 || matrix.version == 'latest') ) }} | |
| env: | |
| FPM_FLAGS: ${{ env.FPM_FLAGS }} --flag -DASSERTIONS | |
| run: | | |
| ( set +e | |
| fpm run --example pure-stop-and-print ${FPM_FLAGS} --flag "$FFLAGS" -- --array 2>&1 | tee output | |
| test ${PIPESTATUS[0]} > 0 && grep -q "212,222" output | |
| ) | |
| ( set +e | |
| fpm run --example pure-stop-and-print ${FPM_FLAGS} --flag "$FFLAGS" -- --derived-type 2>&1 | tee output | |
| test ${PIPESTATUS[0]} > 0 && grep -q "answer = 42" output | |
| ) | |
| ( set +e | |
| fpm run --example pure-stop-and-print ${FPM_FLAGS} --flag "$FFLAGS" -- --file fpm.toml 2>&1 | tee output | |
| test ${PIPESTATUS[0]} > 0 && grep -q "[install]" output | |
| ) | |
| - name: Run Demo (Assertions ON) | |
| env: | |
| FPM_FLAGS: ${{ env.FPM_FLAGS }} --flag -DASSERTIONS | |
| run: | | |
| cd demo | |
| fpm test ${FPM_FLAGS} --flag "$FFLAGS" -- --contains doing | |
| ( set +e | |
| fpm test ${FPM_FLAGS} --flag "$FFLAGS" -- 2>&1 | tee output | |
| test ${PIPESTATUS[0]} > 0 && | |
| grep -q "FAILS on checking something." output && | |
| grep -q "SKIPS on skipping something." output && | |
| grep -q "2 of 6 tests passed. 2 tests were skipped" output | |
| ) | |
| - name: Test w/ Parallel Callbacks | |
| env: | |
| FPM_FLAGS: ${{ env.FPM_FLAGS }} --flag -DJULIENNE_PARALLEL_CALLBACKS --flag -DTEST_PARALLEL_CALLBACKS | |
| run: | | |
| fpm test ${FPM_FLAGS} --flag "$FFLAGS" | |