I have a local library and module files not in current working directory. I need compile and link a new project to this library using fpm. Where should I modify the fpm.toml or pass the flag to the fpm command?
See Manifest reference — Fortran Package Manager (specifying-dependencies)
You can also use the --flag option, for example:
$ fpm run --flag '$(pkg-config --cflags mylibrary)'
The reason I am asking for help here is that it is difficult for me to understand some description in Manifest reference. Maybe I need some tutorials on how to link local library to a project. Anyway, here is my situation: I have a local library libmylib.a at ~/mine/lib and the related mod files at ~/mine/include. Based on Manifest:link external library, the build section is modified as
[build]
link = "mylib"
However, where do I specify the the path for lib and mods? When compile and link using gfortran, the command used was
gfortran -I~/mine/include -L~/mine/lib main.f90 -lmylib
There are a few different ways that this can be done in fpm.
- If you have local includes specify them in the
"include-dir" = ["mylocalinc"]keyword. Keep in mind this
include-dir does not currently allow using pre-built module
.modfiles
- If you have includes outside of your project either:
- Use the fpm subcommand
--flagto pass whatever compiler options you want to fpm - Set the shell variable
FPM_FFLAGSto pass whatever compiler options you want to fpm - Or last option, that I do not recommend but I list for completeness, append/prepend to the variable your compiler uses to look for include paths for GNU (gfortran) that is
CPATHe.g. CPATH=${CPATH}:/my/path
- Use the fpm subcommand
For linking the options that you have are pretty much the same. In your fpm.toml add the lib you wish to link against to
[build]
link = ["mylib"]
- Use the fpm subcommand
--link-flage.g.fpm build --link-flag "-L/path/to/mylib" - Set
FPM_LDFLAGSe.g.export FPM_LDFLAGS="-L/path/to/mylib"and thenfpm build - Or set the compiler variables
LD_LIBRARY_PATH(and for gfortranLIBRARY_PATH) to include your “/path/to/mylib” e.g.export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/path/to/mylib,export LIBRARY_PATH=${LIBRARY_PATH}:/path/to/myliband thenfpm build
Here is an example where you link against an external library is GitHub - gnikit/gmsh-fpm: Gmsh API using the Fortran Package Manager (fpm)
Thank you very much. Very clear description.
I’m trying to get rid of -Werror=implicit-interface flag when compiling a project and I am passing my compiler flags via --flag "compiler flags option of my choice " but the --verbose option shows me that the project is still being compiled with -Werror=implicit-interface. What can I do to get it -Werror=implicit-interface out of the way?
You may want to try this: Manifest reference — Fortran Package Manager