Provided by: icmake_10.03.00-1_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 handling program maintenance that can be used as an alternative for 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.

       Icmake  allows programmers to use a programming 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.

       Although icmake scripts can be written from scratch, often the required activities are highly comparable.
       This observation resulted in the construction of two icmake scripts,  which  are  part  of  the  standard
       icmake  distribution:  icmstart(1),  initializing  a  directory  for program development and icmbuild(1),
       handling the actual program maintenance. By default  both  scripts  are   tailored  to  initializing  and
       maintaining  C++  programs (or, after minimal adaptation, C programs), but can easily be adapted to other
       programming languages. Both icmstart and icmbuild can be run without explicitly calling icmake.

       This man-page covers icmake (the program), and its support programs. Refer to the  icmstart(1))  man-page
       for  information  about  how  a  directory  can be initialized (created) in which (by default) a C++ or C
       program can be developed and refer to the icmbuild(1) man-page for information about how icmbuild can  be
       used  to  handle  program  maintenance.  Refer  to the bv(icmscript)(7) man-page for a description of the
       syntax and facilities offered by icmake’s scripting language.

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

       In its standard activation modes, icmake uses the following support programs:

       o      icm-pp     to pre-process the icmake file

       o      icm-comp   to byte-code compile the icmake  s

       o      icm-dep  to  handle  class-dependencies  (see  the  ICM-DEP  section  in  this  man-page  for more
              information about icm-dep).

       o      icm-exec to execute the byte-code file

       In addition, primarily used for illustration, education, and debugging, the program icmun is available to
       disassemble compiled icmake byte-code (.bim) files (`bim-files’). Icmun is not installed  in  a  standard
       PATH  directory  but in icmake’s lib directory, which commonly is /usr/lib/icmake (see also section ICMUN
       in this man-page).

       Traditional make-utilities 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 you  to  recompile
       all  source  files of those classes. To handle class dependencies icmbuld(1) may optionally inspect class
       dependencies, (re)compiling sources of dependent classes when necessary. By  default,  class-dependencies
       are  not  interpreted,  but  they  are when the PRECOMP and/or USE_ALL defines, found in the file icmconf
       file, are activated. Refer to the icmconf(7) man-page for details.

       This manpage describes icmake’s options in the next  section,  followed  by  two  sections  covering  the
       support programs

       o      ICM-DEP
              - the icm-dep dependency analyzer;

       o      ICMUN
              - icmake’s unassembler.

       Refer to the icmscript(7) man-page for a description of icmake’s C-like scripting language.

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.

       The following action options write some text to the standard output stream, whereafter icmake ends:

       o      --about (-a)
              Shows some information about icmake;

       o      --help (-h)
              Provides usage info, returning 0 to the operating system. Usage information is  also  provided  if
              icmake is started without providing arguments. In that case 1 is returned to the operating system;

       o      --version (-v)
              Displays icmake’s version.

       The remaining action options require additional options and/or arguments, and most of them process icmake
       source-  or  bim-files.  Several  of  these action options write output files. By default these files are
       located in the same directories as the source files’ directories.

       The remaining action options are:

       o      --compile (-c) [options] source [bim-file]
              The source file is first pre-processed (by icm-pp) 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 the bim-file exists and is younger than source then source is not compiled.
              With this option pre-processor symbol-defining options can be used: symbols having values 1  which
              can be used in source. E.g., when issuing the command

                  icmake -c -d one --define two source dest.bim

              then  icmake compiles source, defines the pre-processor symbols one and two (each having value 1),
              and produces the bim-file dest.bim. Note that instead of using long options --define short options
              -d can also be used.
              If source is a previously pre-processed file then option -P must be specified to compile it. E.g.,

                  icmake -c -P source dest.bim

       o      --dependencies (-d) [options] action
              Icmake calls icm-dep to determine 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, specified as icmake’s first  file  argument.  Before  the  bim-file  option
              --no-version-check  (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.  See
              also the description of the --no-version-check option at the description of the non-action options
              below.
              Options  and  arguments specified beyond the bim-file are forwarded as arguments to the bim-file’s
              main function (refer to the icmscript(7) man-page for details about how to write 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. As with --compile, if source is a previously pre-processed file then option -P must be
              specified to compile it. E.g.,

                  icmake -f -P source dest.bim

       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 having values 1 which
              can be used in source. E.g., when issuing the command

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

              then 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      --source (-s)  [options] source [arguments]
              Icmake  uses --compile to compile the icmake source file specified as first argument (constructing
              the default bim-file if necessary) and then uses --execute to execute the bim-file, forwarding any
              subsequent arguments as-is to the bim-file’s main function.
              With this option pre-processor options as well as the --no-version-check  execute  option  can  be
              used.  When using the latter option it must follow the pre-processor options (if specified) and it
              must be preceded by --execute (or -e). E.g., when issuing the command

                  icmake -s -d one -en source

              then icmake first compiles source, defining the pre-processor symbol one, and  then  executes  the
              bim-file, passing --no-version-check to icm-exec;

       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. Its argument tmpspec is either a single dot (as in -t.) in which case icmake determines  the
              name of the bim-file in the directory icmake uses for temporary files (see option --tmpdir below),
              or  it  uses tmpspec as the filename to write the bim-file to (which file is also removed once the
              script’s execution ends).
              At the options pre-processor options as well as  the  --no-version-check  execute  option  can  be
              specified.  When  using  the latter option it must follow the pre-processor options (if specified)
              and it must be preceded by --execute (or -e).
              The argument source is the name of the icmake script to process,  and  source  may  optionally  be
              followed  by  arguments.  Those arguments are forwarded as-is to the script’s main function, where
              they appear as elements of its list argv parameter.

              Rather than using the explicit command-line call icmake -t. ... the -t option is normally used  in
              the  first  line  of an (executable) (so usually chmod +x source has been specified before calling
              the script), where its pre-processor and execute options can also be specified. For example  after
              writing the executable script hello:

                  #!/usr/bin/icmake -t.

                  int main(int argc, list argv)
                  {
                      printf << "hello: " << argv << ’\n’;
                  }

              it can be called as hello one -two --three, producing output like:

                  hello: /tmp/10434.bim.MKqvAb one -two --three

              (the  name  following  hello:  will  be  different,  as  it  is the name of the compiled temporary
              bim-file). If icmake pre-process and/or execute options are required they can be specified in  the
              first line, following the -t option. E.g.,

                  #!/usr/bin/icmake -t. -d one --define two

       o      --unassemble (-u)
              The  file  specified  as  first argument is an icmake bim-file, which is unassembled. Refer to the
              icmun section further down this man-page for more information about icmun;

              The program icmun unassembles bim-files. This program also supports  the  --no-version-check  (-n)
              option.

       Finally, there are some (non-action) options that can be specified before specifying action options:

       o      --no-process (-N)
              Implies  option  --verbose.  This  option  may  precede  options  -d, -e, -s and -t (either as two
              separate options or by `gluing’ both options together, like -Ne). When specified, the actions  are
              not activated, 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 of icm-bim files and icmake itself  may  differ.  This  option  should
              normally not be used, and was added for development purposes only;

       o      --tmpdir=directory (-T)
              The  specified  directory  is  used  for  storing  temporary files. E.g., when compiling an icmake
              script, the output of icmake’s preprocessor is written to a temporary file which is  removed  when
              icmake  ends.  By default /tmp is used, unless /tmp is not a writable directory, in which case the
              current user’s $HOME directory is used;

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

ICM-DEP

       Icm-dep is a  support  program  called  by  icmake  to  determine  source-  and  precompiled-header  file
       dependencies.  Icm-dep  can  be  used  for  software  projects that 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-directory  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 filed, commonly having extensions .ih.

       Icmake automatically calls icm-depd when USE_ALL or PRECOMP is specified in icmconf files.  By default it
       is called with arguments -V go. The #define ICM_DEP define-specification in the icmconf file can be  used
       to specify a different set of options.

       When  icm-dep  is  activated  (i.e.,  its  argument  go  is  specified) then icm-dep determines directory
       dependencies, touching all files in directories that depend on  directories  containing  modified  files,
       and/or removing precompiled headers if they include headers from other directories that were modified. By
       providing  another  argument than go icm-dep performs a `dry run’: it analyzes dependencies, but it won’t
       remove or touch files.

       Options of icm-dep may  be  specified  immediately  following  icmake’s  --dependencies  option.  Icm-dep
       supports the following options:

       o      --classes=filename (-c)
              By  default,  icm-dep  inspects  dependencies  of  the  directories mentioned in the file CLASSES.
              Furthermore, if the icmconf(7) file specifies PARSER_DIR and 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      --help (-h)
              Icm-dep writes a summary of its usage to the standard output and terminates, returning  0  to  the
              operating system;

       o      --icmconf=filename (-i)
              By  default  icm-dep  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 parameter 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      --gch
              If icmconf files contain #define PRECOMP specifications then icm-dep  checks  whether  precompiled
              headers  must be refreshed.  If an icmconf file does not contain a #define PRECOMP specifications,
              but precompiled headers should nonetheless be inspected, then option --gch can be specified;

       o      --no-gch
              If icmconf files contain #define PRECOMP specifications  but  icm-dep  should  not  check  whether
              precompiled headers must be refreshed then option --no-gch should be specified;

       o      --no-use-all
              If  icmconf  files  contain  #define  USE_ALL  "filename"  specifications then all source files in
              directories  containing  files  named  filename  are  recompiled.  When  specifying  this   option
              inspections of `USE_ALL’ specifications is suppressed;

       o      --use-all=filename
              If  icmconf  files  contain  #define  USE_ALL  "filename"  specifications then all source files in
              directories containing files named filename are recompiled. Specify this  option  to  inspect  the
              presence of filename files if icmconf does not contain a `USE_ALL’ specification;

       o      --verbose (-V)
              This  option  can  be  specified  multiple  times.  The number of times it is specified determines
              icm-dep’s verbosity. If not used then icm-dep silently performs its  duties.  If  specified  once,
              then  icm-dep  reports to the standard output what 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)
              Icm-dep reports its version number to the standard output  and  terminates,  returning  0  to  the
              operating system.

       As an example, for icmake itself the class dependencies, obtained using the option -VVV are shown as:

           Direct class dependencies:
           --------------------------
                         uses:
                         ------------
               class:     1  2  3  4
           --------------------------
                    .  1  x  x  x  x
              options  2     x     x
              handler  3     x  x
           argoptions  4           x
           --------------------------
                          1  2  3  4
           --------------------------

           Implied class dependencies:
           --------------------------
                         uses:
                         ------------
               class:     1  2  3  4
           --------------------------
                    .  1  -  x  x  x
              handler  2     -  x  x
              options  3        -  x
           argoptions  4           -
           --------------------------
                          1  2  3  4
           --------------------------

       The  second  table  immediately shows that there are no circular dependencies: its lower triangle remains
       empty.

icmun

       The icmun support program expects one argument, a bim-file. It disassembles the binary file an shows  the
       assembler  instructions  and  the structure of the bim-file. Note that in standard installations icmun is
       not located in one of the directories of the PATH environment  variable,  but  it  is  available  in  the
       /usr/lib/icmake  directory,  and  the  command  icmake  -u  bim-file  is  normally used to unassemble the
       bim-file.

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

           void main()
           {
               printf("hello world");
           }

       the  resulting  demo.bim  file  can  be processed by icmun (e.g., calling /usr/lib/icmake/icmun demo.bim.
       Icmun then writes the following to the standard output fle:

           icmun by Frank B. Brokken (f.b.brokken@rug.nl)
           icmun V10.00.00
           Copyright (c) GPL 1992-2021. NO WARRANTY.

           Binary file statistics:
                   strings      at offset  0x0025
                   variables    at offset  0x0032
                   filename     at offset  0x0032
                   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 disassembled code shows the opcodes of the instructions of  the
       compiled  icmake  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:

       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/icmstart:  an  icmake-script  that  is  can  be  used  to create the startup-files of new
              projects;

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

       o      /usr/lib/icmake/icm-exec: the byte-code interpreter called by icmake;

       o      /usr/lib/icmake/icm-dep: the support program handling class- and precompiled header dependencies;

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

       o      /usr/lib/icmake/icmun: 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/lib/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), icmscript(7), icmstart(1), icmstart.rc(7), make(1)

BUGS

       Be advised that starting icmake version 10.00.00

       o      the --summary (-F) option has been discontinued;

       o      the --source short option -i has been replaced by -s;

       o      long option --icm-dep has been replaced by --dependencies;

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                                          icmake(1)