A KISS pure Fortran Library for building powerful, easy-to-use, elegant command line interfaces
| What is FLAP? | Main features | Copyrights | Documentation | Install |
Modern Fortran standards (2003+) have introduced support for Command Line Arguments (CLA), thus it is possible to construct nice and effective Command Line Interfaces (CLI). FLAP is a small library designed to simplify the (repetitive) construction of complicated CLI in pure Fortran (standard 2003+). FLAP has been inspired by the python module argparse trying to mimic it. Once you have defined the arguments that are required by means of a user-friendly method of the CLI, FLAP will parse the CLAs for you. It is worthy of note that FLAP, as argparse, also automatically generates help and usage messages and issues errors when users give the program invalid arguments.
Go to Top
FLAP is inspired by the python great module argparse, thus many features are taken from it. Here the main features are listed.
nargs='3'
;nargs='+'
;nargs='*'
;Any feature request is welcome.
Go to Top
FLAP is an open source project, it is distributed under a multi-licensing system:
Anyone is interest to use, to develop or to contribute to FLAP is welcome, feel free to select the license that best matches your soul!
More details can be found on wiki.
Go to Top
Besides this README file the FLAP documentation is contained into its own wiki. Detailed documentation of the API is contained into the GitHub Pages that can also be created locally by means of ford tool.
A minimal plate:
program minimal type(command_line_interface) :: cli ! Command Line Interface (CLI). character(99) :: string ! String value. integer :: error ! Error trapping flag. call cli%init(description = 'minimal FLAP example') call cli%add(switch='--string', & switch_ab='-s', & help='a string', & required=.true., & act='store', & error=error) if (error/=0) stop call cli%get(switch='-s', val=string, error=error) if (error/=0) stop print '(A)', cli%progname//' has been called with the following argument:' print '(A)', 'String = '//trim(adjustl(string)) endprogram minimal
That built and run provides:
→ ./minimal ./minimal: error: named option "--string" is required! usage: ./exe/test_minimal --string value [--help] [--version] minimal FLAP example Required switches: --string value, -s value a string Optional switches: --help, -h Print this help message --version, -v Print version
A nice automatic help-message, right? Executed correctly gives.
→ ./minimal --string 'hello world' ./exe/minimal has been called with the following argument: String = hello world
For more details, see the provided tests.
FLAP fully supports nested (sub)commands or groups of command line arguments. For example a fake git
toy remake can be coded as
! initializing Command Line Interface call cli%init(progname = 'test_nested', & version = 'v2.1.5', & authors = 'Stefano Zaghi', & license = 'MIT', & description = 'Toy program for testing FLAP with nested commands',& examples = ['test_nested ',& 'test_nested -h ',& 'test_nested init ',& 'test_nested commit -m "fix bug-1"',& 'test_nested tag -a "v2.1.5" ']) ! set a Command Line Argument without a group to trigger authors names printing call cli%add(switch='--authors',switch_ab='-a',help='Print authors names',required=.false.,act='store_true',def='.false.') ! set Command Line Arguments Groups, i.e. commands call cli%add_group(group='init',description='fake init versioning') call cli%add_group(group='commit',description='fake commit changes to current branch') call cli%add_group(group='tag',description='fake tag current commit') ! set Command Line Arguments of commit command call cli%add(group='commit',switch='--message',switch_ab='-m',help='Commit message',required=.false.,act='store',def='') ! set Command Line Arguments of commit command call cli%add(group='tag',switch='--annotate',switch_ab='-a',help='Tag annotation',required=.false.,act='store',def='') ! parsing Command Line Interface call cli%parse(error=error) if (error/=0) then print '(A)', 'Error code: '//trim(str(n=error)) stop endif ! using Command Line Interface data to trigger program behaviour call cli%get(switch='-a',val=authors_print,error=error) ; if (error/=0) stop if (authors_print) then print '(A)','Authors: '//cli%authors elseif (cli%run_command('init')) then print '(A)','init (fake) versioning' elseif (cli%run_command('commit')) then call cli%get(group='commit',switch='-m',val=message,error=error) ; if (error/=0) stop print '(A)','commit changes to current branch with message "'//trim(message)//'"' elseif (cli%run_command('tag')) then call cli%get(group='tag',switch='-a',val=message,error=error) ; if (error/=0) stop print '(A)','tag current branch with message "'//trim(message)//'"' else print '(A)','cowardly you are doing nothing... try at least "-h" option!' endif
that when invoked without arguments prompts:
cowardly you are doing nothing... try at least "-h" option!
and invoked with -h
option gives:
usage: test_nested [--authors] [--help] [--version] {init,commit,tag} ... Toy program for testing FLAP with nested commands Optional switches: --authors, -a default value .false. Print authors names --help, -h Print this help message --version, -v Print version Commands: init fake init versioning commit fake commit changes to current branch tag fake tag current commit For more detailed commands help try: test_nested init -h,--help test_nested commit -h,--help test_nested tag -h,--help Examples: test_nested test_nested -h test_nested init test_nested commit -m "fix bug-1" test_nested tag -a "v2.1.5"
For more details, see the provided example.
Go to Top
FLAP is a Fortran library composed by several modules.
Before download and compile the library you must check the requirements.
To download and build the project two main ways are available:
Go to Top
FLAP ships a bash script (downloadable from here) that is able to automatize the download and build steps. The script install.sh
has the following usage:
→ ./install.sh Install script of FLAP Usage: install.sh --help|-? Print this usage output and exit install.sh --download|-d <arg> [--verbose|-v] Download the project --download|-d [arg] Download the project, arg=git|wget to download with git or wget respectively --verbose|-v Output verbose mode activation install.sh --build|-b <arg> [--verbose|-v] Build the project --build|-b [arg] Build the project, arg=fobis|make|cmake to build with FoBiS.py, GNU Make or CMake respectively --verbose|-v Output verbose mode activation Examples: install.sh --download git install.sh --build make install.sh --download wget --build cmake
The script does not cover all possibilities.
The script operation modes are 2 (collapsible into one-single-mode):
you can mix any of the above combinations accordingly to the tools available.
Typical usages are:
# download and prepare the project by means of git and build with GNU Make install.sh --dowload git --build make # download and prepare the project by means of wget (curl) and build with CMake install.sh --dowload wget --build cmake # download and prepare the project by means of git and build with FoBiS.py install.sh --dowload git --build fobis
Go to Top
manually download and buildTo download all the available releases and utilities (fobos, license, readme, etc...), it can be convenient to clone whole the project:
git clone https://github.com/szaghi/FLAP cd FLAP git submodule update --init
Alternatively, you can directly download a release from GitHub server, see the ChangeLog.
The most easy way to compile FLAP is to use FoBiS.py within the provided fobos file.
Consequently, it is strongly encouraged to install FoBiS.py.
| Build by means of FoBiS | Build by means of GNU Make | Build by means of CMake |
FoBiS.py is a KISS tool for automatic building of modern Fortran projects. Providing very few options, FoBiS.py is able to build almost automatically complex Fortran projects with cumbersome inter-modules dependency. This removes the necessity to write complex makefile. Moreover, providing a very simple options file (in the FoBiS.py nomenclature indicated as fobos
file) FoBiS.py can substitute the (ab)use of makefile for other project stuffs (build documentations, make project archive, etc...). FLAP is shipped with a fobos file that can build the library in both static and shared forms and also build the Test_Driver
program. The provided fobos file has several building modes.
Typing:
the following message should be printed:
The fobos file defines the following modes: - "shared-gnu" - "static-gnu" - "test-driver-gnu" - "shared-gnu-debug" - "static-gnu-debug" - "test-driver-gnu-debug" - "shared-intel" - "static-intel" - "test-driver-intel" - "shared-intel-debug" - "static-intel-debug" - "test-driver-intel-debug"
The modes should be self-explicative: shared
, static
and test-driver
are the modes for building (in release, optimized form) the shared and static versions of the library and the Test Driver program, respectively. The other 3 modes are the same, but in debug form instead of release one. -gnu
use the GNU gfortran
compiler while -intel
the Intel one.
The shared
or static
directories are created accordingly to the form of the library built. The compiled objects and mod files are placed inside this directory, as well as the linked library.
FoBiS.py build -mode shared-gnu
FoBiS.py build -mode static-gnu
FoBiS.py build -mode shared-gnu-debug
FoBiS.py build -mode static-gnu-debugbuilding the Test Driver program
The Test_Driver
directory is created. The compiled objects and mod files are placed inside this directory, as well as the linked program.
FoBiS.py build -mode test-driver-gnudebug test driver program
FoBiS.py build -mode test-driver-gnu-debug
Typing:
the following message should be printed:
The fobos file defines the following rules: - "makedoc" Rule for building documentation from source files Command => rm -rf doc/html/* Command => ford doc/main_page.md Command => cp -r doc/html/publish/* doc/html/ - "deldoc" Rule for deleting documentation Command => rm -rf doc/html/* - "maketar" Rule for making tar archive of the project Command => tar -czf FLAP.tar.gz * - "makecoverage" Rule for performing coverage analysis Command => FoBiS.py clean -mode test-driver-gnu Command => FoBiS.py build -mode test-driver-gnu -coverage Command => ./Test_Driver/Test_Driver Command => ./Test_Driver/Test_Driver -v Command => ./Test_Driver/Test_Driver -s 'Hello FLAP' -i 2 Command => ./Test_Driver/Test_Driver 33.0 -s 'Hello FLAP' --integer_list 10 -3 87 -i 3 -r 64.123d0 --boolean --boolean_val .false. - "coverage-analysis" Rule for performing coverage analysis and saving reports in markdown Command => FoBiS.py clean -mode test-driver-gnu Command => FoBiS.py build -mode test-driver-gnu -coverage Command => ./Test_Driver/Test_Driver Command => ./Test_Driver/Test_Driver -v Command => ./Test_Driver/Test_Driver -s 'Hello FLAP' -i 2 Command => ./Test_Driver/Test_Driver 33.0 -s 'Hello FLAP' --integer_list 10 -3 87 -i 3 -r 64.123d0 --boolean --boolean_val .false. Command => gcov -o Test_Driver/obj/ src/* Command => FoBiS.py rule -gcov_analyzer wiki/ Coverage-Analysis Command => rm -f *.gcov
The rules should be self-explicative.
build by means of GNU MakeBad choice :-)
However, a makefile (generated by FoBiS.py...) to be used with a compatible GNU Make tool is provided.
It is convenient to clone the whole FLAP repository and run a standard make:
git clone https://github.com/szaghi/FLAP cd FLAP make -j 1
This commands build all tests (executables are in exe/
directory). To build only the library (statically linked) type:
git clone https://github.com/szaghi/FLAP cd FLAP make -j 1 STATIC=yes
Bad choice :-)
However, a CMake setup (kindly developed by victorsndvg) is provided.
It is convenient to clone the whole FLAP repository and run a standard CMake configure/build commands:
git clone https://github.com/szaghi/FLAP $YOUR_FLAP_PATH mkdir build cd build cmake $YOUR_FLAP_PATH cmake --build .
If you want to run the tests suite type:
git clone https://github.com/szaghi/FLAP $YOUR_FLAP_PATH mkdir build cd build cmake -DFLAP_ENABLE_TESTS=ON $YOUR_FLAP_PATH cmake --build . ctest
A Fortran Package Manager manifest file is also included, so that the library and test cases can be compiled with FPM. For example:
fpm build --profile release
fpm test --profile release
To use FLAP
within your fpm project, add the following to your fpm.toml
file:
[dependencies] FLAP = { git="https://github.com/szaghi/FLAP.git" }
Or, to use a specific revision:
[dependencies] FLAP = { git="https://github.com/szaghi/FLAP.git", rev = "11cb276228d678c1d9ce755badf0ce82094b0852" }
Note that, when compiling with FPM, the git submodules in the src/third_party
directory are not used, but FPM will download these separately, based on the versions specified in the fpm.toml
file.
Go to Top
NVFortran Compiling IssueThanks to Carl Ponder (@cponder), we know that Nvidia NVFortran compiler misunderstand a quoted string containing a backslash into source files. To overcome this issue we suggest to use the -Mbackslash
switch of NVFortran compiler.
For example, to compile by means of CMake use:
git clone https://github.com/szaghi/FLAP $YOUR_FLAP_PATH mkdir build cd build cmake -D CMAKE_Fortran_FLAGS="-Mbackslash" $YOUR_FLAP_PATH cmake --build .
Similarly, into the fobos config file there is a specific template for NVFortran where this switch has been used to compile FLAP by means of Nvidia compiler. To test it use:
FoBiS.py build -mode static-nvf
Go to Top
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4