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).

icmake.12.03.00                                     1992-2024                                         icmconf(7)