Merge from default.

--HG--
branch : dtrg-experimental-powerpc-branch
This commit is contained in:
David Given 2016-09-15 22:59:01 +02:00
commit 4703db0fff
1042 changed files with 11476 additions and 25911 deletions

11
.clang-format Normal file
View file

@ -0,0 +1,11 @@
---
BasedOnStyle: WebKit
AllowShortLoopsOnASingleLine: 'false'
AlwaysBreakAfterDefinitionReturnType: false
BreakBeforeBraces: Allman
IndentCaseLabels: 'true'
PointerAlignment: Left
TabWidth: '4'
UseTab: ForIndentation
...

17
.distr
View file

@ -1,9 +1,7 @@
README README
CHANGES CHANGES
Copyright Copyright
pm Makefile
pmfile
config.pm
h h
modules/h modules/h
@ -13,7 +11,7 @@ util/data
util/LLgen util/LLgen
modules/src/alloc modules/src/alloc
modules/src/assert #modules/src/assert
modules/src/system modules/src/system
modules/src/string modules/src/string
modules/src/read_em modules/src/read_em
@ -31,7 +29,7 @@ util/ack
lib/descr/fe lib/descr/fe
util/arch util/arch
#util/cpp #util/cpp
util/cgg #util/cgg
util/ncgg util/ncgg
util/misc util/misc
util/opt util/opt
@ -43,15 +41,22 @@ lang/cem
lang/pc lang/pc
lang/m2 lang/m2
#lang/occam #lang/occam
#lang/basic lang/basic
mach/proto mach/proto
mach/i80 mach/i80
mach/i86 mach/i86
mach/i386 mach/i386
mach/m68020
mach/vc4
plat
plat/cpm plat/cpm
plat/pc86 plat/pc86
plat/linux
plat/linux386 plat/linux386
plat/linux68k
plat/rpi
examples examples
man

3
.hgignore Normal file
View file

@ -0,0 +1,3 @@
.obj
.sass-cache
_site

View file

@ -1,9 +0,0 @@
5a0daa6017c4aa5ae23b870e97eb7431021762bc distr2
15b742c4c278c27029eca0e41f16463bc076de6e distr3
a0686e2ca8d6780ce37b8267b865f60e9317a340 llgen-1-0
d96cd06672c368e8aaa584fead379ce1d343acad oct-1
bf69b3579e8545ecfc03f5e2550586e3c479270d release-6-0-pre-4
e880082b57f12a7df1c33a2da2c7424d6368f185 dist2
fe535e3e8bc859d4a4e4a186f42670f9e588a5aa release-5-6
90102c21c4480102634c6a482d0dd55f2d9ca00f release-6-0-pre-3
ddc0de0e5e7d91b1dcd7c05602c9c2a6adf8d312 release-6-0-pre-1

6
.travis.yml Normal file
View file

@ -0,0 +1,6 @@
before_install:
- sudo apt-get install ed lua5.1 liblua5.1-posix1 ninja-build
language: c
script:
- make PREFIX=/tmp/acki -j4

View file

@ -2,6 +2,11 @@
# $State$ # $State$
# $Revision$ # $Revision$
6.1pre1
Threw away the make-based build system, because it just didn't work. Wrote
ackbuilder. Many, many little bugfixes and cleanups, too many to remember.
6.0pre4 6.0pre4
Fixed some minor bit-rotting issues that were preventing compilation on Fixed some minor bit-rotting issues that were preventing compilation on

104
Makefile Normal file
View file

@ -0,0 +1,104 @@
# ======================================================================= #
# ACK CONFIGURATION #
# (Edit this before building) #
# ======================================================================= #
# What platform to build for by default?
DEFAULT_PLATFORM = pc86
# Where should the ACK put its temporary files?
ACK_TEMP_DIR = /tmp
# Where is the ACK going to be installed, eventually? If you don't want to
# install it and just want to run the ACK from the build directory
# (/tmp/ack-build/staging, by default), leave this as $(INSDIR).
#PREFIX = /usr/local
PREFIX = $(INSDIR)
# Where do you want to put the object files used when building?
BUILDDIR = $(ACK_TEMP_DIR)/ack-build
# What build flags do you want to use?
CFLAGS = -g
LDFLAGS =
# Various commands.
AR = ar
CC = gcc
# Which build system to use; use 'ninja' or 'make' (in lower case). Leave
# blank to autodetect.
BUILDSYSTEM =
# Build flags for ninja.
NINJAFLAGS =
# Build flags for make.
MAKEFLAGS = -r
# ======================================================================= #
# END OF CONFIGURATION #
# ======================================================================= #
# You shouldn't need to change anything below this point unless you are
# actually developing ACK.
OBJDIR = $(abspath $(BUILDDIR)/obj)
BINDIR = $(abspath $(BUILDDIR)/bin)
LIBDIR = $(abspath $(BUILDDIR)/lib)
INCDIR = $(abspath $(BUILDDIR)/include)
INSDIR = $(abspath $(BUILDDIR)/staging)
PLATIND = $(INSDIR)/share/ack
PLATDEP = $(INSDIR)/lib/ack
MAKECMDGOALS ?= +ack
BUILD_FILES = $(shell find * -name '*.lua')
ifneq ($(shell which ninja),)
BUILDSYSTEM = ninja
BUILDFLAGS = $(NINJAFLAGS)
else
BUILDSYSTEM = make
BUILDFLAGS = $(MAKEFLAGS)
endif
ifneq ($(findstring +, $(MAKECMDGOALS)),)
$(MAKECMDGOALS): $(BUILDDIR)/build.$(BUILDSYSTEM)
@$(BUILDSYSTEM) $(BUILDFLAGS) -f $^ $(MAKECMDGOALS)
endif
$(BUILDDIR)/build.$(BUILDSYSTEM): first/ackbuilder.lua Makefile $(BUILD_FILES)
@mkdir -p $(BUILDDIR)
@lua5.1 first/ackbuilder.lua \
first/build.lua build.lua \
--$(BUILDSYSTEM) \
OBJDIR=$(OBJDIR) \
BINDIR=$(BINDIR) \
LIBDIR=$(LIBDIR) \
INCDIR=$(INCDIR) \
INSDIR=$(INSDIR) \
PLATIND=$(PLATIND) \
PLATDEP=$(PLATDEP) \
AR=$(AR) \
CC=$(CC) \
> $(BUILDDIR)/build.$(BUILDSYSTEM)
install:
mkdir -p $(PREFIX)
tar cf - -C $(INSDIR) . | tar xvf - -C $(PREFIX)
clean:
@rm -rf $(BUILDDIR)

82
README
View file

@ -1,8 +1,8 @@
THE AMSTERDAM COMPILER KIT V6.0pre4 THE AMSTERDAM COMPILER KIT V6.1pre1
=================================== ===================================
© 1987-2005 Vrije Universiteit, Amsterdam © 1987-2005 Vrije Universiteit, Amsterdam
2010-08-08 2016-08-02
INTRODUCTION INTRODUCTION
@ -13,10 +13,10 @@ front end compilers for a number of different languages, code generators,
support libraries, and all the tools necessary to go from source code to support libraries, and all the tools necessary to go from source code to
executable on any of the platforms it supports. executable on any of the platforms it supports.
This is an early prerelease of the apocryphal version 6.0 release. Not a This is an early prerelease of the apocryphal version 6.1 release. Not a
lot is supported, the build mechanism needs work, and a lot of things are lot is supported, the build mechanism needs work, and a lot of things are
probably broken. However, what's there should be sufficient to get things probably broken. However, what's there should be sufficient to get things
done and to evaluate how the full 6.0 release should work. done and to evaluate how the full 6.1 release should work.
SUPPORT SUPPORT
@ -24,58 +24,67 @@ SUPPORT
Languages: Languages:
ANSI C, Pascal, Modula 2. K&R is supported via the ANSI C compiler. ANSI C, Pascal, Modula 2, Basic. K&R is supported via the ANSI C compiler.
Platforms: Platforms:
pc86 produces bootable floppy disk images for 8086 PCs pc86 produces bootable floppy disk images for 8086 PCs
linux386 produces ELF executables for PC Linux systems linux386 produces ELF executables for PC Linux systems
linux68k produces ELF executables for m68020 Linux systems
cpm produces i80 CP/M .COM files cpm produces i80 CP/M .COM files
rpi produces Raspberry Pi GPU binaries
INSTALLATION INSTALLATION
============ ============
The version 6.0 build mechanism has been completely rewritten and is based The version 5.0 build mechanism has been completely rewritten. Installation
around the Prime Mover build tool (see http://primemover.sf.net for more ought to be fairly straightforward.
information). Installation ought to be fairly straightforward.
Requirements: Requirements:
- an ANSI C compiler. Currently, I'm afraid, it's hard-coded to use gcc. - an ANSI C compiler. This defaults to gcc. You can change this by setting
To change, try changing the variable definitions in first/c.pm. This also the CC make variable.
needs to be available as 'cc' from the shell.
- about 20MB free in /tmp (or some other temporary directory). - flex and yacc.
- GNU make.
- Lua 5.1 and the luaposix library (used by the build system).
- (optionally) ninja; if you've got this, this will be autodetected and give
you faster builds.
- about 40MB free in /tmp (or some other temporary directory).
- about 6MB in the target directory. - about 6MB in the target directory.
Instructions: Instructions:
- edit config.pm. There's a small section at the top containing some editable - edit the Makefile. There's a small section at the top where you can change
variables. Probably the only one you may want to edit is PREFIX, which the configuration. Probably the only one you may want to edit is PREFIX,
changes where the ACK installs to. which changes where the ACK installs to.
- Run: - Run:
./pm configure make
...from the command line. This will write out a configuration file. ...from the command line. This will do the build.
The make system is fully parallelisable. If you have a multicore system,
install ninja and it'll use all your cores. If you don't have ninja, you
can still use make for parallel builds with:
make MAKEFLAGS='-r -j8' # or however many cores you have
...but frankly, I recommend ninja.
- Run: - Run:
./pm sudo make install
...from the command line. This will actually do the build. This takes ...from the command line. This will install the ACK in your PREFIX
about two minutes on my 1.6GHz Athlon Linux machine and about 30 on my directory (by default, /usr/local).
166MHz Pentium OpenBSD machine.
- Run:
./pm install
...from the command line (possibly with sudo). This will install the built
ACK into whatever directory you nominated in PREFIX.
The ACK should now be ready to use. The ACK should now be ready to use.
@ -94,8 +103,9 @@ Some useful options include:
-o <file> specifies the output file -o <file> specifies the output file
-c produce a .o file -c produce a .o file
-c.s produce a .s assembly file -c.s produce a .s assembly file
-O enable optimisation -O enable optimisation (optimisation levels go up to 6)
-ansi compile ANSI C (when using the C compiler) -ansi compile ANSI C (when using the C compiler)
-v be more verbose (repeatable)
<file> build file <file> build file
ack figures out which language to use from the file extension: ack figures out which language to use from the file extension:
@ -107,6 +117,7 @@ ack figures out which language to use from the file extension:
.p Pascal .p Pascal
.o object files .o object files
.s assembly files .s assembly files
.e ACK intermediate code assembly files
For further information, see the man page (which actually does get For further information, see the man page (which actually does get
installed, but is rather out of date). installed, but is rather out of date).
@ -117,12 +128,13 @@ A sample command line is:
ack -mlinux386 -O examples/paranoia.c ack -mlinux386 -O examples/paranoia.c
GOTCHAS GOTCHAS
======= =======
There are some things you should be aware of. There are some things you should be aware of.
- Look at plat/<PLATFORMNAME>/README for information about the two supported - Look at plat/<PLATFORMNAME>/README for information about the supported
platforms. platforms.
- The library support is fairly limited; for C, it's at roughly the ANSI C - The library support is fairly limited; for C, it's at roughly the ANSI C
@ -138,6 +150,10 @@ There are some things you should be aware of.
- The ACK uses its own .o format. You won't be able to mix the ACK's object - The ACK uses its own .o format. You won't be able to mix the ACK's object
files and another compiler's. files and another compiler's.
- The distribution contains *everything*, including the weird, ancient,
archaic stuff that doesn't work any more and never will, such as the int EM
interpreter and the assembler-linkers. Only some of it builds. Look for
build.lua files.
DISCLAIMER DISCLAIMER
========== ==========
@ -163,8 +179,4 @@ Please enjoy.
David Given (dtrg on Sourceforge) David Given (dtrg on Sourceforge)
dg@cowlark.com dg@cowlark.com
2010-08-08 2016-08-02
# $Source$
# $State$
# $Revision$

View file

@ -1,9 +0,0 @@
cc-and-mkdep.ack
cc-and-mkdep.all
cc-and-mkdep.sun
do_deps
do_resolve
lint-lib.ack
lint-lib.unix
mk_manpage
rm_deps

38
build.lua Normal file
View file

@ -0,0 +1,38 @@
vars.cflags = {
"-g", "-O"
}
vars.ackcflags = {
"-O6"
}
vars.plats = {
"cpm",
"linux386",
"linux68k",
"pc86",
"rpi",
}
local plat_packages = {}
for _, p in ipairs(vars.plats) do
plat_packages[#plat_packages+1] = "plat/"..p.."+pkg"
end
installable {
name = "ack",
map = {
"lang/basic/src+pkg",
"lang/cem/cemcom.ansi+pkg",
"lang/m2/comp+pkg",
"lang/pc/comp+pkg",
"util/ack+pkg",
"util/amisc+pkg",
"util/arch+pkg",
"util/ego+pkg",
"util/led+pkg",
"util/misc+pkg",
"util/opt+pkg",
"examples+pkg",
plat_packages
}
}

View file

@ -13,7 +13,7 @@ ACK_TEMP_DIR = "/tmp"
-- Where is the ACK going to be installed, eventually? -- Where is the ACK going to be installed, eventually?
PREFIX = "/usr/local" PREFIX = "/tmp/ack-temp/staging"
-- ======================================================================= -- -- ======================================================================= --
-- BROKEN ACK CONFIGURATION -- -- BROKEN ACK CONFIGURATION --

View file

@ -1,15 +0,0 @@
++ ./doc/install.pr made
++ ./doc/int/.distr made
++ ./etc/new_table_done made
++ ./lang/cem/cemcom.ansi/Version.c made
++ ./lang/cem/libcc.ansi/stdlib/malloc.c made
++ ./lang/cem/cemcom/Version.c made
++ ./lang/pc/comp/Version.c made
++ ./lang/m2/comp/Version.c made
++ ./lang/m2/m2mm/Version.c made
++ ./mach/sparc/ce/EM_table made
++ ./mach/sparc_solaris/libem/LIST made
++ ./util/LLgen/src/LLgen.c.dist made
++ ./util/cpp/Version.c made
++ ./util/ego/share/pop_push.h made
++ ./util/grind/ops.c made

View file

@ -1,90 +0,0 @@
How to make a distribution
--------------------------
I have written a new tool to generate the distributions that does not rely on
having a local CVS server --- distr/mkdist.
To use it, you need to specify your CVS work tree, the destination directory
that the distribution will be written to, plus flags. It should be self-
documenting; use:
mkdist --help
...to get documentation.
It uses .distr files in exactly the same way as the previous mechanism.
The documentation for the old distribution tools follows.
David Given
dg@cowlark.com
2005-06-25
-----------------------------------------------------------------------------
How to make a fresh distribution:
For a distribution you need ".distr" files and RCS files.
The EM home directory contains a file called ".distr". It contains
the names of all the files and directories you want to have in the distribution.
The directories should contain .distr files, the other files should
be placed under CVS.
There are files that derive from other files and yet should be placed
in the distribution.
These files should not be placed under RCS or CVS.
The file "Exceptions" in this directory contains the current list of
these files.
When all this is correct, use the shell script mktree the extract
the distribution from the EM tree.
sh mktree destination_tree repository_tree <distrname> 2>f.attf
Use the "cvs rtag" command to give the distribution a name first!
Make sure that the destination tree exists and is empty!
Failing to do that will almost certainly result in a welter of
error messages.
The file f.attf contains mktree error messages and should be compared
to Exceptions.
The actions of mktree are quite complicated. It starts in the current
directory creating a version in the destination directory.
Then it reads the .distr file.
For each file mentioned there it performes certain actions:
1- Directory Change to that directory and call yourself recursively.
2- File
a- Does a file LIST exist in this directory AND
is the first line of LIST equal to the name of the
destination file? If so, try to extract all the files
named in the rest of the LIST file and call the program
arch to create a library "arch cDr `cat LIST`".
In this manner libraries can be distributed whose members
have their own RCS file.
else
b- Try to run 'make distr'
else
c- Try to run 'make <filename>'
else
d- give message that says "not present" (or some such).
Now, the tree contains all the files in the distribution, but it also contains
files that should not be in the distribution, especially the files created
by CVS.
That is why we now give the command:
dtar cdf distr .
The file distr is the one you should put on tape!
But,.... before doing that: Try it out!
Repeat the process described in the installation manual.
Only if that succeeds you are sure that you included the files needed.
Good Luck,
Ed Keizer, 85/4/15.
Updated for 3rd distribution by Ceriel Jacobs, 87/3/11.
And again,
Good Luck!
Updated for 4th distribution by Ceriel Jacobs, 88/4/08.
And again,
Good Luck!
Updated for 5th distribution by Ceriel Jacobs, 91/19/12.
And again,
Good Luck!
Updated for 1st upgrade to 5th distribution by Ceriel Jacobs, 91/12/11.
And again,
Good Luck!

View file

@ -1,26 +0,0 @@
#!/bin/sh
: ${CDIR=.}
${DF-:} $CDIR .distr
if test ! -r $DESTDIR/$CDIR/.distr
then
echo ++ no .distr in $CDIR 1>&2
exit 0
fi
for i in `cat $DESTDIR/$CDIR/.distr`
do
if test -d $i
then
( if cd $i
then
CDIR=$CDIR/$i
export CDIR
exec $DDIR/dwalk $*
else
echo ++ Could not access $CDIR/$i 1>&2
fi
)
else
${DF-:} $CDIR $i
fi
done

View file

@ -1 +0,0 @@
echo $1

View file

@ -1,10 +0,0 @@
case $# in
0) DESTDIR=. ;;
1) DESTDIR=$1 ;;
*) echo $0 [directory] ; exit 1 ;;
esac
DD=`pwd`/listall.d
DW=`pwd`/dwalk
export DD DESTDIR
cd $DESTDIR
$DW

View file

@ -1,2 +0,0 @@
echo "<$1>"
ls -bCdx `cat .distr`

View file

@ -1,10 +0,0 @@
case $# in
0) DIR=. ;;
1) DIR=$1 ;;
*) echo $0 [directory] ; exit 1 ;;
esac
DD=`pwd`/echod
DW=`pwd`/dwalk
export DD
cd $DIR
$DW

View file

@ -1,40 +0,0 @@
#!/bin/sh
: Utility to make a tree of symbolic links to source tree.
: Mount the source tree read-only, use this script, and then try installation.
case $# in
2) ;;
*) echo "Usage: $0 <source-tree> <symlink-tree>" 1>&2
exit 1
;;
esac
if [ -f $1/.distr ]
then
for i in `cat $1/.distr`
do
if [ -d $1/$i ]
then
if mkdir $2/$i && $0 $1/$i $2/$i
then
:
else
exit 2
fi
else
if [ -f $1/$i ]
then
if ln -s $1/$i $2/$i
then
:
else
exit 3
fi
else
echo "Missing file $1/$i" 1>&2
exit 4
fi
fi
done
else
echo "No .distr file in $1" 1>&2
exit 5
fi

View file

@ -1,11 +0,0 @@
#!/bin/sh
set -e
for i in `tail +2 $DESTDIR/$1/LIST`
do
${DF-false} $1 $i
done
cd $DESTDIR/$1
arch cDr `cat LIST`
: I do not remove the files constituating the library, because
: they might be present in .distr

View file

@ -1,177 +0,0 @@
#!/bin/sh
# $Source$
# $State$
# Set up default variables.
destdir=
srcdir=`pwd`
arch=/usr/local/bin/arch
delete=no
copy="ln"
# --- Options parsing -------------------------------------------------------
while [ "$1" != "" ]; do
case "$1" in
-s|--srcdir)
srcdir="$2"
shift
;;
-d|--destdir)
destdir="$2"
shift
;;
-x|--delete)
delete=yes
;;
-c|--copy)
copy="cp -Rp"
;;
-S|--symlink)
copy="ln -s"
;;
-a|--arch)
arch="$2"
shift
;;
-h|--help)
echo "mkdist [options]"
echo "Options are:"
echo " -s --srcdir <path> The CVS tree to read from. (default: CWD)"
echo " -d --destdir <path> The directory to create the distribution in."
echo " -x --delete Erase the destination directory first."
echo " -c --copy Make physical copies of the files. (default: hardlink)"
echo " -S --symlink Make symbolic links instead of copying or hardlinking."
echo " -a --arch <path> Where the ACK 'arch' tool is."
echo " -h --help Display this message."
exit 0
;;
*)
echo "Unrecognised option. Try --help for help."
exit 1
esac
shift
done
if [ "$destdir" = "" ]; then
echo "You must specify a destination directory. (Try --help for help.)"
exit 1
fi
# --- Main routines ---------------------------------------------------------
# These two routines do the work of traversing the source tree and building
# the distribution tree.
addfile() {
local f
f="${1##$srcdir/}"
mkdir -p $destdir/`dirname $f`
$copy "$1" "$destdir/$f"
}
process_dir() {
local path
local archivename
path=$1
cd $path
echo $PWD
# Look for a LIST file and cache the first line.
archivename=
if [ -f LIST ]; then
archivename=`head -1 LIST`
fi
for i in `cat $path/.distr`; do
case "$i" in
\#*) # Comment. Do nothing.
;;
*)
if [ -d $i ]; then
# This is a directory. Recurse into it.
( process_dir $path/$i )
elif [ -f $i ]; then
# This is a file.
addfile $path/$i
elif [ "$i" = "$archivename" ]; then
# Build the named archive.
$arch cDr `cat LIST`
addfile $path/$archivename
else
echo "Don't know what to do with $i, listed in $PWD/.distr."
exit 1
fi
;;
esac
done
}
# --- Main program ----------------------------------------------------------
# Test to make sure that $arch points to the right thing.
if !(strings $arch | grep archiver > /dev/null); then
echo "$arch does not seem to point at the ACK archiver tool."
echo "(Don't confuse this with the Linux tool for displaying your"
echo "architecture.)"
echo ""
echo "Press RETURN to go ahead anyway, or CTRL+C to abort."
read ignored
fi
# Actually do the work.
echo "Creating distribution from CVS tree: $srcdir"
echo " into destination tree: $destdir"
echo ""
if [ -e $destdir ]; then
if [ "$delete" = "yes" ]; then
echo "Press RETURN to erase $destdir and its contents, or CTRL+C to abort."
read
echo "Erasing..."
rm -rf "$destdir"
else
echo "$destdir exists. Aborting."
exit 1
fi
fi
echo "Working..."
mkdir -p $destdir
process_dir $srcdir
echo "Done."
# Revision history
# $Log$
# Revision 1.5 2007-04-24 19:48:41 dtrg
# Removed bashish.
#
# Revision 1.4 2007/02/25 20:56:41 dtrg
# Performed major renovations to make the script work on OpenBSD.
#
# Revision 1.3 2007/02/24 02:05:56 dtrg
# Removed some bashish; added comment support; removed the make
# distr functionality, as nothing was using it any more and it was
# causing problems.
#
# Revision 1.2 2005/06/24 23:19:23 dtrg
# Added new mkdist tool.
#
# Revision 1.1 2005/06/24 22:13:57 dtrg
# Created new tool to generate distributions.

View file

@ -1,19 +0,0 @@
#!/bin/sh
if [ -f $DESTDIR/$1/$2 ]
then
:
elif grep LIST $DESTDIR/$1/.distr >/dev/null 2>&1 &&
(test "$2" = "`head -1 $DESTDIR/$1/LIST`") >/dev/null 2>&1 &&
${DA-false} "$1" "$2"
then
: Fetched library contents one by one and put them together
elif ( cd $DESTDIR/$1 ; make distr ) > /dev/null 2>&1
then
echo ++ $1/$2 made 1>&2
elif ( cd $DESTDIR/$1 ; make $2 ) > /dev/null 2>&1
then
echo ++ $1/$2 made 1>&2
else
echo ++ $1/$2 not present 1>&2
fi

View file

@ -1,42 +0,0 @@
case $# in
2|3) ;;
*) echo Usage: $0 directory repdir [ SVrecord ] 1>&2 ; exit 1 ;;
esac
case $0 in
/*) DDIR=`dirname $0`
;;
*) DDIR=`pwd`/`dirname $0`
;;
esac
case $1 in
/*) DESTDIR=$1 ;;
*) DESTDIR=`pwd`/$1 ;;
esac
case $2 in
/*) REPDIR=$2 ;;
*) REPDIR=`pwd`/$2 ;;
esac
# DD=$DDIR/mkd
# export DD
mkdir -p $DESTDIR
CVSROOT=/usr/proj/em/Repositories
export CVSROOT
cd $DESTDIR
case $# in
3)
cvs checkout world -r $3
;;
2)
cvs checkout world
;;
esac
cd $REPDIR
DF=$DDIR/mkf
DA=$DDIR/mka
export DDIR DESTDIR DF DA REPDIR
$DDIR/dwalk
cd $DESTDIR
find . -type d -print | xargs chmod "uog+rx"
chmod -R "og-w,u+w,uog+r" .

View file

@ -1,26 +0,0 @@
REV=
FILE=
while :
do
case $# in
0) break ;;
esac
ARG="$1"
shift
case "$ARG" in
-r*) REV=`echo "$ARG"| sed s/-r//` ;;
-*) FLAGS="$FLAGS $ARG" ;;
*) case x$FILE in
x) FILE="$ARG" ;;
*) echo todistr can only be done on one file at the time
exit 1 ;;
esac
esac
done
case x$REV in
x) REV=`rlog -h "$FILE"|sed -n -e '/head/s/^head:[ ]*//p'` ;;
esac
case x$REV in
x) exit 2 ;;
esac
rcs -ndistr4:$REV $FLAGS $FILE

View file

@ -1,2 +0,0 @@
DD=`pwd`/ts
echo OK

View file

@ -1,32 +0,0 @@
READ_ME
Makefile
proto.make
ack.doc
basic.doc
cg.doc
crefman.doc
ansi_C.doc
em
install.doc
install.pr
ncg.doc
pcref.doc
peep.doc
regadd.doc
toolkit.doc
v7bugs.doc
val.doc
6500.doc
i80.doc
z80.doc
m68020.doc
m2ref.doc
nopt.doc
top
ego
occam
int
ceg
sparc
lint
pascal

View file

@ -1,4 +0,0 @@
LLgen.n
LLgen_NCER.n
LLgen.refs
proto.make

View file

@ -1,3 +0,0 @@
proto.make
ceg.ref
ceg.tr

View file

@ -1,18 +0,0 @@
proto.make
bo
ca
cf
cj
cs
ic
il
intro
lv
ov
ra
refs.gen
refs.opt
refs.stat
sp
sr
ud

View file

@ -1 +0,0 @@
bo1

View file

@ -1 +0,0 @@
ca1

View file

@ -1,6 +0,0 @@
cf1
cf2
cf3
cf4
cf5
cf6

View file

@ -1 +0,0 @@
cj1

View file

@ -1,5 +0,0 @@
cs1
cs2
cs3
cs4
cs5

View file

@ -1,5 +0,0 @@
ic1
ic2
ic3
ic4
ic5

View file

@ -1,6 +0,0 @@
il1
il2
il3
il4
il5
il6

View file

@ -1,3 +0,0 @@
head
intro1
tail

View file

@ -1 +0,0 @@
lv1

View file

@ -1 +0,0 @@
ov1

View file

@ -1,4 +0,0 @@
ra1
ra2
ra3
ra4

View file

@ -1 +0,0 @@
sp1

View file

@ -1,4 +0,0 @@
sr1
sr2
sr3
sr4

View file

@ -1,5 +0,0 @@
ud1
ud2
ud3
ud4
ud5

View file

@ -1,28 +0,0 @@
proto.make
READ_ME
app.codes.nr
app.exam.nr
assem.nr
cont.nr
descr.nr
dspace.nr
em.i
env.nr
even.c
exam.e
exam.p
int
intro.nr
ip.awk
ispace.nr
mach.nr
macr.nr
mapping.nr
mem.nr
title.nr
traps.nr
types.nr
mkdispatch.c
dispat1.sed
dispat2.sed
dispat3.sed

View file

@ -1,5 +0,0 @@
proto.make
READ_ME
em.p
emdmp.c
mktables.c

View file

@ -1,15 +0,0 @@
proto.make
abstract
appendix_A
appendix_B
chap1
chap2
chap3
chap4
chap5
chap6
chap7
chap8
chap9
contents
frontpage

View file

@ -1,12 +0,0 @@
proto.make
ctot
p0
p1
p2
p3
p4
p5
p6
p7
p8
p9

View file

@ -1,20 +0,0 @@
ab+intro.doc
compar.doc
conf.doc
contents.doc
deviations.doc
example.doc
extensions.doc
hints.doc
his.doc
improv.doc
internal.doc
options.doc
proto.make
reference.doc
rtl.doc
syntax.doc
test.doc
titlepg.doc
transpem.doc
vrk.doc

View file

@ -1,15 +0,0 @@
1
2
3
4
5
A
B
init
intro
note_on_reg_wins
refs
timing
title
proto.make
pics

View file

@ -1,12 +0,0 @@
EM_stack.orig
EM_stack.ours
compile_bars
mem_config
perf
perf.comp
perf.d
perf.dhry
reg_layout
run-time_bars
run-time_bars.bup
signal_stack

View file

@ -1,3 +0,0 @@
proto.make
refs.top
top.n

View file

@ -1,6 +0,0 @@
Makefile
READ_ME
ok
select.c
test.h
tests

View file

@ -1,7 +0,0 @@
proto.make
em_table
new_table
new_table_done
pop_push
traps
ip_spec.t

View file

@ -1,10 +0,0 @@
hilo.b
hilo.c
hilo.mod
hilo.ocm
hilo.p
mandelbrot.c
paranoia.c
startrek.c
startrek.doc
README

44
examples/build.lua Normal file
View file

@ -0,0 +1,44 @@
include("plat/build.lua")
local conly = {
rpi = true
}
local sourcefiles = filenamesof(
"./hilo.b",
"./hilo.c",
"./hilo.mod",
"./hilo.p",
"./mandelbrot.c",
"./paranoia.c",
"./startrek.c"
)
local installmap = {}
for _, file in ipairs(sourcefiles) do
local b = basename(file)
local be = replace(b, "%.", "_")
local _, _, e = b:find("%.(%w*)$")
for _, plat in ipairs(vars.plats) do
if (e == "c") or not conly[plat] then
local exe = ackprogram {
name = be.."_"..plat,
srcs = { file },
vars = {
plat = plat,
lang = e,
}
}
installmap["$(PLATIND)/examples/"..be.."."..plat] = exe
end
end
installmap["$(PLATIND)/examples/"..b] = file
end
installable {
name = "pkg",
map = installmap
}

View file

@ -1,6 +0,0 @@
Action
driver
f_c.ansi
f_c
f_m2
f_pc

View file

@ -1,5 +0,0 @@
afcc.1
afm2.1
afpc.1
driver.c
proto.make

View file

@ -1,3 +0,0 @@
Parameters
proto.main
proto.make

View file

@ -1,3 +0,0 @@
Parameters
proto.main
proto.make

View file

@ -1,3 +0,0 @@
Parameters
proto.main
proto.make

View file

@ -1,3 +0,0 @@
Parameters
proto.main
proto.make

View file

@ -1,3 +0,0 @@
Action
cemcom
driver

View file

@ -1,4 +0,0 @@
Parameters.sun3
Parameters.vax4
proto.main
proto.make

View file

@ -1,3 +0,0 @@
fcc.1
fcc.c
proto.make

View file

@ -1,24 +0,0 @@
ack.pm
ack-custom.pm
c.pm
llgen.pm
yacc.pm
#create_dir
#cp_dir
#em_path.h.src
#first
#get_answer
#get_makepars
#get_sys
#get_sysvax
#install_tail
#limit_enquire
#limit_impl
#lint_params
#local.h.src
#mk_config
#mk_makefile
#mk_target
#target_comp
#util_comp

View file

@ -1,21 +0,0 @@
-- $Source$
-- $State$
-- Custom rules used by the ACK build process.
preprocess = simple {
class = "preprocess",
outputs = {"%U%-%I%"},
command = {
"cpp -I%HEADERDIR% %in% > %out[1]%"
}
}
-- Revision history
-- $Log$
-- Revision 1.2 2007-02-20 00:32:58 dtrg
-- Changed the 'preprocess' rule to use the system C preprocessor.
--
-- Revision 1.1 2006/07/22 00:49:48 dtrg
-- First version in CVS.
--

View file

@ -1,33 +0,0 @@
-- $Source$
-- $State$
-- Provides rules for building things with the half-built ACK itself.
ACKBUILDFLAGS = {"-m%PLATFORM%", "%OPTIMISATION%"}
ACKDEFINES = EMPTY
ACKINCLUDES = EMPTY
ackfile = simple_with_clike_dependencies {
class = "ackfile",
CINCLUDES = {REDIRECT, "ACKINCLUDES"},
command = {
"%BINDIR%bin/ack %ACKBUILDFLAGS% %ACKINCLUDES:cincludes% %ACKDEFINES:cdefines% -c -o %out% %in%"
},
outputs = {"%U%-%I%.o"},
}
ackprogram = simple {
class = "ackprogram",
command = {
"%BINDIR%bin/ack %ACKBUILDFLAGS% -o %out% %in%"
},
outputs = {"%U%-%I%"},
}
acklibrary = simple {
class = "acklibrary",
command = {
"%RM% %out% && %BINDIR%bin/aal cr %out% %in%"
},
outputs = {"%U%-%I%.a"},
}

916
first/ackbuilder.lua Normal file
View file

@ -0,0 +1,916 @@
local posix = require("posix")
-- Targets:
--
-- {
-- fullname = full name of target
-- dir = target's build directory
-- outs = target's object files
-- is = { set of rule types which made the target }
-- }
local emitter = {}
local rules = {}
local targets = {}
local buildfiles = {}
local globals
local cwd = "."
local vars = {}
local parente = {}
local loadingstack = {}
-- Forward references
local loadtarget
local function print(...)
local function print_no_nl(list)
for _, s in ipairs(list) do
if (type(s) == "table") then
io.stderr:write("{")
for k, v in pairs(s) do
print_no_nl({k})
io.stderr:write("=")
print_no_nl({v})
io.stderr:write(" ")
end
io.stderr:write("}")
else
io.stderr:write(tostring(s))
end
end
end
print_no_nl({...})
io.stderr:write("\n")
end
local function assertString(s, i)
if (type(s) ~= "string") then
error(string.format("parameter %d must be a string", i))
end
end
local function concat(...)
local r = {}
local function process(list)
for _, t in ipairs(list) do
if (type(t) == "table") and not t.is then
process(t)
else
r[#r+1] = t
end
end
end
process({...})
return r
end
-- Test table membership (crudely).
local function contains(needle, haystack)
for _, k in ipairs(haystack) do
if (k == needle) then
return true
end
end
return false
end
local function inherit(high, low)
local o = {}
setmetatable(o, {
__index = function(self, k)
local x = high[k]
if x then
return x
end
return low[k]
end
})
for k, v in pairs(high) do
local _, _, kk = k:find("^%+(.*)$")
if kk then
o[kk] = concat(low[kk], v)
end
end
return o
end
local function asstring(o)
local t = type(o)
if (t == "nil") then
return ""
elseif (t == "string") then
return o
elseif (t == "number") then
return o
elseif (t == "table") then
if o.is then
return asstring(o.outs)
else
local s = {}
for _, v in pairs(o) do
s[#s+1] = asstring(v)
end
return table.concat(s, " ")
end
else
error(string.format("can't turn values of type '%s' into strings", t))
end
end
local function concatpath(...)
local p = table.concat({...}, "/")
return (p:gsub("/+", "/"):gsub("^%./", ""):gsub("/%./", "/"))
end
-- Returns a list of the targets within the given collection; the keys of any
-- keyed items are lost. Lists and wildcards are expanded.
local function targetsof(...)
local o = {}
local function process(items)
for _, item in pairs(items) do
if (type(item) == "table") then
if item.is then
-- This is a target.
o[#o+1] = item
else
-- This is a list.
process(item)
end
elseif (type(item) == "string") then
-- Filename!
if item:find("^%+") then
item = cwd..item
elseif item:find("^%./") then
item = concatpath(cwd, item)
end
o[#o+1] = loadtarget(item)
else
error(string.format("member of target list is not a string or a target"))
end
end
end
process({...})
return o
end
local function filenamesof(...)
local targets = targetsof(...)
local f = {}
for _, r in ipairs(targets) do
if (type(r) == "table") and r.is then
if r.outs then
for _, o in ipairs(r.outs) do
f[#f+1] = o
end
end
elseif (type(r) == "string") then
f[#f+1] = r
else
error(string.format("list of targets contains a %s which isn't a target",
type(r)))
end
end
return f
end
local function targetnamesof(...)
local targets = targetsof(...)
local f
for _, r in pairs(targets) do
if (type(r) == "table") and r.is then
f[#f+1] = r.fullname
elseif (type(r) == "string") then
f[#f+1] = r
else
error(string.format("list of targets contains a %s which isn't a target",
type(r)))
end
end
return f
end
local function dotocollection(files, callback)
if (#files == 1) and (type(files[1]) == "string") then
return callback(files[1])
end
local o = {}
local function process(files)
for _, s in ipairs(files) do
if (type(s) == "table") then
if s.is then
error("passed target to a filename manipulation function")
else
process(s)
end
else
local b = callback(s)
if (b ~= "") then
o[#o+1] = b
end
end
end
end
process(files)
return o
end
local function abspath(...)
return dotocollection({...},
function(filename)
assertString(filename, 1)
if not filename:find("^[/$]") then
filename = concatpath(posix.getcwd(), filename)
end
return filename
end
)
end
local function basename(...)
return dotocollection({...},
function(filename)
assertString(filename, 1)
local _, _, b = filename:find("^.*/([^/]*)$")
if not b then
return filename
end
return b
end
)
end
local function dirname(...)
return dotocollection({...},
function(filename)
assertString(filename, 1)
local _, _, b = filename:find("^(.*)/[^/]*$")
if not b then
return ""
end
return b
end
)
end
local function replace(files, pattern, repl)
return dotocollection({files},
function(filename)
return filename:gsub(pattern, repl)
end
)
end
local function fpairs(...)
return ipairs(filenamesof(...))
end
local function matching(collection, pattern)
local o = {}
dotocollection(collection,
function(filename)
if filename:find(pattern) then
o[#o+1] = filename
end
end
)
return o
end
-- Selects all targets containing at least one output file that matches
-- the pattern (or all, if the pattern is nil).
local function selectof(targets, pattern)
local targets = targetsof(targets)
local o = {}
for k, v in pairs(targets) do
if v.is and v.outs then
local matches = false
for _, f in pairs(v.outs) do
if f:find(pattern) then
matches = true
break
end
end
if matches then
o[#o+1] = v
end
end
end
return o
end
local function uniquify(...)
local s = {}
return dotocollection({...},
function(filename)
if not s[filename] then
s[filename] = true
return filename
end
end
)
end
local function startswith(needle, haystack)
return haystack:sub(1, #needle) == needle
end
local function emit(...)
local n = select("#", ...)
local args = {...}
for i=1, n do
local s = asstring(args[i])
io.stdout:write(s)
if not s:find("\n$") then
io.stdout:write(" ")
end
end
end
local function templateexpand(list, vars)
vars = inherit(vars, globals)
local o = {}
for _, s in ipairs(list) do
o[#o+1] = s:gsub("%%%b{}",
function(expr)
expr = expr:sub(3, -2)
local chunk, e = loadstring("return ("..expr..")", expr)
if e then
error(string.format("error evaluating expression: %s", e))
end
setfenv(chunk, vars)
local value = chunk()
if (value == nil) then
error(string.format("template expression '%s' expands to nil (probably an undefined variable)", expr))
end
return asstring(value)
end
)
end
return o
end
local function loadbuildfile(filename)
if contains(filename, loadingstack) then
error(string.format("build file cycle; '%s' refers to itself indirectly; stack is: %s %s",
filename, asstring(loadingstack), filename))
end
loadingstack[#loadingstack+1] = filename
if not buildfiles[filename] then
buildfiles[filename] = true
local fp, data, chunk, e
io.stderr:write("loading ", filename, "\n")
fp, e = io.open(filename)
if not e then
data, e = fp:read("*a")
fp:close()
if not e then
local thisglobals = {}
thisglobals._G = thisglobals
setmetatable(thisglobals, {__index = globals})
chunk, e = loadstring(data, "@"..filename)
if not e then
setfenv(chunk, thisglobals)
end
end
end
if e then
error(string.format("couldn't load '%s': %s", filename, e))
end
local oldcwd = cwd
cwd = dirname(filename)
chunk()
cwd = oldcwd
end
loadingstack[#loadingstack] = nil
end
local function loadbuildfilefor(filepart, targetpart)
local normalname = concatpath(filepart, "/build.lua")
if posix.access(normalname, "r") then
loadbuildfile(normalname)
return
end
local extendedname = concatpath(filepart, "/build-"..targetpart..".lua")
if posix.access(extendedname, "r") then
loadbuildfile(extendedname)
return
end
error(string.format("could not access either '%s' or '%s'", normalname, extendedname))
end
loadtarget = function(targetname)
if targets[targetname] then
return targets[targetname]
end
local target
if not targetname:find("%+") then
local files
if targetname:find("[?*]") then
files = posix.glob(targetname)
if not files then
files = {}
end
else
files = {targetname}
end
target = {
outs = files,
is = {
__implicitfile = true
}
}
targets[targetname] = target
else
local _, _, filepart, targetpart = targetname:find("^([^+]*)%+([%w-_]+)$")
if not filepart or not targetpart then
error(string.format("malformed target name '%s'", targetname))
end
if (filepart == "") then
filepart = cwd
end
loadbuildfilefor(filepart, targetpart)
target = targets[targetname]
if not target then
error(string.format("build file '%s' contains no target '%s'",
filename, targetpart))
end
end
return target
end
local typeconverters = {
targets = function(propname, i)
if (type(i) == "string") then
i = {i}
elseif (type(i) ~= "table") then
error(string.format("property '%s' must be a target list", propname))
end
local m = {}
for k, v in pairs(i) do
local ts = targetsof(v)
if (type(k) == "number") then
for _, t in ipairs(ts) do
m[#m+1] = t
end
else
if (#ts ~= 1) then
error(string.format("named target '%s' can only be assigned from a single target", k))
else
m[k] = ts[1]
end
end
end
return m
end,
strings = function(propname, i)
if (type(i) == "string") then
i = {i}
elseif (type(i) ~= "table") then
error(string.format("property '%s' must be a string list", propname))
end
return concat(i)
end,
boolean = function(propname, i)
if (type(i) ~= "boolean") then
error(string.format("property '%s' must be a boolean", propname))
end
return i
end,
string = function(propname, i)
if (type(i) ~= "string") then
error(string.format("property '%s' must be a string", propname))
end
return i
end,
table = function(propname, i)
if (type(i) ~= "table") then
error(string.format("property '%s' must be a table", propname))
end
return i
end,
object = function(propname, i)
return i
end,
}
local function definerule(rulename, types, cb)
if rulename and rules[rulename] then
error(string.format("rule '%s' is already defined", rulename))
end
types.name = { type="string" }
types.cwd = { type="string", optional=true }
types.vars = { type="table", default={} }
for propname, typespec in pairs(types) do
if not typeconverters[typespec.type] then
error(string.format("property '%s' has unrecognised type '%s'",
propname, typespec.type))
end
end
local rulecwd = cwd
local rule = function(e)
local definedprops = {}
for propname, _ in pairs(e) do
definedprops[propname] = true
end
local args = {}
for propname, typespec in pairs(types) do
if not e[propname] then
if not typespec.optional and (typespec.default == nil) then
error(string.format("missing mandatory property '%s'", propname))
end
args[propname] = typespec.default
else
args[propname] = typeconverters[typespec.type](propname, e[propname])
definedprops[propname] = nil
end
end
local propname, _ = next(definedprops)
if propname then
error(string.format("don't know what to do with property '%s'", propname))
end
if not args.cwd then
args.cwd = cwd
end
args.fullname = args.cwd.."+"..args.name
local oldparente = parente
parente = args
args.vars = inherit(args.vars, oldparente.vars)
local result = cb(args) or {}
parente = oldparente
result.is = result.is or {}
if rulename then
result.is[rulename] = true
end
result.fullname = args.fullname
if targets[arg.fullname] and (targets[arg.fullname] ~= result) then
error(string.format("target '%s' is already defined", args.fullname))
end
targets[result.fullname] = result
return result
end
if rulename then
if rules[rulename] then
error(string.format("rule '%s' is already defined", rulename))
end
rules[rulename] = rule
end
return rule
end
-----------------------------------------------------------------------------
-- DEFAULT RULES --
-----------------------------------------------------------------------------
local function install_make_emitter()
emit("hide = @\n")
function emitter:var(name, value)
-- Don't let emit insert spaces.
emit(name.."="..value.."\n")
end
function emitter:rule(name, ins, outs)
if (#outs == 0) then
local n = name.."-IMAGINARY-OUT"
emit(".INTERMEDIATE:", n, "\n")
outs = {n}
end
local impl = name.."-IMPL"
emit(".INTERMEDIATE:", name, "\n")
emit(".INTERMEDIATE:", impl, "\n")
for i = 1, #outs do
emit(name..":", outs[i], "\n")
end
for i = 1, #outs do
emit(outs[i]..":", impl, ";\n")
end
for i = 1, #ins do
emit(impl..":", ins[i], "\n")
end
emit(impl..":", "\n")
local dirs = uniquify(dirname(outs))
if (#dirs > 0) then
emit("\t@mkdir -p", dirs, "\n")
end
end
function emitter:phony(name, ins, outs)
emit(".PHONY:", name, "\n")
self:rule(name, ins, outs)
end
function emitter:label(...)
local s = table.concat({...}, " ")
emit("\t@echo", s, "\n")
end
function emitter:exec(commands)
for _, s in ipairs(commands) do
emit("\t$(hide)", s, "\n")
end
end
function emitter:endrule()
emit("\n")
end
end
local function install_ninja_emitter()
emit("rule build\n")
emit(" command = $command\n")
emit("\n")
local function unmake(collection)
return dotocollection({collection},
function(s)
return s:gsub("%$%b()",
function(expr)
return "${"..expr:sub(3, -2).."}"
end
)
end
)
end
function emitter:var(name, value)
-- Don't let emit insert spaces.
emit(name.."="..unmake(value).."\n")
end
function emitter:rule(name, ins, outs)
if (#outs == 0) then
emit("build", name, ": phony", unmake(ins), "\n")
else
emit("build", name, ": phony", unmake(outs), "\n")
emit("build", unmake(outs), ": build", unmake(ins), "\n")
end
end
function emitter:label(...)
end
function emitter:exec(commands)
emit(" command =", table.concat(unmake(commands), " && "), "\n")
end
function emitter:endrule()
emit("\n")
end
end
definerule("simplerule",
{
ins = { type="targets" },
outs = { type="strings" },
deps = { type="targets", default={} },
label = { type="string", optional=true },
commands = { type="strings" },
vars = { type="table", default={} },
},
function (e)
emitter:rule(e.fullname, filenamesof(e.ins, e.deps), e.outs)
emitter:label(e.fullname, " ", e.label or "")
local vars = inherit(e.vars, {
ins = filenamesof(e.ins),
outs = filenamesof(e.outs)
})
emitter:exec(templateexpand(e.commands, vars))
emitter:endrule()
return {
outs = e.outs
}
end
)
definerule("installable",
{
map = { type="targets", default={} },
},
function (e)
local deps = {}
local commands = {}
local srcs = {}
local outs = {}
local dests = {}
for dest, src in pairs(e.map) do
if src.is.installable then
if (type(dest) ~= "number") then
error("can't specify a destination filename when installing an installable")
end
deps[#deps+1] = src.fullname
outs = concat(outs, filenamesof(src))
elseif (type(dest) == "number") then
error("only references to other installables can be missing a destination")
else
local f = filenamesof(src)
if (#f ~= 1) then
error("installable can only cope with targets emitting single files")
end
deps[#deps+1] = f
dests[#dests+1] = dest
outs[#outs+1] = dest
commands[#commands+1] = "cp "..f[1].." "..dest
end
end
emitter:rule(e.fullname, deps, dests)
emitter:label(e.fullname, " ", e.label or "")
if (#commands > 0) then
emitter:exec(commands)
end
emitter:endrule()
return {
outs = outs
}
end
)
-----------------------------------------------------------------------------
-- MAIN PROGRAM --
-----------------------------------------------------------------------------
local function parse_arguments(argmap, arg)
local i = 1
local files = {}
local function unrecognisedarg(arg)
argmap[" unrecognised"](arg)
end
while (i <= #arg) do
local o = arg[i]
local op
if (o:byte(1) == 45) then
-- This is an option.
if (o:byte(2) == 45) then
-- ...with a -- prefix.
o = o:sub(3)
local fn = argmap[o]
if not fn then
unrecognisedarg("--"..o)
end
i = i + fn(arg[i+1], arg[i+2])
else
-- ...without a -- prefix.
local od = o:sub(2, 2)
local fn = argmap[od]
if not fn then
unrecognisedarg("-"..od)
end
op = o:sub(3)
if (op == "") then
i = i + fn(arg[i+1], arg[i+2])
else
fn(op)
end
end
else
files[#files+1] = o
end
i = i + 1
end
argmap[" files"](files)
end
globals = {
posix = posix,
abspath = abspath,
asstring = asstring,
basename = basename,
concat = concat,
concatpath = concatpath,
cwd = function() return cwd end,
definerule = definerule,
dirname = dirname,
emit = emit,
filenamesof = filenamesof,
fpairs = fpairs,
include = loadbuildfile,
inherit = inherit,
print = print,
replace = replace,
matching = matching,
selectof = selectof,
startswith = startswith,
uniquify = uniquify,
vars = vars,
}
setmetatable(globals,
{
__index = function(self, k)
local rule = rules[k]
if rule then
return rule
else
return _G[k]
end
end
}
)
vars.cflags = {}
parente.vars = vars
setmetatable(_G,
{
__index = function(self, k)
local value = rawget(_G, k)
if not value then
error(string.format("access of undefined variable '%s'", k))
end
return value
end
}
)
do
local emitter_type = install_make_emitter
parse_arguments(
{
["make"] = function()
emitter_type = install_make_emitter
return 0
end,
["ninja"] = function()
emitter_type = install_ninja_emitter
return 0
end,
[" unrecognised"] = function(arg)
error(string.format("unrecognised argument '%s'", arg))
end,
[" files"] = function(files)
emitter_type()
for _, f in ipairs(files) do
local _, _, name, value = f:find("^([%w_]+)=(.*)$")
if name then
emitter:var(name, value)
end
end
for _, f in ipairs(files) do
if not f:find("=") then
loadbuildfile(f)
end
end
end
},
{...}
)
end

351
first/ackbuilder.md Normal file
View file

@ -0,0 +1,351 @@
# ackbuilder
## What is it?
ackbuilder is a very small build tool inspired by [bazel](https://bazel.io/)
which uses either make or [ninja](https://ninja-build.org/) as a backend.
It supports fully parallelisable builds (in both make and ninja), as well as
hopefully-robust support for rules which generate more than one output file,
which is something make is very, very bad at.
It was written because the ACK is a really horribly complex thing to build and
there wasn't anything else. ackbuilder is pretty rough and ready but it does
sort of work. Be prepared for bugs.
This document is a very rapid brain dump of how the build file works. It
doesn't cover actually running the tool (because that bit's pretty nasty) ---
go look at the top level Makefile to see that for now.
## Basic concepts
Complete example, using the built-in C rules. This should be saved in a file
called `build.lua`:
cprogram {
name = 'prog',
srcs = { "./*.c" },
}
This defines a rule `prog` which, when built, compiles all the source files in
the same directory as the `build.lua` file into an executable.
Slightly more complex example:
clibrary {
name = "library",
srcs = { "./library.c" },
hdrs = { "./library.h" },
}
cprogram {
name = 'prog2',
srcs = { "./prog2.c" },
deps = { "+library" }
}
If we move the library into another directory, we can invoke it like this:
cprogram {
name = 'prog3',
srcs = { "./prog3.c" },
deps = { "path/to/library+library" }
}
* Targets starting with `./` are relative to **the current directory** (i.e.
the one the build file is in).
* Targets starting with a path are relative to the top directory of the
project.
* Targets containing a `+` refer to a named target in another build file. So,
on encountering the library in `prog3` above, ackbuilder will look for
`path/to/library/build.lua`, load it, and then try to find a target in it
called `library`.
**Warning**: files are interpreted from top to bottom; every time a target
referring to another build file is seen for the first time, that file is
interpreted then and there. You can't have circular dependencies (these are
caught and an error is generated). You can't refer to a target defined below
you in the same source file (these are not caught, and just won't be found).
Build files each get their own private global scope. If you randomly set a
variable, it won't be seen by other build files. (Use `vars` for that; see
below.) Build files are only loaded once.
The `cprogram` and `clibrary` rules, by the way, are sophisticated enough to
automatically handle library and header paths. The exported headers by the
library are automatically imported into the program.
## `simplerule` and `normalrule`
These are the building blocks out of which all other rules are made. If you
want to run your own programs, you will be using these.
`simplerule` is the simplest. You give it inputs, and outputs, and commands,
and it does it.
simplerule {
name = 'sorted-input',
ins = { './input.txt' },
outs = { './output.txt' },
commands = {
"sort < %{ins} > %{outs}"
}
}
In a command block, `%{...}` will evaluate the Lua expression between the
braces; various useful things are in scope, including the list of inputs and
outputs.
However, this ends up leaving the output file lying around in the project
directory, which we don't want, so we usually use `normalrule` instead.
(`normalrule` is not strictly part of the ackbuilder core; it's in the standard
library along with `cprogram` and `clibrary`.)
normalrule {
name = 'sorted-input',
ins = { './input.txt' },
outleaves = { 'output.txt' },
commands = {
"sort < %{ins} > %{outs}"
}
}
Note `outleaves`; there is no `./`. This is a list of leaf filenames. The rule
will create a directory in the object tree and put the files specified in it,
somewhere; you don't care where. You can refer to the output file via the
target name, so:
normalrule {
name = 'reversed',
ins = { '+sorted-input' },
outleaves = { 'reversed.txt' },
commands = {
"rev < %{ins} > %{outs}"
}
}
One common use for this is to generate C header or source files.
normalrule {
name = 'reversed_h',
ins = { '+reversed' },
outleaves = { 'reversed.h' },
commands = {
'xxd -i %{ins} > %{outs}'
}
}
cprogram {
name = 'prog',
srcs = { './*.c' },
deps = { '+reversed_h' }
}
Now you can refer to `reversed.h` in one of your C files and it'll just work
(`+reversed_h`'s output directory gets added to the include path
automatically).
## Defining your own rules
Like this:
definerule("sort",
{
srcs = { type="targets" },
},
function(e)
return normalrule {
name = e.name,
ins = e.srcs,
outleaves = { 'sorted.txt' },
commands = {
"sort < %{ins} > %{outs}"
}
}
}
)
sort {
name = 'sorted',
srcs = { './input.txt' }
}
You give `definerule()` the name of the rule you want to define, a description
of the properties the rule will take, and a callback that does the work.
You can do anything you like in the callback, including defining as many
targets as you like; but remember that all targets must have unique names, so
for any temporary files you probably want something like `name =
e.name.."/intermediate"` to ensure uniqueness.
The callback should end by returning an invocation of another rule, with `name
= e.name` as above.
Rules are defined whenever a build file containing them is seen. Letting this
happen automatically doesn't always work so you probably want to explicitly
include it:
include("foo/bar/baz/build.lua")
Rule properties are typed and can be specified to be required or optional (or
have a default value). If you try to invoke a rule with a property which isn't
declared, or missing a property which should be declared, you'll get an error.
definerule("sort",
{
srcs = { type="targets" },
numeric = { type="boolean", optional=true, default=false }
}
...omitted...
(The `optional=true` part can be omitted if you specify a default which isn't
`nil`.)
Types include:
* `targets`: the most common one. When the rule is invoked, ackbuilder will
resolve these for you so that when your callback fires, the property is a
flattened list of target objects.
* `strings`: a Lua table of strings. If the invoker supplies a single string
which isn't a table, it'll get wrapped in one.
* `string`: a string.
* `boolean`: a boolean (either `true` or `false`; nothing else is allowed).
* `table`: a Lua table.
* `object`: any Lua value.
## Target objects
When a rule callback is run, any targets it needs will be resolved into target
objects. These are Lua objects with assorted useful stuff in them.
* `object.is`: contains a set telling you which rules made the object. e.g.
`object.is.cprogram` is true if `object` was built with `cprogram`. Bear in
mind that `object.is.normalrule` is _also_ going to be true.
* `object.dir`: the object's build directory. Only exists if the object was
built with `normalrule`.
There are other properties (`fullname` and `outs`). Please don't use these; use
`targetnamesof()` and `filenamesof()` as described below.
## The standard library
Your build files are supplied a pile of useful functions.
### Manipulating target lists
A target list is a possibly nested set of tables containing either target
objects or strings. All of these functions will implicitly flatten the list and
resolve any strings into target objects before doing anything else to them.
Most of these functions can be supplied with varargs parameters.
e.g. `targetsof(a, b)` is equivalent to `targetsof({a, b})` is equivalent to
`targetsof({a, {b}})`.
* `targetsof(...)`: just flattens the list and resolves any string target
names.
* `filenamesof(...)`: returns a list of output files for all the supplied
targets.
* `targetnamesof(...)`: returns a list of fully qualified target names for
all the supplied stargets.
* `selectof(targets, pattern)`: returns only those targets whose outputs
contain at least one file matching the pattern.
### Manipulating filename lists
Like the target list functions, all of these implicitly flatten any nested
tables. They all return lists; however, as a special exception, if any of the
functions which take varargs parameters have a single parameter which is a
string, they return just a string.
e.g. `abspath({f})` returns a table; `abspath(f)` returns a string.
* `abspath(...)`: attempts to return the absolute path of its arguments. This
isn't always possible due to variable references.
* `basename(...)`: returns the basenames of its arguments (the file part of
the path).
* `dirname(...)`: returns the directory name of its arguments.
* `matching(files, pattern)`: returns only those files which match a Lua
pattern.
* `replace(files, pattern, repl)`: performs a Lua pattern replace on the list
of files.
* `uniquify(...)`: removes duplicates.
### Other things
* `include(file)`: loads another build file, if it hasn't been loaded before.
## Variables
There are two types of variable, mostly for hysterical reasons.
### Makefile variables
(Despite the name, these work on ninja too.)
Filenames can contain variable references of the form `$(FOO)`. These are
expanded at build time based on definitions supplied on the ackbuilder command
line.
ackbuilder assumes that these are absolute paths and won't attempt to
manipulate them much.
I want to get rid of these at some point.
### ackbuilder variables
These are expanded by ackbuilder itself.
Every rule invocation contains a magic property, `vars`. When a rule's commands
are executed, the variables provided in the template expansion are calculated
by combining all `vars` settings in the call stack (including the top level
build file).
Easiest to explain with an example:
cprogram {
name = 'another_test',
srcs = { './*.c' },
vars = {
cflags = { '-g', '-O3' }
}
}
When `cprogram` builds each C file, the command will refer to `%{cflags}`. The
value above will be flattened into a space-separated string and substituted in.
Setting a variable this way will _override_ any definition further up the call
stack. However, you can do this:
vars.cflags = { '-g' }
cprogram {
name = 'another_test',
srcs = { './*.c' },
vars = {
["+cflags"] = { '-O3' }
}
}
Now `cflags` will default to `-g` everywhere, because it's set at the top
level; but when `another_test` is built, it'll be `-g -O3`.
ackbuilder variables are only expanded in command templates, not in filenames.
<!-- # vim: set ts=2 sw=2 expandtab : -->

257
first/build.lua Normal file
View file

@ -0,0 +1,257 @@
local function objdir(e)
return concatpath("$(OBJDIR)", e.cwd, e.name)
end
definerule("normalrule",
{
ins = { type="targets" },
deps = { type="targets", default={} },
outleaves = { type="strings" },
label = { type="string", optional=true },
objdir = { type="string", optional=true },
commands = { type="strings" },
},
function (e)
local dir = e.objdir or objdir(e)
local realouts = {}
for _, v in pairs(e.outleaves) do
realouts[#realouts+1] = concatpath(dir, v)
end
local vars = inherit(e.vars, {
dir = dir
})
local result = simplerule {
name = e.name,
ins = e.ins,
deps = e.deps,
outs = realouts,
label = e.label,
commands = e.commands,
vars = vars,
}
result.dir = dir
return result
end
)
definerule("cfile",
{
srcs = { type="targets" },
deps = { type="targets", default={} },
commands = {
type="strings",
default={
"$(CC) -c -o %{outs[1]} %{ins[1]} %{hdrpaths} %{cflags}"
},
}
},
function (e)
local hdrpaths = {}
for _, t in pairs(e.deps) do
if t.dir then
hdrpaths[#hdrpaths+1] = "-I"..t.dir
end
end
hdrpaths = uniquify(hdrpaths)
local outleaf = basename(e.name)..".o"
return normalrule {
name = e.name,
cwd = e.cwd,
ins = e.srcs,
deps = e.deps,
outleaves = {outleaf},
label = e.label,
commands = e.commands,
vars = {
hdrpaths = hdrpaths,
}
}
end
)
definerule("cppfile",
{
srcs = { type="targets" },
deps = { type="targets", default={} },
outleaf = { type="string" },
commands = {
type="strings",
default={
"$(CC) -E -P -o %{outs[1]} %{hdrpaths} %{cflags} -x c %{ins}"
}
},
},
function (e)
if (#e.srcs ~= 1) then
error("you must have exactly one input file")
end
local hdrpaths = {}
for _, t in pairs(e.deps) do
hdrpaths[#hdrpaths+1] = "-I"..t.dir
end
hdrpaths = uniquify(hdrpaths)
return normalrule {
name = e.name,
cwd = e.cwd,
ins = e.srcs,
deps = e.deps,
outleaves = {e.outleaf},
label = e.label,
commands = e.commands,
vars = {
hdrpaths = hdrpaths,
}
}
end
)
definerule("bundle",
{
srcs = { type="targets" },
commands = {
type="strings",
default={
"tar cf - %{ins} | (cd %{dir} && tar xf -)"
}
}
},
function (e)
local outleaves = {}
local commands = {}
for _, f in fpairs(e.srcs) do
local localf = basename(f)
outleaves[#outleaves+1] = localf
commands[#commands+1] = "cp "..f.." %{dir}/"..localf
end
return normalrule {
name = e.name,
cwd = e.cwd,
ins = e.srcs,
outleaves = outleaves,
label = e.label,
commands = commands
}
end
)
definerule("clibrary",
{
srcs = { type="targets", default={} },
hdrs = { type="targets", default={} },
deps = { type="targets", default={} },
_cfile = { type="object", default=cfile },
commands = {
type="strings",
default={
"rm -f %{outs[1]}",
"$(AR) cqs %{outs[1]} %{ins}",
},
}
},
function (e)
local ins = {}
for _, src in fpairs(e.srcs) do
local n = basename(src):gsub("%.%w*$", "")
ins[#ins+1] = e._cfile {
name = e.name.."/"..n,
cwd = e.cwd,
srcs = {src},
deps = e.deps,
vars = {
["+cflags"] = { "-I"..e.cwd, },
},
}
end
local commands = {}
local outleaves = {}
if (#e.srcs > 0) then
for _, s in ipairs(e.commands) do
commands[#commands+1] = s
end
outleaves[#outleaves+1] = e.name..".a"
end
local hdrsin = {}
for dest, src in pairs(e.hdrs) do
if (type(dest) == "number") then
for _, f in ipairs(filenamesof(src)) do
hdrsin[#hdrsin+1] = f
outleaves[#outleaves+1] = basename(f)
commands[#commands+1] = "cp "..asstring(f).." %{dir}"
end
else
local fs = filenamesof(src)
if (#fs ~= 1) then
error(string.format("keyed header '%s' can only be a single file", dest))
end
local f = fs[1]
hdrsin[#hdrsin+1] = f
outleaves[#outleaves+1] = dest
commands[#commands+1] = "cp "..asstring(f).." %{dir}/"..dest
end
end
return normalrule {
name = e.name,
cwd = e.cwd,
ins = ins,
deps = {hdrsin, e.deps},
outleaves = outleaves,
label = e.label,
commands = commands,
}
end
)
definerule("cprogram",
{
srcs = { type="targets", default={} },
deps = { type="targets", default={} },
_clibrary = { type="object", default=clibrary },
commands = {
type="strings",
default={
"$(CC) -o %{outs[1]} -Wl,--start-group %{ins} -Wl,--end-group"
},
}
},
function (e)
local libs = matching(filenamesof(e.deps), "%.a$")
if (#e.srcs > 0) then
for _, f in pairs(
matching(
filenamesof(
e._clibrary {
name = e.name .. "/main",
cwd = e.cwd,
srcs = e.srcs,
deps = e.deps,
}
),
"%.a$"
)
) do
libs[#libs+1] = f
end
end
return normalrule {
name = e.name,
cwd = e.cwd,
deps = e.deps,
ins = libs,
outleaves = { e.name },
commands = e.commands,
}
end
)

View file

@ -1,238 +0,0 @@
-- $Id$
-- $HeadURL: https://primemover.svn.sf.net/svnroot/primemover/pm/lib/c.pm $
-- $LastChangedDate: 2007-02-24 01:37:06 +0000 (Sat, 24 Feb 2007) $
-- pm includefile to compile *host* C programs.
-- Standard Lua boilerplate.
local io_open = io.open
local string_gsub = string.gsub
local string_gfind = string.gfind
local string_find = string.find
local table_insert = table.insert
local table_getn = table.getn
local filetime = pm.filetime
-- Define some variables.
CCOMPILER = "gcc"
CXXCOMPILER = "g++"
CC = "%CCOMPILER% %CBUILDFLAGS% %CDYNINCLUDES:cincludes% %CINCLUDES:cincludes% %CDEFINES:cdefines% %CEXTRAFLAGS% -c -o %out% %in%"
CXX = "%CXXCOMPILER% %CBUILDFLAGS% %CDYNINCLUDES:cincludes% %CINCLUDES:cincludes% %CDEFINES:cdefines% %CEXTRAFLAGS% -c -o %out% %in%"
CPROGRAM = "%CCOMPILER% %CBUILDFLAGS% %CLINKFLAGS% %CEXTRAFLAGS% -o %out% %in% %CLIBRARIES:clibraries%"
CXXPROGRAM = "%CXXCOMPILER% %CBUILDFLAGS% %CLINKFLAGS% %CEXTRAFLAGS% -o %out% %in% %CLIBRARIES:clibraries%"
CLIBRARY = "rm -f %out% && ar cr %out% %in% && ranlib %out%"
CBUILDFLAGS = {"-g"}
CINCLUDES = EMPTY
CDEFINES = EMPTY
CEXTRAFLAGS = EMPTY
CLINKFLAGS = EMPTY
CDYNINCLUDES = EMPTY
CLIBRARIES = EMPTY
--- Custom string modifiers -------------------------------------------------
local function prepend(rule, arg, prefix)
if (arg == EMPTY) then
return EMPTY
end
local t = {}
for i, j in ipairs(arg) do
t[i] = prefix..j
end
return t
end
function pm.stringmodifier.cincludes(rule, arg)
return prepend(rule, arg, "-I")
end
function pm.stringmodifier.cdefines(rule, arg)
return prepend(rule, arg, "-D")
end
function pm.stringmodifier.clibraries(rule, arg)
if (arg == EMPTY) then
return EMPTY
end
local t = {}
for i, j in ipairs(arg) do
if string_find(j, "%.a$") then
t[i] = j
else
t[i] = "-l"..j
end
end
return t
end
--- Manage C file dependencies ----------------------------------------------
local dependency_cache = {}
local function calculate_dependencies(filename, includes)
-- Cache values, so we don't recalculate dependencies needlessly.
local o = dependency_cache[filename]
if o then
return o
end
local deps = {}
deps[filename] = true
local calcdeps = 0
calcdeps = function(filename, file)
file = file or io_open(filename)
if not file then
return
end
local localincludes = string_gsub(filename, "/[^/]*$", "")
if localincludes then
localincludes = {localincludes, unpack(includes)}
else
localincludes = includes
end
for line in file:lines() do
local _, _, f = string_find(line, '^[ \t]*#[ \t]*include[ \t]*["<]([^"]+)[">]')
if f then
for _, path in ipairs(localincludes) do
local subfilename = path.."/"..f
local subfile = io_open(subfilename)
if subfile then
if not deps[subfilename] then
deps[subfilename] = true
calcdeps(subfilename, subfile)
end
break
end
end
end
end
-- Explicit close to avoid having to wait for the garbage collector
-- to free up the underlying fd.
file:close()
end
calcdeps(filename)
o = {}
for i, _ in pairs(deps) do
table_insert(o, i)
end
dependency_cache[filename] = o
return o
end
-- This clause specialises 'simple' to add support for smart dependencies of C
-- files.
simple_with_clike_dependencies = simple {
class = "simple_with_clike_dependencies",
makedepends = {"%CDEPENDS%"},
__init = function(self, p)
simple.__init(self, p)
-- If we're a class, don't verify.
if ((type(p) == "table") and p.class) then
return
end
-- If dynamicheaders is an object, turn it into a singleton list.
if self.dynamicheaders then
if (type(self.dynamicheaders) ~= "table") then
self:__error("doesn't know what to do with dynamicheaders, which ",
"should be a list or an object but was a ", type(self.dynamicheaders))
end
if self.dynamicheaders.class then
self.dynamicheaders = {self.dynamicheaders}
end
end
end,
__dependencies = function(self, inputs, outputs)
local cincludes = self:__index("CINCLUDES")
if (type(cincludes) == "string") then
cincludes = {cincludes}
end
local includes = {}
for _, i in ipairs(cincludes) do
table_insert(includes, self:__expand(i))
end
local input = self:__expand(inputs[1])
local depends = calculate_dependencies(input, includes)
if not depends then
self:__error("could not determine the dependencies for ",
pm.rendertable({input}))
end
if pm.verbose then
pm.message('"', input, '" appears to depend on ',
pm.rendertable(depends))
end
return depends
end,
__buildadditionalchildren = function(self)
self.CDYNINCLUDES = {}
if self.dynamicheaders then
for _, i in ipairs(self.dynamicheaders) do
local o = i:__build()
if o[1] then
table_insert(self.CDYNINCLUDES, (string_gsub(o[1], "/[^/]*$", "")))
end
end
end
-- If no paths on the list, replace the list with EMPTY so it doesn't
-- expand to anything.
if (table_getn(self.CDYNINCLUDES) == 0) then
self.CDYNINCLUDES = EMPTY
end
end
}
-- These are the publically useful clauses.
cfile = simple_with_clike_dependencies {
class = "cfile",
command = {"%CC%"},
outputs = {"%U%-%I%.o"},
}
cxxfile = simple_with_clike_dependencies {
class = "cxxfile",
command = {"%CXX%"},
outputs = {"%U%-%I%.o"},
}
cprogram = simple {
class = "cprogram",
command = {"%CPROGRAM%"},
outputs = {"%U%-%I%"},
}
cxxprogram = simple {
class = "cxxprogram",
command = {"%CXXPROGRAM%"},
outputs = {"%U%-%I%"},
}
clibrary = simple {
class = "clibrary",
command = {
"%CLIBRARY%"
},
outputs = {"%U%-%I%.a"},
}

View file

@ -1,18 +0,0 @@
#!/bin/sh
set -e
trap "rm -f /tmp/xx$$" 0 1 2 3 15
case $2 in
/*) target_dir=$2
;;
*) target_dir=`pwd`/$2
;;
esac
cd $1
tar cf /tmp/xx$$ .
if [ -d $target_dir ]
then :
else mkdir $target_dir
fi
cd $target_dir
tar xf /tmp/xx$$

View file

@ -1,13 +0,0 @@
#!/bin/sh
if ( cd $1 ) 2>/dev/null
then
:
elif mkdir $1 2>/dev/null
then
:
else
echo $0: could not create directory $1 1>&2
exit 1
fi
exit 0

View file

@ -1,11 +0,0 @@
/* $Id$ */
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
/* Intended as a common directory for ALL temporary files */
#define TMP_DIR "/tmp"
/* Access to the ACK tree and parts thereof */
#define EM_DIR "/usr/em" /* The root directory for EM stuff */
#define ACK_PATH "lib/descr"

View file

@ -1,208 +0,0 @@
#! /bin/sh
case $0 in
*/first)
FDIR=`expr $0 : '\(.*\)/first'`
;;
first) FDIR=.
;;
esac
if echo 'a\c' | grep 'c' >/dev/null ; then
: We have BSD-like echo command.
E_FLAG='-n'
E_SFX=''
else
: We have SystemV-like echo command.
E_FLAG=''
E_SFX='\c'
fi
export E_FLAG E_SFX
echo check write-ability of /tmp ...
if ( >/tmp/aaax.$$ )
then
rm /tmp/aaax.$$
else
echo /tmp must exist and be writable.
exit 2
fi
echo "/tmp ok"
if [ -f macros ]
then
. macros
fi
: "Now get system name and directories"
. $FDIR/get_sys
: "Take action according to the system used"
BM=1
OLDACM=$ACM
OLDSYS=$SYS
case $SYSNAME in
vax_bsd4_1a) ACM=vax4 ; SYS=BSD4_1 ; BYTE_ORDER=0123 ; MACH=vax4 ;;
vax_bsd4_2) ACM=vax4 ; SYS=BSD4_2 ; BYTE_ORDER=0123 ; MACH=vax4 ;;
vax_sysV_2) ACM=vax4 ; SYS=SYS_5 ; BYTE_ORDER=0123 ; MACH=vax4 ;;
i386) ACM=i386 ; SYS=SYS_5 ; BYTE_ORDER=0123 ; MACH=i386 ;;
sun3) ACM=sun3 ; SYS=BSD4_2; BYTE_ORDER=3210 ; MACH=m68020 ;;
sun2) ACM=sun2 ; SYS=BSD4_2; BYTE_ORDER=3210 ; MACH=m68k4 ;;
m68_unisoft|m68k2) ACM=m68k2 ; SYS=V7; BYTE_ORDER=3210 ; MACH=m68k2 ;;
m68_sysV_0|mantra) ACM=mantra ; SYS=SYS_5; BYTE_ORDER=3210 ; MACH=m68k4 ;;
m68020) ACM=m68020 ; SYS=SYS_5; BYTE_ORDER=3210 ; MACH=m68020 ;;
sparc) ACM=sparc ; SYS=BSD4_2; BYTE_ORDER=3210 ; MACH=sparc ;;
sparc_solaris) ACM=sparc_solaris ; SYS=SYS_5; BYTE_ORDER=3210 ; MACH=sparc_solaris ;;
i86) ACM=i86 ; SYS=SYS_5; BYTE_ORDER=0123 ; MACH=i86 ;;
xenix3) ACM=xenix3 ; SYS=SYS_5; BYTE_ORDER=0123 ; MACH=i86 ;;
minix) ACM=minix ; SYS=V7; BYTE_ORDER=0123 ; MACH=i86 ;;
pmds) ACM=pmds ; SYS=V7; BYTE_ORDER=3210 ; MACH=m68k2 ;;
pmds4) ACM=pmds4 ; SYS=V7; BYTE_ORDER=3210 ; MACH=m68k4 ;;
minixST) ACM=minixST ; SYS=V7; BYTE_ORDER=3210 ; MACH=m68k2 ;;
m68k4) ACM=m68k4 ; SYS=V7; BYTE_ORDER=3210 ; MACH=m68k4 ;;
*) ACM=XXX ; SYS=XXX ; BYTE_ORDER=XXX ; MACH=XXX ;;
esac
: do not change the order in MACH_LIST. check limit_enquire first.
MACH_LIST="i86 xenix3 minix i386 6500 6800 6805 6809 i80 em22 em24 em44 m68k2 pmds minixST m68k4 pmds4 sun2 mantra m68020 sun3 sparc sparc_solaris ns pdp s2650 vax4 z80 z8000 arm"
while :
do
for i in $MACH_LIST
do
if [ $i = "$ACM" ]
then break
fi
done
if [ $i = "$ACM" ]
then break
fi
echo "This installation script has no knowledge about $SYSNAME.
You will have to specify the default machine that you want ACK to
compile for. Choices:"
l=
x=
for i in $MACH_LIST
do
l="$l $i"
x=x$x
case $x in
xxxxxxxxxx) echo $l
x=
l=
;;
esac
done
ACM=$OLDACM
echo $l
echo $E_FLAG "Your choice: [$OLDACM] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$ACM";;
esac
ACM="$ANS"
done
while :
do
case $SYS in
V7|BSD4_1|BSD4_2|SYS_5)
break
;;
*)
SYS=$OLDSYS
echo 'What kind of Unix is the target system running?
Choices:
V7 for Unix V7, BSD 2.*
BSD4_1 for Berkeley 4.1
BSD4_2 for Berkeley 4.2, 4.3, SunOs 3, SunOs 4
SYS_5 for Xenix, System III, System V, SunOs 5'
echo $E_FLAG "Your choice (V7|BSD4_1|BSD4_2|SYS_5): [$OLDSYS] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$SYS";;
esac
SYS="$ANS"
;;
esac
done
rm -f local.h
sed -e /ACKM/s/'".*"'/'"'$ACM'"'/ -e /BIGMACH/s/'[01]'/$BM/ -e /SYSTEM/s/'^#[ ]*define[ ]*[a-zA-Z_][a-zA-Z0-9_]*'/"# define $SYS"/ < $FDIR/local.h.src >local.h
case $BYTE_ORDER in
XXX) ;;
*) echo '/* Optional definition of BYTE_ORDER: */' >> local.h
echo "#define BYTE_ORDER 0x$BYTE_ORDER" >> local.h
;;
esac
echo "Your default machine to compile for is $ACM"
echo "Installation of the complete ACK takes a long time. Limiting the
number of languages, runtime libraries, back-ends, and assemblers to be
installed may save a lot of time. If you want to install everything,
answer no to the next question. Otherwise, answer yes, and you will be
prompted for details"
while :
do
echo $E_FLAG "Do you want to limit the installation in any way? (y/n) [$LIMIT] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$LIMIT";;
esac
case X$ANS in
Xj*|Xy|X)
LIMIT=y
. $FDIR/limit_enquire
break
;;
Xn*) . $FDIR/get_sysvax
LIMIT=n
DO_MACHINE_INDEP=y
DO_FAST=n
DISABLE_LANG=
DISABLE_SUP=
if [ $TARGET_HOME = $UTIL_HOME ]
then
case $ACM in
sun3|m68020|i386|vax*)
DO_FAST=y
;;
esac
fi
break
;;
*) echo "I do not understand your answer ($ANS). Try again."
;;
esac
done
. $FDIR/get_makepars
echo "TARGET_HOME=\"$TARGET_HOME\"; export TARGET_HOME" > macros
echo "UTIL_HOME=\"$UTIL_HOME\"; export UTIL_HOME" >> macros
echo "SRC_HOME=\"$SRC_HOME\"; export SRC_HOME" >> macros
echo "SYSNAME=\"$SYSNAME\"; export SYSNAME" >> macros
echo "ACM=\"$ACM\"; export ACM" >> macros
echo "CURRENT=\"$CURRENT\"; export CURRENT" >> macros
echo "SYS=\"$SYS\"; export SYS" >> macros
echo "LIMIT=\"$LIMIT\"; export LIMIT" >> macros
echo "CONFIG=\"$CONFIG\"; export CONFIG" >> macros
echo "DISABLE_LANG=\"$DISABLE_LANG\"; export DISABLE_LANG" >> macros
echo "DISABLE_SUP=\"$DISABLE_SUP\"; export DISABLE_SUP" >> macros
echo "DO_MACHINE_INDEP=\"$DO_MACHINE_INDEP\"; export DO_MACHINE_INDEP" >> macros
echo "MACH_LIST=\"$MACH_LIST\"; export MACH_LIST" >> macros
echo "SYSVAX=\"$SYSVAX\"; export SYSVAX" >> macros
echo "MACH=\"$MACH\"; export MACH" >> macros
echo "WS=\"$WS\"; export WS" >> macros
echo "PS=\"$PS\"; export PS" >> macros
echo "DO_FAST=\"$DO_FAST\"; export DO_FAST" >> macros
cat macros $FDIR/install_tail > INSTALL
chmod +x INSTALL
echo "
A shell-script called 'INSTALL' has been created. Running it
installs ACK. Note that this may take a (very) long time, so run it
in the background, with its output redirected, f.i.:
sh INSTALL > INSTALL.out 2>&1 &
"
exit 0

View file

@ -1,7 +0,0 @@
#!/bin/sh
if read ANS
then echo
else echo "Sorry, got EOF when reading your answer"
exit 1
fi

View file

@ -1,106 +0,0 @@
#!/bin/sh
know_target=0
case $SYSNAME in
vax*|i386|sun*|sparc*|m68_sysV_0|m68020|mantra|pmds4|m68k4)
WS=4 ; PS=4
know_target=1
;;
m68_unisoft|m68k2|minixST|pmds)
WS=2 ; PS=4
know_target=1
;;
i86|minix|xenix3)
WS=2 ; PS=2
know_target=1
;;
*) trap "rm -f ws.c ws.o a.out t$$" 0 1 2 3 15
cat > ws.c <<'EOF'
#include <stdio.h>
main()
{
printf("WS=%d ; PS=%d\n", sizeof(int), sizeof(char *));
exit(0);
}
EOF
if [ $TARGET_HOME = $UTIL_HOME ] && cc ws.c 2>/dev/null
then
: We can find out ourselves what the word-size and
: the pointer-size of the target machine is.
cc ws.c 2>/dev/null
./a.out > t$$
. t$$
rm -f t$$ a.out ws.[co]
else
: we will have to ask installer.
echo $E_FLAG "Please give the word-size of the target-machine (sizeof(int)) in bytes: [$WS] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$WS";;
esac
WS="$ANS"
echo $E_FLAG "Please give the pointer-size of the target-machine (sizeof(char *)) in bytes: [$PS] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$PS";;
esac
PS="$ANS"
fi
;;
esac
echo "# Paths:
SRC_HOME = $SRC_HOME
TARGET_HOME = $TARGET_HOME
UTIL_HOME = $UTIL_HOME
# Machine independent part created?
DO_MACHINE_INDEP = $DO_MACHINE_INDEP
# Target machine, only needed for fast compilers
MACH = $MACH
" > make_macros
if [ $TARGET_HOME = $UTIL_HOME ]
then
if [ -f /bin/ranlib -o -f /usr/bin/ranlib -o -f /usr/ucb/ranlib ]
then
sed "s/^COPTIONS.*\$/COPTIONS=-O -D_EM_WSIZE=$WS -D_EM_PSIZE=$PS -D__${MACH}__/" < $FDIR/target_comp >> make_macros
else
sed -e "s/^COPTIONS.*\$/COPTIONS=-O -D_EM_WSIZE=$WS -D_EM_PSIZE=$PS -D__${MACH}__/" -e "s/^# RANLIB=:/RANLIB=:/" < $FDIR/target_comp >> make_macros
fi
case $ACM in
sun3|sparc)
ed -s make_macros <<'EOF'
/cc-and-mkdep.sun/s/^..//
w
q
EOF
;;
esac
cat $FDIR/util_comp >> make_macros
else
case $know_target in
1) sed -e "s/^COPTIONS.*\$/COPTIONS=-O -D_EM_WSIZE=$WS -D_EM_PSIZE=$PS -D__${MACH}__/" -e "/cc-and-mkdep.ack/s/^..//" -e "s/^CC=cc/CC=acc -m$ACM/" -e "s/^# AR=aal/AR=aal/" -e "s/^# RANLIB=:/RANLIB=:/" < $FDIR/target_comp >> make_macros
;;
*) if [ -f /bin/ranlib -o -f /usr/bin/ranlib -o -f /usr/ucb/ranlib ]
then
sed "s/^COPTIONS.*\$/COPTIONS=-O -D_EM_WSIZE=$WS -D_EM_PSIZE=$PS -D__${MACH}__/" < $FDIR/target_comp >> make_macros
else
sed -e "s/^COPTIONS.*\$/COPTIONS=-O -D_EM_WSIZE=$WS -D_EM_PSIZE=$PS -D__${MACH}__/" -e "s/^# RANLIB=:/RANLIB=:/" < $FDIR/target_comp >> make_macros
fi
;;
esac
sed "s/^#U/U/" < $FDIR/util_comp >> make_macros
fi
cat $FDIR/lint_params >> make_macros
echo "A file called 'make_macros' has been created. This file defines some
'make' variables that parameterize all Makefiles in ACK. You may want
to check it before attempting to actually install ACK."
case $know_target in
0) echo "In fact, this installation script does not know much about
your target machine, so expect some things to be wrong"
;;
esac

View file

@ -1,157 +0,0 @@
#!/bin/sh
rm -f em_path.h
echo "You will now be asked for the root directory of the ACK sources.
This directory will not be changed by the installation process.
"
while :
do
echo $E_FLAG "Please give the root of the ACK source tree,
an absolute path: [$SRC_HOME] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$SRC_HOME" ;;
esac
SRC_HOME="$ANS"
case $SRC_HOME in
/*) break;
;;
*) echo "$SRC_HOME is not an absolute path; try again"
;;
esac
done
echo "You will now be asked for a configuration directory. This is
the directory in which the compilations will take place. The tree that
resides in it will have the same structure as the ACK source tree, but
the directories will usually only contain Makefiles and .o files.
"
while :
do
echo $E_FLAG "Please give the root of the configuration tree,
an absolute path: [$CONFIG] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$CONFIG";;
esac
CONFIG="$ANS"
case $CONFIG in
/*) break;
;;
*) echo "$CONFIG is not an absolute path; try again"
;;
esac
done
echo "You will now be asked for the root directory of the ACK binaries. After
installation, this directory will have subdirectories bin, lib, lib.bin,
man, h, config, include, modules, doc.
Four of these directories will contain stuff that depends on the machine
for which the ACK binaries are made: bin, modules, config, and lib.bin. The
other sub-directories (lib, man, h, include and doc) will contain
machine-independent stuff.
This information may be useful if you want to use ACK on different platforms
and you have a shared file system. See the installation manual.
"
while :
do
echo $E_FLAG "Please give the root of the ACK binaries,
an absolute path: [$TARGET_HOME] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$TARGET_HOME";;
esac
TARGET_HOME="$ANS"
case $TARGET_HOME in
/*) break;
;;
*) echo "$TARGET_HOME is not an absolute path; try again"
;;
esac
done
sed -e "/^#define[ ]*EM_DIR/s@\".*\"@\"$TARGET_HOME\"@" <$FDIR/em_path.h.src >em_path.h
echo "You will now be asked for the type of the system that you want
ACK binaries produced for. This is not neccessarily the system you
run this program on. In this case, if you have not done so already,
you will have to install ACK on the current machine first.
"
echo "Give me the type of the system, the current choice is:
vax_bsd4_1a VAX11 with BSD4.1a
vax_bsd4_2 VAX11 with BSD4.2
vax_sysV_2 VAX11 with System V.2
i386 Intel 80386 system running Xenix System V
sun3 Sun 3 M68020 workstation
sun2 Sun 2 M68000 workstation
m68_sysV_0 Motorola 68000 with Uniplus System V.0 Unix
m68020 Motorola M68020 VME131 running Unix System V/68 R2V2.1
sparc SUN SPARC workstation running SunOs 4
sparc_solaris SUN SPARC workstation running solaris 2
ANY Neither of the above
"
echo $E_FLAG "system type: [$SYSNAME] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$SYSNAME";;
esac
SYSNAME="$ANS"
while :
do
echo $E_FLAG "Is this the system you are running on? (y/n) [$CURRENT] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$CURRENT";;
esac
case X$ANS in
Xj*|Xy*|X) UTIL_HOME=$TARGET_HOME
CURRENT=y
break
;;
Xn*) CURRENT=n
echo "You will now be asked for the root directory of ACK on the current machine.
This tree will not be changed by the installation process.
"
while :
do
echo $E_FLAG "Please give the root of a runnable ACK tree,
an absolute path: [$UTIL_HOME] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$UTIL_HOME" ;;
esac
UTIL_HOME="$ANS"
case $UTIL_HOME in
/*) break;
;;
*) echo "$UTIL_HOME is not an absolute path; try again"
;;
esac
done
break
;;
*) echo "I do not understand your answer ($ANS). Try again."
;;
esac
done
while :
do
echo "The system to install ACK for is $SYSNAME,
the root of the ACK source tree is $SRC_HOME,
the root of the configuration tree is $CONFIG,
the root of the ACK binary tree to be created is $TARGET_HOME,
and the root of a runnable ACK binary tree is $UTIL_HOME.
If the machine to compile ACK for is the current machine, the last two names
may be identical."
echo $E_FLAG "Are you satisfied with all this? (y/n) $E_SFX"
. $FDIR/get_answer
case X$ANS in
Xj*|Xy*|X) break
;;
Xn*) echo Ok, I will give you another chance....
. $0
break
;;
*) echo "I do not understand your answer ($ANS). Try again."
;;
esac
done

View file

@ -1,23 +0,0 @@
#!/bin/sh
while :
do
echo $E_FLAG "Which system-call library do you want to install for the VAX?
You can choose between
libbsd4_1a for Berkeley Unix 4.1
libbsd4_2 for Berkeley Unix 4.2 or newer, or Ultrix
libsysV_2 for Unix System V
Your choice: [$SYSVAX] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$SYSVAX";;
esac
SYSVAX="$ANS"
case $SYSVAX in
libbsd4_1a|libbsd4_2|libsysV_2)
break
;;
*) echo "I do not understand your answer ($SYSVAX). Try again"
;;
esac
done

View file

@ -1,93 +0,0 @@
#!/bin/sh
set -e
PATH=::$CONFIG/bin:$UTIL_HOME/bin:/usr/ccs/bin:/usr/ucb:$PATH
export PATH
$SRC_HOME/first/create_dir $CONFIG
$SRC_HOME/first/create_dir $CONFIG/bin
(
# Slight complication here to ensure that the #! magic at the
# beginning of TakeAction is preserved correctly.
head -1 $SRC_HOME/TakeAction
echo "PATH=:$CONFIG/bin:$UTIL_HOME/bin:$PATH; export PATH"
tail +2 $SRC_HOME/TakeAction
) > $CONFIG/bin/TakeAction
sed '/^#PARAMS/r make_macros' < $SRC_HOME/first/mk_makefile > $CONFIG/bin/mk_makefile
cp $SRC_HOME/first/create_dir $CONFIG/bin/create_dir
cp $SRC_HOME/first/cp_dir $CONFIG/bin/cp_dir
chmod +x $CONFIG/bin/*
$SRC_HOME/first/mk_config
$SRC_HOME/first/mk_target
$SRC_HOME/first/limit_impl
case $SYSNAME in
i386)
ed -s $TARGET_HOME/lib/descr/fe << 'ABC'
1,$s/-D{NAME}/-D{NAME} -DNO_PROTOTYPE/
w
q
ABC
;;
esac
: find varargs include file
: if not present use our own
if test -f /usr/include/varargs.h
then
:
else
cp $SRC_HOME/include/_tail_cc/varargs.h $TARGET_HOME/modules/h
fi
case X$SYSVAX in
Xvax_sysV_2)
ed -s $TARGET_HOME/lib/vax4/descr << 'ABC'
/CPP_F/s/$/ -D__USG/
w
q
ABC
ed -s $CONFIG/mach/vax4/Action << 'ABC'
/libbsd4_2/s/libbsd4_2/libsysV_2/
w
q
ABC
( cd $CONFIG/mach/vax4
for i in libcc libcc.ansi
do
ed -s $i/Makefile << 'ABC'
/BFS/s/BFS/UFS/
w
q
ABC
done
)
;;
Xvax_bsd4_2)
ed -s $TARGET_HOME/lib/vax4/descr << 'ABC'
/CPP_F/s/$/ -D__BSD4_2/
w
q
ABC
;;
Xvax_bsd4_1a)
ed -s $CONFIG/mach/vax4/Action << 'ABC'
/libbsd4_2/s/libbsd4_2/libbsd4_1a/
w
q
ABC
;;
esac
: and finally installing ...
cd $CONFIG
set +e
exec TakeAction

View file

@ -1,209 +0,0 @@
#!/bin/sh
while :
do
echo "The libraries will end up in the machine-independent part of the
ACK binary tree. You may already have them from a previous ACK installation
on a different machine, in particular if you have an NFS file system.
Therefore, it may not be neccessary to install them again. As this part
of the ACK installation takes the most time, you are given the opportunity
to disable installation of the machine-independent part"
echo $E_FLAG \
"Do you want to install the machine-independent part? (y/n) [$DO_MACHINE_INDEP] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$DO_MACHINE_INDEP" ;;
esac
case X$ANS in
Xj*|Xy*|X) DO_MACHINE_INDEP=y
echo "machine-independent part will be installed"
echo
break
;;
Xn*) DO_MACHINE_INDEP=n
echo "machine-independent part will not be installed"
echo
break
;;
*) echo "I do not understand your answer ($ANS). Try again."
;;
esac
done
OLD_DIS_LANG="$DISABLE_LANG"
DISABLE_LANG=
case X$OLD_DIS_LANG in
X) ;;
*) set $OLD_DIS_LANG
;;
esac
for i in Modula-2 Pascal Occam Basic ANSI-C C Fortran
do
DEF=y
if [ $# != 0 -a X$i = X$1 ]
then
DEF=n
shift
fi
while :
do
echo $E_FLAG "Do you want to install $i? (y/n) [$DEF] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$DEF";;
esac
case X$ANS in
Xj*|Xy*)
echo "$i will be installed"
echo
break
;;
Xn*) DISABLE_LANG=$DISABLE_LANG" $i"
echo "$i will not be installed"
echo
break
;;
*) echo "I do not understand your answer ($ANS). Try again."
;;
esac
done
done
OLD_DIS_SUP="$DISABLE_SUP"
DISABLE_SUP=
set $MACH_LIST
while test $# != 0
do
DEF=y
for i in $OLD_DIS_SUP
do
if [ X$i = X$1 ]
then
DEF=n
break
fi
done
while :
do
case $1 in
i86) echo "not installing i86 will disable installation of xenix3 and minix."
;;
m68k2) echo "not installing m68k2 will disable installation of pmds, minixST,
m68k4, pmds4, sun2, and mantra."
;;
m68k4) echo "not installing m68k4 will disable installation of pmds4, sun2, and mantra."
;;
m68020) echo "not installing m68020 will disable installation of sun3."
;;
esac
echo $E_FLAG "Do you want to install the $1 support? (y/n) [$DEF] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$DEF";;
esac
case X$ANS in
Xj*|Xy*)
echo "The $1 support will be installed"
echo
case $1 in
vax4) case $SYSNAME in
vax_bsd4_1a) SYSVAX=libbsd4_1a
;;
vax_bsd4_2) SYSVAX=libbsd4_2
;;
vax_sysV_2) SYSVAX=libsysV_2
;;
*) if [ $DO_MACHINE_INDEP = y ]
then
. $FDIR/get_sysvax
fi
;;
esac
;;
sparc) shift
;;
esac
break
;;
Xn*) DISABLE_SUP=$DISABLE_SUP" $1"
echo "The $1 support will not be installed"
echo
case $1 in
i86)
shift
DISABLE_SUP=$DISABLE_SUP" $1"
shift
DISABLE_SUP=$DISABLE_SUP" $1"
;;
m68k2)
shift
DISABLE_SUP=$DISABLE_SUP" $1"
shift
DISABLE_SUP=$DISABLE_SUP" $1"
shift
DISABLE_SUP=$DISABLE_SUP" $1"
shift
DISABLE_SUP=$DISABLE_SUP" $1"
shift
DISABLE_SUP=$DISABLE_SUP" $1"
shift
DISABLE_SUP=$DISABLE_SUP" $1"
;;
m68k4)
shift
DISABLE_SUP=$DISABLE_SUP" $1"
shift
DISABLE_SUP=$DISABLE_SUP" $1"
shift
DISABLE_SUP=$DISABLE_SUP" $1"
;;
sparc)
shift
DISABLE_SUP=$DISABLE_SUP" $1"
;;
m68020)
shift
DISABLE_SUP=$DISABLE_SUP" $1"
;;
esac
break
;;
*) echo "I do not understand your answer ($ANS). Try again."
;;
esac
done
shift
done
if [ $TARGET_HOME = $UTIL_HOME ]
then
case $ACM in
sun3|m68020|i386|vax*)
while :
do
echo $E_FLAG "Do you want to install the fast compilers? (y/n) [$DO_FAST] $E_SFX"
. $FDIR/get_answer
case $ANS in
'') ANS="$DO_FAST" ;;
esac
case X$ANS in
Xj*|Xy*)
DO_FAST=y
echo "The fast compilers will be installed"
break
;;
Xn*)
DO_FAST=n
echo "The fast compilers will not be installed"
break
;;
*) echo "I do not understand your answer ($ANS). Try again."
;;
esac
done
;;
*)
DO_FAST=n
;;
esac
else
DO_FAST=n
fi

View file

@ -1,208 +0,0 @@
#!/bin/sh
for i in $DISABLE_LANG
do
ed -s $CONFIG/Action <<EOF
/^name "$i/;/^end/s/^/!/
w
q
EOF
case $i in
Modula-2)
ed -s $CONFIG/Action <<EOF
/^name "$i definition/;/^end/s/^/!/
/^name "$i makefile/;/^end/s/^/!/
w
q
EOF
;;
ANSI-C) : install compiler anyway
ed -s $CONFIG/Action <<EOF
/^!name "$i frontend/;/^!end/s/^!//
w
q
EOF
;;
C) : install compiler anyway
ed -s $CONFIG/Action <<EOF
/^!name "$i frontend/;/^!end/s/^!//
w
q
EOF
;;
esac
done
for i in Modula-2 Pascal Basic Occam ANSI-C C Fortran
do
if [ $DO_MACHINE_INDEP = n ]
then
continue
fi
for j in $DISABLE_LANG
do
case $i in
$j) i=X
break
;;
esac
done
case $i in
X) continue
;;
Modula-2)
lib=libm2
;;
Pascal)
lib=libpc
;;
Basic)
lib=libbc
;;
Occam)
lib=liboc
;;
ANSI-C)
lib=libcc.ansi
;;
C)
lib=libcc
;;
Fortran)
lib=libf77
;;
esac
( cd $CONFIG/mach
for j in $MACH_LIST
do
case $j in
6800|6805|6809|s2650) continue
;;
esac
: do not install fortran for 2-byte integer machines
case $i in
Fortran) case $j in
em2*|i8*|m68k2|minix*|pdp|pmds|xenix3|z80*)
continue
;;
esac
;;
esac
case $j in
sparc*)
( cd $j
cat >> Action <<EOF
name "$j $i libraries"
system "$j"
dir $lib
end
EOF
)
;;
*)
( cd $j
cat >> Action <<EOF
name "$j $i libraries"
dir $lib
end
EOF
)
;;
esac
done
)
done
DISABLE_INT=0
for i in $DISABLE_SUP
do
ed -s $CONFIG/Action <<EOF
/^dir .*$i\$/;?^name?;/^end/s/^/!/
w
q
EOF
case $i in
m68k2)
DISABLE_INT=1
;;
m68k4)
case $SYSNAME in
m68_sysV_0|sun2)
DISABLE_INT=1
;;
esac
;;
mantra)
if test $SYSNAME = m68_sysV_0
then
DISABLE_INT=1
fi
;;
sun2)
if test $SYSNAME = sun2
then
DISABLE_INT=1
fi
;;
sun3)
if test $SYSNAME = sun3
then
DISABLE_INT=1
fi
;;
pmds4)
case $SYSNAME in
pmds*)
DISABLE_INT=1
;;
esac
;;
m68020)
case $SYSNAME in
m68020|sun3)
DISABLE_INT=1
;;
esac
;;
esac
done
case $SYSNAME in
m68*|sun2|sun3|pmds*)
;;
*) DISABLE_INT=1
;;
esac
if test $DISABLE_INT = 1
then
ed -s $CONFIG/Action <<EOF
/68000 interpreters/;/^end/s/^/!/
w
q
EOF
fi
if [ $DO_MACHINE_INDEP = n ]
then
for i in $CONFIG/mach/*/Action
do
for j in libem libend libfp libdb libsys libmon libbsd4_2 libbsd4_1a libsysV_2 libce
do
if fgrep -s $j $i
then
ed -s $i <<EOF
/$j/;?^name?,/^end/s/^/!/
w
q
EOF
fi
done
done
fi
if [ $DO_FAST = n ]
then
ed -s $CONFIG/Action <<'EOF'
/^name "Peephole optimizer lib/;/^end/s/^/!/
/^name "Fast/;$s/^/!/
w
q
EOF
fi

View file

@ -1,19 +0,0 @@
#!/usr/bin/make
# There are two choices for lint here: ACK lint and Unix lint.
# The current setup is for ACK lint. If you want to use the Unix lint,
# put '#' signs on the next 4 lines that have ACK in them.
LINT=/usr/bin/lint# # Unix lint
LINT=$(UTIL_HOME)/bin/lint# # ACK lint
LINTOPTIONS=# # options always passed to lint
LINTPREF=llib-l# # prefix of unix lint libraries
LINTPREF=# # ACK lint libraries do not have a prefix
LINTSUF=ln# # suffix of Unix lint libraries
LINTSUF=llb# # suffix of ACK lint libraries
MK_LINT_LIB=lint-lib.unix# # for Unix lint
MK_LINT_LIB=lint-lib.ack# # for ACK lint

View file

@ -1,37 +0,0 @@
-- $Source$
-- $State$
-- This is unpleasant. LLgen can generate an arbitrary number of output files,
-- which means we need our own output filename generator.
LLgen = simple {
class = "LLgen",
command = {
"rm -f %out%",
"cd %out[1]:dirname% && %TOOLDIR%LLgen %in%"
},
outputs = {"%U%/" },
__outputs = function(self, inputs)
local o = simple.__outputs(self, inputs)[1]
local outputs = {o.."Lpars.h", o.."Lpars.c"}
for _, i in ipairs(inputs) do
i = string.gsub(i, "^.*/", "")
i = string.gsub(i, "%.g$", ".c")
table.insert(outputs, o..i)
end
return outputs
end
}
-- Revision history
-- $Log$
-- Revision 1.2 2006-11-11 22:59:01 dtrg
-- Now uses the version of LLgen included with the ACK instead of the standalone version.
--
-- Revision 1.1 2006/07/20 23:18:18 dtrg
-- First version in CVS.
--

View file

@ -1,19 +0,0 @@
/* $Id$ */
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
/* collection of options, selected by including or excluding 'defines' */
/* Version number of the EM object code */
# define VERSION 3 /* 16 bits number */
/* The default machine used by ack, acc, apc */
# define ACKM "sun3"
/* size of local machine, either 0 (for 16 bit address space), or 1 */
# define BIGMACHINE 1
/* operating system, SYS_5, V7, BSD4_1 or BSD4_2; Do NOT delete the comment
in the next line! */
# define BSD4_2 1 /* SYSTEM */

View file

@ -1,133 +0,0 @@
#!/bin/sh
set -e
create_dir $CONFIG
create_dir $CONFIG/bin
echo "#!/bin/sh" > $CONFIG/bin/ack_sys
echo "echo $SYSNAME" >> $CONFIG/bin/ack_sys
chmod +x $CONFIG/bin/ack_sys
cd $SRC_HOME
find . -type d -perm -555 -print > $CONFIG/dir_list
cd $CONFIG
for i in mach/*/libsys
do
rm -rf $i
done
for i in `cat dir_list`
do
create_dir $i
rm -f $i/No*
if [ -f $i/Makefile ]
then
( cd $i ; if make clean ; then exit 0 ; else exit 0 ; fi ) > /dev/null 2>&1
fi
if [ -f $SRC_HOME/$i/proto.make ]
then mk_makefile $SRC_HOME/$i/proto.make > $i/Makefile
fi
if [ -f $SRC_HOME/$i/Action ]
then
cd $SRC_HOME/$i
cp Action* $CONFIG/$i
chmod +w $CONFIG/$i/Action*
cd $CONFIG
fi
done
cd $CONFIG
for i in lang/cem/cemcom.ansi lang/cem/cemcom lang/m2/comp
do
cp $SRC_HOME/$i/BigPars $CONFIG/$i/Parameters
chmod +w $CONFIG/$i/Parameters
done
for i in lang/pc/comp lang/cem/cpp.ansi
do
cp $SRC_HOME/$i/Parameters $CONFIG/$i/Parameters
chmod +w $CONFIG/$i/Parameters
done
cd $CONFIG/mach
for i in *
do
if [ -d $i ]
then
if [ -d $i/as ]
then
cd $i/as
mk_makefile $SRC_HOME/mach/proto/as/proto.make | sed -e "/#MACH_DEFINE/,/^MACH/s/=.*/= $i/" > Makefile
cd ../..
fi
if [ -d $i/top ]
then
cd $i/top
mk_makefile $SRC_HOME/mach/proto/top/proto.make | sed -e "/#MACH_DEFINE/,/^MACH/s/=.*/= $i/" > Makefile
cd ../..
fi
if [ -d $i/cg ]
then
cd $i/cg
mk_makefile $SRC_HOME/mach/proto/cg/proto.make | sed -e "/#MACH_DEFINE/,/^MACH/s/=.*/= $i/" > Makefile
cd ../..
fi
if [ -d $i/ncg ]
then
cd $i/ncg
mk_makefile $SRC_HOME/mach/proto/ncg/proto.make | sed -e "/#MACH_DEFINE/,/^MACH/s/=.*/= $i/" > Makefile
if [ -f $SRC_HOME/mach/$i/ncg/table_dir ]
then
ed -s Makefile <<EOF
/^#TABLE_DEFINE/+1r $SRC_HOME/mach/$i/ncg/table_dir
w
q
EOF
fi
cd ../..
fi
if [ -f $SRC_HOME/mach/$i/mach_params ]
then :
else continue
fi
for j in libem libend libmon libfp libsys libdb
do
if [ -d $i/$j ]
then
cd $i/$j
mk_makefile $SRC_HOME/mach/proto/libg/proto.$j | sed -e "/#MACH_PARAMS/r $SRC_HOME/mach/$i/mach_params" > Makefile
cd ../..
fi
done
for j in libbsd4_1a libbsd4_2 libsysV_2
do
if [ -d $i/$j ]
then
cd $i/$j
mk_makefile $SRC_HOME/mach/proto/libg/proto.libsys | sed -e "/#MACH_PARAMS/r $SRC_HOME/mach/$i/mach_params" -e "s/libsys/$j/g" > Makefile
cd ../..
fi
done
for j in libcc libcc.ansi libm2 libpc libbc liboc libf77
do
create_dir $i/$j
rm -f $i/$j/No*
cd $i/$j
mk_makefile $SRC_HOME/mach/proto/libg/proto.$j | sed -e "/#MACH_PARAMS/r $SRC_HOME/mach/$i/mach_params" > Makefile
cd ../..
done
if [ $i = vax4 ]
then :
elif [ -d $i/libsys ]
then :
else
create_dir $i/libsys
rm -f $i/libsys/No*
cd $i/libsys
mk_makefile $SRC_HOME/mach/proto/libg/proto.sysmon | sed -e "/#MACH_PARAMS/r $SRC_HOME/mach/$i/mach_params" > Makefile
cd ../..
fi
fi
done

View file

@ -1,35 +0,0 @@
#!/bin/sh
: '$Id$'
: This shell script inserts make macros after a line
: starting with #PARAMS in "make_proto", and produces the result on
: standard output.
trap "rm -f /tmp/mk_mak$$" 0 1 2 3 15
case $# in
1) ;;
*) echo "Usage: $0 <make_proto>" 1>&2
exit 1
;;
esac
cp $1 /tmp/mk_mak$$
ed -s /tmp/mk_mak$$ << 'EOF'
/^#PARAMS/c
#PARAMS do not remove this line!
.
w
q
EOF
case `ack_sys` in
sparc_solaris)
ed -s /tmp/mk_mak$$ << 'EOF'
g/^EXTRALIB/s/=/= -lelf/
w
q
EOF
;;
esac
cat /tmp/mk_mak$$
exit 0

View file

@ -1,41 +0,0 @@
#!/bin/sh
set -e
: machine-dependant stuff
create_dir $TARGET_HOME
create_dir $TARGET_HOME/config
create_dir $TARGET_HOME/lib.bin
create_dir $TARGET_HOME/modules
create_dir $TARGET_HOME/modules/h
create_dir $TARGET_HOME/bin
cp local.h em_path.h $TARGET_HOME/config
cp_dir $SRC_HOME/bin $TARGET_HOME/bin
cp $CONFIG/bin/cp_dir $TARGET_HOME/bin/cp_dir
echo "echo $SYSNAME" > $TARGET_HOME/bin/ack_sys
chmod +x $TARGET_HOME/bin/ack_sys
: machine-independant stuff
if [ $DO_MACHINE_INDEP = n ]
then
exit 0
fi
create_dir $TARGET_HOME/lib
create_dir $TARGET_HOME/etc
create_dir $TARGET_HOME/h
create_dir $TARGET_HOME/include
create_dir $TARGET_HOME/doc
cp $SRC_HOME/etc/ip_spec.t $TARGET_HOME/etc/ip_spec.t
cp_dir $SRC_HOME/lib $TARGET_HOME/lib
cp_dir $SRC_HOME/h $TARGET_HOME/h
cp_dir $SRC_HOME/include $TARGET_HOME/include
cd $TARGET_HOME
find . -type f -exec chmod +w {} \;
exit 0

View file

@ -1,28 +0,0 @@
#!/bin/sh
# compiler set for target machine
CC=cc# # compiler to be used for compiling ACK
# always passed to $(CC) -c.
COPTIONS=-O -D_EM_WSIZE=4 -D_EM_PSIZE=4
# passed to $(CC) -c when compiling modules.
LIBOPTIONS=#
# LIBOPTIONS=-LIB -L # when $(CC) is ACK
CC_AND_MKDEP=cc-and-mkdep.all# # when $(CC) is neither ACK or SUN,
# CC_AND_MKDEP=cc-and-mkdep.ack## when $(CC) is an ACK-derived C compiler,
# CC_AND_MKDEP=cc-and-mkdep.sun## when $(CC) is a SUN C compiler
LDOPTIONS=# # always passed to $(CC) when linking
SUF=o# # suffix of files produced with $(CC) -c
AR=ar# # archiver for Unix format objects
# AR=aal# # archiver for ACK .o format objects
# AR=arch# # archiver for ACK .s format objects
RANLIB=ranlib# # when ranlib required
# RANLIB=:# # when ranlib not required
LIBSUF=a# # suffix of object libraries

View file

@ -1,23 +0,0 @@
#!/bin/sh
# compiler set for producing runnable binaries (possibly using $(UTIL_HOME)).
# This must describe the compiler with which $(UTIL_HOME) has been compiled.
# If $(TARGET_HOME) is identical to $(UTIL_HOME), which usually will be
# the case, this part does not have to be changed. Otherwise (when you are
# cross-compiling ACK), you will have to change this part. Probable
# replacements are given in comments. Maybe the installation script
# has already changed them, but they should be checked to be sure.
UCC=$(CC)
#UCC=cc# # compiler to be used
UCOPTIONS=$(COPTIONS)
#UCOPTIONS=-O# # always passed to $(UCC) -c.
ULDOPTIONS=$(LDOPTIONS)
#ULDOPTIONS=# # always passed to $(UCC) when linking
USUF=$(SUF)
#USUF=o# # suffix of files produced with $(UCC) -c
ULIBSUF=$(LIBSUF)
#ULIBSUF=a# # suffix of object libraries for $(UCC)

44
first/yacc.lua Normal file
View file

@ -0,0 +1,44 @@
definerule("yacc",
{
srcs = { type="targets" },
commands = {
type="strings",
default={
"yacc -t -b %{dir}/y -d %{ins}"
}
},
},
function (e)
return normalrule {
name = e.name,
cwd = e.cwd,
ins = e.srcs,
outleaves = { "y.tab.c", "y.tab.h" },
label = e.label,
commands = e.commands,
}
end
)
definerule("flex",
{
srcs = { type="targets" },
commands = {
type="strings",
default={
"flex -s -t %{ins} > %{outs[1]}"
}
}
},
function (e)
return normalrule {
name = e.name,
cwd = e.cwd,
ins = e.srcs,
outleaves = { "lex.yy.c" },
label = e.label,
commands = e.commands
}
end
)

View file

@ -1,18 +0,0 @@
yacc = simple {
class = "yacc",
outputs = {"%U%/%I%.c"},
command = {
"yacc -t -b %out[1]:dirname%/y -d %in%",
"mv %out[1]:dirname%/y.tab.c %out[1]%"
}
}
flex = simple {
class = "flex",
outputs = {"%U%/%I%.c"},
command = {
"flex -s -t %in% > %out%"
}
}

View file

@ -1,29 +0,0 @@
#Makefile
arch.h
bc_io.h
bc_string.h
#as_spec.h
cg_pattern.h
cgg_cg.h
em_abs.h
em_ego.h
em_flag.h
em_mes.h
#em_mnem.h
#em_pseu.h
em_ptyp.h
em_reg.h
#em_spec.h
out.h
stb.h
pc_err.h
pc_file.h
pc_math.h
ranlib.h
ocm_chan.h
ocm_parco.h
ocm_proc.h
m2_traps.h
#ip_spec.h
em_table
con_float

33
h/build.lua Normal file
View file

@ -0,0 +1,33 @@
normalrule {
name = "em_path",
ins = {},
outleaves = { "em_path.h" },
commands = {
"echo '#define TMP_DIR \"/tmp\"' > %{outs}",
"echo '#define EM_DIR \"$(PREFIX)\"' >> %{outs}",
"echo '#define ACK_PATH \"share/ack/descr\"' >> %{outs}",
}
}
normalrule {
name = "local",
ins = {},
outleaves = { "local.h" },
commands = {
"echo '#define VERSION 3' > %{outs}",
"echo '#define ACKM \"$(DEFAULT_PLATFORM)\"' >> %{outs}",
"echo '#define BIGMACHINE 1' >> %{outs}",
"echo '#define SYS_5' >> %{outs}",
}
}
clibrary {
name = "emheaders",
hdrs = {
"./*.h",
"./con_float",
"+em_path",
"+local",
}
}

68
h/out.h
View file

@ -6,22 +6,25 @@
#ifndef __OUT_H_INCLUDED #ifndef __OUT_H_INCLUDED
#define __OUT_H_INCLUDED #define __OUT_H_INCLUDED
#include <stdint.h>
/* /*
* output format for ACK assemblers * output format for ACK assemblers
*/ */
struct outhead { struct outhead {
unsigned short oh_magic; /* magic number */ uint16_t oh_magic; /* magic number */
unsigned short oh_stamp; /* version stamp */ uint16_t oh_stamp; /* version stamp */
unsigned short oh_flags; /* several format flags */ uint16_t oh_flags; /* several format flags */
unsigned short oh_nsect; /* number of outsect structures */ uint16_t oh_nsect; /* number of outsect structures */
unsigned short oh_nrelo; /* number of outrelo structures */ uint16_t oh_nrelo; /* number of outrelo structures */
unsigned short oh_nname; /* number of outname structures */ uint16_t oh_nname; /* number of outname structures */
long oh_nemit; /* sum of all os_flen */ uint32_t oh_nemit; /* sum of all os_flen */
long oh_nchar; /* size of string area */ uint32_t oh_nchar; /* size of string area */
}; };
#define O_MAGIC 0x0201 /* magic number of output file */ #define O_MAGIC 0x0202 /* magic number of output file */
#define O_STAMP 0 /* version stamp */ #define O_STAMP 0 /* version stamp */
#define MAXSECT 64 /* Maximum number of sections */ #define MAXSECT 64 /* Maximum number of sections */
@ -29,18 +32,18 @@ struct outhead {
#define HF_8086 0x0008 /* os_base specially encoded */ #define HF_8086 0x0008 /* os_base specially encoded */
struct outsect { struct outsect {
long os_base; /* startaddress in machine */ uint32_t os_base; /* startaddress in machine */
long os_size; /* section size in machine */ uint32_t os_size; /* section size in machine */
long os_foff; /* startaddress in file */ uint32_t os_foff; /* startaddress in file */
long os_flen; /* section size in file */ uint32_t os_flen; /* section size in file */
long os_lign; /* section alignment */ uint32_t os_lign; /* section alignment */
}; };
struct outrelo { struct outrelo {
char or_type; /* type of reference */ uint16_t or_type; /* type of reference */
char or_sect; /* referencing section */ uint16_t or_sect; /* referencing section */
unsigned short or_nami; /* referenced symbol index */ uint16_t or_nami; /* referenced symbol index */
long or_addr; /* referencing address */ uint32_t or_addr; /* referencing address */
}; };
struct outname { struct outname {
@ -50,24 +53,25 @@ struct outname {
} on_u; } on_u;
#define on_mptr on_u.on_ptr #define on_mptr on_u.on_ptr
#define on_foff on_u.on_off #define on_foff on_u.on_off
unsigned short on_type; /* symbol type */ uint16_t on_type; /* symbol type */
unsigned short on_desc; /* debug info */ uint16_t on_desc; /* debug info */
long on_valu; /* symbol value */ uint32_t on_valu; /* symbol value */
}; };
/* /*
* relocation type bits * relocation type bits
*/ */
#define RELSZ 0x07 /* relocation length */ #define RELSZ 0x0fff /* relocation length */
#define RELO1 1 /* 1 byte */ #define RELO1 1 /* 1 byte */
#define RELO2 2 /* 2 bytes */ #define RELO2 2 /* 2 bytes */
#define RELO4 3 /* 4 bytes */ #define RELO4 3 /* 4 bytes */
#define RELOPPC 4 /* PowerPC 26-bit address */ #define RELOPPC 4 /* PowerPC 26-bit address */
#define RELOH2 5 /* write top 2 bytes of 4 byte word */ #define RELOH2 5 /* write top 2 bytes of 4 byte word */
#define RELOVC4 6 /* VideoCore IV address in 32-bit instruction */
#define RELPC 0x08 /* pc relative */ #define RELPC 0x2000 /* pc relative */
#define RELBR 0x10 /* High order byte lowest address. */ #define RELBR 0x4000 /* High order byte lowest address. */
#define RELWR 0x20 /* High order word lowest address. */ #define RELWR 0x8000 /* High order word lowest address. */
/* /*
* section type bits and fields * section type bits and fields
@ -98,19 +102,13 @@ struct outname {
*/ */
/* /*
* structure format strings * structure sizes on disk (bytes in file; add digits in SF_*)
*/ * Note! These are NOT the sizes in memory (64-bit architectures will have
#define SF_HEAD "22222244" * a different layout).
#define SF_SECT "44444"
#define SF_RELO "1124"
#define SF_NAME "4224"
/*
* structure sizes (bytes in file; add digits in SF_*)
*/ */
#define SZ_HEAD 20 #define SZ_HEAD 20
#define SZ_SECT 20 #define SZ_SECT 20
#define SZ_RELO 8 #define SZ_RELO 10
#define SZ_NAME 12 #define SZ_NAME 12
/* /*

View file

@ -1,3 +0,0 @@
_tail_mon
_tail_cc
occam

View file

@ -1,4 +0,0 @@
errno.h
signal.h
sgtty.h
sys

View file

@ -1,2 +0,0 @@
types.h
timeb.h

View file

@ -1,6 +0,0 @@
basic
cem
occam
pc
m2
fortran

View file

@ -1,8 +0,0 @@
COPYRIGHT
README
a68s.1
aem
cpem
liba68s
test
util

Some files were not shown because too many files have changed in this diff Show more