Skip to content

fobos — the FoBiS makefile

A fobos file is FoBiS.py's project configuration file. It replaces makefiles entirely, using a simple INI-like syntax.

Overview

When FoBiS.py runs, it automatically looks for a file named fobos in the current working directory. Options in the fobos file override the CLI defaults, and for cflags, lflags, and preproc they are combined with any additional values passed on the command line.

Design principle

Brevity is a design parameter. The fobos file uses the same option names as the CLI switches — there is nothing new to learn.

Basic structure

A minimal single-mode fobos file:

ini
[default]
compiler  = gnu
cflags    = -c -O2
src       = ./src/
build_dir = ./build/
obj_dir   = ./obj/
mod_dir   = ./mod/
target    = src/main.f90
output    = myapp

A multi-mode fobos file:

ini
[modes]
modes = debug release

[debug]
compiler  = gnu
cflags    = -c -O0 -g -Wall
build_dir = ./build/debug/

[release]
compiler  = gnu
cflags    = -c -O3
build_dir = ./build/release/

Loading a fobos file

ScenarioCommand
Default name and locationLoaded automatically
Custom name or pathFoBiS.py build -f /path/to/my_fobos
Select a specific modeFoBiS.py build -mode release
List available modesFoBiS.py build -lmodes

Case sensitivity

By default fobos option names are case-sensitive. To make them case-insensitive:

bash
FoBiS.py build -fci

Or in the fobos file itself, this is implicit for the option names (values remain as written).

Available options

All CLI options accepted by build and clean are available in a fobos mode section with identical names (using the long form without the leading --). A representative set:

OptionDescription
compilerCompiler identifier (gnu, intel, …)
fcCompiler executable (for custom compiler)
cflagsCompilation flags
lflagsLinking flags
preprocPreprocessor macro flags
srcRoot source directory (space-separated list)
build_dirBuild output directory
obj_dirCompiled objects directory
mod_dirModule interface files directory
lib_dirExternal library search directories
includeInclude files search directories
targetBuild target file
outputOutput executable name
excludeFiles to exclude from the build
libsExternal libraries (full paths)
vlibsVolatile external libraries (full paths)
ext_libsExternal libraries (by name, in linker path)
ext_vlibsVolatile external libraries (by name)
dependonInterdependent external fobos files
mklibBuild a library: static or shared
arArchiver executable for static libraries (default: ar)
arflagsArchiver flags (default: -rcs)
ranlibRanlib executable; set to empty string to skip (default: ranlib)
mpiEnable MPI compiler variant
openmpEnable OpenMP
coarrayEnable coarrays
coverageEnable coverage instrumentation
jobsNumber of parallel compile jobs
colorsColoured terminal output
quietSuppress verbose output
logWrite build log file
cflags_heritageTrack flag changes and force rebuild on change

Special sections

Beyond the mode sections, a fobos file can contain several top-level sections with fixed names:

SectionPurposeDocumentation
[modes]Lists the available named mode sectionsMany-mode fobos
[project]Project metadata: name, version, authors, …Project metadata
[dependencies]GitHub-hosted build dependenciesFetch Dependencies
[rule-NAME]Custom shell-command rulesRules

[dependencies] section

Declares GitHub-hosted dependencies. Each entry maps a short name to a repository spec:

ini
[dependencies]
deps_dir = .fobis_deps          # optional: where to clone deps (same as --deps-dir)
penf     = https://github.com/szaghi/PENF :: tag=v1.5.0
stdlib   = https://github.com/fortran-lang/stdlib :: tag=v0.5.0 :: use=fobos :: mode=gnu

The use= field selects the integration mode:

  • sources (default) — dependency sources are compiled inline with your project
  • fobos — dependency is built as a separate library and linked

See Fetch Dependencies for the full syntax and workflow.

Comments

Lines beginning with # are ignored:

ini
[default]
# This is a comment
compiler = gnu  # inline comments are also supported
cflags   = -c -O2

Further reading