fpm icon indicating copy to clipboard operation
fpm copied to clipboard

Fortran packages using pkg-config

Open ivan-pi opened this issue 4 years ago • 9 comments

I've created this issue to keep track of some of the (scientific) packages which provide a pkg-config file and could be candidates for testing with fpm.

You can see a list of package files already installed on your system with the command pkg-config --list-all.

ivan-pi avatar Apr 16 '21 17:04 ivan-pi

Feel free to add more packages to the first post.

ivan-pi avatar Apr 16 '21 17:04 ivan-pi

stdlib does provide a pc file and even some more or less transparent logic how it is generated: https://github.com/fortran-lang/stdlib/blob/3621b03c5748b309113316168eae7b6ddc973851/config/CMakeLists.txt#L3-L13

awvwgk avatar Apr 16 '21 17:04 awvwgk

Related to FFTW and also discussion #447, the default installation of FFTW will place a set of source files containing the interfaces to the C routines in /usr/include:

$ ls /usr/include/fftw* -l
-rw-r--r-- 1 root root  2447 Dez  9  2017 /usr/include/fftw3.f
-rw-r--r-- 1 root root 54596 Dez  9  2017 /usr/include/fftw3.f03
-rw-r--r-- 1 root root 31394 Dez  9  2017 /usr/include/fftw3.h
-rw-r--r-- 1 root root 26983 Dez  9  2017 /usr/include/fftw3l.f03
-rw-r--r-- 1 root root 25682 Dez  9  2017 /usr/include/fftw3q.f03

Now to bypass the whole issue of shipping Fortran modules, the FFTW manual recommends that users who want to import FFTW routines as a module, should define one themselves:

  module FFTW3
    use, intrinsic :: iso_c_binding
    include 'fftw3.f03'
  end module

However, since gfortran doesn't search /usr/include/, anyone who wants to use FFTW still needs to append the flag -I/usr/include.

Also the system installed .pc file is not geared towards Fortran users:

$ pkg-config --cflags fftw3

$ pkg-config --libs fftw3
-lfftw3

ivan-pi avatar Apr 17 '21 08:04 ivan-pi

We would have to add --keep-system-cflags in case we detect GFortran to work around this issue.

❯ pkg-config fftw3 --cflags --keep-system-cflags
-I/usr/include 

awvwgk avatar Apr 17 '21 08:04 awvwgk

It looks like you are using pkgconf (see https://github.com/pkgconf/pkgconf/blob/2fdc5f0081dcf22fa476767877d13097eb81e255/cli/main.c#L849)

On my installation:

$ pkg-config --version
0.29.1
$ pkg-config fftw3 --cflags --keep-system-cflags
Unknown option --keep-system-cflags

So the different command line options of pkg-config programs can potentially make a bigger mess.

This might also affect your reply to Milan in https://github.com/fortran-lang/fpm/issues/439#issuecomment-821781400

ivan-pi avatar Apr 17 '21 08:04 ivan-pi

Arch Linux uses pkgconf (1.7.3) with symlinking it as pkg-config. This means we can't workaround this issue with GFortran by using pkg-config options because they won't be supported in all implementations.

Our alternatives for GFortran would be

  1. implement our own non-standard pkg-config to read the pc files in a GFortran friendly way
  2. manually detect the system include paths and append them to the compile arguments as -I options
  3. fix the bug in upstream GFortran

awvwgk avatar Apr 17 '21 09:04 awvwgk

Another solution for FFTW3 with GFortran would be using the C preprocessor instead of the Fortran include directive with:

module fftw3
   use, intrinsic :: iso_c_binding
#include "fftw3.f03"
end module fftw3

awvwgk avatar Apr 17 '21 10:04 awvwgk

That works, but the file needs to given the .F90 suffix in order to invoke the preprocessor automatically (for all compilers). In the long term, I would ultimately prefer the system fftw packages change their default install location (and suffix) of the interface files (unless we reach agreement that /usr/include/ is the right location for these).

Another option would be to offer an fftw3 module fpm package in a fortran-lang repository.

ivan-pi avatar Apr 17 '21 16:04 ivan-pi

Should this be of use, sometime ago I wrote a module to read pkg-config files, including substitution of macros. See the attached file: pkgconfig.f90.txt

arjenmarkus avatar May 24 '21 11:05 arjenmarkus