We have just release version 0.7.0 of fpm!
New main features include:
- C preprocessor support in the manifest
fpm.toml
- Compilation of C++ sources
- and other minor bug fixes
For a more detailed description check out the Release Notes
We have just release version 0.7.0 of fpm!
New main features include:
fpm.toml
For a more detailed description check out the Release Notes
With fpm
coming to 0.7.0, do we have some clear short-term goals to do?
Iâm very much looking forward to dependencies being stored locally via toml
/json
so that we only need to parse files that are changed.
fpm 0.7.0 has just arrived in MSYS2:
https://packages.msys2.org/base/mingw-w64-fpm
fpm 0.7.0 has been imported into OpenBSD ports tree: ports/devel/fpm/
Iâve tried to follow Homebrew way of installing as instructed on the fpm page but it failed. First, the version âpouredâ from the awvwgk/fpm tap is 0.5.0. Second, it does not work, seemingly unable to find libgfortran.5.dylib
which is present, as part of gfortran-12
suite but not in places that fpm is searching
dyld[22790]: Library not loaded: â/usr/local/opt/gcc/lib/gcc/11/libgfortran.5.dylibâ
Referenced from: â/usr/local/Cellar/fpm/0.5.0/bin/fpmâ
Reason: tried: â/usr/local/opt/gcc/lib/gcc/11/libgfortran.5.dylibâ (no such file), â/usr/local/lib/libgfortran.5.dylibâ (no such file), â/usr/lib/libgfortran.5.dylibâ (no such file)
The binary for MacOS is no better:
./fpm-0.7.0-macos-x86_64
dyld[23036]: Library not loaded: â/usr/local/opt/gcc@9/lib/gcc/9/libgfortran.5.dylibâ
Referenced from: â/Users/msz/Downloads/fpm-0.7.0-macos-x86_64â
Reason: tried: â/usr/local/opt/gcc@9/lib/gcc/9/libgfortran.5.dylibâ (no such file), â/usr/local/lib/libgfortran.5.dylibâ (no such file), â/usr/lib/libgfortran.5.dylibâ (no such file)
Finally, I downloaded the source and ran install.sh
. This has worked although I was a bit confused to find
SOURCE_URL="https://github.com/fortran-lang/fpm/releases/download/v0.6.0/fpm-0.6.0.F90"
line in the install.sh
script
The source-compiled fpm
reports version 0.7.0 alpha which is a bit discouraging. On the WWW page, it is tagged as âLatestâ but the next-older release, 0.6.0, is not tagged as âStableâ. So which one should I use?
Added: Sorry for a stupid question but the tutorial says only about creating a new project. Is fpm
capable of building a project basing just on its fpm.toml file? I tried to build pyplot-fortran
that way but I got just âProject is up to dateâ. Only when I downloaded full source drom Github, I was able to build it. I thought fpm
is sort of apm/yum/brew app, capable of downloading the source based on a single configuration file.
msz59: it looks like recent fpm doesnât build dependencies if your program `app\main.f90â doesnât use them. Very nice feature.
I donât think I can help much with the brew tap issue, since I donât have access to a Mac anymore.
Same goes for the GitHub release artifact. The only thing I would add is that the release binary is only for Intel MacOS not the newer ARM based chips.
The install.sh
script does more than simply download version 0.6.0 of fpm. It then uses fpm to update dependencies and build itself from source, hence the version being 0.7.0 is correct.
âLatestâ is a GitHub assignment to indicate the latest release, thatâs useful for a number of reasons. Also we donât tag our releases as âStableâ, they are all meant to be stable.
fpm will only recompile if there are changes to your project, very similar to other build tools. If there are no changes, then there is no work for your compiler to do.
The adding dependencies part of the tutorial is I suspect what youâre looking for: https://fpm.fortran-lang.org/en/tutorial/dependencies.html
I hope this helps.
My question was about building an external package, not about building my project that depends on an external package. When I finally downloaded the full source of pyplot-fortran and isssued fpm build --profile release
in its top directory, the project was built, resulting in pyplot_module.mod
and libpyplot-fortran.a
files in the build
directory tree. So I wondered if fpm were able to do this whole process based on just fpm.toml
file which, as I see, contains the URL of the project.
Sort of self-dependence, so to say.
@gnikit
Do I understand correctly that if I initially build fpm itself or other project with specific flags etc. and then running fpm install --prefix "$PREFIX"
I must setup the same flags to avoid recompiling?
If initially run fpm build
and then run fpm test
then build fpm package it will be recompiled because of internal built-in tests (using test-drive), isnât it?
So I wondered if fpm were able to do this whole process based on just
fpm.toml
file which, as I see, contains the URL of the project.
Yes, very similar to other build tools. For fpm the file fpm.toml
is how fpm interacts with your project.
If you are using fpm install ...
yes, since every time you install will override the same binary/library.
If you are doing fpm build ...
or fpm run ...
then fpm is capable of maintaining multiple builds simultaneously, under ./build
.
When you do fpm build
what is compiled by default are Fortran files under src
, app
and example
, so when you do fpm test
you only need to compile the Fortran files under test
not the entire project. The only reason I can think of why fpm test
would recompile files under src
is if somehow your test modules where altering the files.
The only reason I can think of why
fpm test
would recompile files undersrc
is if somehow your test modules where altering the files.
If files in src get built in fpm test they were probably not used in any executable, since fpm will only compile modules which are used.
I prepared Gentoo Linux package dev-util/fpm-0.7.0 for GURU repository.
I have to patch fpm.toml
to unbundle toml-f
and m_cli2
libraries (as separate packages) to build it as external packages and to link as shared libraries. Itâs because package is required to be built within networkless environment and Gentoo QA requirements to unbundle as much as possible.
In src_compile
and src_install
phases I pass all possible flags to be safe of respecting user/system defined values instead of defaults. Also I assumed that fpm
recompile on options changes like scons
build system so pass the same options (flags) to fpm install
command. On this iteration I disable tests checking for package.
The package is in the dev
branch so it requires to wait a little bit and it will be available for Gentoo users too.
P.S.
I didnât find option in fpm documentation to run parallel build process. Isnât it implementing yet?
Nice, thanks for doing the work to port it to Gentoo.
The parallelisation is only available via OpenMP. This should work assuming you have OpenMP installed
fpm install --profile release --flag "-fopenmp"
@gnikit ,
thank you for additional info. I added optional USE="openmp"
package manager flag for gentoo fpm package but without --profile release
as anyway system defined flags are passed anyway.
Have you verified that the resulting fpm binary contains optimised code? I would check that just to be safe.
Also, just as a sanity check to make sure fpm works with the compiler flags you are using I would run through the test suite. I donât mean as part of the Gentoo install process, just locally on your machine.
Oops!
It seems the fpm currently incompatible with toml-f-0.3.1 - with being unbundled of this library 3 tests (or more) are failed (non depend on flags, I passed from system: -march=native -O2 -pipe
):
...
# Starting invalid-toml ... (2/3)
# ... invalid-toml [EXPECTED FAIL]
# Message: error: Key 'dependencies' already exists
--> fpm-invalid-toml.toml:4:2-13
|
3 | dependencies.fpm.git = "https://github.com/fortran-lang/fpm"
| ------------ first defined here
4 | [dependencies]
| ^^^^^^^^^^^^ key already used
|
...
# Starting package-simple ... (24/48)
# ... package-simple [FAILED]
# Message: manifest file syntax error: package name must be composed only of alphanumerics, "-" and "_" and start with a letter ::"example"
...
# Starting package-wrongexe ... (28/48)
# ... package-wrongexe [EXPECTED FAIL]
# Message: manifest file syntax error: package name must be composed only of alphanumerics, "-" and "_" and start with a letter ::"example"
# Starting package-wrongtest ... (29/48)
# ... package-wrongtest [EXPECTED FAIL]
# Message: manifest file syntax error: package name must be composed only of alphanumerics, "-" and "_" and start with a letter ::"example"
# Starting package-duplicate ... (30/48)
# ... package-duplicate [EXPECTED FAIL]
# Message: manifest file syntax error: package name must be composed only of alphanumerics, "-" and "_" and start with a letter ::"example"
# Starting test-simple ... (31/48)
# ... test-simple [FAILED]
...
# Starting example-simple ... (39/48)
# ... example-simple [FAILED]
# Message: manifest file syntax error: example name must be composed only of alphanumerics, "-" and "_" and start with a letter ::"example"
...
3 test(s) failed!
ERROR STOP 1
Error termination. Backtrace:
#0 0x7ff8c4b85a28 in ???
#1 0x7ff8c4b86674 in ???
#2 0x555c909f9ec0 in MAIN__
#3 0x555c909f94de in main
...
<ERROR> Execution failed for object " fpm-test "
<ERROR>*cmd_run*:stopping due to failed executions
STOP 1
But fpm successfully build the fpm from git and create new project. The executable is optimized with applied flags - itâs about 700 Kb and addition of --verbose
key show that the offered flags are used.
With unbundled toml-f-0.2.4 (that corresponds bundled commit-sha) all tests are passed. I need to restrict fpm package build against this version of toml-f.
It seems the fpm currently incompatible with toml-f-0.3.1 - with being unbundled of this library 3 tests (or more) are failed (non depend on flags, I passed from system:
-march=native -O2 -pipe
):
Thanks for pointing this out could you open an issue in fpm regarding this incompatibility? It could also be a bug in TOML Fortran.
I open appropriate issue: fpm tests fail if build against toml-f 0.3.1 instead of 0.2.4 ¡ Issue #805 ¡ fortran-lang/fpm ¡ GitHub
Initially I failed to reproduce and was confused. It was because my cloned fpm repo already had build/dependencies/toml-f
with v0.2.4
and change of toml-f commit-sha
within fpm.toml
didnât result in the update of this dependency files. Is it a bug or there is fpm command to refetch/update dependencies?
Good point, I just cheated when making the patch by cloning from a local repo so I didnât noticed any issue in fpm update. If you have a reproducer we can check.