unix-pc CCC shell script
Joseph
sysop at atrium.UUCP
Thu Feb 4 13:53:47 AEST 1988
I've received several requests on how I solved the problem with implementing
shared libraries and curses together. Below is Jeffery Small's ccc shell
script which will compile your programs with the shared libraries and if you
add -lcurses to the command line, it will add the curses library also.
--
Joseph Gomez ..gatech!petro!atrium!sysop
--
# This is a shell archive. Remove anything before this line
# then unpack it by saving it in a file and typing "sh file"
# (Files unpacked will be owned by you and have default permissions).
# This archive contains the following files:
# ./README
# ./Size
# ./Name
# ./Files
# ./Install
# ./Remove
# ./Makefile
# ./ccc
#
if `test ! -s ./README`
then
echo "extracting ./README ..."
sed 's/^X//' > ./README << 'END__of_the__FILE'
XThe enclosed files provide a updated c-compiler interface for the UNIX-PC
Xwhich automates the use of the shared libraries when compiling programs on
Xthis machine.
X
XCredit for the initial idea of a compiler interface goes to Arnold Robbins
Xof Emory University Computing Center who distributed the original interface
Xprogram. To this original work I have done the following:
X
X - Added and/or modify support for -[CUefouLW] & -VS flags
X - Expanded comments throughout the script for reradability.
X - Performed some minor reorganization for clarity.
X - Modified the script so as not to rename /bin/cc. Instead, this
X script is called /bin/ccc and it references the original cc.
X - Added a test which prevents the loader-step from starting up if
X an error occurs in the compiling stage. Prior to this, linking
X would be attempted even if one of the .o files was missing.
X
X
XRecently, Emmet Gray of the US Army HQ III Corp sent out a script for
Xmodifying the /lib/shlib.ifile to allow curses programs to be compiled
Xusing the shared libraries. This was a great idea but I found three
Xadditions which I wanted to make:
X
X (1) I wanted a permenant copy of the edited .ifile so that I didn't
X have to re-edit the original file each time I compiled a curses
X program.
X
X (2) I found that there were a few routines contained in /lib/libc.a
X which were not duplicated in the shared libraries but which
X were required by the curses library /usr/lib/libcurses.a.
X
X (3) I wanted curses programs to compile transparently like any
X other program - which meant modifying /bin/ccc to handle the
X work.
X
X
XFinally, I like the way that the UNIX-PC keeps track of installed software
Xby hiding a Remove script which cleans up if you decide to remove the
Xthe software at a later date. So what you have here is a set of files
Xto make a UNIX-PC Installable File. To Install this program:
X
X 1: Unshar this package
X
X 2: Type: make
X
X 3: Use the "Install Software sent by Electronic Mail" item in
X the "Software Setup" menu from the "Administration" menu
X to install the file "CCC". This step will allow you to
X create a Backup Installable Floppy if you decide you
X would like it.
X
X 4: Use "ccc" just as you would "cc". In your Makefiles, define
X CC=/bin/ccc to force make to use the interface program.
X
X (For those of you not running the User Agent, you can install
X this program by: 1: become root [su root]
X 2: Type: sh Install
X 3: Keep a copy of the Remove file if you like.)
X
X
XI have compiled a number of curses program using this modified script and
Xhave encountered no problems to date. Should you find any problems with
Xthis script and support files, I would appreciate hearing about them.
X
X--
XJeffery Small (203) 776-2000 UUCP: uunet!---\
XC. Jeffery Small and Associates ihnp4!--- hsi!cjsa!jeff
X123 York Street, New Haven, CT 06511 hao!noao!---/
END__of_the__FILE
if test `wc -c < ./README` -ne 2935
then
echo "\tWAIT A MINUTE ... Expecting file size of 2935 bytes"
echo "\t but got a file size of `wc -c < ./README` bytes"
echo "\tWARNING ......... Suggest you check file contents."
fi
else
echo "will not over write ./README"
fi
if `test ! -s ./Size`
then
echo "extracting ./Size ..."
sed 's/^X//' > ./Size << 'END__of_the__FILE'
X50
END__of_the__FILE
if test `wc -c < ./Size` -ne 3
then
echo "\tWAIT A MINUTE ... Expecting file size of 3 bytes"
echo "\t but got a file size of `wc -c < ./Size` bytes"
echo "\tWARNING ......... Suggest you check file contents."
fi
else
echo "will not over write ./Size"
fi
if `test ! -s ./Name`
then
echo "extracting ./Name ..."
sed 's/^X//' > ./Name << 'END__of_the__FILE'
Xccc - A C-compiler interface for the UNIX-pc. (Ver. 1.2)
END__of_the__FILE
if test `wc -c < ./Name` -ne 57
then
echo "\tWAIT A MINUTE ... Expecting file size of 57 bytes"
echo "\t but got a file size of `wc -c < ./Name` bytes"
echo "\tWARNING ......... Suggest you check file contents."
fi
else
echo "will not over write ./Name"
fi
if `test ! -s ./Files`
then
echo "extracting ./Files ..."
sed 's/^X//' > ./Files << 'END__of_the__FILE'
XSize
XName
XFiles
XInstall
XRemove
Xccc
END__of_the__FILE
if test `wc -c < ./Files` -ne 35
then
echo "\tWAIT A MINUTE ... Expecting file size of 35 bytes"
echo "\t but got a file size of `wc -c < ./Files` bytes"
echo "\tWARNING ......... Suggest you check file contents."
fi
else
echo "will not over write ./Files"
fi
if `test ! -s ./Install`
then
echo "extracting ./Install ..."
sed 's/^X//' > ./Install << 'END__of_the__FILE'
X# A model install script for User Agent applications.
X#
X# C. Jeffery Small and Associates Date: 01-23-88
X
X
X#########################################################################
X# Insert the name of the Application in NAME="", exactly as it should #
X# appear in the User Agent Menu. "NAME" MUST be identical to that in #
X# both the "Remove" Script and in the "UA_UPDATE" File. #
X#########################################################################
X
XNAME="ccc"
X
X
X#########################################################################
X# List the application files below & assign the appropriate directory, #
X# owner, group, and mode to each group. OT1 and OT2 are "Other" groups #
X# and can be used for file-groups which do not go into $BIN, $LIB or #
X# $DOC. The "Other" directory assignments can also be used to force the #
X# creation of intermediate directories which may not otherwise exist. #
X# (ie: To install files in "/usr/games/lib/rogue" it is necessary #
X# to insure that "/usr/games" & "/usr/games/lib" exist before #
X# attempting to mkdir "/usr/games/lib/rogue".) #
X#########################################################################
X
XBINFILES="ccc"
X
XBIN=/bin
X
XBINMOD=755
X
XBINOWN=bin
X
XBINGRP=bin
X
Xecho "Now beginning the installation of $NAME ...\n"
X
X
X
X#########################################################################
X# Step 1: See if the C compiler exists on this system. #
X#########################################################################
X
Xif [ ! -x $BIN/cc ]
Xthen
X echo " \007The C-compiler is not installed on this machine.\n"
X echo " To install this application you must first load the"
X echo " Development Set Utilities onto this system.\n\n"
X echo " $NAME cannot be installed at this time.\n"
X echo " Hit <ENTER> to continue ... \c"
X read ANS
X exit 64 # This aborts the Install process
Xfi
X
X#########################################################################
X# Step 2: Link files into the proper directories. #
X#########################################################################
X
Xecho "\n Installing the files ..."
X
Xfor i in $BINFILES
Xdo
X chown $BINOWN $i
X chgrp $BINGRP $i
X chmod $BINMOD $i
X ln $i $BIN
Xdone
X
X#########################################################################
X# Step 3: Put any special work here. #
X#########################################################################
X
Xecho "\n Creating a curses compatible shared-library ifile ..."
X
Xif [ ! -f /lib/shlib.ifile ]
Xthen
X echo " \007Error: /lib/shlib.ifile is missing!"
X echo " Make sure that you have loaded the Development Set."
X echo " Hit <ENTER> to continue ... \c"
X read ANS
Xelse
X # The following is credited totally to Emmet P. Gray (fthood!gray)
X # Thanks Emmet!
X
X cp /lib/shlib.ifile /lib/shlib.iCURSES
X chmod 644 /lib/shlib.iCURSES
X chown bin /lib/shlib.iCURSES
X chgrp bin /lib/shlib.iCURSES
X
X ed - /lib/shlib.iCURSES <<-'ENDofEDIT'
X 1,$s/^PC/xPC/
X 1,$s/^BC/xBC/
X 1,$s/^UP/xUP/
X 1,$s/^ospeed/xospeed/
X 1,$s/^LINES/xLINES/
X 1,$s/^COLS/xCOLS/
X 1,$s/^tgetflag/xtgetflag/
X 1,$s/^tgetent/xtgetent/
X 1,$s/^tgetstr/xtgetstr/
X 1,$s/^tgetnum/xtgetnum/
X 1,$s/^tgoto/xtgoto/
X 1,$s/^tputs/xtputs/
X 1,$s/^wrefresh/xwrefresh/
X 1,$s/^initscr/xinitscr/
X 1,$s/^cbreak/xcbreak/
X 1,$s/^nl/xnl/
X 1,$s/^flushinp/xflushinp/
X 1,$s/^noecho/xnoecho/
X 1,$s/^savetty/xsavetty/
X 1,$s/^resetty/xresetty/
X 1,$s/^echo/xecho/
X 1,$s/^nocbreak/xnocbreak/
X 1,$s/^nonl/xnonl/
X 1,$s/^keypad/xkeypad/
X 1,$s/^endwin/xendwin/
X 1,$s/^printw/xprintw/
X 1,$s/^fixterm/xfixterm/
X 1,$s/^resetterm/xresetterm/
X 1,$s/^setterm/xsetterm/
X 1,$s/^baudrate/xbaudrate/
X w
X q
XENDofEDIT
Xfi
X
Xecho "\n Creating a supplemental library of routines missing from"
Xecho " the shared-library but required by the curses ..."
X
Xif [ ! -f /lib/libc.a ]
Xthen
X echo " \007Error: /lib/libc.a is missing!"
X echo " Make sure that you have loaded the Development Set."
X echo " Hit <ENTER> to continue ... \c"
X read ANS
Xelse
X OFILES="doprnt.o doscan.o setvbuf.o"
X
X ar x /lib/libc.a $OFILES
X ar qc libCURSES.a $OFILES
X chmod 644 libCURSES.a
X chown bin libCURSES.a
X chgrp bin libCURSES.a
X ln libCURSES.a /lib
Xfi
X
X
X#########################################################################
X# Step 4: Update the UA menu with the new application. #
X#########################################################################
X
X
X#########################################################################
X# Step 5: Close out with any explanatory comments. #
X#########################################################################
X
X
Xecho "\nInstallation of $NAME is now complete."
Xecho "\nUse ccc just as you would cc. In Makefiles, define"
Xecho "CC=/bin/ccc at the head of your file to force make"
Xecho "to use the ccc compiler interface."
Xecho "\nHit <ENTER> to continue ... \c"
Xread ANS
Xexit 0
END__of_the__FILE
if test `wc -c < ./Install` -ne 4981
then
echo "\tWAIT A MINUTE ... Expecting file size of 4981 bytes"
echo "\t but got a file size of `wc -c < ./Install` bytes"
echo "\tWARNING ......... Suggest you check file contents."
fi
else
echo "will not over write ./Install"
fi
if `test ! -s ./Remove`
then
echo "extracting ./Remove ..."
sed 's/^X//' > ./Remove << 'END__of_the__FILE'
X# A model Remove script for User Agent applications.
X#
X# C. Jeffery Small and Associates Date: 01-23-88
X
X
X#########################################################################
X# Insert the name of the Application in NAME="", exactly as it should #
X# appear in the User Agent Menu. "NAME" MUST be identical to that in #
X# both the "Install" Script and in the "UA_UPDATE" File. #
X#########################################################################
X
XNAME="ccc"
X
XBINFILES="ccc"
XLIBFILES="shlib.iCURSES libCURSES.a"
X
XBIN=/bin
XLIB=/lib
X
X
Xecho "Now beginning the removal of $NAME ...\n"
X
Xfor i in $BINFILES
Xdo
X rm -f $BIN/$i
Xdone
X
Xfor i in $LIBFILES
Xdo
X rm -f $LIB/$i
Xdone
X
X#########################################################################
X# Step 3: Close out with any explanatory comments. #
X#########################################################################
X
X
Xecho "\nThe Removal of $NAME is now complete."
Xexit 0
END__of_the__FILE
if test `wc -c < ./Remove` -ne 949
then
echo "\tWAIT A MINUTE ... Expecting file size of 949 bytes"
echo "\t but got a file size of `wc -c < ./Remove` bytes"
echo "\tWARNING ......... Suggest you check file contents."
fi
else
echo "will not over write ./Remove"
fi
if `test ! -s ./Makefile`
then
echo "extracting ./Makefile ..."
sed 's/^X//' > ./Makefile << 'END__of_the__FILE'
XSHELL=/bin/sh
X
X
Xinstall: ccc
X cat ./Files | cpio -ocBv > /usr/spool/uucppublic/CCC+IN
END__of_the__FILE
if test `wc -c < ./Makefile` -ne 86
then
echo "\tWAIT A MINUTE ... Expecting file size of 86 bytes"
echo "\t but got a file size of `wc -c < ./Makefile` bytes"
echo "\tWARNING ......... Suggest you check file contents."
fi
else
echo "will not over write ./Makefile"
fi
if `test ! -s ./ccc`
then
echo "extracting ./ccc ..."
sed 's/^X//' > ./ccc << 'END__of_the__FILE'
X#########################################################################
X# #
X# Program: /bin/ccc (Bourne Shell Script) #
X# Version: 1.2 #
X# #
X# Original Coding: Arnold Robbins - Emory Univ. Computing Center #
X# #
X# SYNOPSIS #
X# ccc [ options ] file [ file ... ] #
X# #
X# DESCRIPTION #
X# "ccc" is an interface for the standard C-compiler (/bin/cc) on #
X# the AT&T UNIX-pc (aka 3B1) which allows a more natural usage of #
X# the shared library facilities on this machine. #
X# #
X# To use this script, you must: #
X# 2: Install this script as /bin/ccc #
X# #
X# You may use this replacement "ccc" as you would the original #
X# with the added benefit that programs will now be compiled using #
X# the shared library. #
X# #
X# REVISION HISTORY #
X# 09-10-87 V1.0: Jeffery Small (uunet!hsi!cjsa!jeff) #
X# - Add/modify support for -[CUefouLW] & -VS flag #
X# - Expanded comments #
X# - Performed some minor reorganization. #
X# 09-22-87 V1.1: Jeffery Small (uunet!hsi!cjsa!jeff) #
X# - Modified script to leave /bin/cc alone #
X# - Rename this script to /bin/ccc #
X# - Prevent loader-step from starting if an error #
X# occurs in the compiling stage. #
X# 01-20-88 V1.2: Jeffery Small (uunet!hsi!cjsa!jeff) #
X# - Added support to allow curses programs to be #
X# compiled with the shared library. This #
X# requires the following two support files. #
X# (1) /lib/shlib.iCURSES - edited version of #
X# /lib/shlib.ifile modified to eliminate #
X# conflicts with the curses library. Idea #
X# credits to Emmet P. Gray (fthood!egray) #
X# (2) /lib/libCURSES.a - missing routines #
X# from /lib/libc.a not defined by the #
X# shared libraries. #
X# #
X#########################################################################
X
XPATH=/bin:/usr/bin
Xexport PATH
X
XOCC=${OCC-/bin/cc} # allows compiler to be renamed
X
Xstartoff=/lib/crt0s.o # use the shared library by default
Xlibc=/lib/shlib.ifile
X
Xfiles=
Xofiles=
Xldargs=
Xccargs=-c # have to run $OCC with this
X
Xload=1 # run ld (1=yes 0=no)
Xjustprint=0 # just print what would do, -#
Xverbose=0 # be verbose, -v
X
Xwhile [ $# -gt 0 ]
Xdo
X case "$1" in
X -C) ccargs="$ccargs $1" # cpp flag
X ;;
X -[UDI]*) ccargs="$ccargs $1" # cpp flags
X ;;
X -#) ccargs="$ccargs $1" # cc flag
X justprint=1
X ;;
X -c) load=0 # cc flag
X ;;
X -[EPS]) ccargs="$ccargs $1" # cc flags
X load=0
X ;;
X -g) ccargs="$ccargs $1" # cc & ld flags
X ldargs="$ldargs -lg"
X startoff=/lib/crt0.o
X libc=/lib/libc.a
X ;;
X -O) ccargs="$ccargs $1" # cc flag
X ;;
X -p) ccargs="$ccargs $1" # cc & ld flags
X ldargs="$ldargs -L/lib/libp"
X startoff=/lib/mcrt0.o
X libc=/lib/libc.a
X ;;
X -W*) ccargs="$ccargs $1" # cc flag
X ;;
X -680[012]0) ccargs="$ccargs $1" # cc flags
X ;;
X -v) ccargs="$ccargs $1" # cc flag
X verbose=1
X ;;
X -T) ccargs="$ccargs $1" # cc & ld flags
X ldargs="$ldargs -G"
X ;;
X -[efouL]) ldargs="$ldargs $1 $2" # ld flags
X shift
X ;;
X -VS) ldargs="$ldargs $1 $2" #ld flags
X shift
X ;;
X -[nNzF]) ;; # ifile sets load type
X -ltam) ;; # get from shared lib
X -lc) ;; # get from shared lib
X -ltermlib) ;; # get from shared lib
X -ltermcap) ;; # get from shared lib
X -lcurses) libc=/lib/shlib.iCURSES
X ldargs="$ldargs $1 -lCURSES"
X ;;
X -*) ldargs="$ldargs $1" # other flags go to ld
X ;;
X *.[ao]) ofiles="$ofiles $1" # files for ld
X ;;
X *.[cs]) files="$files $1" # files for cc and ld
X ofiles="$ofiles `basename $1 .[cs]`.o"
X ;;
X *) files="$files $1" # files(?) for cc & ld
X ofiles="$ofiles $1"
X ;;
X esac
X shift
Xdone
X
X$OCC $ccargs $files # compile source files
X
Xif [ "$?" != "0" ] # exit upon error
Xthen # do not attempt ld
X exit $?
X
Xelif [ "$load" -eq 1 ] # run ld phase
Xthen
X run="/bin/ld $startoff $libc $ofiles $ldargs"
X
X if [ "$verbose" -eq 1 ]
X then
X echo Loading ...
X fi
X
X if [ "$justprint" -eq 1 ]
X then
X echo callsys $run
X else
X eval $run
X fi
Xfi
Xexit $?
END__of_the__FILE
if test `wc -c < ./ccc` -ne 4061
then
echo "\tWAIT A MINUTE ... Expecting file size of 4061 bytes"
echo "\t but got a file size of `wc -c < ./ccc` bytes"
echo "\tWARNING ......... Suggest you check file contents."
fi
else
echo "will not over write ./ccc"
fi
echo "Finished archive 1 of 1"
# if you want to concatenate archives, remove anything after this line
exit
More information about the Comp.sys.att
mailing list