278 lines
13 KiB
Plaintext
278 lines
13 KiB
Plaintext
=============================================================================
|
|
ICMAKE
|
|
the Intelligent C-like MAKEr, or
|
|
the ICce MAKE utility
|
|
|
|
Copyright (c) Frank B. Brokken and Karel Kubat
|
|
|
|
ICCE, State University of Groningen, Netherlands
|
|
=============================================================================
|
|
|
|
|
|
Introduction
|
|
------------
|
|
|
|
Icmake is a hybrid between a 'make' utility and a 'shell script'
|
|
language. Originally, it was concocted to provide a useful tool for
|
|
automatic program maintenance and system administrative tasks on MS-DOS
|
|
platforms. As we learned to appreciate its flexibility, Icmake was
|
|
eventually ported to Unix platforms (SCO and Linux). By now Icmake also runs
|
|
on a HP-Unix platform.
|
|
|
|
To give an impression of "what Icmake does", take a look at the
|
|
following makefile. It is used for automatic program maintenance, where it
|
|
is assumed that in some directory all files with the extension ".c" (C
|
|
source files) constitute a program "myprog". The automatic maintenance makes
|
|
sure that, once Icmake is invoked, C source files which are more recent
|
|
(newer) than a library file "libmyprog.a" are recompiled and placed in the
|
|
library. A new program is then made and installed in a directory
|
|
"/home/user/bin".
|
|
|
|
void main ()
|
|
{
|
|
list
|
|
cfiles; // list of .c files
|
|
int
|
|
i; // counter variable
|
|
string
|
|
sourcefile; // string with name of
|
|
// 1 source file
|
|
|
|
cfiles = makelist ("*.c", younger, // cfiles is now a list of
|
|
"libmyprog.a"); // all files to recompile
|
|
|
|
if (cfiles) // if there are any files..
|
|
for (i = 0; i < sizeof (cfiles), // recompile them
|
|
i++)
|
|
{
|
|
sourcefile = element (i, cfiles); // get the name from the list
|
|
exec ("gcc", "-c -Wall", sourcefile); // recompile
|
|
}
|
|
|
|
if (makelist ("*.o")) // any "*.o" files here?
|
|
{
|
|
exec ("ar", "rvs", "libmyprog.a", "*.o"); // add to library
|
|
exec ("rm", "*.o"); // remove them
|
|
exec ("gcc", "-o myprog", "libmyprog.a"); // re-link program
|
|
exec ("mv", "myprog", "/home/user/bin"); // and install in bin dir
|
|
}
|
|
}
|
|
|
|
The source files for Icmake look remarkably like C sourcefiles. The
|
|
resemblance is so close that this cannot be pure chance! Yes, we have
|
|
implemented Icmake to be a language with a syntax which largely overlaps C.
|
|
Since we know how to program in C, we decided that we didn't want to learn
|
|
some new macro language. The Icmake language is a "subset" of C in the
|
|
sence that not all operators or functions of C are implemented (but a good
|
|
deal are, e.g., gets(), getch(), printf(), etc.). The Icmake language has
|
|
its own extensions to make it a handy language for the purpose of
|
|
maintenance: e.g., the operator "younger" compares two files in respect to
|
|
their date of last modification, a type "list" is defined to hold several
|
|
strings.
|
|
|
|
The usage of Icmake is not restricted to program maintenance. The
|
|
setup, which allows for functions, arguments, local or global variables, the
|
|
calling of external programs, etc. makes Icmake also extremely suitable as
|
|
a shell script language. E.g., it is easy to accomplish to let Icmake
|
|
figure out which files need to be backupped since the last backup date and
|
|
to start a process to do so, to send mail about it etc.
|
|
|
|
This guide provides a short description how Icmake can be ported to
|
|
new platforms. The documentation for the usage of Icmake, including a
|
|
description of the grammar and of all built-in functions, comes with the
|
|
distribution files.
|
|
|
|
|
|
Installing Icmake
|
|
-----------------
|
|
|
|
The installation files for Icmake come as an archive, e.g.,
|
|
"icmake.zip" or "icmake-6.00.tar.gz". These archives unpack to several
|
|
directories and files. Please note that the archives unpack to the *current*
|
|
directory.
|
|
|
|
To unpack the archives, create an appropriate directory (e.g.,
|
|
"/usr/local/src/icmake" for Unix platforms, or "c:\c\icmake" for DOS) and
|
|
change-dir to that directory. Use an appropriate archiver to unpack. Some
|
|
possibilities are described below:
|
|
|
|
(a) The archive in the form ".tar.Z" can be unpacked using
|
|
"cat icmake-5.00.tar.Z | uncompress | tar xvf -"
|
|
|
|
(b) Archives in the form ".tar.gz", ".tar.z" or ".tgz" can be unpacked using
|
|
"gzip -c -d icmake-5.00.tar.gz | tar xvf -"
|
|
|
|
(c) The archives with the extension ".zip" can be unpacked using
|
|
"unzip icmake.zip" or "pkunzip -d icmake.zip".
|
|
|
|
The extraction of files from the archive should yield a lot of C
|
|
source files in a number of directories. The default distribution of Icmake
|
|
may or may not contain makefiles for the Unix-utility "make"; but the
|
|
programs can always be created by compiling all files "by hand".
|
|
Furthermore, the directory "dosbin" contains compiled versions of the Icmake
|
|
programs for DOS platforms.
|
|
|
|
To compile all files "by hand" in order to make the programs, please
|
|
follow these steps:
|
|
|
|
(a) Change-dir to the directory "rss". This directory contains sourcefiles
|
|
for the Runtime Support System. These functions are used in all the programs
|
|
of the Icmake family.
|
|
|
|
Compile all files, using the appropriate compiler flags which cause your
|
|
compiler to compile-only and which cause it to treat "char"s as "unsigned
|
|
char"s. If your compiler supports memory models, choose the "small" model.
|
|
E.g., these compiler flags are:
|
|
|
|
for GNU's gcc: gcc -c -funsigned-char
|
|
for Microsoft C 7.00: cl -c -J -AS
|
|
|
|
While compiling, you may need special definition flags to produce workable
|
|
code for 'exotic' (well.. exotic to me) systems. Please check the section
|
|
below to see if you need any special flags.
|
|
|
|
Next, place the produced object files into one library. A suggested name is
|
|
"libicrss.a" for Unix systems, or "icrss.lib" for DOS systems. See the
|
|
documentation of your library manager ("ar" or "lib") for the required
|
|
command line. E.g., for Unix systems try "ar rsv libicrss.a *.o" in the
|
|
directory "rss".
|
|
|
|
(b) The following five directories must also be created from the archive:
|
|
"make", "pp", "comp", "exec", "un". The directories hold respectively the
|
|
files needed for the top-level program "icmake", for the preprocessor
|
|
"icm-pp", for the compiler "icm-comp", for the executor "icm-exec" and for
|
|
the unassembler "icmun". These program names are on Unix-based systems
|
|
without extension; supply ".exe" for DOS.
|
|
|
|
Change-dir to each of these directories, and compile and link all .c files
|
|
into the appropriate program. E.g., for a Unix system you might type:
|
|
cd make
|
|
gcc -funsigned-char -o icmake *.c ../rss/libicrss.a
|
|
cd ../pp
|
|
gcc -funsigned-char -o icm-pp *.c ../rss/libicrss.a
|
|
cd ../comp
|
|
gcc -funsigned-char -o icm-comp *.c ../rss/libicrss.a
|
|
cd ../exec
|
|
gcc -funsigned-char -o icm-exec *.c ../rss/libicrss.a
|
|
cd ../un
|
|
gcc -funsigned-char -o icmun *.c ../rss/libicrss.a
|
|
cd ..
|
|
For a DOS platform with the Microsoft compiler, you might type:
|
|
cd make
|
|
cl -AS -J -Feicmake.exe *.c ..\rss\icrss.lib
|
|
cd ..\pp
|
|
cl -AS -J -Feicm-pp.exe *.c ..\rss\icrss.lib
|
|
cd ..\comp
|
|
cl -AS -J -Feicm-comp.exe *.c ..\rss\icrss.lib
|
|
cd ..\exec
|
|
cl -AS -J -Feicm-exec.exe *.c ..\rss\icrss.lib
|
|
cd ..\un
|
|
cl -AS -J -Feicmun.exe *.c ..\rss\icrss.lib
|
|
cd ..
|
|
|
|
Whichever platform you use, please make sure to include the "unsigned chars"
|
|
flag when compiling, and name the resulting program by the appropriate name
|
|
(one of "icmake", "icm-pp", "icm-comp", "icm-exec", "icmun", optionally
|
|
followed by an extension ".exe" for DOS systems). The reason for this is the
|
|
fact that the top-level program "icmake" must be able to call all subsequent
|
|
programs, of which the names therefore must be known. Furthermore, you may
|
|
need special compilation flags for rare systems (see the section below).
|
|
|
|
During the compilation your compiler may report some warnings. You can
|
|
ignore these.
|
|
|
|
(c) If all goes well, you've now created all necessary programs. Move the
|
|
executable files to a system directory; e.g., "/usr/local/bin" for Unix
|
|
systems, "c:\sys\bin" for DOS systems, etc.
|
|
|
|
(d) For all subsequent releases of Icmake which you may wish to install, you
|
|
can use your old programs of the Icmake family and the included icmake-files.
|
|
E.g., the installation includes a file "unix.im" to create Icmake for Unix
|
|
platforms. Prior to using the makefiles, you may wish to edit this file, to
|
|
define your favorite compiler, your system directory, etc. Even when you
|
|
successfully create Icmake by hand, it may be a good idea to re-make it with
|
|
the makefile to check its workings. Just type "icmake unix", or "icmake
|
|
dos-msc" or whatever is appropriate; then follow the instructions which are
|
|
printed by the makefile.
|
|
|
|
|
|
Special flags while compiling
|
|
-----------------------------
|
|
|
|
A large part of the source code of Icmake should compile on any
|
|
platform. The exceptions we have encountered so far are the following:
|
|
|
|
(a) On MSDOS platforms, the constant MSDOS must be defined. This symbol is
|
|
by default defined by the Microsoft compiler. For other compilers on DOS
|
|
systems, a flag "-DMSDOS" may be necessary when invoking the compilations.
|
|
Non-DOS systems should, obviously, *not* have a defined symbol MSDOS.
|
|
|
|
(b) Sparc stations which require double-word alignment, require that the
|
|
constant SPARC be defined. Parts of the code, especially the file
|
|
"comp/patchup.c", handle assignments differently when SPARC is defined. On
|
|
such systems, "-DSPARC" should be added to the compiler flags. (Many thanks
|
|
to Wilco Oelen (W.Oelen@el.utwente.nl)).
|
|
|
|
|
|
The Documentation
|
|
-----------------
|
|
|
|
Icmake is documented in a Postscript file, "icmake.ps", located in
|
|
the directory "doc". This file is generated from a .dvi file using dvips,
|
|
and can be processed with GhostScript. Note that the file is generated for
|
|
a printer resolution of 300 dpi, which suits a LaserJet family printer. If
|
|
your site lacks the means to print this file, you can mail us at the address
|
|
below to obtain a printed copy of the documentation. (However, we will
|
|
charge you a small amount to cover our costs).
|
|
|
|
The directory "doc" furthermore contains the file "icmake.1". This
|
|
is a crude "man" page for Unix systems. You can install it by copying it to
|
|
a directory which contains formatted manual pages. To use this feature,
|
|
your "man" command must be able to show an already-formatted manual entry.
|
|
E.g., on Linux systems you can copy this file to "/usr/man/cat1". Typing
|
|
"man icmake" will then show the information. Some man systems also support
|
|
compressed manual pages. On these systems you may achieve a lower disk
|
|
usage by compressing the file "icmake.1" to "icmake.1.Z", using the Unix
|
|
program "compress".
|
|
|
|
A few makefiles are provided as examples in the directory
|
|
"examples". You may wish to look at these to see how makefiles can be
|
|
organized.
|
|
|
|
|
|
Some Legal Stuff
|
|
----------------
|
|
|
|
Icmake is shareware. This means that no fee is charged for it. As
|
|
with everything that's free, there's no pay but also *absolutely no
|
|
warranty*. Furthermore, you are allowed (and encouraged) to distribute
|
|
Icmake, provided that you include this information with each distribution
|
|
and provided that you do *not* charge any amount for it. Not even the $5
|
|
for shipping.
|
|
|
|
The source files and the documentation for Icmake are copyrighted by
|
|
us. The reason for this is (a) that we'd like to have always the last
|
|
version of Icmake, and (b) that we'd like to have the last word in all
|
|
modifications. If you have requests (or even better, "working code" to
|
|
include in Icmake) please mail us and we'll gladly oblige when we find the
|
|
time.
|
|
|
|
|
|
Requests, Bug Reports, etc.
|
|
---------------------------
|
|
|
|
It is possible, even highly likely, that the version of Icmake which
|
|
you received contains bugs. We are continuously fighting a battle against
|
|
the insects which pop up from time to time to tease us.
|
|
|
|
Therefore, we'd very much appreciate it if you'd let us know if you
|
|
encounter any bugs. Also, if you have requests or comments about the
|
|
programs or the documentation, mail us. We can be reached at:
|
|
|
|
Frank Brokken Karel Kubat
|
|
e-mail: F.B.Brokken@icce.rug.nl K.Kubat@icce.rug.nl
|
|
phone: (+31) 50 63 36 88 (+31) 50 63 36 47
|
|
address: Westerhaven 16 Westerhaven 16
|
|
Groningen Groningen
|
|
Netherlands Netherlands
|