Update tools to v2.

This commit is contained in:
David Brown 2016-06-16 16:31:59 +01:00
parent ce855c93c8
commit 8b0bd9c675
8 changed files with 1742 additions and 86 deletions

447
src/tools/make/configure.c Normal file
View file

@ -0,0 +1,447 @@
// Test platform supportability and establish build configuration:
//
// Writes the configuration parameters to these two files:
//
// Configuration.Mod - settings to compile into the compiler binary
// Configuration.make - makefile variable settings for this configuration
//
// Derived from vocparam.c originally by J. Templ 23.6.95
#define O_VER 1.2 // Version number to be reported by compiler.
#define O_NAME voc // Compiler name used for binary, install dir and references in text.
// #define LARGE // Define this to get 32 bit INTEGER and 64 bit longints even on 32 bit platforms.
#include "SYSTEM.h"
#ifdef _WIN32
#define strncasecmp _strnicmp
#else
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/utsname.h>
#include <unistd.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
void fail(char *msg) {fprintf(stderr, "Error: %s\n", msg); exit(1);}
void assert(int truth, char *complaint) {if (!truth) fail(complaint);}
char builddate[256];
char installdir[256];
char versionstring[256];
char osrelease[1024];
char cwd[1024];
char ldconfig[1024]; // Command(s) to update OS shared library config
char libspec[1024];
#define macrotostringhelper(s) #s
#define macrotostring(s) macrotostringhelper(s)
char *version = macrotostring(O_VER);
char *objext = ".o";
char *objflag = " -o ";
char *linkflags = " -L\"";
char *oname = NULL; // From O_NAME env var if present, or O_NAME macro otherwise.
char *dataModel = NULL;
char *compiler = NULL;
char *cc = NULL;
char *os = NULL;
char *platform = NULL;
char *binext = NULL;
char *staticlink = NULL; // Static compilation option - none on darwin / windows.
int alignment = 0;
int addressSize = 0;
int intsize = 0;
int bsd = 0;
int termux = 0;
void ParseOsRelease(FILE *fd) {
while (fgets(osrelease, sizeof(osrelease), fd) != NULL) {
if (strncasecmp(osrelease, "id=", 3) == 0) {
int i=3;
while (osrelease[i] == '"') {i++;}
int j=i;
while (osrelease[j] > '"') {j++;}
if (j>i) {
osrelease[j] = 0;
os = osrelease + i;
}
break;
}
}
fclose(fd);
}
void determineLinuxVariant() {
FILE *fd = NULL;
os = "linux";
if ((fd = fopen("/etc/os-release", "r"))) {ParseOsRelease(fd); return;}
// Hack for centos without /etc/os-release
if ((fd = fopen("/etc/centos-release", "r"))) {os = "centos"; fclose(fd); return;}
// Hack to detect running in termux in android
if ((fd = fopen("/data/data/com.termux/files/usr/bin/bash", "r"))) {os = "termux"; staticlink = ""; termux = 1; fclose(fd); return;}
}
void determineOS() {
#ifdef _WIN32
os = "windows"; platform = "windows"; binext = ".exe"; staticlink = "";
#else
os = "unknown"; platform = "unix"; binext = ""; staticlink = "-static";
struct utsname sys;
if (uname(&sys)<0) fail("Couldn't get sys name - uname() failed.");
if (strncasecmp(sys.sysname, "cygwin", 6) == 0) {os = "cygwin"; binext = ".exe";}
else if (strncasecmp(sys.sysname, "linux", 5) == 0) {determineLinuxVariant();}
else if (strncasecmp(sys.sysname, "freebsd", 5) == 0) {os = "freebsd"; bsd = 1;}
else if (strncasecmp(sys.sysname, "openbsd", 5) == 0) {os = "openbsd"; bsd = 1;}
else if (strncasecmp(sys.sysname, "darwin", 5) == 0) {os = "darwin"; staticlink = "";}
else {
fprintf(stderr, "\n\n** Unrecognised utsname.sysname '%s' returned by uname().\n", sys.sysname);
fprintf(stderr, "** Please add a test for this OS in src/buildtools/configure.c\n");
fprintf(stderr, "** in function determineOS() near line %d.\n\n", __LINE__-3);
fail("Unrecognised OS architecture name (sysname) returned by uname.");
}
#endif
}
void determineCCompiler() {
snprintf(libspec, sizeof(libspec), " -l %s", oname);
#if defined(__MINGW32__)
compiler = "mingw";
if (sizeof (void*) == 4) {
cc = "i686-w64-mingw32-gcc -g";
} else {
cc = "x86_64-w64-mingw32-gcc -g";
}
#elif defined(__clang__)
compiler = "clang";
cc = "clang -fPIC -g";
#elif defined(__GNUC__)
compiler = "gcc";
if (strncasecmp(os, "cygwin", 6) == 0) {
// Avoid cygwin specific warning that -fPIC is ignored.
cc = "gcc -g";
} else {
cc = "gcc -fPIC -g";
}
#elif defined(_MSC_VER)
compiler = "MSC";
cc = "cl /nologo";
objext = ".obj";
objflag = " -Fe";
linkflags = " -link -libpath:\"";
snprintf(libspec, sizeof(libspec), " lib%s.lib", oname);
#else
fail("Unrecognised C compiler.");
#endif
}
void determineInstallDirectory() {
char *env = getenv("INSTALLDIR");
if (env) {
strncpy(installdir, env, sizeof(installdir));
} else {
#if defined(_MSC_VER) || defined(__MINGW32__)
if (sizeof (void*) == 8) {
snprintf(installdir, sizeof(installdir), "%s\\%s", getenv("ProgramFiles"), oname);
} else {
snprintf(installdir, sizeof(installdir), "%s\\%s", getenv("ProgramFiles(x86)"), oname);
}
#if defined(__MINGW32__)
int i; for(i=0; installdir[i]; i++) if (installdir[i] == '\\') installdir[i] = '/';
#endif
#else
if (bsd) {
snprintf(installdir, sizeof(installdir), "/usr/local/share/%s", oname);
} else if (termux) {
snprintf(installdir, sizeof(installdir), "/data/data/com.termux/files/opt/%s", oname);
} else {
snprintf(installdir, sizeof(installdir), "/opt/%s", oname);
}
#endif
}
}
void determineLdconfig() { // Generate appropriate ldconfig command for this OS
if (bsd) {
snprintf(ldconfig, sizeof(ldconfig), "ldconfig -m \"%s/lib\"", installdir);
} else {
snprintf(
ldconfig, sizeof(ldconfig),
"if echo \"%s/lib\" >/etc/ld.so.conf.d/lib%s.conf; then ldconfig; fi",
installdir, oname
);
}
}
void determineBuildDate() {
time_t t = time(0);
strftime(builddate, sizeof(builddate), "%Y/%m/%d", localtime(&t));
}
struct {char ch; CHAR x;} c;
struct {char ch; BOOLEAN x;} b;
struct {char ch; SHORTINT x;} si;
struct {char ch; INTEGER x;} i;
struct {char ch; LONGINT x;} li;
struct {char ch; SET x;} s;
struct {char ch; REAL x;} r;
struct {char ch; LONGREAL x;} lr;
struct {char ch; void* x;} p;
struct {char ch; void (*x)();} f;
struct {char ch; int x;} in;
struct {char ch; long x;} lo;
struct {char ch; long long x;} ll;
struct {char ch; char x[1];} a1;
struct {char ch; char x[2];} a2;
struct {char ch; char x[4];} a4;
struct {char ch; char x[8];} a8;
struct s1 {char ch;}; struct {char ch; struct s1 x;} s1;
struct s2 {char ch[2];}; struct {char ch; struct s2 x;} s2;
struct s4 {char ch[4];}; struct {char ch; struct s4 x;} s4;
struct s8 {char ch[8];}; struct {char ch; struct s8 x;} s8;
struct {char ch;} rec0;
struct {char x[65];} rec2;
// Pass any parameter to configure and it will report sizes and alignments
// instead of generating configuration files.
void ReportSizesAndAlignments() {
printf("Type Size Align\n");
printf("CHAR %4zd %4td\n", sizeof(CHAR), (char*)&c.x - (char*)&c);
printf("BOOLEAN %4zd %4td\n", sizeof(BOOLEAN), (char*)&b.x - (char*)&b);
printf("SHORTINT %4zd %4td\n", sizeof(SHORTINT), (char*)&si.x - (char*)&si);
printf("INTEGER %4zd %4td\n", sizeof(INTEGER), (char*)&i.x - (char*)&i);
printf("LONGINT %4zd %4td\n", sizeof(LONGINT), (char*)&li.x - (char*)&li);
printf("SET %4zd %4td\n", sizeof(SET), (char*)&s.x - (char*)&s);
printf("REAL %4zd %4td\n", sizeof(REAL), (char*)&r.x - (char*)&r);
printf("LONGREAL %4zd %4td\n", sizeof(LONGREAL), (char*)&lr.x - (char*)&lr);
printf("void* %4zd %4td\n", sizeof(void*), (char*)&p.x - (char*)&p);
printf("int %4zd %4td\n", sizeof(int), (char*)&in.x - (char*)&in);
printf("long %4zd %4td\n", sizeof(long), (char*)&lo.x - (char*)&lo);
printf("long long %4zd %4td\n", sizeof(long long), (char*)&ll.x - (char*)&ll);
printf("char[1] %4zd %4td\n", sizeof(a1.x), (char*)&a1.x - (char*)&a1);
printf("char[2] %4zd %4td\n", sizeof(a2.x), (char*)&a2.x - (char*)&a2);
printf("char[4] %4zd %4td\n", sizeof(a4.x), (char*)&a4.x - (char*)&a4);
printf("char[8] %4zd %4td\n", sizeof(a8.x), (char*)&a8.x - (char*)&a8);
printf("struct s1 %4zd %4td\n", sizeof(struct s1), (char*)&s1.x - (char*)&s1);
printf("struct s2 %4zd %4td\n", sizeof(struct s2), (char*)&s2.x - (char*)&s2);
printf("struct s4 %4zd %4td\n", sizeof(struct s4), (char*)&s4.x - (char*)&s4);
printf("struct s8 %4zd %4td\n", sizeof(struct s8), (char*)&s8.x - (char*)&s8);
}
#define MIN(a,b) (((a)<(b)) ? (a) : (b))
void determineCDataModel() {
addressSize = sizeof(void*);
alignment = (char*)&lr.x - (char*)&lr; // Base alignment measure on largest type.
if (addressSize == 4 && sizeof(int) == 4) dataModel = "ILP32"; // Unix/Linux and modern Win32
else if (addressSize == 8 && sizeof(long) == 4) dataModel = "LLP64"; // Windows/mingw 64 bit
else if (addressSize == 8 && sizeof(long) == 8) dataModel = "LP64"; // Unix/Linux 64 bit
else fail("Unsupported combination of address size and int/long size.");
// Check for supported address sie and alignment
if (addressSize == 4) {
assert(alignment == 4 || alignment == 8, "Aligment neither 4 nor 8 when address size is 4.");
} else {
assert(addressSize == 8, "Address size neither 4 nor 8.");
assert(alignment == 8, "Alignemnt not 8 when address size is 8.");
}
// Define 'LARGE' to get 32 bit INTEGER and 64 bit LONGINT even on 32 bit systems.
// Note that plenty of the library source files do not expect this.
#ifdef LARGE
intsize = 4;
#else
intsize = (addressSize == 4) ? 2 : 4;
#endif
}
void testSystemDotH() {
/* test the __ASHR macro */
assert(__ASHR(-1, 1) == -1, "ASH(-1, -1) # -1.");
assert(__ASHR(-2, 1) == -1, "ASH(-2, -1) # -1.");
assert(__ASHR(0, 1) == 0, "ASH(0, 1) # 0.");
assert(__ASHR(1, 1) == 0, "ASH(1, 1) # 0.");
assert(__ASHR(2, 1) == 1, "ASH(2, 1) # 1.");
/* test the __SETRNG macro */
long x = 0;
long y = sizeof(SET)*8 - 1;
assert(__SETRNG(x, y) == -1, "SETRNG(0, MAX(SET)) != -1.");
/* test string comparison for extended ascii */
{char a[10], b[10];
a[0] = (CHAR)128; a[1] = 0;
b[0] = 0;
assert(__STRCMP(a, b) >= 0, "__STRCMP(a, b) with extended ascii charcters; should be unsigned.");
}
// Check the sizes of the Oberon basic types as defined in SYSTEM.h.
// By design all but INTEGER and LONGINT are fixed across all supported platfroms.
assert(sizeof(CHAR) == 1, "Size of CHAR not 1.");
assert(sizeof(BOOLEAN) == 1, "Size of BOOLEAN not 1.");
assert(sizeof(SHORTINT) == 1, "Size of SHORTINT not 1.");
assert(sizeof(INTEGER) == 2
|| sizeof(INTEGER) == 4, "Size of INTEGER neither 2 nor 4 bytes.");
assert(sizeof(LONGINT) == 4
|| sizeof(LONGINT) == 8, "Size of LONGINT neither 4 nor 8 bytes.");
assert(sizeof(SET) == sizeof(LONGINT), "Size of SET differs from size of LONGINT.");
assert(sizeof(REAL) == 4, "Size of REAL not 4 bytes.");
assert(sizeof(LONGREAL) == 8, "Size of LONGREAL not 8 bytes.");
assert(sizeof(f.x) == sizeof(p.x), "Size of function pointer differs from size of data pointer.");
assert((alignment == 4) || (alignment == 8), "Alignment of LONGINT neither 4 nor 8 bytes.");
assert(((char*)&c.x - (char*)&c) == 1, "Alignment of CHAR not 1.");
assert(((char*)&b.x - (char*)&b) == 1, "Alignment of BOOLEAN not 1.");
assert(((char*)&si.x - (char*)&si) == 1, "Alignment of SHORTINT not 1.");
//assert(((char*)&i.x - (char*)&i) == 4, "Alignment of INTEGER not 4 bytes.");
assert(((char*)&r.x - (char*)&r) == 4, "Alignment of REAL not 4 bytes.");
assert(((char*)&lr.x - (char*)&lr) >= 4, "Alignment of LONGREAL less than 4 bytes.");
assert(((char*)&s.x - (char*)&s) == MIN(alignment, sizeof(SET)), "Alignment of SET differs from alignmnet of LONGINT.");
assert(((char*)&p.x - (char*)&p) == addressSize, "Alignment of data pointer differs from address size.");
assert(((char*)&f.x - (char*)&f) == addressSize, "Alignment of data pointer differs from address size.");
assert(sizeof(rec0) == 1, "CHAR wrapped in record aligns differently to CHAR alone.");
assert(sizeof(rec2) == 65, "CHAR array wrapped in record aligns differently to CHAR array alone.");
assert(sizeof(LONGINT) >= sizeof(p.x), "LONGINT should have at least the same size as data pointers.");
assert(sizeof(LONGINT) >= sizeof(f.x), "LONGINT should have at least the same size as function pointers.");
if (((sizeof(rec2)==65) == (sizeof(rec0)==1)) && ((sizeof(rec2)-64) != sizeof(rec0)))
printf("error: unsupported record layout sizeof(rec0) = %lu sizeof(rec2) = %lu\n", (long)sizeof(rec0), (long)sizeof(rec2));
x = 1;
assert(*(char*)&x == 1, "C compiler does not store multibyte numeric values in little-endian order.");
}
void writeMakeParameters() {
FILE *fd = fopen("Configuration.Make", "w");
if (fd == NULL) fail("Couldn't create Configuration.make.");
fprintf(fd, "OLANGDIR=%s\n", cwd);
fprintf(fd, "COMPILER=%s\n", compiler);
fprintf(fd, "OS=%s\n", os);
fprintf(fd, "VERSION=%s\n", version);
fprintf(fd, "ONAME=%s\n", oname);
fprintf(fd, "DATAMODEL=%s\n", dataModel);
fprintf(fd, "INTSIZE=%d\n", intsize);
fprintf(fd, "ADRSIZE=%d\n", addressSize);
fprintf(fd, "ALIGNMENT=%d\n", alignment);
fprintf(fd, "INSTALLDIR=%s\n", installdir);
fprintf(fd, "PLATFORM=%s\n", platform);
fprintf(fd, "BINEXT=%s\n", binext);
fprintf(fd, "COMPILE=%s\n", cc);
fprintf(fd, "STATICLINK=%s\n", staticlink);
fprintf(fd, "LDCONFIG=%s\n", ldconfig);
fclose(fd);
}
void writeConfigurationMod() {
FILE *fd = fopen("Configuration.Mod", "w");
if (fd == NULL) fail("Couldn't create Configuration.Mod.");
fprintf(fd, "MODULE Configuration;\n");
fprintf(fd, "CONST\n");
fprintf(fd, " name* = '%s';\n", oname);
fprintf(fd, " versionLong* = '%s';\n", versionstring);
fprintf(fd, " intsize* = %d;\n", intsize);
fprintf(fd, " addressSize* = %d;\n", addressSize);
fprintf(fd, " alignment* = %d;\n", alignment);
fprintf(fd, " objext* = '%s';\n", objext);
fprintf(fd, " objflag* = '%s';\n", objflag);
fprintf(fd, " linkflags* = '%s';\n", linkflags);
fprintf(fd, " libspec* = '%s';\n", libspec);
fprintf(fd, " compile* = '%s';\n", cc);
fprintf(fd, " dataModel* = '%s';\n", dataModel);
fprintf(fd, " installdir* = '%s';\n", installdir);
fprintf(fd, " staticLink* = '%s';\n", staticlink);
fprintf(fd, "END Configuration.\n");
fclose(fd);
}
int main(int argc, char *argv[])
{
oname = getenv("ONAME"); if (!oname) oname = macrotostring(O_NAME);
if (argc>1) {
ReportSizesAndAlignments();
exit(0);
}
getcwd(cwd, sizeof(cwd));
int i; for (i=0; cwd[i]; i++) if (cwd[i]=='\\') cwd[i]='/';
determineOS();
determineCCompiler();
determineCDataModel();
determineBuildDate();
determineInstallDirectory();
determineLdconfig();
testSystemDotH();
snprintf(versionstring, sizeof(versionstring),
"%s [%s] for %s %s on %s",
version, builddate, compiler, dataModel, os);
writeConfigurationMod();
writeMakeParameters();
printf("Configuration: %s\n", versionstring);
return 0;
}

372
src/tools/make/vishap.make Normal file
View file

@ -0,0 +1,372 @@
# DO NOT RUN THIS MAKEFILE DIRECTLY.
#
# Always use the makefile in the root of the enlistment. This makefile
# depends on up to date configuration files generated by the root makefile.
# Gnu make has the make initial directory in CURDIR, BSD make has it in .CURDIR.
ROOTDIR = $(CURDIR)$(.CURDIR)
include ./Configuration.Make
FLAVOUR = $(OS).$(DATAMODEL).$(COMPILER)
BUILDDIR = build/$(FLAVOUR)
VISHAP = $(ONAME)$(BINEXT)
# Default make target - explain usage
usage:
@echo ""
@echo Do not run this makefile directly, always run the makefile in
@echo the root of the enlistment.
clean:
rm -rf $(BUILDDIR)
rm -f $(VISHAP)
# Assemble: Generate the Vishap Oberon compiler binary by compiling the C sources in the build directory
assemble:
@printf "\nmake assemble - compiling Oberon compiler c source:\n"
@printf " VERSION: %s\n" "$(VERSION)"
@printf " Target characeristics:\n"
@printf " PLATFORM: %s\n" "$(PLATFORM)"
@printf " OS: %s\n" "$(OS)"
@printf " BUILDDIR: %s\n" "$(BUILDDIR)"
@printf " INSTALLDIR: %s\n" "$(INSTALLDIR)"
@printf " Oberon characteristics:\n"
@printf " INTSIZE: %s\n" "$(INTSIZE)"
@printf " ADRSIZE: %s\n" "$(ADRSIZE)"
@printf " ALIGNMENT: %s\n" "$(ALIGNMENT)"
@printf " C compiler:\n"
@printf " COMPILER: %s\n" "$(COMPILER)"
@printf " COMPILE: %s\n" "$(COMPILE)"
@printf " DATAMODEL: %s\n" "$(DATAMODEL)"
cd $(BUILDDIR) && $(COMPILE) -c SYSTEM.c Configuration.c Platform.c Heap.c
cd $(BUILDDIR) && $(COMPILE) -c Console.c Strings.c Modules.c Files.c
cd $(BUILDDIR) && $(COMPILE) -c Reals.c Texts.c vt100.c errors.c
cd $(BUILDDIR) && $(COMPILE) -c OPM.c extTools.c OPS.c OPT.c
cd $(BUILDDIR) && $(COMPILE) -c OPC.c OPV.c OPB.c OPP.c
cd $(BUILDDIR) && $(COMPILE) $(STATICLINK) Vishap.c -o $(ROOTDIR)/$(VISHAP) \
SYSTEM.o Configuration.o Platform.o Heap.o Console.o Strings.o Modules.o Files.o \
Reals.o Texts.o vt100.o errors.o OPM.o extTools.o OPS.o OPT.o \
OPC.o OPV.o OPB.o OPP.o
@printf "$(VISHAP) created.\n"
compilerfromsavedsource:
@echo Populating clean build directory from bootstrap C sources.
@mkdir -p $(BUILDDIR)
@cp bootstrap/$(PLATFORM)-$(ADRSIZE)$(ALIGNMENT)/* $(BUILDDIR)
@make -f src/tools/make/vishap.make -s assemble
translate:
# Make sure we have an oberon compiler binary: if we built one earlier we'll use it,
# otherwise use one of the pre-prepared sets of C sources in the bootstrap directory.
if [ ! -e $(VISHAP) ]; then make -f src/tools/make/vishap.make -s compilerfromsavedsource; fi
@printf "\nmake translate - translating compiler source from Oberon to C:\n"
@printf " PLATFORM: %s\n" $(PLATFORM)
@printf " INTSIZE: %s\n" $(INTSIZE)
@printf " ADRSIZE: %s\n" $(ADRSIZE)
@printf " ALIGNMENT: %s\n" $(ALIGNMENT)
@mkdir -p $(BUILDDIR)
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../Configuration.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/system/Platform$(PLATFORM).Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfFapx -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/system/Heap.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/system/Console.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/library/v4/Strings.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/library/v4/Modules.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfFx -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/system/Files.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/library/v4/Reals.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/library/v4/Texts.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/library/misc/vt100.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/errors.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/OPM.cmdln.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/extTools.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfFx -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/OPS.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/OPT.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/OPC.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/OPV.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/OPB.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SsfF -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/OPP.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ssfm -B$(INTSIZE)$(ADRSIZE)$(ALIGNMENT) ../../src/compiler/Vishap.Mod
cp src/system/*.[ch] $(BUILDDIR)
@printf "$(BUILDDIR) filled with compiler C source.\n"
browsercmd:
@printf "\nMaking symbol browser\n"
@cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -fSm ../../src/tools/browser/BrowserCmd.Mod
@cd $(BUILDDIR); $(COMPILE) BrowserCmd.c -o showdef \
Platform.o Texts.o OPT.o Heap.o Console.o SYSTEM.o OPM.o OPS.o OPV.o \
Files.o Reals.o Modules.o vt100.o errors.o Configuration.o Strings.o \
OPC.o
FORCE:
testcoordinator: FORCE
@rm -f testcoordinator.exe testclient.exe
@make -f src/tools/make/vishap.make -s testtools
testtools:
@printf "\nMaking test coordinator\n"
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -SfFs ../../src/tools/testcoordinator/IP.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Sfsm ../../src/tools/testcoordinator/TestCoordinator.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Sfsm ../../src/tools/testcoordinator/TestClient.Mod
cd $(BUILDDIR); $(COMPILE) -c IP.c
cd $(BUILDDIR); $(COMPILE) TestCoordinator.c -o $(ROOTDIR)/testcoordinator \
Platform.o SYSTEM.o Heap.o Console.o Strings.o IP.o
cd $(BUILDDIR); $(COMPILE) TestClient.c -o $(ROOTDIR)/testclient \
Platform.o SYSTEM.o Heap.o Console.o Strings.o IP.o
# install: Use only after a successful full build. Installs the compiler
# and libraries in /opt/$(ONAME).
# May require root access.
install:
@printf "\nInstalling into \"$(INSTALLDIR)\"\n"
@rm -rf "$(INSTALLDIR)"
@mkdir -p "$(INSTALLDIR)/bin" "$(INSTALLDIR)/include" "$(INSTALLDIR)/sym" "$(INSTALLDIR)/lib"
@cp $(BUILDDIR)/*.h "$(INSTALLDIR)/include/"
@cp $(BUILDDIR)/*.sym "$(INSTALLDIR)/sym/"
@cp $(VISHAP) "$(INSTALLDIR)/bin/$(VISHAP)"
@-cp $(BUILDDIR)/showdef$(BINEXT) "$(INSTALLDIR)/bin"
@cp $(BUILDDIR)/lib$(ONAME).* "$(INSTALLDIR)/lib/"
@if which ldconfig >/dev/null 2>&1; then $(LDCONFIG); fi
@printf "\nNow add $(INSTALLDIR)/bin to your path, for example with the command:\n"
@printf "export PATH=\"$(INSTALLDIR)/bin:\$$PATH\"\n"
@printf "\n"
uninstall:
@printf "\nUninstalling from \"$(INSTALLDIR)\"\n"
rm -rf "$(INSTALLDIR)"
rm -f /etc/ld.so.conf/lib$(ONAME)
if which ldconfig >/dev/null 2>&1; then ldconfig; fi
v4:
@printf "\nMaking v4 library\n"
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/v4/Args.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/v4/Printer.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/v4/Sets.Mod
ooc2:
@printf "\nMaking ooc2 library\n"
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc2/ooc2Strings.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc2/ooc2Ascii.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc2/ooc2CharClass.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc2/ooc2ConvTypes.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc2/ooc2IntConv.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc2/ooc2IntStr.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc2/ooc2Real0.Mod
ooc:
@printf "\nMaking ooc library\n"
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocLowReal.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocLowLReal.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocRealMath.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocOakMath.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocLRealMath.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocLongInts.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocComplexMath.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocLComplexMath.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocAscii.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocCharClass.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocStrings.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocConvTypes.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocLRealConv.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocLRealStr.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocRealConv.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocRealStr.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocIntConv.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocIntStr.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocMsg.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocSysClock.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocTime.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocChannel.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocStrings2.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocRts.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocFilenames.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocTextRider.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocBinaryRider.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocJulianDay.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocFilenames.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocwrapperlibc.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ooc/oocC$(DATAMODEL).Mod
oocX11:
@printf "\nMaking oocX11 library\n"
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/oocX11/oocX11.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/oocX11/oocXutil.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/oocX11/oocXYplane.Mod
ulm:
@printf "\nMaking ulm library\n"
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmObjects.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmPriorities.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmDisciplines.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmServices.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmSys.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmSYSTEM.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmEvents.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmProcess.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmResources.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmForwarders.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmRelatedEvents.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmTypes.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmStreams.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmStrings.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmSysTypes.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmTexts.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmSysConversions.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmErrors.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmSysErrors.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmSysStat.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmASCII.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmSets.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmIO.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmAssertions.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmIndirectDisciplines.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmStreamDisciplines.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmIEEE.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmMC68881.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmReals.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmPrint.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmWrite.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmConstStrings.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmPlotters.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmSysIO.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmLoader.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmNetIO.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmPersistentObjects.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmPersistentDisciplines.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmOperations.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmScales.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmTimes.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmClocks.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmTimers.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmConditions.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmStreamConditions.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmTimeConditions.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmCiphers.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmCipherOps.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmBlockCiphers.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmAsymmetricCiphers.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmConclusions.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmRandomGenerators.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmTCrypt.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/ulm/ulmIntOperations.Mod
pow32:
@printf "\nMaking pow library\n"
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/pow/powStrings.Mod
misc:
@printf "\nMaking misc library\n"
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/system/Oberon.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/misc/crt.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/misc/Listen.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/misc/MersenneTwister.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/misc/MultiArrays.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/misc/MultiArrayRiders.Mod
s3:
@printf "\nMaking s3 library\n"
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethBTrees.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethMD5.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethSets.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethZlib.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethZlibBuffers.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethZlibInflate.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethZlibDeflate.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethZlibReaders.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethZlibWriters.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethZip.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethRandomNumbers.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethGZReaders.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethGZWriters.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethUnicode.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethDates.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethReals.Mod
cd $(BUILDDIR); $(ROOTDIR)/$(VISHAP) -Ffs ../../src/library/s3/ethStrings.Mod
librarybinary:
@printf "\nMaking lib$(ONAME)\n"
# Remove objects that should not be part of the library
rm -f $(BUILDDIR)/vishap.o
# Note: remining compiler files are retained in the library allowing the building
# of utilities like BrowserCmd.Mod (aka showdef).
# Make static library
ar rcs "$(BUILDDIR)/lib$(ONAME).a" $(BUILDDIR)/*.o
# Make shared library
@cd $(BUILDDIR) && $(COMPILE) -shared -o lib$(ONAME).so *.o
library: v4 ooc2 ooc ulm pow32 misc s3 librarybinary
confidence:
@printf "\n\n--- Confidence tests ---\n\n"
cd src/test/confidence/hello; ./test.sh "$(INSTALLDIR)"
if [ "$(PLATFORM)" != "windows" ] ; then cd src/test/confidence/signal; ./test.sh "$(INSTALLDIR)"; fi
cd src/test/confidence/lola; ./test.sh "$(INSTALLDIR)"
cd src/test/confidence/arrayassignment; ./test.sh "$(INSTALLDIR)"
@printf "\n\n--- Confidence tests passed ---\n\n"
# auto: A full build started from a central machine running TestCoordinator.
auto:
@make -f src/tools/make/vishap.make -s clean
@make -f src/tools/make/vishap.make -s translate
@make -f src/tools/make/vishap.make -s assemble
@make -f src/tools/make/vishap.make -s testtools
while cmd=$$(./testclient -w "$(FLAVOUR)"); do $$cmd 2>&1 | ./testclient -s "$(FLAVOUR)"; done