Skip to content

Commit 4030a8a

Browse files
authored
Merge pull request #1055 from perazz/hdf5_metapackage
Metapackages: `pkg_config` backend support; HDF5
2 parents 1559b60 + 00aef12 commit 4030a8a

File tree

14 files changed

+875
-143
lines changed

14 files changed

+875
-143
lines changed

.github/workflows/meta.yml

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ jobs:
6767
wget
6868
unzip
6969
curl
70+
hdf5
7071
7172
- name: (Windows) Setup VS Build environment
7273
if: contains(matrix.os,'windows') && contains(matrix.mpi,'intel')
@@ -93,12 +94,12 @@ jobs:
9394
- name: (Ubuntu) Install OpenMPI
9495
if: contains(matrix.os,'ubuntu') && contains(matrix.mpi,'openmpi')
9596
run: |
96-
sudo apt install -y -q openmpi-bin libopenmpi-dev
97+
sudo apt install -y -q openmpi-bin libopenmpi-dev hwloc fabric libhdf5-dev libhdf5-fortran-102
9798
9899
- name: (Ubuntu) Install MPICH
99100
if: contains(matrix.os,'ubuntu') && contains(matrix.mpi,'mpich')
100101
run: |
101-
sudo apt install -y -q mpich
102+
sudo apt install -y -q mpich hwloc fabric libhdf5-dev libhdf5-fortran-102
102103
103104
- name: (Ubuntu) Retrieve Intel toolchain
104105
if: contains(matrix.os,'ubuntu') && contains(matrix.mpi,'intel')
@@ -110,14 +111,27 @@ jobs:
110111
111112
- name: (Ubuntu) Install Intel oneAPI
112113
if: contains(matrix.os,'ubuntu') && contains(matrix.mpi,'intel')
113-
timeout-minutes: 15
114-
run: sudo apt-get install intel-oneapi-compiler-dpcpp-cpp-2023.1.0 intel-oneapi-compiler-fortran-2023.1.0 intel-oneapi-mpi-devel ninja-build
114+
uses: fortran-lang/[email protected]
115+
id: setup-fortran
116+
with:
117+
compiler: intel
118+
version: 2024.1.0
115119

116-
- name: (Ubuntu) Setup Intel oneAPI environment
120+
- name: (Ubuntu) finalize oneAPI environment
117121
if: contains(matrix.os,'ubuntu') && contains(matrix.mpi,'intel')
118122
run: |
119-
source /opt/intel/oneapi/setvars.sh
120-
printenv >> $GITHUB_ENV
123+
# Install MPI
124+
sudo apt-get install -y -q intel-oneapi-mpi-devel ninja-build cmake
125+
source /opt/intel/oneapi/setvars.sh --force
126+
printenv >> $GITHUB_ENV
127+
# To run HDF5 with oneAPI, we need to build it from source. Use CMake to generate pkg-config info
128+
curl -O -L https://github.com/HDFGroup/hdf5/archive/refs/tags/snapshot-1.14.tar.gz
129+
tar zxf snapshot-1.14.tar.gz
130+
cd hdf5-snapshot-1.14
131+
cmake -B build -DCMAKE_Fortran_COMPILER=ifx -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DHDF5_BUILD_FORTRAN=ON -DCMAKE_INSTALL_PREFIX=/usr
132+
cd build
133+
make -j
134+
sudo make install
121135
122136
- name: (Windows) Put MSYS2_MinGW64 on PATH
123137
if: contains(matrix.os,'windows') && (!contains(matrix.mpi,'intel'))
@@ -197,6 +211,11 @@ jobs:
197211
run: |
198212
brew install openmpi #--cc=gcc-${{ env.GCC_V }} openmpi
199213
214+
- name: (macOS) Install homebrew HDF5
215+
if: contains(matrix.os,'macos')
216+
run: |
217+
brew install hdf5
218+
200219
# Phase 1: Bootstrap fpm with existing version
201220
- name: Install fpm
202221
uses: fortran-lang/setup-fpm@v5
@@ -209,8 +228,8 @@ jobs:
209228
mv $(which fpm) fpm-bootstrap${{ matrix.exe }}
210229
echo "BOOTSTRAP=$PWD/fpm-bootstrap" >> $GITHUB_ENV
211230
212-
- name: (macOS) Use gcc/g++ instead of Clang for C/C++
213-
if: contains(matrix.os,'macOS')
231+
- name: (macOS/Ubuntu) Use gcc/g++ instead of Clang for C/C++ / ifx to build fpm
232+
if: contains(matrix.os,'macOS') || contains(matrix.os,'ubuntu')
214233
shell: bash
215234
run: |
216235
echo "FPM_FC=gfortran-${{ env.GCC_V }}" >> $GITHUB_ENV

ci/meta_tests.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,10 @@ pushd metapackage_mpi_c
4242
"$fpm" run --verbose
4343
popd
4444

45+
pushd metapackage_hdf5
46+
"$fpm" build --verbose
47+
"$fpm" run --verbose
48+
popd
49+
4550
# Cleanup
4651
rm -rf ./*/build
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
program metapackage_hdf5
2+
use hdf5
3+
implicit none
4+
5+
integer :: error
6+
7+
call h5open_f(error)
8+
if (error/=0) stop -1
9+
10+
call h5close_f(error)
11+
if (error/=0) stop -2
12+
13+
stop 0
14+
15+
end program metapackage_hdf5
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
name = "metapackage_hdf5"
2+
dependencies.hdf5="*"

src/fpm/manifest/meta.f90

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ module fpm_manifest_metapackages
4848

4949
!> fortran-lang minpack
5050
type(metapackage_request_t) :: minpack
51+
52+
!> HDF5
53+
type(metapackage_request_t) :: hdf5
5154

5255
end type metapackage_config_t
5356

@@ -196,6 +199,9 @@ subroutine new_meta_config(self, table, meta_allowed, error)
196199

197200
call new_meta_request(self%mpi, "mpi", table, meta_allowed, error)
198201
if (allocated(error)) return
202+
203+
call new_meta_request(self%hdf5, "hdf5", table, meta_allowed, error)
204+
if (allocated(error)) return
199205

200206
end subroutine new_meta_config
201207

@@ -208,7 +214,7 @@ logical function is_meta_package(key)
208214
select case (key)
209215

210216
!> Supported metapackages
211-
case ("openmp","stdlib","mpi","minpack")
217+
case ("openmp","stdlib","mpi","minpack","hdf5")
212218
is_meta_package = .true.
213219

214220
case default

src/fpm/manifest/profiles.f90

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -749,25 +749,25 @@ function get_default_profiles(error) result(default_profiles)
749749
& 'ifort', &
750750
& OS_ALL, &
751751
& flags = ' -fp-model precise -pc64 -align all -error-limit 1 -reentrancy&
752-
& threaded -nogen-interfaces -assume byterecl -standard-semantics', &
752+
& threaded -nogen-interfaces -assume byterecl', &
753753
& is_built_in=.true.), &
754754
& new_profile('release', &
755755
& 'ifort', &
756756
& OS_WINDOWS, &
757757
& flags = ' /fp:precise /align:all /error-limit:1 /reentrancy:threaded&
758-
& /nogen-interfaces /assume:byterecl /standard-semantics', &
758+
& /nogen-interfaces /assume:byterecl', &
759759
& is_built_in=.true.), &
760760
& new_profile('release', &
761761
& 'ifx', &
762762
& OS_ALL, &
763763
& flags = ' -fp-model=precise -pc64 -align all -error-limit 1 -reentrancy&
764-
& threaded -nogen-interfaces -assume byterecl -standard-semantics', &
764+
& threaded -nogen-interfaces -assume byterecl', &
765765
& is_built_in=.true.), &
766766
& new_profile('release', &
767767
& 'ifx', &
768768
& OS_WINDOWS, &
769769
& flags = ' /fp:precise /align:all /error-limit:1 /reentrancy:threaded&
770-
& /nogen-interfaces /assume:byterecl /standard-semantics', &
770+
& /nogen-interfaces /assume:byterecl', &
771771
& is_built_in=.true.), &
772772
& new_profile('release', &
773773
&'nagfor', &
@@ -805,28 +805,28 @@ function get_default_profiles(error) result(default_profiles)
805805
& new_profile('debug', &
806806
& 'ifort', &
807807
& OS_ALL, &
808-
& flags = ' -warn all -check all -error-limit 1 -O0 -g -assume byterecl -standard-semantics -traceback', &
808+
& flags = ' -warn all -check all -error-limit 1 -O0 -g -assume byterecl -traceback', &
809809
& is_built_in=.true.), &
810810
& new_profile('debug', &
811811
& 'ifort', &
812812
& OS_WINDOWS, &
813813
& flags = ' /warn:all /check:all /error-limit:1&
814-
& /Od /Z7 /assume:byterecl /standard-semantics /traceback', &
814+
& /Od /Z7 /assume:byterecl /traceback', &
815815
& is_built_in=.true.), &
816816
& new_profile('debug', &
817817
& 'ifx', &
818818
& OS_ALL, &
819-
& flags = ' -warn all -check all -error-limit 1 -O0 -g -assume byterecl -standard-semantics -traceback', &
819+
& flags = ' -warn all -check all -error-limit 1 -O0 -g -assume byterecl -traceback', &
820820
& is_built_in=.true.), &
821821
& new_profile('debug', &
822822
& 'ifx', &
823823
& OS_WINDOWS, &
824-
& flags = ' /warn:all /check:all /error-limit:1 /Od /Z7 /assume:byterecl /standard-semantics', &
824+
& flags = ' /warn:all /check:all /error-limit:1 /Od /Z7 /assume:byterecl', &
825825
& is_built_in=.true.), &
826826
& new_profile('debug', &
827827
& 'ifx', &
828828
& OS_WINDOWS, &
829-
& flags = ' /warn:all /check:all /error-limit:1 /Od /Z7 /assume:byterecl /standard-semantics', &
829+
& flags = ' /warn:all /check:all /error-limit:1 /Od /Z7 /assume:byterecl', &
830830
& is_built_in=.true.), &
831831
& new_profile('debug', &
832832
& 'lfortran', &

src/fpm_compiler.F90

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,7 @@ subroutine get_release_compile_flags(id, flags)
309309
flag_intel_limit//&
310310
flag_intel_pthread//&
311311
flag_intel_nogen//&
312-
flag_intel_byterecl//&
313-
flag_intel_standard_compliance
312+
flag_intel_byterecl
314313

315314
case(id_intel_classic_mac)
316315
flags = &
@@ -320,8 +319,7 @@ subroutine get_release_compile_flags(id, flags)
320319
flag_intel_limit//&
321320
flag_intel_pthread//&
322321
flag_intel_nogen//&
323-
flag_intel_byterecl//&
324-
flag_intel_standard_compliance
322+
flag_intel_byterecl
325323

326324
case(id_intel_classic_windows)
327325
flags = &
@@ -331,8 +329,7 @@ subroutine get_release_compile_flags(id, flags)
331329
flag_intel_limit_win//&
332330
flag_intel_pthread_win//&
333331
flag_intel_nogen_win//&
334-
flag_intel_byterecl_win//&
335-
flag_intel_standard_compliance_win
332+
flag_intel_byterecl_win
336333

337334
case(id_intel_llvm_nix)
338335
flags = &
@@ -342,8 +339,7 @@ subroutine get_release_compile_flags(id, flags)
342339
flag_intel_limit//&
343340
flag_intel_pthread//&
344341
flag_intel_nogen//&
345-
flag_intel_byterecl//&
346-
flag_intel_standard_compliance
342+
flag_intel_byterecl
347343

348344
case(id_intel_llvm_windows)
349345
flags = &
@@ -353,8 +349,7 @@ subroutine get_release_compile_flags(id, flags)
353349
flag_intel_limit_win//&
354350
flag_intel_pthread_win//&
355351
flag_intel_nogen_win//&
356-
flag_intel_byterecl_win//&
357-
flag_intel_standard_compliance_win
352+
flag_intel_byterecl_win
358353

359354
case(id_nag)
360355
flags = &
@@ -418,7 +413,6 @@ subroutine get_debug_compile_flags(id, flags)
418413
flag_intel_limit//&
419414
flag_intel_debug//&
420415
flag_intel_byterecl//&
421-
flag_intel_standard_compliance//&
422416
flag_intel_backtrace
423417

424418
case(id_intel_classic_mac)
@@ -428,7 +422,6 @@ subroutine get_debug_compile_flags(id, flags)
428422
flag_intel_limit//&
429423
flag_intel_debug//&
430424
flag_intel_byterecl//&
431-
flag_intel_standard_compliance//&
432425
flag_intel_backtrace
433426
case(id_intel_classic_windows)
434427
flags = &
@@ -437,7 +430,6 @@ subroutine get_debug_compile_flags(id, flags)
437430
flag_intel_limit_win//&
438431
flag_intel_debug_win//&
439432
flag_intel_byterecl_win//&
440-
flag_intel_standard_compliance_win//&
441433
flag_intel_backtrace_win
442434
case(id_intel_llvm_nix)
443435
flags = &
@@ -446,16 +438,14 @@ subroutine get_debug_compile_flags(id, flags)
446438
flag_intel_limit//&
447439
flag_intel_debug//&
448440
flag_intel_byterecl//&
449-
flag_intel_standard_compliance//&
450441
flag_intel_backtrace
451442
case(id_intel_llvm_windows)
452443
flags = &
453444
flag_intel_warn_win//&
454445
flag_intel_check_win//&
455446
flag_intel_limit_win//&
456447
flag_intel_debug_win//&
457-
flag_intel_byterecl_win//&
458-
flag_intel_standard_compliance_win
448+
flag_intel_byterecl_win
459449
case(id_nag)
460450
flags = &
461451
flag_nag_debug//&

src/fpm_environment.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include <stdlib.h>
2+
#include <stdio.h>
3+
4+
/// @brief Set environment variable using the C standard library
5+
/// @param envname: points to a string containing the name of an environment variable to be added or altered.
6+
/// @param envval: points to the value the environment variable is set to
7+
/// @param overwrite: flag to determine whether an old value should be overwritten
8+
/// @return success flag, 0 on successful execution
9+
int c_setenv(const char *envname, const char *envval, int overwrite) {
10+
#ifndef _WIN32
11+
return setenv(envname, envval, overwrite);
12+
#else
13+
int errcode = 0;
14+
if(!overwrite) {
15+
size_t envsize = 0;
16+
errcode = getenv_s(&envsize, NULL, 0, envname);
17+
if (errcode || envsize) return errcode;
18+
}
19+
return _putenv_s(envname, envval);
20+
#endif
21+
}
22+
23+
/// @brief Delete environment variable using the C standard library
24+
/// @param envname: points to a string containing the name of an environment variable.
25+
/// @return success flag, 0 on successful execution
26+
int c_unsetenv(const char *envname) {
27+
#ifndef _WIN32
28+
return unsetenv(envname);
29+
#else
30+
char* str = malloc(64*sizeof(char));
31+
*str = '\0';
32+
int errcode = _putenv_s(envname,str);
33+
// Windows returns a non-0 code when setting empty variable
34+
if (errcode==-1) errcode=0;
35+
free(str);
36+
return errcode;
37+
#endif
38+
}

0 commit comments

Comments
 (0)