# FCM: User Guide: Annex: FCM Configuration File

## Syntax

### Syntax: comment

An empty line, a line with only space characters and a line beginning with a `#` character is a comment line. For example:

    # This is a comment.
        # This is also a comment.

Also, if a line contains a space character followed by a `#` character then this, and any following characters, are treated as an end of line comment and are ignored.

### Syntax: declaration

The general syntax of a declaration consists of a label, a set of modifiers, a list of name-spaces, and a value:

    label{mod:mod-value}[ns] = value
    label{mod:mod-value} = value
    label[ns] = value
    label = value
    label = value\
        value # "value    value"
    label = value\
        \value # "valuevalue"

The label is compulsory. It defines the declaration, and may have one or more characters in the alpha-numeric, the underscore, the minus sign and the full stop. The label cannot be substituted with a variable.

The modifier is an optional part of the syntax, but may be a compulsory part of some declarations. The modifiers are embedded between a pair of curly braces and must come after the label, but before the name-spaces and the equal sign. It should be a comma-separated list of colon-separated key-value pairs, (i.e. `{key1: value1, key2: value2, ...}`). The value in each modifier is optional - if a key is set without a value, its value is assumed to be 1. The contents of the modifiers can be substituted using a variable.

The name-space is an optional part of the syntax, but may be a compulsory part of some declarations. The name-spaces are embedded between a pair of square braces and must come after the label and/or modifiers but before the equal sign. It should be a space-separated list of names. If a name contains space, the space character can be escaped using a backslash character or the name can be quoted. The contents of the name-spaces can be substituted using a variable.

The first non-space character after the equal sign begins the value of the declaration. If there is nothing after the equal sign, the value is an empty string. The contents of the value can be substituted using a variable. Trailing space characters are ignored. The end of line can be escaped using a backslash, and the value of the declaration will continue from the next non-comment line. If the first non-space character on that line is a backslash then the line contents up to and including that backslash are ignored.

### Syntax: variable

A variable is used to substitute commonly used values in a declaration. It can refer to an environment variable or can be defined locally using the syntax:

    $var = value    # Sets "var" variable to "value"
    $var{?} = value # Sets "var" variable to "value" only if "var" is not defined
    # E.g.:
    $projects = foo bar baz
    $long_path = src/path/is/very/very/very/long
    $UMDIR{?} = /projects/um1
    # time passes...
    extract.ns = $projects
    extract.path-excl[$projects egg ham] = doc man ${long_path}_longer
    build.prop{cc.defs} = foo=\$foo # escape substitution

The name of a variable must begin with an alphabet or an underscore and followed by 0 or more alpha-numeric or underscore characters, (i.e. it must match this regular expression: ^[A-Za-z_][A-Za-z0-9_]*$).

Locally defined variables only apply in the context of the configuration file and are not passed down, for instance, to the compiler. If there is an environment variable with the same identifier, its value is normally overridden (within the context of the configuration file) by any local setting. However, if a `?` modifier is given, it assigns the value to the variable only if the variable is not already defined (either as an environment variable or locally). Substitution can be escaped using a backslash character in front of the dollar sign. Any attempt to reference an undefined variable will trigger an exception.

Note: $HERE is a reserved variable to indicate the parent directory of the current configuration file. (The system ignores the $HERE environment variable, if there is one.) Any attempt to assign a value to $HERE will trigger an exception.

### Syntax: include

An `include` declaration specifies the logical locations of a list of configuration files, where contents are to be included inline:

    include{type:type} = location ...
    # E.g.:
    include = fcm:foo/path/to/config/file
    include = svn://server/path/to/config/file@1234
    include{type:svn} = http://server/path/to/config/file
    include = /path/to/config/file $HERE/another-config-file
    include = $HERE/another-config-file
    include = ~/path/to/config/file ~fred/path/to/config/file

If the value of an `include` declaration is a relative path, the system will search the directory containing the current configuration file for the include file. More include search paths can be specified using the `include-path` declaration. E.g.:

    # Define or replace include search paths
    include-path=/path/to/some/cfg /path/to/more/cfg
    # Append to include search paths
    include-path{+}=host2:/path/to/cfg
    include-path{type:svn,+}=https://host1/path/to/cfg
    # ... Include files can now be relative paths
    include=foo.cfg bar.cfg

Some commands, e.g. `fcm make`, accept one or more `--config-file-path=PATH` command line option, which can be used to pre-define the include search paths when they read their configuration files.

Currently, the location can be a path in the file system, a Subversion URL, a FCM keyword pointing to a Subversion URL, or a location in the file system of a remote host accessible via passphrase-less SSH. The system will attempt to make an intelligent guess of the location type. To allow for future expansion, both the `include` and the `include-path` declarations accept a type:TYPE modifier (where TYPE can currently be `fs` for a file system path or `svn` for a Subversion location) to allow the location type to be defined where it is ambiguous.

## FCM Keyword Configuration

The keyword configuration files are mainly used to define FCM location keywords and related settings. The `fcm` command searches for keyword configuration files from the following locations:

1. (Deprecated) `$HOME/.fcm` - expects FCM 1 configuration file format. See Annex: Declarations in FCM 1 central/user configuration file for detail.
2. `$FCM/etc/fcm/keyword.cfg` where $FCM/bin/ is the path at which `fcm` is installed.
3. `$HOME/.metomi/fcm/keyword.cfg`.

The following are declarations recognised by the keyword configuration files:

location

  description: Associates a namespace with a location, and allows the use of `fcm:namespace` as a substitute of the location.

  modifier: primary: Optional. If specified, the location is a primary location, i.e. the system will create the `_tr`, `_br`, `_tg`, `-tr`, `-br` and `-tg` keywords for this location.

  modifier: type: Optional. Specifies the type of the location. The system currently supports `svn` for a Subversion location and `fs` for a file system location. If not specified, the system will make an intelligent guess based on the given value.

  namespace: The namespace to be associated with the location.

  value: A valid location of a type supported by the system.

  example:

      location{primary}[var] = svn://fcm5/VAR_svn/VAR
      location{primary, type:svn}[egg] = http://chicken/egg

revision

  description: Associates a keyword with a revision of a location in a version control system.

  namespace: The namespace of a location (already defined using the `location` declaration), followed by a colon and the namespace of the revision.

  value: A valid revision of the location.

  example:

      revision[um:vn7.5] = 18479
      revision[egg:free-range] = 1

browser.comp-pat

  description: Specifies a regular expression to capture components in the scheme-specific part of a version control system location (already defined using the `location{primary}` declaration). These components can then be used in the `browser.loc-tmpl` template string.

  namespace: Optional. The namespace of a location. If not specified, the declaration applies globally.

  value: A valid regular expression.

  example:

      browser.comp-pat = (?msx-i:\A // ([^/]+) /+ ([^/]+)_svn /*(.*) \z) # default
      browser.comp-pat[egg] = (?msx-i:\A//([^/]+)/(.*)\z)

browser.loc-tmpl

  description: Specifies a template string, in which the components captured by the `browser.comp.pat` regular expression are used to fill in the numbered fields. The template should have one more field than the number of components captured by `browser.comp-pat`. The final field is used to place the revision, which is generated via the `browser.rev-tmpl`.

  namespace: Optional. The namespace of a location. If not specified, the declaration applies globally.

  value: A valid template.

  example:

      browser.loc-tmpl = http://{1}/projects/{2}/intertrac/source:/{3}{4} # default
      browser.loc-tmpl[egg] = http://{1}/intertrac/source:/{3}{4}

browser.rev-tmpl

  description: Specifies a template string, which should have a single numbered field for filling in the revision number.

  namespace: Optional. The namespace of a location. If not specified, the declaration applies globally.

  value: A valid template.

  example:

      browser.rev-tmpl = @{1} # default

## FCM External Configuration

The external configuration files are used to define the name of external commands used by the FCM system. The `fcm` command searches for external configuration files from the following locations:

1. `$FCM/etc/fcm/external.cfg` where $FCM/bin/ is the path at which `fcm` is installed.
2. `$HOME/.metomi/fcm/external.cfg`.

The following are declarations recognised by the external configuration files:

browser

  description: Specifies the command to invoke the web browser. (default=`firefox`)

  example:

      browser = konqueror

diff3

  description: The shell command used by the extract system of FCM Make to perform a 3-way merge. (default=`diff3`)

  example:

      diff3 = diff3

diff3.flags

  description: The options used by the 3-way merge shell command. (default=`-E -m`)

  example:

      diff3.flags = -E -m

graphic-diff

  description: Specifies the command to invoke the graphic diff tool. (default=`xxdiff`)

  example:

      graphic-diff = tkdiff

graphic-merge

  description: Specifies the command to invoke the graphic merge tool. (default=`xxdiff`)

  example:

      graphic-merge = xxdiff

ssh

  description: The secure remote shell command to execute commands on a remote host. (default=`ssh`)

  example:

      ssh = ssh

ssh.flags

  description: The options used by the secure shell command to execute commands on a remote host. (default=`-n -oBatchMode=yes`)

  example:

      ssh.flags = -n -oBatchMode=yes

rsync

  description: The `rsync` command. (default=`rsync`)

  example:

      rsync = rsync

rsync.flags

  description: The options used by the `rsync` command. (default=`-a --exclude=.* --delete-excluded --timeout=900 --rsh=ssh\ -oBatchMode=yes`)

  example:

      rsync.flags = -a --exclude=.* --delete-excluded --timeout=900 --rsh=ssh\ -oBatchMode=yes

## FCM Make Configuration

A typical FCM make configuration consists of some top level declarations to define the make, and specific declarations for each step. The top level declarations are described below, and the specific declarations for each type of step will be described in the sub-sections to follow.

Note:

- Unless stated otherwise, FCM make configuration declarations are non-cumulative, i.e. if more than one declarations apply to the same configuration, the value of the last declaration overrides those of the earlier ones. E.g.:

      # Sets the Fortran compiler flags for the root name-space
      build.prop{fc.flags} = -O3
      # build.prop{fc.flags}[/] = -O3

      # Sets the C/Fortran compiler flags for the "foo/bar" name-space
      build.prop{cc.flags, fc.flags}[foo/bar] = -g -C
      # build.prop{cc.flags}[foo/bar] = -g -C
      # build.prop{fc.flags}[/] = -O3
      # build.prop{fc.flags}[foo/bar] = -g -C

      # Sets the Fortran compiler flags for the root and "foo/bar" name-spaces
      build.prop{fc.flags}[/ foo/bar] = -O2
      # build.prop{cc.flags}[foo/bar] = -g -C
      # build.prop{fc.flags}[/] = -O2
      # build.prop{fc.flags}[foo/bar] = -O2

      # Sets the Fortran compiler flags for the "foo/bar" name-spaces
      build.prop{fc.flags}[foo/bar] = -O1
      # build.prop{cc.flags}[foo/bar] = -g -C
      # build.prop{fc.flags}[/] = -O2
      # build.prop{fc.flags}[foo/bar] = -O1

- Unless stated otherwise, declarations are inherited.
- The default values of the property settings of each step class (e.g. `build.prop{fc}`) can be modified in:
  1. The site configuration file `$FCM/etc/fcm/make.cfg` where $FCM/bin/ is the path at which `fcm` is installed.
  2. The user configuration file `$HOME/.metomi/fcm/make.cfg`.
  3. `*.prop{class,*}` declarations in the FCM make configuration file of the current session.

  The syntax is identical to a normal FCM make configuration file declaration except that:

  - Only `*.prop{*}` declarations are accepted.
  - The settings apply to a step class, not an individual step.
  - Name-space is not allowed.

For further details, please refer to the chapter on FCM Make.

description

  description: Specifies a description string for the current make.

  value: A string.

  example:

      description = Release 2.71.82

dest

  description: Specifies the output destination of the make system. If not specified, the system assumes the output destination to be the current working directory. This setting is not inherited.

  value: A writable directory path.

  example:

      dest = path
      # E.g.:
      dest = $HERE

name

  description: Specifies the NAME of the make, so that the command will search for fcm-makeNAME.cfg instead of fcm-make.cfg, and will write context files in .fcm-makeNAME/ and log files as fcm-makeNAME.log, etc.

  value: A file name friendly string.

  example:

      name = -friend

require-version

  description: Specifies the minimum FCM version and optionally the maximum FCM version that can be used on the current configuration. If specified, FCM make fails immediately if its version does not meet the criteria.

  value: The minimum version required, and optionally the maximum version required.

  example:

      # Requires minimum FCM release at 2016.02.0
      require-version = 2016.02.0
      # Requires minimum FCM release at 2016.02.0, and maximum at 2038.01.0
      require-version = 2016.02.0 2038.01.0

steps

  description: Specifies a list of steps for the make system to invoke. Each specified step can either be the ID of a known sub-system, i.e. `extract`, `mirror`, `preprocess` and `build`, or an ID defined using the `step.class` declaration. (See below.)

  value: A list of steps for the make system to invoke.

  example:

      steps = id-1 id-2 ...
      # E.g.:
      steps = extract mirror

step.class

  description: Defines custom step IDs. This allows built-in steps to be renamed, or re-used in multiple steps.

  namespace: Specifies the step IDs.

  value: An ID of a known sub-system, i.e. `extract`, `mirror`, `preprocess` and `build`.

  example:

      step.class[id ...] = id-of-class
      # E.g.:
      step.class[build-qxrecon build-ieee] = build

use

  description: Specifies inheritance locations. It is worth noting that this declaration is cumulative, i.e. a `use` declaration adds more inheritance locations rather than overrides the inheritance locations of any previous `use` declarations.

  value: A list of paths where this make can inherit items and properties from.

  example:

      use = path1 path2 ...
      E.g.:
      use = /path/to/inherit

### FCM Make Configuration: Extract

All declarations are prefixed with `extract.*`. Where appropriate, replace the leading `extract` with the appropriate step ID. With the exception of the `extract.location{diff}` declaration, any attempt to specify any extract declarations in an inherited extract will result in an exception.

extract.ns

  description: Specifies a list of names of the projects to extract.

  value: A space-delimited list of names of the projects to extract.

  example:

      extract.ns = gen ops um var ver

extract.location

  description: Specifies the location of the base source tree a project. If the base source tree is not specified for a Subversion project, the system will try to use `trunk@HEAD`.

  modifier: type: Specifies the type of the locations. The system currently supports `svn` for a Subversion location, `ssh` for a file system on a remote host accessible via SSH and RSYNC, and `fs` for a file system location. (default=`svn` if the location is recognised as a Subversion URL, `ssh` if the location has the form [USER@]HOST:PATH and HOST is a valid remote host, `fs` otherwise)

  namespace: A space-delimited list of project IDs.

  value: A location, which can be a full path in the file system, or a relative location of the project root.

  example:

      extract.location[um] = trunk@vn7.5
      extract.location[gen ops var] = trunk@HEAD

extract.location{diff}

  description: Specifies the location(s) of one or more diff source trees of a project. It is OK to add more diff source trees in an inheriting extract.

  modifier: type: -as above-

  namespace: A project ID.

  value: A space-delimited list of locations. A location can be a full path in the file system, or a relative location of the project root.

  example:

      extract.location{diff}[gen] = \
          branches/dev/fred/r12345_678 \
          branches/dev/free/r12345_678@123

extract.location{primary}

  description: Specifies the project locations for an extract, if they are not already defined in the keyword configuration.

  modifier: type: -as above-

  namespace: A project ID.

  value: A project location. The location can be a path in the file system, a Subversion URL or a FCM keyword pointing to a Subversion URL.

  example:

      extract.location{primary}[egg] = svn://server2/egg
      extract.location{primary,type:svn}[foo] = http://server1/foo

extract.path-excl / extract.path-incl

  description: Specifies the paths in a project tree to exclude/include. (A path-incl takes precedence over a path-excl declaration.)

  namespace: A space-delimited list of project IDs.

  value: A space-delimited list of paths in a project tree.

  example:

      extract.path-excl[foo] = / # everything
      extract.path-incl[foo] = bin lib src/code

extract.path-root

  description: Specifies the root paths in the source trees of the projects to be extracted. By default, the root path is the root of a source tree. If this setting is specified, the system will only extract source files under the specified root path. The system will also adjust the name-space of each source file to be relative to the specified root path. The `extract.path-excl` and `extract.path-incl` declarations will apply from the level of the specified root path.

  namespace: A space-delimited list of project IDs.

  value: A relative path in the project source trees.

  example:

      extract.path-root[gen] = src/code

extract.prop

  description: Sets or modifies a property.

  modifier: diff3: The shell command to perform a 3-way merge. If not specified, use the diff3 setting of the FCM external configuration.

  modifier: diff3.flags: The options used by the 3-way merge shell command. If not specified, use the diff3.flags setting of the FCM external configuration.

  value: The value of the property.

  example:

      extract.prop{diff3} = diff3
      extract.prop{diff3.flags} = -E -m

### FCM Make Configuration: Mirror

All declarations are prefixed with `mirror.*`. Where appropriate, replace the leading `mirror` with the appropriate ID.

mirror.target

  description: Specifies the mirror target. This setting is not inherited.

  value: The mirror target.

  example:

      mirror.target = fred@server:/path/of/dest

      # Or if the current user ID is "fred"
      # Or if the user ID for "server" is configured under "~/.ssh/config"
      mirror.target = server:/path/of/dest

      # Or if mirroring to a path accessible only by user ID "bob"
      mirror.target = bob@localhost:/path/of/dest

      # Or if the current user ID is "fred" and local host is "server"
      mirror.target = /path/of/dest

mirror.prop

  description: Sets or modifies a property.

  modifier: See below.

  value: The value of the property.

  example:

      mirror.prop{rsync} = cnysr

The following is a list of properties accepted by the `mirror.prop` declaration:

config-file.name
  The context name to be included in the generated configuration file in the mirror destination.
config-file.steps
  The steps to be included in the generated configuration file in the mirror destination.
no-config-file
  If specified, do not generate a `fcm-make.cfg` in the mirror target.
ssh
  The secure remote shell command to execute commands on a remote machine. If not specified, use the ssh setting of the FCM external configuration.
ssh.flags
  The flags used by the remote shell command to execute commands on a remote machine. If not specified, use the ssh.flags setting of the FCM external configuration.
rsync
  The `rsync` command. If not specified, use the rsync setting of the FCM external configuration.
rsync.flags
  The options used by the `rsync` command. If not specified, use the rsync.flags setting of the FCM external configuration.

### FCM Make Configuration: Build

All declarations are prefixed with `build.*`. Where appropriate, replace the leading `build` with the appropriate ID.

build.source

  description: Specifies one or more source files and/or directories.

  namespace: Optional. Specifies the namespace of the specified paths.

  value: A list of space-delimited file system paths.

  example:

      build.source[foo] = $HOME/foo $DATADIR/foo

build.ns-excl / build.ns-incl

  description: Specifies the name-spaces in the source tree to exclude/include. (A `build.ns-incl` takes precedence over a `build.ns-excl` declaration.)

  value: A list of space-delimited items. Each item is a name-space to exclude/include.

  example:

      build.ns-excl = / # exclude everything
      build.ns-incl = foo bar/baz # include items in these name-spaces

build.target

  description: Selects targets to build according to their keys, categories and tasks.

  modifier: `key` (default if no modifier specified), `category` or `task`

  namespace: Not allowed if modifier is `key`. Optional if modifier is `category` or `task`. If specified, setting only applies to given name-spaces. Otherwise, setting applies to all name-spaces.

  value: A list of space-delimited items (according to the modifier).

  example:

      build.target{category}[etc/namelists etc/configs] = etc
      build.target{category}[src/hello src/greet src/world] = bin lib
      build.target{task}[src/public] = archive install
      build.target = egg.sh mince.py

build.target-rename

  description: Rename targets.

  value: A list of space-delimited items. Each item should be the (automatic) key of a target, followed by a colon and its preferred key.

  example:

      build.target-rename = hello.exe:hello

build.prop

  description: Sets or modifies a property.

  modifier: The name of one (or more) property. See below.

  namespace: Optional. A list of space-delimited namespaces to which this setting applies. The namespaces can be target names, when used with target properties (dependency properties are regarded as source properties), or the hierarchical namespaces of source files. If not specified, the setting applies to the global/root namespace. N.B. Not all build properties accept a namespace. See below for detail.

  value: The value of the property.

  example:

      build.prop{fc} = gfortran
      build.prop{cc.flags,fc.flags} = -C -g
      build.prop{fc.flags}[foo/bar] = -C -g -W
      build.prop{fc.flags}[egg ham bacon] = -C -W
      build.prop{fc.flag-define} = -D%s
      build.prop{cc.defs,fc.defs}[gen] = LOWERCASE UNDERSCORE
      build.prop{fc.libs}[myprog.exe] = netcdf grib

The following is a list of properties accepted by the `build.prop` declaration. The default value is an empty string unless given otherwise. Properties that do not accept a namespace are marked with an asterisk (*).

ar
  The archive command. (default=`ar`)
ar.flags
  If a list of values is specified, the system will not inherit sources with the name-spaces matching the specified values. If the value is a `*`, the system will not inherit any sources.
  The options used by the archive command. (default=`rs`)
archive-ok-target-category *
  If `fcm make` is invoked with the `--archive` option, sub-directories in categories containing intermediate build files will be put into TAR-GZIP files. E.g. with the default setting, `include/` and `o/` will become `include.tar.gz` and `o.tar.gz` respectively. (default=`include o`)
cc
  The C compiler and linker. (default=`gcc`)
cc.defs
  The C compiler will pre-define each word in this setting as a macro.
cc.flags
  The options used by the C compiler at compile time.
cc.flags-ld
  The options used by the C compiler at link time.
cc.flag-compile
  The option used by the C compiler to suppress the linking stage. (default=`-c`)
cc.flag-define
  The option used by the C compiler to define a macro. (default=`-D%s`)
cc.flag-include
  The option used by the C compiler to specify an include search path. (default=`-I%s`)
cc.flag-lib
  The option used by the C compiler at link time to specify a library. (default=`-l%s`)
cc.flag-lib-path
  The option used by the C compiler at link time to specify a library search path. (default=`-L%s`)
cc.flag-omp
  The option used by the C compiler to switch on OpenMP.
cc.flag-output
  The option used by the C compiler to specify the output file name. (default=`-o%s`)
cc.include-paths
  The C compiler will add each directory in this setting as an include search path.
cc.libs
  The C linker will add each item in this setting as a link library.
cc.lib-paths
  The C linker will add each directory in this setting as a library search path.
checksum-method
  The checksum method to use to determine if the content of a file is changed or not. Either MD5 or one of the SHA algorithms supported by the Perl module Digest::SHA can be used. (default=`md5`)
cxx
  The C++ compiler and linker. (default=`g++`)
cxx.defs
  The C++ compiler will pre-define each word in this setting as a macro.
cxx.flags
  The options used by the C++ compiler at compile time.
cxx.flags-ld
  The options used by the C++ compiler at link time.
cxx.flag-compile
  The option used by the C++ compiler to suppress the linking stage. (default=`-c`)
cxx.flag-define
  The option used by the C++ compiler to define a macro. (default=`-D%s`)
cxx.flag-include
  The option used by the C++ compiler to specify an include search path. (default=`-I%s`)
cxx.flag-lib
  The option used by the C++ compiler at link time to specify a library. (default=`-l%s`)
cxx.flag-lib-path
  The option used by the C++ compiler at link time to specify a library search path. (default=`-L%s`)
cxx.flag-omp
  The option used by the C++ compiler to switch on OpenMP.
cxx.flag-output
  The option used by the C++ compiler to specify the output file name. (default=`-o%s`)
cxx.include-paths
  The C++ compiler will add each directory in this setting as an include search path.
cxx.libs
  The C++ linker will add each item in this setting as a link library.
cxx.lib-paths
  The C++ linker will add each directory in this setting as a library search path.
dep.bin
  Specifies a list of manual dependencies on external executable commands.
dep.f.module
  Specifies a list of manual Fortran module dependencies. Note: This modifier does not work if the name-space is specified using a target name.
dep.include
  Specifies a list of manual include dependencies.
dep.o
  Specifies a list of manual object dependencies.
dep.o.special
  Specifies a list of manual object dependencies, which must appear on the command line of the linker, (e.g. an object containing a Fortran blockdata program unit).
fc
  The Fortran compiler and linker. (default=`gfortran`)
fc.defs
  The Fortran compiler will pre-define each word in this setting as a macro.
fc.flags
  The options used by the Fortran compiler at compile time.
fc.flags-ld
  The options used by the Fortran compiler at link time.
fc.flag-compile
  The option used by the Fortran compiler to suppress the linking stage. (default=`-c`)
fc.flag-define
  The option used by the Fortran compiler to define a macro. (default=`-D%s`)
fc.flag-include
  The option used by the Fortran compiler to specify an include search path. (default=`-I%s`)
fc.flag-lib
  The option used by the Fortran compiler at link time to specify a library. (default=`-l%s`)
fc.flag-lib-path
  The option used by the Fortran compiler at link time to specify a library search path. (default=`-L%s`)
fc.flag-module
  The option used by the Fortran compiler to specify a module search path.
fc.flag-omp
  The option used by the Fortran compiler to switch on OpenMP. If specified, the build system will treat `USE` and `INCLUDE` statements that are protected by `!$` sentinels as normal dependency statements.
fc.flag-output
  The option used by the Fortran compiler to specify the output file name. (default=`-o%s`)
fc.include-paths
  The Fortran compiler will add each directory in this setting as an include search path.
fc.libs
  The Fortran linker will add each item in this setting as a link library.
fc.lib-paths
  The Fortran linker will add each directory in this setting as a library search path.
file-ext.a *
  Specifies the extension of an object archive file. (default=`.a`)
file-ext.bin *
  Specifies the extension of a binary executable file. (default=`.exe`)
file-ext.c *
  Specifies the extensions of a C source file. (default=`.c .i .m .mi`)
file-ext.cxx *
  Specifies the extensions of a C++ source file. (default=`.cc .cp .cxx .cpp .CPP .c++ .C .mm .M .mii`)
file-ext.fortran *
  Specifies the extensions of a Fortran source file. (default=`.F .FOR .FTN .F90 .F95 .f .for .ftn .f90 .f95 .inc`)
file-ext.f90-interface *
  Specifies the extension of a Fortran interface file. (default=`.interface`)
file-ext.f90-mod *
  Specifies the extension of a compiled Fortran module file. (default=`.mod`)
file-ext.h *
  Specifies the extensions of a C/C++ header file. (default=`.h`)
file-ext.o *
  Specifies the extension of a compiled object file. (default=`.o`)
file-ext.script *
  Specifies the extensions of script files.
file-name-option.f90-mod *
  Specifies other options for naming a compiled Fortran module file. Accepts `case=upper` or `case=lower` (default).
file-pat.script *
  Specifies a regular expression for matching the name of script files.
ignore-missing-dep-ns *
  Specifies a list of source name-spaces, in which targets can ignore missing dependencies.
keep-lib-o
  Relevant when linking a binary executable and link-without-ar is not set to `true`. If `true`, create and keep the dependent object library as `lib/libNAME.a`, where NAME is the root name of the executable. In the absence of this setting, the behaviour is to create the dependent object library in a temporary directory, which is removed after the linker command is completed.
ld
  The linker command. If not specified, use the compiler of the source file.
link-without-ar
  Relevant when linking a binary executable. If `true`, do not create the dependent object library when linking. Instead, locations of the dependent objects will be specified on the command line of the linker. In the absence of this setting, the behaviour is to create the dependent object library in a temporary directory, with the location of the object library specified using the relevant options of the linker.
no-dep.bin
  Switches off a list of automatic dependencies on external executable. If the value is a `*`, switches off all automatic external executable dependencies.
no-dep.f.module
  Switches off a list of automatic Fortran module dependencies. If the value is a `*`, switches off all automatic Fortran module dependencies. Note: This modifier does not work if the name-space is specified using a target name.
no-dep.include
  Switches off a list of automatic include dependencies. If the value is a `*`, switches off all automatic include dependencies.
no-dep.o
  Switches off a list of automatic object dependencies. If the value is a `*`, switches off all automatic object dependencies.
no-inherit-source *
  If a list of values is specified, the system will not inherit sources with the name-spaces matching the specified values. If the value is a `*`, the system will not inherit any sources.
no-inherit-target-category *
  If a list of values is specified, the system will not inherit a target in a category matching a specified value. (default=`bin etc lib`)
no-step-source *
  If a list of make steps is specified, the system will not search for source files from the specified make steps.
ns-dep.o
  Specifies a list of link-time object dependencies on all objects in the list of name-spaces in the value.

### FCM Make Configuration: Preprocess

The preprocess system uses the same declarations as the build system (see FCM Make Configuration: Build), although their prefixes should be replaced with `preprocess.*` or the appropriate step ID. The following is a list of modifiers accepted by the `preprocess.prop` declaration. The default value of a property is an empty string unless given otherwise. Properties that do not accept a namespace are marked with an asterisk (*).

cpp
  The command of the C/C++ pre-processor. (default=`cpp`)
cpp.defs
  The C/C++ pre-processor will pre-define each word in this setting as a macro.
cpp.flags
  The options used by the C/C++ pre-processor.
cpp.flag-define
  The option used by the C/C++ pre-processor to define a macro. (default=`-D%s`)
cpp.flag-include
  The option used by the C/C++ pre-processor to specify the include search path. (default=`-I%s`)
cpp.include-paths
  The C/C++ preprocessor will add each directory in this setting as an include search path.
dep.include
  Specifies a list of manual include dependencies.
file-ext.cpp *
  Specifies the extensions of C/C++ source file. (default=`.c .m .cc .cp .cxx .cpp .CPP .c++ .C .mm .M`)
file-ext.fpp *
  Specifies the extensions of Fortran source file requiring preprocessing. (default=`.F .FOR .FTN .F90 .F95`)
file-ext.h *
  Specifies the extensions of a C/C++ header file. (default=`.h`)
fpp
  The command of the Fortran pre-processor. (default=`cpp`)
fpp.defs
  The Fortran pre-processor will pre-define each word in this setting as a macro.
fpp.flags
  The options used by the Fortran pre-processor. (default=`-P -traditional`)
fpp.flag-define
  The option used by the Fortran pre-processor to define a macro. (default=`-D%s`)
fpp.flag-include
  The option used by the Fortran pre-processor to specify the include search path. (default=`-I%s`)
fpp.include-paths
  The Fortran preprocessor will add each directory in this setting as an include search path.
no-dep.include
  Switches off a list of automatic include dependencies. If the value is a `*`, it switches off all automatic include dependencies.
no-inherit-source *
  Same as the build property of the same name.
no-inherit-target-category *
  Same as the build property of the same name.
no-step-source *
  Same as the build property of the same name.