Ninja: MPICH2 and Intel MPI mpif90 breaks Fortran ABI check
CMake + Intel mpif90 + Ninja fails:
-- The Fortran compiler identification is Intel ...
...
-- Detecting Fortran compiler ABI info - failed
The reason is as follows.
With the Intel Fortran compiler and the Ninja generator, CMake explicitly preprocesses Fortran sources like this:
$ ifort -fpp -E src.F > src.F-pp.f
The redirection of stdout to a file is needed because ifort
's -E
option is documented as "Causes the preprocessor to send output to stdout". There is no way to tell the compiler to write the preprocessor output directly to a file.
Since !2716 (merged), first included in CMake 3.14, CMake passes the -v
flag when compiling the ABI check in order to extract the implicit include directories that ifort -v
prints to stderr. That causes the explicit preprocessing step to look like this:
$ ifort -fpp -v -E src.F > src.F-pp.f
CMake captures the -v
output on stderr to extract the implicit include directories.
However, this breaks when using Intel MPI's mpif90
. It interprets the -v
flag to mean two things:
- Write version information to stdout.
- Invoke the underlying
ifort
compiler with-v
.
The ABI check's explicit preprocessing step:
$ mpif90 -fpp -v -E src.F > src.F-pp.f
writes two lines of version of information into src.F-pp.f
, which of course isn't valid Fortran syntax and doesn't compile.
This can be seen by hand:
$ mpif90 -fpp -v -E empty.F 2>/dev/null
mpif90 for the Intel(R) MPI Library ...
Copyright(C) ..., Intel Corporation. All rights reserved.
# 1 "empty.F"