Provided by: icmake_13.04.00-1ubuntu2_amd64 bug

NAME

       icmake - A program maintenance (make) utility using a C-like grammar

SYNOPSIS

       icmake option(s) [source [dest]] [args]

DESCRIPTION

       Icmake(1)  is  a  generic  tool  for  program  maintenance which can be used as an alternative for, e.g.,
       make(1). It’s a generic tool in that icmake-scripts, written in  a  language  closely  resembling  the  C
       programming language, can perform tasks that are traditionally the domain of scripting languages.

       This man-page consists of the following sections:

       o      ICMAKE V. 13.00.00 covers the changes since icmake version 12.03.00;

       o      OPTIONS covers icmake’s options;

       o      EXECUTING ICMAKE SCRIPTS covers how to call icmake scripts;

       o      ICM-DEP describes the icm-dep support program;

       o      ICM-MULTICOMP describes the icm-multicomp support program;

       o      ICM-SPCH describes the icm-spch support program;

       o      ICM-UN describes the icm-un support program;

       o      FILES  provides  an  overvieuw of the locations of icmake and its support programs (as used by the
              Debian Linux distribution);

       o      EXAMPLES contains references to locations containing some examples;

       o      SEE ALSO contains references to man-pages of icmake support programs  and  man-pages  of  programs
              related to icmake. In particular

              o      icmstart(1), describes how to initialize a directory for (C++ or C) program development;

              o      icmbuild(1), covers how to use icmake for the maintenance of such programs.

              o      icmscript(7)  covers the syntax and facilities of icmake’s scripting language, allowing you
                     to write your own icmake scripts.

       Icmake allows programmers to use a scripting language (closely resembling  the  well-known  C-programming
       language)  to  define  the  actions that are required for (complex) program maintenance. For this, icmake
       offers various special operators as well as a set of support functions that have shown  their  usefulness
       in program maintenance.

       Icmake  should  not  be confused with an Integrated Development Environment (IDE). Icmake merely performs
       tasks for which scripts can be written, and a minimal set of pre-defined scripts (icmstart and  icmbuild)
       that  have  proven  their  usefulness  when  developing and maintaining programs are included in icmake’s
       distribution.

       When using icmbuild(1) for program maintenance the following icmake support programs are used:

       o      icm-comp       byte-code compiling an icmake script;

       o      icm-dep        handling class-dependencies;

       o      icm-exec       executing a byte-code compiled icmake script;

       o      icm-multicomp  (optionally) using multi-threaded source file compilation;

       o      icm-pp         pre-processing an icmake script;

       o      icm-spch       (optionally) constructing a project-wide Single Pre-Compiled Hbeader file (SPCH).

       In addition to the above programs the icmake project provides

       o      the icmodmap program can be used when developing C++ programs using modules (cf.  the  icmodmap(1)
              man-page);

       o      icm-un  disassembling  compiled icmake byte-code files (`bim-files’). icm-un is primarily used for
              illustration, education, and debugging  and  is  called  by  icmake  when  specifying  its  option
              --unassemble or -u (see also section ICMUN).

       Some  make-utilities  by  default  recompile  sources once header files are modified. When developing C++
       programs this is often not required, as adding new member functions  to  classes  does  not  require  the
       recompilatopm  of  all  source  files  of  those  classes. Class dependencies are optionally inspected by
       icmbuld(1) (they are inspected when the USE_ALL, SPCH, and/or (now deprecated) PRECOMP #define directives
       in the icmconf file are activated (cf. the icmconf(7) man-page for details).

ICMAKE V. 13.00.00

       In icmake version 13.00.00 the following modifications were implemented w.r.t. its version 12.03.00:

       o      option --all (-a) was added to the icm-spch program performing in  sequence  the  actions  of  its
              --list,  --precompile,  and  --soft-link  options.  Several existing options were altered. See the
              ICM-SPH section for details.

       o      the (internal) headers inspected by icmake --spch (or -S) are not modified anymore.

       o      to remove the (now obsoleted) #ifndef SPCH_ specifications from  files  listed  in  existing  spch
              files  written  by  previous versions of icm-spch the program noifndef.cc, available in the icmake
              source distribution in its support/ sub-directory can be used  to  remove  existing  #ifnef  SPCH_
              sections from a project’s .ih files;

       o      icmake --source compiles the icmake script to a temporary .bim file;

       o      the support program icmun was renamed to icm-un (called by icmake when specifying the --unassemble
              (-u) option, so in practice the name change is automatically handled).

       o      The  icmconf(7)  script  can  use  -o  in  its  #define  SPCH  specification. All (space character
              delimited) words following -o are passed to icm-spch as separate `-o word’ options;

       o      When developing C++ programs the environment variable ICMAKE_CXXFLAGS is no longer  used.  Instead
              the environment variable ICMAKE_CPPSTD is used. Use this latter environment variable to define one
              point of maintenance specifying the version of the C++ standard used when compiling sources;

       o      When  using  Debian  (or  a  comparable distributions) the script ’rebuild’ can be used to rebuild
              icmake’s binaries after installing ’libbobcat-dev’, resulting in a reduction  of  their  sizes  of
              about 40%.

       o      The icmake program itself was redesigned.

OPTIONS

       Where available, single letter options are listed between parentheses beyond their associated long-option
       variants.  Icmake  defines  action  options  and  non-action  options.  The  first  action option that is
       encountered is used.

       When using icmbuild(1) for program maintenance icmake is called automatically, and the user doesn’t  have
       to specify any icmake options.

       o      --about (-a)
              Ends icmake after showing some information about icmake;

       o      --compile (-c) [options] source [bim-file]
              The  icmake  script  is  first  pre-processed  (see  option  --preprocess  below)  whereafter  the
              pre-processed file is compiled by icm-comp producing a bim-file.  If  the  bim-file  name  is  not
              specified then source’s base-name, receiving extension .bim, is used.
              If  source  is  a  previously  pre-processed  file then option -P can be specified to suppress its
              pre-processing. E.g.,

                  icmake -c -P source dest.bim

              If the bim-file exists and is younger than source then source is not compiled;

       o      --dependencies (-d) [options] action
              The icm-dep program is  called  determining  the  dependencies  among  classes.  All  options  and
              arguments  following  this  option  are forwarded to icm-dep. Refer to the ICM-DEP section of this
              man-page for information about icm-dep;

       o      --execute (-e) [option] bim-file [arguments]
              Executes the bim-file, Before specifying bim-file option --no-version-check  (see  below,  or  the
              equivalent short option -n) can be specified to allow mismatches between icmake’s main version and
              the icmake version that was used to compile the bim-file.
              Command-line arguments specified beyond bim-file are forwarded as arguments to the bim-file’s main
              function (cf. the icmscript(7) man-page for details about writing icmake-scripts);

       o      --force (-f) [options] source [bim-file]
              Acts  like  option  --compile,  but  compilation  is  always  performed,  even  if the bim-file is
              up-to-date;

       o      --help (-h)
              Ends icmake after providing usage info. Usage info is also provided when icmake is started without
              arguments;

       o      --multicomp (-m) [options] jobs ’compiler-spec’
              The  optional  options  are  the  options  passed  to  the  icm-multicomp  program  (cf.   section
              ICM-MULTICOMP below).
              See   also  the  icomonf(7)  man-page’s  #define  MULTICOMP  directive:  when  specified  threaded
              compilation is automatically used;

       o      --no-process (-N)
              Implies option --verbose (see  below).  This  option  is  recognized  by  options  --dependencies,
              --execute,  --source  and -t (either as two separate options or by `gluing’ both options together,
              like -Ne). When specified, the support program is not run, but the command(s) that would have been
              used are shown to the standard output;

       o      --no-version-check (-n)
              This option is available with the action options --execute, --source, --unassemble, and  -t.  When
              specified  the  main  versions  stored in the specified icm-bim file and icmake itself may differ.
              This option should normally not be required, but was primarily added for development purposes;

       o      --preprocess (-p)  [options] source [pim-file]
              The file specified as first argument is pre-processed,  producing  a  `.pim’  file.  If  a  second
              filename  argument  is  provided  then that file becomes the .pim file. If not specified, then the
              first filename, using the extension .pim, is used.
              With this option pre-processor symbol-defining options can be used: symbols whose  values  can  be
              used in source. E.g., when issuing the command

                  icmake -p -d one --define two source dest.pim

              icmake  pre-processes source, defines the pre-processor symbols one and two (each having value 1),
              and produces the pim-file dest.pim. Note that instead of using long options --define short options
              -d can also be used;

       o      --spch (-S) ...
              A SPCH is built. All options and arguments following --spch are forwarded to the icm-spch  support
              program.  (cf. section ICM-SPCH below).
              See  also the icomonf(7) man-page’s #define SPCH directive: when specified a SPCH is automatically
              constructed;

       o      --source (-s)  [options] source [arguments]
              Icmake uses --compile to compile the icmake source file specified as first argument  (constructing
              a  temporary  bim-file) and then uses --execute to execute the bim-file, forwarding any subsequent
              arguments as arguments to the bim-file’s main function.
              Following the --source option options available for icmake’s --compile command can  be  specified.
              Following  those  options  options  of  icmake’s  --execute options can be specified. Those latter
              options must be preceded by --execute or -e. E.g., when issuing the command

                  icmake -s -d one -en source

              then icmake first compiles source after defining the pre-processor symbol one, and  then  executes
              the bim-file, passing --no-version-check to icm-exec
              When  merely compiling icmake source files (using icmake -c) the compiled file by default receives
              the extension .bim. But when using icmake -s temporary files are used   which  are  removed  after
              executing  the  constructed  binary  file. When compilation errors are encountered the name of the
              temporary file is reported. It consists of three parts: the directory receiving icmake’s temporary
              files; the filename of the icmake script which is passed to icmake -s; and  a  random  6-character
              extension. E.g., when calling icmake -s script error messages may refer to /tmp/script.2JS49A;

       o      -t tmpspec [options] source [arguments]
              This  option  is intended for icmake-scripts although it can also be used in a command-line icmake
              call. The -t option can be used in quite a few different ways which is covered in the next section
              (EXECUTING ICMAKE SCRIPTS).

       o      --tmpdir=directory (-T)
              By default temporary files are created in the /tmp sub-directory, or in the user’s home  (${HOME})
              directory  if  /tmp/  cannot  be  used.  To  specify another directory to write temporary files in
              icmake’s option --tmpdir (or -T) can be specified, followed by the name of an (existing) directory
              to use for temporary files.
              E.g., when compiling an icmake file main.im, the output of icmake’s pre-processor is written to  a
              temporary file which is removed after compilation. To write the temporary file to ~/.icmake icmake
              can be called as

                  icmake -T ~/.icmake -c main.im

       o      --unassemble (-u)
              The  file  specified  as  first  argument is an icmake bim-file, which is unassembled (cf. section
              ICM-UN below for more information about unassembling icmake bim-files);

       o      --verbose (-V)
              Icmake child processes and their arguments are written to the standard output stream  before  they
              are  called.  This  option  may  precede  `action’  options (-c, -d, -e, -s and -u), either as two
              separate options or by `gluing’ both options together, like -Ve.

       o      --version (-v)
              Ends icmake after displaying its version.

EXECUTING ICMAKE SCRIPTS

       The -t option is available primarily for being used in executable  icmake  scripts.  The  first  line  of
       executable icmake scripts consists of the following components:

       o      a shebang (#!) specification followed by icmake’s location;

       o      the -t option followed by its argument (see below);

       and optionally:

       o      compilation and execution options (specified as described at the --source option);

       o      a  non-option  component (e.g., :) which will be replaced by the location of the executable icmake
              script;

       o      remaining components on the first line are forwarded as-is to the icmake script’s main function;

       E.g., the following simple icm executable script `args’ could be defined in ~/bin:
           #!/usr/bin/icmake -t. -d one : two --dir three
           void main(int argc, list argv)
           {
               #ifdef one
                   printf << "one is defined\n";
               #endif
               printf << argc << " arguments: " << argv << ’\n’;
           }

       When it’s called as ~/bin/args four five then the arguments four and five are  added  to  the  two  --dir
       three  arguments  already  specified  by  the  script itself. Called this way the script outputs. Its 1st
       argument is the name of a temporary .bim file whose finale extension is different at each new  call  (see
       also this section’s final paragraph):
           one is defined
           /tmp/args.F04dgh two --dir three four five

       The  argument  of  the  -t option is used to specify the location of the files used by icmake’s -t option
       (/dir can also be specified as multiple directories, like /dir/sub1/sub2):

       o      if it’s a single dot (-t.) the compiled (temporary) bim-file is written in icmake’s directory used
              for temporary files (e.g., /tmp or $HOME);

       o      if it’s ~/dir or /dir then icmake writes temporary files in the specified directory,  replacing  ~
              by the user’s $HOME directory;

       o      if  it’s  ~/dir/name  or /dir/name then [~]/dir/name specifies the path of the compiled .bim file,
              writing all other temporary files in the same directory as the .bim file. The .bim  file  is  kept
              after  execution  (allowing  it to be executed repeatedly using ’icmake -e’). The icmake-script is
              not compiled if the .bim file is younger than the script.

       When executing icmake scripts (either by using executable #/bin/icmake scripts explicitly calling  icmake
       -t)  the  preprocessed  scripts  and  usually  the compiled script are temporary files are used which are
       removed after executing the constructed binary  file.  When  errors  are  encountered  the  name  of  the
       temporary  file  containing  the  errors  is  reported. Those temporary files consist of three parts: the
       directory receiving icmake’s temporary files; the filename of the icmake script which is passed to icmake
       -s; and a random 6-character extension. E.g., when executing a script like showfiles (using #!/bin/icmake
       -t .) and the script contains errors then the error messages may refer to /tmp/showfiles.2JS47P;)

ICM-DEP

       Icm-dep is a support program called by icmake --dependencies (or its short alternative -d)  to  determine
       source- and precompiled-header file dependencies.

       When  using  icmbuild(1)  and  an icmconf file contains the #define SPCH directive icmake -d is not used;
       instead, directories inspected when using a SPCH are automatically inspected (and updated when necessary)
       by icmake -S.

       Icmake -d’s synopsis is
           icmake -d [options] argument
       Specifications following -d are forwared to icm-dep. The following options can be specified after -d:

       o      --classes=filename (-c)
              By default, icm-dep inspects dependencies of the directories mentioned in the file CLASSES. If the
              icmconf(7)  file  specifies  PARSER_DIR  and/or  SCANNER_DIR  then  those  directories  are   also
              considered.   Use  this  option  to  specify  the  file  containing the names of directories to be
              inspected by icm-dep.

       o      --gch
              If an icmconf file specifies the (deprecated) #define PRECOMP  directive  then  icmake  -d  checks
              whether  precompiled  headers  must  be  refreshed.  If an icmconf file does not contain a #define
              PRECOMP diretive, but precompiled headers should nonetheless be inspected, then option  --gch  can
              be specified;

       o      --help (-h)
              A  summary of icm-dep’s usage is written to the standard output and icmake terminates, returning 0
              to the operating system;

       o      --icmconf=filename (-i)
              By default icmake -d inspects the content of icmconf files, This option  is  used  if  instead  of
              icmconf another file should be inspected;

       o      --mainih=mainheader (-m)
              In  the  icmconf file the #define IH directive is used to specify the suffix of class header files
              that should be precompiled,  assuming  that  their  filenames  are  equal  to  the  names  of  the
              directories  which  are  listed  in the CLASSES file. But CLASSES does not specify the name of the
              program’s top-level directory. This option is used to specify the name  of  the  top-level  header
              file to precompile. By default main.ih is used;

       o      --no-gch
              If  an  icmconf  file  contains  a (deprecated) #define PRECOMP directive but icmake -d should not
              check whether precompiled headers must be refreshed then specify option --no-gch;

       o      --no-use-all
              If this option is specified then the #define USE_ALL "filename" directive in the icmconf file (cf.
              icmconf(7)) is ignored;

       o      --use-all=filename
              If this option is specified then all files in directories containing the file filename and  source
              files in directories (recursively) depending on the files in those directories are recompiled;

       o      --verbose (-V)
              This  option  can  be specified multiple times. The number of times it is specified determines the
              verbosity of icmake -d’s output. If not specified then icmake -d silently performs its duties.  If
              specified  once (which is the default specification), then icmake -d writes to the standard output
              the actions it performs; if specified twice it also reports non-default options and  automatically
              included  directories;  if  specified three times it also reports class dependencies; if specified
              more often it reports what files it encountered and what decision it would make when go  would  be
              specified;

       o      --version (-v)
              Icmake  -d  writes  icm-dep’s version number to the standard output and terminates, returning 0 to
              the operating system.

       Following the non-terminating options argument go must be specified to allow icmake  -d  to  perform  its
       actions.  Specifying  another argument results in a `dry run’: it analyzes dependencies, but won’t remove
       or touch files.

       Icmake -d can be used for software projects which are developed as  described  in  the  C++  Annotations,
       section  Header  file  organization in chapter Classes. For those projects classes are developed in their
       own directories, which are direct sub-directories of the project’s main program  directory.  Their  class
       interfaces are provided in class-header files bearing the names of the class-directories, and all headers
       that  are  required  by  the  class’s  sources are declared in a separate internal header files, commonly
       having extensions .ih.

ICM-MULTICOMP

       Icmake supports multi-threaded source-file compilation, often significantly reducing the compilation time
       of the source files of projects. When using icmbuild(1) multi-threaded compilation is automatically  used
       when  icmconf  files  contain  the  #define  MULTICOMP  directive (cf. icmconf(7)). It can also be called
       independently from icmconf using icmake’s --multicomp (or -m) option.

       Icmake -m’s synopsis is
           icmake -m [options] arguments

       Icmake -m accepts the following options:

       o      --help (-h)
              Icmake -m writes a summary of its usage to the standard output and terminates, returning 0 to  the
              operating system;

       o      --nr (-n)
              When compiling source files and option --nr is specified then the thread number compiling a source
              file is written to the standard output stream.

       o      --quiet (-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 (-t)
              By default the computer’s number of cores  determines  the  number  of  threads  being  used  when
              compiling  the  source  files.  A  different number of threads can be requested using this option,
              e.g., --threads 5.

       o      --version (-v)
              Icmake -m reports its version number to the standard output and terminates,  returning  0  to  the
              operating system.

       Icmake -m needs one command-line argument and an optional second argument:

       o      the  first  argument  is  the  name  of  the  file  specifying  which  files must be compiled. Use
              icmbuild(1) to write this file. It can also be constructed otherwise:
              The specified file must contain groups of file specifications where each group starts with a  line
              like  : support tmp/o 5 where the 2nd element (here: support) specifies the (sub-)directory of the
              source files (use . to refer to the project’s top-level directory); the 3rd element (here:  tmp/o)
              specifies  the destination directory of the compiled files (which is created if not existing); and
              the 4th element (here: t) specifies the prefix to add in front of the compiled object files.
              Following this line the remaining lines of a group specify the names of the source files  (located
              in specified (sub-)directory) to compile.
              Once  the  compilation  ends  (either  because all files were successfully ccompiled, or because a
              compilation failed) the specification file is removed;

       o      the second argument is optional. By default the following specification is used  (all on one line)

                  g++ -c -o $2 ${ICMAKE_CPPSTD} --Wall -Werror $1

              Here $1 is replaced by the location of the source file to  compile  and  $2  is  replaced  by  the
              location  of  the  compiled  object  file.  If  the  environment variable ICMAKE_CPPSTD is defined
              (specifying the C++ standard to use, e.g.,  ICMAKE_CPPSTD=--std=c++26)  then  its  value  replaces
              ${ICMAKE_CPPSTD} in the specification.
              If  the  default  compiler specification cannot be used the command to compile source files can be
              provided as icmake -m’s second command-line argument, which should be quoted, like

                  ’g++ -c -o $2 ’${ICMAKE_CPPSTD}’ --Wall -Werror $1’

              or the second command-line argument can be f:file, where file is the name of a  file  whose  first
              line  contains  the specification of the command compiling source files (which must specify $1 and
              $2 and optionally $ICMAKE_CPPSTD).
              The PATH environment variable is used to locate the compiler; the  compiler’s  absolute  path  can
              also be specified.

ICM-SPCH

       Single Pre-Compiled Headers (SPCH) are available using icmake --spch (or -S).

       Icmake -S’s synopsis is
           icmake -S [options] arguments

       Icmake -S accepts the following options:

       o      --all=file (-a)
              Call  in  sequence icm -S’s options --list, --precompile, and --soft-links (see below), where file
              is written by option --list and used as option argument for --precompile and --soft-links.  Icmake
              -S --all file may optionally be followed by one or two arguments. When provided the first argument
              defines  the  location  of  the  SPCH  file; the second argument defines the (file containing the)
              compiler command used to construct the SPCH. See option --precompile (below) for details.

       o      --classes=filename (-c)
              The file filename is the name of a file containing a list of directories inspected by  the  --list
              option  (by  default  CLASSES).  The project’s top directory is automatically inspected unless the
              option --no-topdir is specified;

       o      --help (-h)
              Icmake -S writes a summary of its usage to the standard output and terminates, returning 0 to  the
              operating system;

       o      --internal=.ext (-i)
              .ext is the extension used for the internal headers (including the dot). By default .ih is used;

       o      --list (-l)
              Ignored when option --all is specified.
              Write  the names of the files to process when constructing an SPCH to the file specified as icmake
              -S’s first command line argument. The specified filename may not have an  extension  or  directory
              specifications (e.g., spch);

       o      --no-topdir (-n)
              Ignore  the  internal header found in the project’s top directory. This option is used when, e.g.,
              merely constructing a library instead of a program;

       o      --option=opt (-o)
              extra option added to the compiler’s options when --precompile is requested.  The  opt  option  is
              inserted  before  the  compiler’s  option  specification  -x  (see  the next option --precompile).
              Multiple --option options can be specified.

       o      --precompile=file (-p)
              Precompile file (the name of the file specified at the option --list) to the SPCH  file  specified
              as  icmake  -S’s  first  command-line  argument.  If  that  argument  ends  in  /  then  the  SPCH
              ’argument’file.gch is written.
              By default the SPCH is constructed using the following command (all on one line):

              g++ -c -o $2 ${ICMAKE_CPPSTD} -Wall -Werror -O2 -x c++-header $1

              Here, $1 is replaced by ’file’, and $2 is replaced by the name of the SPCH,  while  $ICMAKE_CPPSTD
              refers to the value of the ICMAKE_CPPSTD environment variable (specifying the C++ standard to use,
              e.g., ICMAKE_CPPSTD=--std=c++26).
              Alternatively,  the command constructing the SPCH can be provided as second command-line argument,
              which should be quoted. E.g., (on one line):

              ’g++ -c -o $2 ’${ICMAKE_CPPSTD}’ -Wall -Werror -O2
                                                          -x c++-header $1’

              or the second command-line argument can be f:file, where file is the name of a  file  whose  first
              line  specifies  the  command  constructing  the SPCH (which must specify $1 and $2 and optionally
              $ICMAKE_CPPSTD).
              The PATH environment variable is used to locate the compiler; the  compiler’s  absolute  path  can
              also be used.

       o      --quiet (-q)
              By  default  the  (g++)  command  constructing the single precompiled header file is echoed to the
              standard output stream. Specify this option to suppress writing the command to the standard output
              stream.

       o      --soft-links=file (-s)
              Ignored when option --all is specified.
              This option uses the same arguments as used with the --precompile option. This option creates .gch
              soft-links from the header files listed in file to the generated SPCH-file;

       o      --unused=regex (-u)
              In practice this option is probably not required, but files matching (POSIX  extended)  regex  are
              not  inspected  by  icmake  -S.  When  used specifications like (...)|(...) can be used to specify
              multiple regexes. Alternatively f:file can be used as option argument  to  specify  a  file  whose
              non-empty lines contain regexes;

       o      --version (-v)
              Icmake  -S  writes  its  version  number to the standard output and terminates, returning 0 to the
              operating system;

       o      --warn (-w)
              interactively warn when existing header files are about to be modified, accepting or refusing  the
              modifications. Once refused icm-spch ends.

       Icmake  -S needs one, and optionally two arguments, which were described at the --list, --precompile, and
       soft-links option descriptions.

       Pre-compiled headers have been available for quite  some  time,  and  usually  result  in  a  significant
       reduction  of  the  compilation  time.  Using  single precompiled headers results in a large reduction of
       required disk-space compared to using precompiled headers for separate directories.

       When using SPCHs almost identical precompiled headers for separate  directories  are  avoided:  only  one
       precompiled  header  is  constructed  which  is  then  used  by all components of a project. As identical
       sections are avoided the sizes (and construction times) of SPCHs are much smaller, usually requiring only
       5 to 10 % of the space (and construction time) ccompared to  using  separately  constructed  pre-compiled
       headers.

       SPCHs  can  easily  be used in combination with icmbuild(1). Often a specification in a project’s icmconf
       file like #define SPCH "" is all it takes (cf. icmconf(7)).

ICM-UN

       The support program icm-un is called by icmake -u, expecting one argument, a  bim-file.  It  disassembles
       the binary file an shows the assembler instructions and the structure of the bim-file.

       As an illustration, assume the following script is compiled by icmake -c demo.im):

           void main()
           {
               printf << "hello world\n";
           }

       the  resulting  demo.bim  file is disasembled by icmake -u demo.bim writing the following to the standard
       output fle:

           icm-un by Frank B. Brokken (f.b.brokken@rug.nl)
           icm-un V12.04.00
           Copyright (c) GPL 1992-2024. NO WARRANTY.

           Binary file statistics:
               strings      at offset  0x0025
               variables    at offset  0x0033
               filename     at offset  0x0033
               code         at offset  0x0014
               first opcode at offset  0x0021

           String constants dump:
               [0025 (0000)] ""
               [0026 (0001)] "hello world."

           Disassembled code:
               [0014] 06 01 00   push string "hello world."
               [0017] 05 01 00   push int 0001
               [001a] 1b 1d      callrss 1d (printf)
               [001c] 1c 02      add sp, 02
               [001e] 04         push int 0
               [001f] 24         pop reg
               [0020] 23         ret
               [0021] 21 14 00   call [0014]
               [0024] 1d         exit

       Offsets are shown using the hexadecimal number system and are absolute byte offsets in the bim-file.  The
       string  constants dump also shows, between parentheses, the offsets of the individual strings relative to
       the beginning of the strings section. The output also shows  the  opcodes  of  the  instructions  of  the
       compiled  .im source files. If opcodes use arguments then these argument values are shown following their
       opcodes. Each opcode line ends by showing the opcode’s mnemonic plus (if applicable) the  nature  of  its
       argument.

FILES

       The  mentioned  paths  are  the  ones that are used in the source distribution and are used by the Debian
       Linux distribution. However, they are sugestive only and may have been configured differently:

       Binary programs:

       o      /usr/bin/icmake: the main icmake program;

       o      /usr/bin/icmbuild: the wrapper program  around  the  icmbuild  script  handling  standard  program
              maintenance;

       o      /usr/bin/icmodmap:  the  module  mapper  which  initializes  the maintenance of C++ programs using
              modules;

       o      /usr/bin/icmstart: an icmake-script that is can  be  used  to  create  the  startup-files  of  new
              projects;

       Support programs:

       o      /usr/libexec/icmake/icm-comp: the compiler called by icmake;

       o      /usr/libexec/icmake/icm-dep: the support program handling class-dependencies;

       o      /usr/libexec/icmake/icm-exec: the byte-code interpreter;

       o      /usr/libexec/icmake/icm-multicomp: the multi-thread source file compiler;

       o      /usr/libexec/icmake/icm-pp: the preprocessor called by icmake;

       o      /usr/libexec/icmake/icm-spch: the program preparing SPCHs;

       o      /usr/libexec/icmake/icm-un: the icmake unassembler.

EXAMPLES

       The  distribution  (usually in /usr/share/doc/icmake) contains a directory examples containing additional
       examples of icmake script. The icmstart script is an icmake script  as  is  /usr/libexec/icmake/icmbuild,
       which  is  called  by  the  /usr/bin/icmbuild  program.  See also the EXAMPLE section in the icmscript(7)
       man-page.

SEE ALSO

       chmod(1), icmbuild(1), icmconf(7), icmodmap(1), icmscript(7), icmstart(1), icmstart.rc(7), make(1)

BUGS

       None reported.

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.13.04.00                                     1992-2025                                          icmake(1)