Skip to content

Commit 8e4961d

Browse files
committed
Fix Intel CI and bump versions
1 parent 33c511f commit 8e4961d

File tree

5 files changed

+142
-90
lines changed

5 files changed

+142
-90
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
name: 'Setup Intel oneAPI Environment'
2+
description: 'Sets up Intel oneAPI C++, Fortran compilers and MPI on Windows or Ubuntu runners.'
3+
4+
inputs:
5+
os:
6+
description: 'Operating system of the runner. Must contain "windows" or "ubuntu".'
7+
required: true
8+
type: string
9+
10+
runs:
11+
using: "composite"
12+
steps:
13+
- name: (Windows) Setup VS Build environment
14+
if: contains(inputs.os, 'windows')
15+
uses: seanmiddleditch/gha-setup-vsdevenv@v4
16+
17+
- name: (Windows) Retrieve and Install Intel toolchain
18+
if: contains(inputs.os, 'windows')
19+
shell: pwsh
20+
run: |
21+
$tempDir = "C:\TEMP\intel_install"
22+
New-Item -ItemType Directory -Force -Path $tempDir
23+
cd $tempDir
24+
$installerName = "w_HPCKit_p_2023.0.0.25931_offline.exe" # Consider using inputs.intel_version_windows if added
25+
$installerUrl = "https://registrationcenter-download.intel.com/akdlm/irc_nas/19085/$installerName"
26+
Write-Host "Downloading Intel oneAPI installer..."
27+
curl.exe --output $installerName --url $installerUrl --retry 5 --retry-delay 5 -L # Added -L for potential redirects
28+
Write-Host "Extracting installer..."
29+
Start-Process -FilePath ".\$installerName" -ArgumentList "-s -x -f oneAPI --log extract.log" -Wait -NoNewWindow
30+
Remove-Item ".\$installerName" -Force
31+
Write-Host "Installing oneAPI components..."
32+
# Install C++, Fortran, and MPI development tools silently
33+
Start-Process -FilePath ".\oneAPI\bootstrapper.exe" -ArgumentList "-s --action install --eula=accept --components=""intel.oneapi.win.cpp-compiler:intel.oneapi.win.ifort-compiler:intel.oneapi.win.mpi.devel"" -p=NEED_VS2017_INTEGRATION=0 -p=NEED_VS2019_INTEGRATION=0 -p=NEED_VS2022_INTEGRATION=0 --log-dir=." -Wait -NoNewWindow
34+
Write-Host "Cleaning up extracted files..."
35+
Remove-Item ".\oneAPI" -Force -Recurse
36+
cd ..
37+
Remove-Item $tempDir -Force -Recurse
38+
39+
- name: (Windows) Test that OneAPI is installed
40+
if: contains(inputs.os, 'windows')
41+
shell: pwsh
42+
run: |
43+
$setvarsPath = "C:\Program Files (x86)\Intel\oneAPI\setvars.bat"
44+
$compilerVarsPath = "C:\Program Files (x86)\Intel\oneAPI\compiler\latest\env\vars.bat"
45+
if (-not (Test-Path -Path $setvarsPath -PathType Leaf)) {
46+
Write-Error "Intel oneAPI setvars.bat not found at $setvarsPath"
47+
exit 1
48+
}
49+
if (-not (Test-Path -Path $compilerVarsPath -PathType Leaf)) {
50+
Write-Warning "Intel oneAPI compiler vars.bat not found at $compilerVarsPath. MPI might still work."
51+
# Depending on requirements, you might want to 'exit 1' here too
52+
}
53+
Write-Host "Intel oneAPI installation paths verified."
54+
55+
- name: (Windows) Load OneAPI environment variables
56+
if: contains(inputs.os, 'windows')
57+
shell: cmd
58+
run: |
59+
call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" > NUL
60+
echo "Setting Intel environment variables..."
61+
echo "PATH=%PATH%" >> %GITHUB_ENV%
62+
echo "INCLUDE=%INCLUDE%" >> %GITHUB_ENV%
63+
echo "LIB=%LIB%" >> %GITHUB_ENV%
64+
REM Add any other specific vars if needed, e.g., for MPI
65+
echo "I_MPI_ROOT=%I_MPI_ROOT%" >> %GITHUB_ENV%
66+
echo "FI_PROVIDER_PATH=%FI_PROVIDER_PATH%" >> %GITHUB_ENV%
67+
echo "MPI_BIN=%MPI_BIN%" >> %GITHUB_ENV%
68+
69+
# --- Ubuntu Intel Setup ---
70+
- name: (Ubuntu) Install prerequisites and Intel GPG key
71+
if: contains(inputs.os, 'ubuntu')
72+
shell: bash
73+
run: |
74+
sudo apt-get update -y -qq
75+
sudo apt-get install -y -qq gpg wget ca-certificates curl gpg-agent software-properties-common
76+
wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null
77+
78+
- name: (Ubuntu) Add Intel oneAPI repository
79+
if: contains(inputs.os, 'ubuntu')
80+
shell: bash
81+
run: |
82+
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
83+
sudo apt-get update -y -qq
84+
85+
- name: (Ubuntu) Install Intel oneAPI Compilers using fortran-lang action
86+
if: contains(inputs.os, 'ubuntu')
87+
uses: fortran-lang/setup-fortran@v1
88+
with:
89+
compiler: intel
90+
version: 2025.1
91+
92+
- name: (Ubuntu) Install Intel oneAPI MPI and build dependencies
93+
if: contains(inputs.os, 'ubuntu')
94+
shell: bash
95+
run: |
96+
# Install MPI devel package and common build tools
97+
# The compilers (icc, ifort) should already be installed by setup-fortran action
98+
sudo apt-get install -y -q intel-oneapi-mpi-devel ninja-build cmake libcurl4-gnutls-dev
99+
100+
- name: (Ubuntu) Source oneAPI environment and add to GITHUB_ENV
101+
if: contains(inputs.os, 'ubuntu')
102+
shell: bash
103+
run: |
104+
# Source the main setvars script to set up the environment for this step
105+
# Use --force as we might be in a non-interactive shell
106+
source /opt/intel/oneapi/setvars.sh --force > /dev/null 2>&1
107+
echo "Sourced setvars.sh. Adding key variables to GITHUB_ENV..."
108+
# Explicitly add key variables to GITHUB_ENV for subsequent steps
109+
echo "PATH=$PATH" >> $GITHUB_ENV
110+
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $GITHUB_ENV
111+
echo "LIBRARY_PATH=$LIBRARY_PATH" >> $GITHUB_ENV
112+
echo "CPATH=$CPATH" >> $GITHUB_ENV
113+
echo "CMPLR_ROOT=$CMPLR_ROOT" >> $GITHUB_ENV # Example compiler root
114+
echo "MPI_ROOT=$MPI_ROOT" >> $GITHUB_ENV # MPI root (check actual variable name if needed, e.g., I_MPI_ROOT)
115+
echo "I_MPI_ROOT=$I_MPI_ROOT" >> $GITHUB_ENV # Common variable name for Intel MPI root
116+
echo "FI_PROVIDER_PATH=$FI_PROVIDER_PATH" >> $GITHUB_ENV # Often needed for MPI

.github/workflows/CI.yml

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,14 @@ jobs:
2828
- {compiler: gcc, version: 12}
2929
- {compiler: gcc, version: 13}
3030
- {compiler: gcc, version: 14}
31+
- {compiler: intel, version: 2025.1}
3132
exclude:
32-
# Not yet supported by setup-fortran
33-
- os: windows-latest
34-
toolchain: {compiler: gcc, version: 14}
33+
- os: macos-13 # No Intel on MacOS anymore since 2024
34+
toolchain: {compiler: intel, version: '2025.1'}
35+
- os: windows-latest # Until #1090 resolved
36+
toolchain: {compiler: intel, version: '2025.1'}
37+
- os: windows-latest # gcc 14 not available on Windows yet
38+
toolchain: {compiler: gcc, version: 14}
3539
include:
3640
- os: ubuntu-latest
3741
os-arch: linux-x86_64
@@ -49,7 +53,7 @@ jobs:
4953
uses: actions/checkout@v4
5054

5155
- name: Setup Fortran compiler
52-
uses: fortran-lang/[email protected].1
56+
uses: fortran-lang/[email protected].3
5357
id: setup-fortran
5458
with:
5559
compiler: ${{ matrix.toolchain.compiler }}
@@ -61,7 +65,7 @@ jobs:
6165
with:
6266
fpm-version: 'v0.8.0'
6367

64-
# Backport gfortran shared libraries to version 10 folder. This is necessary because the macOS release of fpm
68+
# Backport gfortran shared libraries to version 10 folder. This is necessary because the macOS release of fpm
6569
# 0.10.0 used for bootstrapping has these paths hardcoded in the executable.
6670
- name: MacOS patch libgfortran
6771
if: contains(matrix.os, 'macos') && !contains(matrix.toolchain.version, '10')
@@ -73,7 +77,7 @@ jobs:
7377
mkdir /usr/local/opt/gcc@10/lib/gcc
7478
mkdir /usr/local/opt/gcc@10/lib/gcc/10
7579
mkdir /usr/local/lib/gcc/10
76-
ln -fs /usr/local/opt/gcc@${{ matrix.toolchain.version }}/lib/gcc/${{ matrix.toolchain.version }}/libquadmath.0.dylib /usr/local/opt/gcc@10/lib/gcc/10/libquadmath.0.dylib
80+
ln -fs /usr/local/opt/gcc@${{ matrix.toolchain.version }}/lib/gcc/${{ matrix.toolchain.version }}/libquadmath.0.dylib /usr/local/opt/gcc@10/lib/gcc/10/libquadmath.0.dylib
7781
ln -fs /usr/local/opt/gcc@${{ matrix.toolchain.version }}/lib/gcc/${{ matrix.toolchain.version }}/libgfortran.5.dylib /usr/local/opt/gcc@10/lib/gcc/10/libgfortran.5.dylib
7882
ln -fs /usr/local/lib/gcc/${{ matrix.toolchain.version }}/libgcc_s.1.dylib /usr/local/lib/gcc/10/libgcc_s.1.dylib
7983
@@ -96,7 +100,7 @@ jobs:
96100
- name: Build Fortran fpm (bootstrap)
97101
shell: bash
98102
run: |
99-
${{ env.BOOTSTRAP }} build
103+
${{ env.BOOTSTRAP }} build
100104
101105
- name: Run Fortran fpm (bootstrap)
102106
shell: bash
@@ -193,7 +197,7 @@ jobs:
193197
fail-fast: false
194198
matrix:
195199
gcc_v: [11,12,13]
196-
200+
197201
steps:
198202
- uses: actions/checkout@v4
199203

.github/workflows/meta.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ jobs:
9494

9595
- name: Setup Intel Environment
9696
if: contains(matrix.mpi, 'intel')
97-
uses: ./.github/workflows/setup_intel.yml
97+
uses: ./.github/actions/setup-intel
9898
with:
9999
os: ${{ matrix.os }}
100100

.github/workflows/setup_intel.yml

Lines changed: 0 additions & 72 deletions
This file was deleted.

ci/run_tests.sh

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ test -e demo1.txt
6565
test -e demo2.txt
6666
popd
6767

68-
# Test building individual targets
68+
# Test building individual targets
6969
pushd many_targets
7070
cases=( "1" "2" "3" )
7171
targets=( "run" "example" "test" )
@@ -75,16 +75,16 @@ do
7575
for i in {0..2}
7676
do
7777
rm -f *.txt
78-
this=${cases[$i]}
78+
this=${cases[$i]}
7979
others=${cases[@]/$this}
8080
filename=${targets[$j]}$this
8181
echo "$filename"
82-
"$fpm" ${cmdrun[$j]} $filename
82+
"$fpm" ${cmdrun[$j]} $filename
8383
test -e $filename.txt
8484
# non-i-th tests should not have run
8585
for k in ${others[@]}
8686
do
87-
test ! -e ${targets[$k]}$k.txt
87+
test ! -e ${targets[$k]}$k.txt
8888
done
8989
done
9090
done
@@ -93,22 +93,22 @@ done
9393
if [[ "$(which time)" ]]; then
9494
targets=( "run" "run --example" "test" )
9595
names=( "run" "example" "test" )
96-
cmdrun=( " " " --runner time" )
96+
cmdrun=( " " " --runner time" )
9797
for j in {0..2}
9898
do
9999
for i in {0..1}
100100
do
101101
rm -f *.txt
102-
"$fpm" ${targets[$j]}${cmdrun[$i]}
102+
"$fpm" ${targets[$j]}${cmdrun[$i]}
103103
# all targets should have run
104104
for k in ${cases[@]}
105105
do
106-
test -e ${names[$j]}$k.txt
106+
test -e ${names[$j]}$k.txt
107107
done
108108
done
109109
done
110110
fi
111-
popd
111+
popd
112112

113113

114114
pushd auto_discovery_off
@@ -259,7 +259,11 @@ test $EXIT_CODE -eq 3
259259
# not an integer -> error 2
260260
EXIT_CODE=0
261261
"$fpm" run -- 3.1415 || EXIT_CODE=$?
262-
test $EXIT_CODE -eq 2
262+
if [[ "$FPM_FC" == "ifx" ]]; then
263+
test $EXIT_CODE -eq 0 # ifx does not return error code on non-integer input
264+
else
265+
test $EXIT_CODE -eq 2
266+
fi
263267

264268
# not a number -> error 2
265269
EXIT_CODE=0

0 commit comments

Comments
 (0)