Merge from default.
--HG-- branch : dtrg-experimental-powerpc-branch
This commit is contained in:
commit
4703db0fff
11
.clang-format
Normal file
11
.clang-format
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
BasedOnStyle: WebKit
|
||||
AllowShortLoopsOnASingleLine: 'false'
|
||||
AlwaysBreakAfterDefinitionReturnType: false
|
||||
BreakBeforeBraces: Allman
|
||||
IndentCaseLabels: 'true'
|
||||
PointerAlignment: Left
|
||||
TabWidth: '4'
|
||||
UseTab: ForIndentation
|
||||
|
||||
...
|
17
.distr
17
.distr
|
@ -1,9 +1,7 @@
|
|||
README
|
||||
CHANGES
|
||||
Copyright
|
||||
pm
|
||||
pmfile
|
||||
config.pm
|
||||
Makefile
|
||||
|
||||
h
|
||||
modules/h
|
||||
|
@ -13,7 +11,7 @@ util/data
|
|||
util/LLgen
|
||||
|
||||
modules/src/alloc
|
||||
modules/src/assert
|
||||
#modules/src/assert
|
||||
modules/src/system
|
||||
modules/src/string
|
||||
modules/src/read_em
|
||||
|
@ -31,7 +29,7 @@ util/ack
|
|||
lib/descr/fe
|
||||
util/arch
|
||||
#util/cpp
|
||||
util/cgg
|
||||
#util/cgg
|
||||
util/ncgg
|
||||
util/misc
|
||||
util/opt
|
||||
|
@ -43,15 +41,22 @@ lang/cem
|
|||
lang/pc
|
||||
lang/m2
|
||||
#lang/occam
|
||||
#lang/basic
|
||||
lang/basic
|
||||
|
||||
mach/proto
|
||||
mach/i80
|
||||
mach/i86
|
||||
mach/i386
|
||||
mach/m68020
|
||||
mach/vc4
|
||||
|
||||
plat
|
||||
plat/cpm
|
||||
plat/pc86
|
||||
plat/linux
|
||||
plat/linux386
|
||||
plat/linux68k
|
||||
plat/rpi
|
||||
|
||||
examples
|
||||
man
|
||||
|
|
9
.hgtags
9
.hgtags
|
@ -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
6
.travis.yml
Normal 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
|
||||
|
7
CHANGES
7
CHANGES
|
@ -2,6 +2,11 @@
|
|||
# $State$
|
||||
# $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
|
||||
|
||||
Fixed some minor bit-rotting issues that were preventing compilation on
|
||||
|
@ -32,4 +37,4 @@
|
|||
compilers, Pascal, Modula-2, Basic and Occam. Working backends: i86. Working
|
||||
platforms: pc86, the very noddy testbed setup that produces floppy disk
|
||||
images.
|
||||
|
||||
|
||||
|
|
104
Makefile
Normal file
104
Makefile
Normal 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)
|
||||
|
92
README
92
README
|
@ -1,8 +1,8 @@
|
|||
THE AMSTERDAM COMPILER KIT V6.0pre4
|
||||
THE AMSTERDAM COMPILER KIT V6.1pre1
|
||||
===================================
|
||||
|
||||
© 1987-2005 Vrije Universiteit, Amsterdam
|
||||
2010-08-08
|
||||
2016-08-02
|
||||
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
|
@ -24,59 +24,68 @@ SUPPORT
|
|||
|
||||
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:
|
||||
|
||||
pc86 produces bootable floppy disk images for 8086 PCs
|
||||
linux386 produces ELF executables for PC Linux systems
|
||||
linux68k produces ELF executables for m68020 Linux systems
|
||||
cpm produces i80 CP/M .COM files
|
||||
rpi produces Raspberry Pi GPU binaries
|
||||
|
||||
|
||||
INSTALLATION
|
||||
============
|
||||
|
||||
The version 6.0 build mechanism has been completely rewritten and is based
|
||||
around the Prime Mover build tool (see http://primemover.sf.net for more
|
||||
information). Installation ought to be fairly straightforward.
|
||||
The version 5.0 build mechanism has been completely rewritten. Installation
|
||||
ought to be fairly straightforward.
|
||||
|
||||
Requirements:
|
||||
|
||||
- an ANSI C compiler. Currently, I'm afraid, it's hard-coded to use gcc.
|
||||
To change, try changing the variable definitions in first/c.pm. This also
|
||||
needs to be available as 'cc' from the shell.
|
||||
|
||||
- about 20MB free in /tmp (or some other temporary directory).
|
||||
- an ANSI C compiler. This defaults to gcc. You can change this by setting
|
||||
the CC make variable.
|
||||
|
||||
- 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.
|
||||
|
||||
Instructions:
|
||||
|
||||
- edit config.pm. There's a small section at the top containing some editable
|
||||
variables. Probably the only one you may want to edit is PREFIX, which
|
||||
changes where the ACK installs to.
|
||||
|
||||
- edit the Makefile. There's a small section at the top where you can change
|
||||
the configuration. Probably the only one you may want to edit is PREFIX,
|
||||
which changes where the ACK installs to.
|
||||
|
||||
- Run:
|
||||
|
||||
./pm configure
|
||||
|
||||
...from the command line. This will write out a configuration file.
|
||||
|
||||
make
|
||||
|
||||
...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:
|
||||
|
||||
./pm
|
||||
|
||||
...from the command line. This will actually do the build. This takes
|
||||
about two minutes on my 1.6GHz Athlon Linux machine and about 30 on my
|
||||
166MHz Pentium OpenBSD machine.
|
||||
|
||||
- Run:
|
||||
sudo make install
|
||||
|
||||
...from the command line. This will install the ACK in your PREFIX
|
||||
directory (by default, /usr/local).
|
||||
|
||||
./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.
|
||||
|
||||
|
||||
|
@ -94,8 +103,9 @@ Some useful options include:
|
|||
-o <file> specifies the output file
|
||||
-c produce a .o 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)
|
||||
-v be more verbose (repeatable)
|
||||
<file> build file
|
||||
|
||||
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
|
||||
.o object files
|
||||
.s assembly files
|
||||
.e ACK intermediate code assembly files
|
||||
|
||||
For further information, see the man page (which actually does get
|
||||
installed, but is rather out of date).
|
||||
|
@ -117,12 +128,13 @@ A sample command line is:
|
|||
ack -mlinux386 -O examples/paranoia.c
|
||||
|
||||
|
||||
|
||||
GOTCHAS
|
||||
=======
|
||||
|
||||
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.
|
||||
|
||||
- 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
|
||||
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
|
||||
==========
|
||||
|
@ -163,8 +179,4 @@ Please enjoy.
|
|||
|
||||
David Given (dtrg on Sourceforge)
|
||||
dg@cowlark.com
|
||||
2010-08-08
|
||||
|
||||
# $Source$
|
||||
# $State$
|
||||
# $Revision$
|
||||
2016-08-02
|
||||
|
|
|
@ -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
38
build.lua
Normal 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
|
||||
}
|
||||
}
|
||||
|
|
@ -13,7 +13,7 @@ ACK_TEMP_DIR = "/tmp"
|
|||
|
||||
-- Where is the ACK going to be installed, eventually?
|
||||
|
||||
PREFIX = "/usr/local"
|
||||
PREFIX = "/tmp/ack-temp/staging"
|
||||
|
||||
-- ======================================================================= --
|
||||
-- BROKEN ACK CONFIGURATION --
|
||||
|
|
|
@ -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
|
90
distr/How_To
90
distr/How_To
|
@ -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!
|
26
distr/dwalk
26
distr/dwalk
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
echo $1
|
|
@ -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
|
|
@ -1,2 +0,0 @@
|
|||
echo "<$1>"
|
||||
ls -bCdx `cat .distr`
|
|
@ -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
|
|
@ -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
|
11
distr/mka
11
distr/mka
|
@ -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
|
177
distr/mkdist
177
distr/mkdist
|
@ -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.
|
19
distr/mkf
19
distr/mkf
|
@ -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
|
42
distr/mktree
42
distr/mktree
|
@ -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" .
|
|
@ -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
|
32
doc/.distr
32
doc/.distr
|
@ -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
|
|
@ -1,4 +0,0 @@
|
|||
LLgen.n
|
||||
LLgen_NCER.n
|
||||
LLgen.refs
|
||||
proto.make
|
|
@ -1,3 +0,0 @@
|
|||
proto.make
|
||||
ceg.ref
|
||||
ceg.tr
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
bo1
|
|
@ -1 +0,0 @@
|
|||
ca1
|
|
@ -1,6 +0,0 @@
|
|||
cf1
|
||||
cf2
|
||||
cf3
|
||||
cf4
|
||||
cf5
|
||||
cf6
|
|
@ -1 +0,0 @@
|
|||
cj1
|
|
@ -1,5 +0,0 @@
|
|||
cs1
|
||||
cs2
|
||||
cs3
|
||||
cs4
|
||||
cs5
|
|
@ -1,5 +0,0 @@
|
|||
ic1
|
||||
ic2
|
||||
ic3
|
||||
ic4
|
||||
ic5
|
|
@ -1,6 +0,0 @@
|
|||
il1
|
||||
il2
|
||||
il3
|
||||
il4
|
||||
il5
|
||||
il6
|
|
@ -1,3 +0,0 @@
|
|||
head
|
||||
intro1
|
||||
tail
|
|
@ -1 +0,0 @@
|
|||
lv1
|
|
@ -1 +0,0 @@
|
|||
ov1
|
|
@ -1,4 +0,0 @@
|
|||
ra1
|
||||
ra2
|
||||
ra3
|
||||
ra4
|
|
@ -1 +0,0 @@
|
|||
sp1
|
|
@ -1,4 +0,0 @@
|
|||
sr1
|
||||
sr2
|
||||
sr3
|
||||
sr4
|
|
@ -1,5 +0,0 @@
|
|||
ud1
|
||||
ud2
|
||||
ud3
|
||||
ud4
|
||||
ud5
|
|
@ -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
|
|
@ -1,5 +0,0 @@
|
|||
proto.make
|
||||
READ_ME
|
||||
em.p
|
||||
emdmp.c
|
||||
mktables.c
|
|
@ -1,15 +0,0 @@
|
|||
proto.make
|
||||
abstract
|
||||
appendix_A
|
||||
appendix_B
|
||||
chap1
|
||||
chap2
|
||||
chap3
|
||||
chap4
|
||||
chap5
|
||||
chap6
|
||||
chap7
|
||||
chap8
|
||||
chap9
|
||||
contents
|
||||
frontpage
|
|
@ -1,12 +0,0 @@
|
|||
proto.make
|
||||
ctot
|
||||
p0
|
||||
p1
|
||||
p2
|
||||
p3
|
||||
p4
|
||||
p5
|
||||
p6
|
||||
p7
|
||||
p8
|
||||
p9
|
|
@ -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
|
|
@ -1,15 +0,0 @@
|
|||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
A
|
||||
B
|
||||
init
|
||||
intro
|
||||
note_on_reg_wins
|
||||
refs
|
||||
timing
|
||||
title
|
||||
proto.make
|
||||
pics
|
|
@ -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
|
|
@ -1,3 +0,0 @@
|
|||
proto.make
|
||||
refs.top
|
||||
top.n
|
|
@ -1,6 +0,0 @@
|
|||
Makefile
|
||||
READ_ME
|
||||
ok
|
||||
select.c
|
||||
test.h
|
||||
tests
|
|
@ -1,7 +0,0 @@
|
|||
proto.make
|
||||
em_table
|
||||
new_table
|
||||
new_table_done
|
||||
pop_push
|
||||
traps
|
||||
ip_spec.t
|
|
@ -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
44
examples/build.lua
Normal 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
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
Action
|
||||
driver
|
||||
f_c.ansi
|
||||
f_c
|
||||
f_m2
|
||||
f_pc
|
|
@ -1,5 +0,0 @@
|
|||
afcc.1
|
||||
afm2.1
|
||||
afpc.1
|
||||
driver.c
|
||||
proto.make
|
|
@ -1,3 +0,0 @@
|
|||
Parameters
|
||||
proto.main
|
||||
proto.make
|
|
@ -1,3 +0,0 @@
|
|||
Parameters
|
||||
proto.main
|
||||
proto.make
|
|
@ -1,3 +0,0 @@
|
|||
Parameters
|
||||
proto.main
|
||||
proto.make
|
|
@ -1,3 +0,0 @@
|
|||
Parameters
|
||||
proto.main
|
||||
proto.make
|
|
@ -1,3 +0,0 @@
|
|||
Action
|
||||
cemcom
|
||||
driver
|
|
@ -1,4 +0,0 @@
|
|||
Parameters.sun3
|
||||
Parameters.vax4
|
||||
proto.main
|
||||
proto.make
|
|
@ -1,3 +0,0 @@
|
|||
fcc.1
|
||||
fcc.c
|
||||
proto.make
|
24
first/.distr
24
first/.distr
|
@ -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
|
|
@ -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.
|
||||
--
|
33
first/ack.pm
33
first/ack.pm
|
@ -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
916
first/ackbuilder.lua
Normal 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
351
first/ackbuilder.md
Normal 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
257
first/build.lua
Normal 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
|
||||
)
|
||||
|
238
first/c.pm
238
first/c.pm
|
@ -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"},
|
||||
}
|
18
first/cp_dir
18
first/cp_dir
|
@ -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$$
|
|
@ -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
|
|
@ -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"
|
208
first/first
208
first/first
|
@ -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
|
|
@ -1,7 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
if read ANS
|
||||
then echo
|
||||
else echo "Sorry, got EOF when reading your answer"
|
||||
exit 1
|
||||
fi
|
|
@ -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
|
157
first/get_sys
157
first/get_sys
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
208
first/limit_impl
208
first/limit_impl
|
@ -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
|
|
@ -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
|
|
@ -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.
|
||||
--
|
|
@ -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 */
|
133
first/mk_config
133
first/mk_config
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
44
first/yacc.lua
Normal 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
|
||||
)
|
||||
|
|
@ -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%"
|
||||
}
|
||||
}
|
29
h/.distr
29
h/.distr
|
@ -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
33
h/build.lua
Normal 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
68
h/out.h
|
@ -6,22 +6,25 @@
|
|||
|
||||
#ifndef __OUT_H_INCLUDED
|
||||
#define __OUT_H_INCLUDED
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
* output format for ACK assemblers
|
||||
*/
|
||||
|
||||
struct outhead {
|
||||
unsigned short oh_magic; /* magic number */
|
||||
unsigned short oh_stamp; /* version stamp */
|
||||
unsigned short oh_flags; /* several format flags */
|
||||
unsigned short oh_nsect; /* number of outsect structures */
|
||||
unsigned short oh_nrelo; /* number of outrelo structures */
|
||||
unsigned short oh_nname; /* number of outname structures */
|
||||
long oh_nemit; /* sum of all os_flen */
|
||||
long oh_nchar; /* size of string area */
|
||||
uint16_t oh_magic; /* magic number */
|
||||
uint16_t oh_stamp; /* version stamp */
|
||||
uint16_t oh_flags; /* several format flags */
|
||||
uint16_t oh_nsect; /* number of outsect structures */
|
||||
uint16_t oh_nrelo; /* number of outrelo structures */
|
||||
uint16_t oh_nname; /* number of outname structures */
|
||||
uint32_t oh_nemit; /* sum of all os_flen */
|
||||
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 MAXSECT 64 /* Maximum number of sections */
|
||||
|
||||
|
@ -29,18 +32,18 @@ struct outhead {
|
|||
#define HF_8086 0x0008 /* os_base specially encoded */
|
||||
|
||||
struct outsect {
|
||||
long os_base; /* startaddress in machine */
|
||||
long os_size; /* section size in machine */
|
||||
long os_foff; /* startaddress in file */
|
||||
long os_flen; /* section size in file */
|
||||
long os_lign; /* section alignment */
|
||||
uint32_t os_base; /* startaddress in machine */
|
||||
uint32_t os_size; /* section size in machine */
|
||||
uint32_t os_foff; /* startaddress in file */
|
||||
uint32_t os_flen; /* section size in file */
|
||||
uint32_t os_lign; /* section alignment */
|
||||
};
|
||||
|
||||
struct outrelo {
|
||||
char or_type; /* type of reference */
|
||||
char or_sect; /* referencing section */
|
||||
unsigned short or_nami; /* referenced symbol index */
|
||||
long or_addr; /* referencing address */
|
||||
uint16_t or_type; /* type of reference */
|
||||
uint16_t or_sect; /* referencing section */
|
||||
uint16_t or_nami; /* referenced symbol index */
|
||||
uint32_t or_addr; /* referencing address */
|
||||
};
|
||||
|
||||
struct outname {
|
||||
|
@ -50,24 +53,25 @@ struct outname {
|
|||
} on_u;
|
||||
#define on_mptr on_u.on_ptr
|
||||
#define on_foff on_u.on_off
|
||||
unsigned short on_type; /* symbol type */
|
||||
unsigned short on_desc; /* debug info */
|
||||
long on_valu; /* symbol value */
|
||||
uint16_t on_type; /* symbol type */
|
||||
uint16_t on_desc; /* debug info */
|
||||
uint32_t on_valu; /* symbol value */
|
||||
};
|
||||
|
||||
/*
|
||||
* relocation type bits
|
||||
*/
|
||||
#define RELSZ 0x07 /* relocation length */
|
||||
#define RELSZ 0x0fff /* relocation length */
|
||||
#define RELO1 1 /* 1 byte */
|
||||
#define RELO2 2 /* 2 bytes */
|
||||
#define RELO4 3 /* 4 bytes */
|
||||
#define RELOPPC 4 /* PowerPC 26-bit address */
|
||||
#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 RELBR 0x10 /* High order byte lowest address. */
|
||||
#define RELWR 0x20 /* High order word lowest address. */
|
||||
#define RELPC 0x2000 /* pc relative */
|
||||
#define RELBR 0x4000 /* High order byte lowest address. */
|
||||
#define RELWR 0x8000 /* High order word lowest address. */
|
||||
|
||||
/*
|
||||
* section type bits and fields
|
||||
|
@ -98,19 +102,13 @@ struct outname {
|
|||
*/
|
||||
|
||||
/*
|
||||
* structure format strings
|
||||
*/
|
||||
#define SF_HEAD "22222244"
|
||||
#define SF_SECT "44444"
|
||||
#define SF_RELO "1124"
|
||||
#define SF_NAME "4224"
|
||||
|
||||
/*
|
||||
* structure sizes (bytes in file; add digits in SF_*)
|
||||
* structure sizes on disk (bytes in file; add digits in SF_*)
|
||||
* Note! These are NOT the sizes in memory (64-bit architectures will have
|
||||
* a different layout).
|
||||
*/
|
||||
#define SZ_HEAD 20
|
||||
#define SZ_SECT 20
|
||||
#define SZ_RELO 8
|
||||
#define SZ_RELO 10
|
||||
#define SZ_NAME 12
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
_tail_mon
|
||||
_tail_cc
|
||||
occam
|
|
@ -1,4 +0,0 @@
|
|||
errno.h
|
||||
signal.h
|
||||
sgtty.h
|
||||
sys
|
|
@ -1,2 +0,0 @@
|
|||
types.h
|
||||
timeb.h
|
|
@ -1,6 +0,0 @@
|
|||
basic
|
||||
cem
|
||||
occam
|
||||
pc
|
||||
m2
|
||||
fortran
|
|
@ -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
Loading…
Reference in a new issue