Provided by: icmake_10.03.00-1_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.

       The  directives  are  biased towards the construction of a C++ program, 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  program  /usr/lib/icmake/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  PRECOMP  was defined, then a similar action is performed for the precompiled headers: if a
       local header file that’s (directly or indirectly) included by a class’s internal header file has changed,
       then that class’s precompiled header as  well  as  all  precompiled  headers  of  dependent  classes  are
       recompiled.

       The  icmbuild(1)  script itself does not inspect these dependencies, but calls /usr/lib/icmake/icm-dep to
       perform the requird tests. The program icm-dep’s short usage summary is written to  the  standard  output
       stream when calling icmake -d (or directly: /usr/lib/icmake/icm-dep).

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;

       o      #define CXXFLAGS "--std=c++20 -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;

       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),  as well as the correct ages of precompiled headers can be checked by icmake’s support
              program icm_dep. 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 NO_PRECOMP_WARNING"
              when PRECOMP 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"
              define this directive to construct precompiled headers (in which case the IH) directive must  also
              have been 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;

       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 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=9.03.00
                  YEARS=1992-2020

              )

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

       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.10.03.00                                     1992-2022                                         icmconf(7)