NAME¶
icmbuild - A generic, easy configurable, program maintenance script
SYNOPSIS¶
icmbuild mode
DESCRIPTION¶
The
icmbuild script is a generic script that can be used to do program
maintenance using
icmake(1).
The script expects two files to be available in the directory where program
maintenance is required, and the
icmbuild script should be available in
your path or it should be started as, e.g.,
./icmbuild
Icmbuild assumes that your sources exist in and below a directory in
which the files
icmconf and
CLASSES live. The file
CLASSES contains the names of all subdirectories in which
class-specific sources are kept. The file
icmconf in
icmake(1)’s distribution offers an example of the configuration
parameters that are used for program maintenance. In this latter file it is
assumed that
C++ sources are maintained, but the
icmbuild script
is not restricted to do maintenance for
C++ programs.
Icmbuild compiles all sources in each of the subdirectories named in the
file
CLASSES, and then compiles all sources in the current working
directory (except for the source containing
main()).
The compiled sources result in object modules which are then kept in a library,
against which the main-object module is linked. It is also possible to specify
additional libraries against which the program must be linked.
Once a library is constructed it is kept up to date by the script. Changing a
source will result in replacing its former module by its new module in the
library.
KICK-STARTING ICMBUILD¶
Normally,
icmbuild is installed and used as follows:
- o
- Install icmbuild in your path;
- o
- copy icmconf and CLASSES to your
project’s base directory (i.e., the directory in which and where
below the project’s sources are found);
- o
- Modify the #defines in the file icmconf to
taste;
- o
- List the subdirectories containing sources in the file
CLASSES
- Note that the order of the classes mentioned in classes
is relevant here. It’s no problem to add new class
(subdirectory) names, but reordering should be prevented. If reordering is
required, recompile the library, as the final object files contain class
order-numbers. These class-order numbers prevent file-name collisions and
thus prevent replacing file x.o from class A by file
x.o from class B;
- o
- Now simply run
icmbuild
from the project’s base directory and let the help-info tell you what
your options are. See the next section for the modes of operation.
OPTIONS¶
Icmbuild may be called with the following operational modes:
- o
- clean
clean up remnants of previous activities
- o
- help
provide help and exit (default when called without arguments)
- o
- library
build the library (static and optionally the dynamic library)
- o
- program
build the binary program
- o
- program strip
build the stripped binary program
- o
- install <base> install the software in the
locations defined in the icmconf file, optionally below the
directory <base> The icmconf file may be given a line
defining DEFCOM containing the default operational mode to use when
none is specified. E.g.,
#define DEFCOM "program"
constructs the program when the command ` icmbuild’ is entered.
DEFCOM may also contain combined options, like
#define DEFCOM "program strip"
Note that DEFCOM is ignored when an explicit operational mode is
provided to the icmbuild script.
FILES¶
The mentioned paths are sugestive only and may be installation dependent:
- o
- /usr/share/icmake/icmconf Example of a
icmbuild configuration file;
- o
- /usr/share/icmake/CLASSES Example of a
icmbuild CLASSES file.
EXAMPLES¶
Here is an example of the configuration file
icmconf for a concrete
program, using the library
libbobcat1 as an additional library:
// Inspect the following #defines. Change them to taste. If you don’t
// need a particular option, change its value into an empty string
// For more information about this file: ’man 7 icmconf’
// The final program and source containing main():
// ===============================================
// define the name of the source containing main():
#define MAIN "main.cc"
// define the name of the program to create (don’t use a path here, but
// define the installation path at `BIN_INSTALL’ below) and use
// `icmbuild install’ to install the binary.
#define BINARY "binary"
// Uncomment to relink the binary, even when no sources were
// changed (this is useful if, e.g., a library was rebuilt)
//#define REFRESH
// Uncomment to install the binary in the provided path using
// `icmbuild install’
//#define BIN_INSTALL "/usr/local/bin"
// Defines related to the local libraries to create:
// =================================================
// Uncomment to create a local library rather (when a binary program is
// built it will be linked against the library rather than the individual
// object modules). Change the lib’s name at you own digression (don’t use
// lib or an extension like .a)
//#define LIBRARY "modules"
// Uncomment to construct a shared library
//#define SHARED
// When creating a shared library:
// Specify the names of any libraries and library paths that are required
// by the shared library. E.g., if a library is found in /usr/lib/special
// use "-L/usr/lib/special -lspecial" if the name of the library is
// libspecial.so
// The /lib and /usr/lib paths are usually predefined and need not be
// specified
#define SHAREDREQ ""
// Uncomment to install the libraries in the provided path using
// `icmbuild install’
//#define LIB_INSTALL "/usr/local/lib"
// #defines used for compilation and linking:
// ==========================================
// Uncomment to clear the screen just before starting the compilation
// process
//#define CLS
// Uncomment to use the ALL facility and a class dependency setup in the
// CLASSES file. When a directory contains a file ALL (optionally rename
// this filename by providing an alternative name) then all its sources
// and all sources of all classes depending on it are also compiled.
// Class dependencies are indicated by the class name (as the first
// word on a line) optionally followed by additional class names, which
// are the classes directly depending on the line’s first class name.
//#define USE_ALL "a"
// define the compiler to use. Options specified here will always be used
// and cannot be overruled by COMPILER_OPTIONS or COPT settings
#define COMPILER "g++ --std=c++0x -Wall"
// define the compiler options to use.
// To enable GNU extensions in addition to C++0x extensions, add the
// --std=gnu++0x flag
#define COMPILER_OPTIONS "-g -O2"
// define the pattern to locate sources in a directory:
#define SOURCES "*.cc"
// define the options used for linking:
#define LINKER_OPTIONS ""
// By providing the following two #defines the contents of environment
// variables named as specified will overrule, resp. COMPILER_OPTIONS
// and LINKER_OPTIONS. If the #defines are provided and the environment
// variables haven’t been specified then COMPILER_OPTIONS and
// LINKER_OPTIONS will be used as-is
//#define COPT "CXXFLAGS"
//#define LOPT "LDFLAGS"
// define any additional libraries BINARY may need:
#define ADD_LIBRARIES ""
// define any additional paths (other than the standard paths) the
// additional libraries are located in:
#define ADD_LIBRARY_PATHS ""
// Some advanced #defines, used to create parsers and lexical scanners
// ===================================================================
// Lexical Scanner section
// =======================
// Should a lexical scanner be constructed? If so, define the subdirectory
// containing the scanner’s specification file.
#define SCANNER_DIR ""
// What is the program generating the lexical scanner?
#define SCANGEN "flexc++"
// Flags to provide SCANGEN with:
#define SCANFLAGS ""
// Name of the lexical scanner specification file
#define SCANSPEC "lexer"
// Specify additional lexer specification files using patterns
// these files are (in)directly included by SCANSPEC
//#define SCANFILES ""
// Name of the file generated by the lexical scanner
#define SCANOUT "lex.cc"
// Parser section
// ==============
// Should a parser be constructed? If so, define the subdirectory
// containing the parser’s specification file
#define PARSER_DIR ""
// What is the program generating a parser?
#define PARSGEN "bisonc++"
// Flags to provide PARSGEN with:
#define PARSFLAGS "-V"
// What is the grammar specification file?
#define PARSSPEC "grammar"
// Specify additional grammar specification files using patterns
// these files are (in)directly included by PARSSPEC. Specify patterns
// relative to PARSER_DIR
//#define PARSFILES ""
// Name of the file generated by the parser generator containing the
// parser function
#define PARSOUT "parse.cc"
// Additional defines, which normally require no modification
// ==========================================================
// should commands be echoed (ON) or not (OFF) ?
#define USE_ECHO ON
// Directory below this directory to contain temporary results
#define TMP_DIR "tmp"
// The extension of object modules:
#define OBJ_EXT ".o"
// Use the VERSION file
#define USE_VERSION
// below #define DEFCOM "program" or "library" may be added by icmstart
SEE ALSO¶
icmake(1),
icmconf(7),
icmstart(1),
icmstart.rc(7)
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).