Provided by: icmake_12.03.00-1ubuntu1_amd64 bug

NAME

       icmconf - Configuration file for the icmbuild(1) program maintenance script

DESCRIPTION

       The  icmconf configuration file is used to specify and fine-tune the program maintenance performed by the
       icmbuild(1) program and script. It can be used to activate and specify various directives that  determine
       how the program or library maintenance is performed.

       Since  icm()  version  11.00.00  icm()  offers  Single  Pre-Compiled  Headers  (SPCH)  and multi-threaded
       source-file compilation, commonly reducing the construction times of projects to  around  30-40%  of  the
       original  construction  times:  refer  to  the  #define  SPCH  and #define MULTICOMP directives below for
       details.

       Icmconf’s directives are biased towards the construction of C++ programs,  but  program  maintenance  for
       other languages (e.g., C) can also easily be configured.

       The icmbuild(1) script ignores empty lines and lines whose first non-blank characters are two consecutive
       forward slashes (//). Long lines can be split over multiple lines by writing a final backslash  character
       at lines continuing at the next line (refer to the icmake(1) man-page for further details).

CLASS DEPENDENCIES

       Traditional  make-utilities  recompile  all  dependent  sources  once  header  files  are  modified. When
       developing C++ programs this is hardly ever requird, as adding new member functions to classes  does  not
       require  you  to  recompile already existing source files. Recompilation is required when the data member
       organization of classes is altered.

       To handle class dependencies in a more sensible  way,  icmake(1)  checks  class  dependencies  using  its
       support  programs icm-dep, visiting the classes listed in the CLASSES file if icmconf’s USE_ALL directive
       was specified. If a directory mentioned in the CLASSES file contains a file having a name that’s equal to
       the  name  specified at the USE_ALL parameter, then all sources of classes that depend on that particular
       class are also recompiled. In practice this means that when you change the data organization of  a  class
       you  only  need  to  touch  it that directory the file whose name was specified by the USE_ALL directive.
       E.g., if your class is named Data, its sources are in the sub-directory ./data, and #define  USE_ALL  "a"
       was  specified  then  after  modifying the data organization of the class Data you only need to issue the
       command touch data/a. Subsequently, at the next icmbuild call all  sources  in  ./data  as  well  as  all
       sources in directories whose (header) files include data.h are recompiled as well.

       Likewise,  if  #define  SPCH or (deprecated) #define PRECOMP was used, then a similar action is performed
       for the precompiled headers: if a local file that’s (directly or indirectly) included by internal  header
       files  has changed, then (having specified SPCH) the Single Pre-Compiled Header (SPCH) file is recompiled
       or (deprecated: having specified PRECOMP the modified class headers  are recompiled).

       The icmbuild(1) script itself does not  inspect  these  dependencies,  but  calls  the  support  programs
       icm-spch  and  icm-dep  to  perform the requird tests. The short usage descriptions of these programs are
       written to the standard output stream when calling, respectively icmake -S and icmake -d.

DEFINES IN ICMCONF

       All of the following #defines are required except those that  are  shown  as  commented  #defines  (e.g.,
       //#define REFRESH).

       o      //#define ADD_LIBRARIES       ""
              when  a  program must be linked against additional libraries (other than the name of the program’s
              library itself (specified at LIBRARY) then those libraries should be specified here. E.g., when  a
              program is linked against libbobcat then the specification is:
                  #define ADD_LIBRARIES  "bobcat"

              If your program is linked against multiple libraries, then use a blank-separated list of libraries
              (like #define ADD_LIBRARIES "math bobcat");

       o      //#define ADD_LIBRARY_PATHS  ""
              this directtive must be specified if ADD_LIBRARIES is also specified, although it may be specified
              as  an  empty  string.   When  additional  libraries  (specified  at ADD_LIBRARIES) are located in
              non-standard library locations (e.g., not in /lib and /usr/lib) then these  additional  paths  are
              (blank space separated) specified here. Specify only the paths, not the -L flags.

              It is stronly advised to specify full pathnames here.  Relative path specifications can be used by
              specify paths relative to the directory that is specified at the TMP_DIR directive (see below);

       o      //#define CLS
              the clear screen directive. If defined tput clear is called to clear the  terminal  screen  before
              starting  compilations. By default it is not defined. Alternatively the -c option can be passed to
              icmbuild;

       o      #define CXX "g++"
              the C++ compiler to use. For a C compiler specify, e.g., #define  CC  "gcc".  Their  settings  are
              overruled  by  identically  named environment variables. If only C files are compiled then #define
              CXX can be omitted.

              By specifying, e.g., #define CXX "ccache g++"  compilations  use  caching  facilities,  which  may
              impressively reduce recompilation times. Refer to the cccache(1) man-page for details.

       o      #define CXXFLAGS "-Werror -Wall -O2"
              C++  compiler  options to use (here showing the default options). When the C compiler is used, use
              #define CFLAGS rather than CXXFLAGS. Their settings are overruled by identically named environment
              variables. If only C files are compiled then #define CXXFLAGS can be omitted.

              Additional  options  can  be  defined  by  adding  them  to  the CXXFLAGS definition. In addition,
              compilations use the environment variable ICMAKE_CPPSTD to set the  C++  standard  to  use.  E.g.,
              after defining

                  ICMAKE_CPPSTD=--std=c++26

              the compiler uses the options

                  --std=c++26 -Werror -Wall -O2

       o      //#define DEFCOM  "..."
              a  DEFCOM directive may be added to the icmconf file (the icmstart(1) script can do this for you).
              It can be specified as:
                  #define DEFCOM  "program"

              in which case icmbuild does program maintenance, or as
                  #define DEFCOM  "library"

              in which case icmbuild does library maintenance.;

       o      //#define ICM_DEP   "-V go"
              the existence and implied  existence  of  USE_ALL  files  (see  the  description  of  the  USE_ALL
              directive).  When  the  (deprecated)  PRECOMP  directive  is  specified the recency of precompiled
              headers is ensured (see also the SPCH description, below). By default icm_dep is called  with  the
              shown  default  arguments. If icm_dep should not be called define ICM_DEP as an empty string ("").
              Icmake(1)’s man-page contains a separate section about the icm_dep support program;

       o      #define IH   ".ih"
              the extension used for internal header files. See #define PRECOMP below. If PRECOMP  is  specified
              ttIH) must also be specified;

       o      //#define LDFLAGS   ""
              linker options to use. By default no options are passed to the linker. Its setting is overruled by
              an identically named environment variable;

       o      //#define LIBRARY   "modules"
              by defining this directive a local library is constructed. When a binary program is  built  it  is
              linked against this library rather than to the individual object modules.

              If  a  library  instead of a program must be constructed (see also the DEFCOM directive), then the
              LIBRARY directive specifies the library’s base name (without the lib prefix  and  without  the  .a
              extension).  In  that  case  source  files  are  expected in sub-directories of the project’s main
              directory (i.e., the directory containing icmconf). In that case avoid having  source  and  header
              files in the project’s main directory. Instead, move such files to a separate sub-directory;

       o      //#define MAIN   "main.cc"
              the  source  file in which the int main function is defined. This directive is required when doing
              program (rather than library) maintenance.

              Note: if source files are located in the project’s  main  directory  but  library  maintenance  is
              intended  (e.g.,  by  specifying #define DEFCOM library) then define MAIN to specify a pseudo main
              source, whose base name is the base name of the header file in the project’s main directory. This,
              however,  is considered a kludge, and should be avoided by moving those source and header files to
              a separate sub-directory;

       o      //#define MULTICOMP   "..."
              Example: #define MULTICOMP  "jobs -q"

              This directive activates threaded compilation of source files. When used its first word  specifies
              the name of a file to contain information about which files must be compiled. This must be a plain
              filename, not containing directory specifiers (like /).

              The filename may be followed by option specifications:

              o      --nr (or -n)
                     when this option is specified the thread numbers compiling source files are written to  the
                     standard output stream.

              o      --quiet (or -q)
                     When  this  options  is not specified then the path names of the compiled object and source
                     files are written to the standard output stream. When it is specified once only the  source
                     files’  directories and filenames are written to the standard output stream, and when it is
                     specified more than once no information about the compiled files is written to the standard
                     output stream.

              o      --threads nThreads (or -t nThreads)
                     by  default the computer’s number of cores determines the number of threads being used when
                     compiling the source files. Optionally a different number of threads can be requested using
                     this option.
                     E.g., --threads 5.

       o      //#define NO_PRECOMP_WARNING"
              when  PRECOMP  (now  deprecated) is defined (see below) a warning is issued when a class-directory
              does not contain a IH file. Such warnings are  suppressed  by  defining  NO_PRECOMP_WARNING.  This
              option is only considered when PRECOMP has been defined;

       o      #define OBJ_EXT   ".o"
              this directive specifies the extension of object modules created by the compiler;

       o      //#define PRECOMP   "-x c++-header"
              (deprecated, consider declaring #define SPCH instead)
              define  this  directive  to  construct  class-specific  precompiled headers (in which case the IH)
              directive must also be specified. Dependencies between  (precompiled)  headers  are  automatically
              considered.
              Existing  precompiled  headers  are  removed  by icmbuild cleangch (or icmbuild clean. When source
              files of other languages are  compiled  the  PRECOMP’s  -x  argument  must  be  adapted  to  those
              languages.
              If PRECOMP is defined then IH must also be defined;

       o      //#define REFRESH
              define  REFRESH  to relink the binary program when icmbuild program is called, even though no file
              was (re)compiled. This is useful when the program links to external libraries which  were  updated
              separately from the currrent project;

       o      //#define SHARED
              this  directive  is  only interpreted when LIBRARY is also specified.  If defined a shared library
              (extension .so*) is built in addition to a static library (extension .a);
              The shared library receives VERSION as its version number while soft links  using  VERSION’s  (see
              below)  major  version  number  an  no version number are also made available. E.g., if VERSION is
              defined as 1.02.03 and #define LIBRARY "demo" then the shared library becomes  libdemo.so.1.02.03,
              with libdemo.so.1 soft-linking to it, and libdemo.so soft-linking to libdemo.so.1;

       o      //#define SHAREDREQ   ""
              when  creating  a shared library SHAREDREQ specifies the names of libraries and library paths that
              are required by  the  constructed  shared  library  itself.   E.g.,  if  a  library  is  found  in
              /usr/lib/special,  assuming  that  the name of the required library is libspecial.so, then use the
              specification #define SHAREDREQ "-L/usr/lib/special -lspecial".  The /lib and /usr/lib  paths  are
              usually  automatically  visited  by the linker and do not have the be specified. This directive is
              required (possibly as an empty string) if SHARED is defined;

       o      #define SOURCES   "*.cc"
              the pattern to locate sources in directories;

       o      //#define SPCH   "..."
              Example: #define SPCH ""

              If SPCH is defined then IH must also be defined.
              This directive activates using Single Pre-Compiled Headers (refer to the  icmake(1)  man-page  for
              details).  The  argument  string  can  be  empty, or it can contain a combination of the following
              specifications:

              o      --keep regex (or -k regex)
                     keep (and do not inspect) include-specification(s) in the internal header matching  regular
                     expressions  in  regex. If regex starts with f: (e.g., f:regex) then regex is the name of a
                     file whose non-empty line contains a regex.  Otherwise regex contains  a  (POSIX  extended)
                     regular expression, using (...)|(...)  when specifying multiple regexes.
                     Example: -k xerr/xerr.

              o      --no-topdir (or -n)
                     Ignore  the  project’s top directory. This option is used in projects merely constructing a
                     library, instead of constructing a program (in which case the top-level directory  commonly
                     contains a main.ih internal header file).

       o      //#define SPCH_FILE   "..."
              Example: #define SPCH_FILE "specs"

              This  directive can be used in combination with the #define SPCH directive. By default the headers
              used to construct the SPCH are written to the file spch. If that name should not be used then  use
              the  SPCH_FILE directive to specify another filename. The specified name must be a plain filename,
              not containing directory specifiers (like /).

       o      #define TMP_DIR   "tmp"
              the directory in which intermediate results are stored. To avoid cross-device communications  it’s
              probably best to define TMP_DIR as a sub-directory of the project’s main directory;

       o      //#define USE_ALL   "a"
              when  defining  this  directive  icmbuild  looks for directories containing files having the names
              defined by the USE_ALL specification. All source files in those directories as well as all  source
              files  in  directories that (recursively) depend on the set of directories under consideration are
              recompiled, after which the USE_ALL files are removed;

       o      //#define USE_ECHO   ON
              when defined as ON (rather than OFF) (system) commands executed by icmbuild are echoed;

       o      //#define USE_VERSION
              when defined (it is defined by default) a file  VERSION  is  read  by  icmconf  to  determine  the
              program’s  or  library’s  version,  and  the  project’s  release  years.  The file VERSION must be
              available in the project’s main directory and should contain lines like these:
                  VERSION=11.01.00
                  YEARS=1992-2024

              )

PARSER MAINTENANCE

       The following directives are available in cases where  a program  uses  a  parser  generator  creating  a
       parser class from a grammar specification. By default they’re all commented out.

       o      //#define PARSER_DIR   ""
              the  sub-directory  containing  the  parser’s  specification  file. If the PARSER_DIR directory is
              specified then all other directives in this section must also be specified;

       o      //#define PARSFILES   ""
              if the parser specification file named at PARSSPEC itself includes additional specification files,
              then  patterns matching these additional grammar specification files should be specified here. The
              pattern is interpreted in the directory specified at PARSER_DIR and could contain  a  subdirectory
              name (e.g. specs/*). When files matching the pattern are modified then a new parser is created;

       o      //#define PARSFLAGS   "-V"
              the flags that are used when calling the program specified at PARSGEN;

       o      //#define PARSGEN   "bisonc++"
              the name of the program generating the parser;

       o      //#define PARSOUT   "parse.cc"
              the  name  of  the  file  generated  by  the  parser generator (used by icmbuild when checking the
              timestamps of parser specification s);

       o      //#define PARSSPEC   "grammar"
              the name of the parser specification file. This file is expected in the directory specified by the
              PARSER_DIR directive.

SCANNER MAINTENANCE

       The  following  directives  are  available  in cases where  a program uses a scanner generator creating a
       lexical scanner class from a set of regular expressions. By default they’re all commented out.

       o      #define SCANNER_DIR   ""
              the subdirectory containing the scanner’s specification file.  If  the  SCANNER_DIR  directory  is
              specified then all other directives in this section must also be specified;

       o      #define SCANFILES   ""
              if   the  lexical  scanner  specification  file  named  at  SCANSPEC  itself  includes  additional
              specification files, then patterns matching these additional lexer specification files  should  be
              specified  here.  The  pattern  is interpreted in the directory specified at SCANNER_DIR and could
              contain a subdirectory name (e.g. specs/*). When files matching the pattern are  modified  then  a
              new lexical scanner is created. By default no additional specification files are used;

       o      #define SCANFLAGS   ""
              the flags that are used when calling the program specified at SCANGEN;

       o      #define SCANGEN   "flexc++"
              the name of the program generating the lexical scanner;

       o      #define SCANOUT   "lex.cc"
              the name of the file generated by the lexical scanner (which is used by icmbuild when checking the
              timestamps of scanner specification s).

       o      #define SCANSPEC   "lexer"
              the name of the lexical scanner specification  file.  This  file  is  expected  in  the  directory
              specified by the SCANNER_DIR directive.

FILES

       The mentioned paths are sugestive only and may be installation dependent:

       o      /usr/share/icmake/CLASSES
              : example of an icmconf CLASSES file;

       o      /usr/share/icmake/icmconf
              : default (skeleton) icmbuild resource files, like main.cc, usage.cc, etc.;

       o      /etc/icmake
              : directory containing the default system-wide icmstart(1) configuration file;

       o      $HOME/.icmake
              :   optional   user-defined   directory  containing  user-defined  specifications  overruling  the
              system-wide definitions. This directory is the proper location for  a  file  AUTHOR  defining  the
              AUTHOR directive with the user’s name. E.g., my .icmake/AUTHOR file contains:
                  #define AUTHOR  "Frank B. Brokken (f.b.brokken@rug.nl)";

SEE ALSO

       ccache(1), icmake(1), icmbuild(1), icmstart(1), icmstart.rc(7).

BUGS

       icmbuild(1)  ends,  displaying a fatal error message, if the current working directory does not contain a
       file icmconf.

COPYRIGHT

       This is free software, distributed under the terms of the GNU General Public License (GPL).

AUTHOR

       Frank B. Brokken (f.b.brokken@rug.nl).