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
-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
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"