[logo]     MINIX 3 - TenDRA Compiler [logo]

TENDRA C/C++ FOR MINIX

TenDRA C/C++ compiler (version 4.1.2) for Minix 2.0.2 (10 MB)

This is a port of the TenDRA C/C++ compiler (version 4.1.2) for Minix 2.0.2 (10 MB) but it will probably compile under 2.0.0 and 2.0.3 without changes. Read the file COPYRIGHT for the original license (which is quite liberal). Since I don't think changing "movl hola, %ebx" for "mov ebx, (hola)" needs a license, my modifications are public domain.

The original sources of TenDRA can be obtained from

ftp://ftp.ten15.org/pub/source/TenDRA-4.1.2.tar.gz
ftp://ftp.ten15.org/pub/source/TenDRA-4.1.2-doc.tar.gz

and also from

http://i44w3.info.uni-karlsruhe.de/~andf/download/TenDRA-4.1.2.tar.gz

This package is available from http://tendra4minix.sourceforge.net


Installation

You need at least an i486 processor (or i386+i387) and 4 MB of RAM to build this package. As bin user, type

cd /usr/local/src
zcat TenDRA412a.taz | tar xf -
cd TenDRA-4.1.2
/INSTALL >gt;>gt; messages.build 2>gt;&1

The compilation and installation may take up to 8 hours on a slow machine (33 MHz). You can monitor the compilation process at another virtual terminal with:

cd /usr/local/src/TenDRA-4.1.2
tail -n 24 -f messages.build

At the end, there should be no error messages in this file. Common causes of failure are:

  • Lack of memory. The memory used by some programs (for example, em_cemcom.ansi) needs to be enlarged to more than 1.2 MB to handle some parts of the code. Try recompiling your kernel to reduce FS buffers and/or drop temporarily some drivers and servers (INET).
  • You have changed system headers in a way that affects their semantics (as the TenDRA frontend understands this). The TenDRA compilers don't use system headers by default, but a library of headers codified in TDF (intermediate language). This library is built from both the API specifications (in the src/lib/apis directory) and the system headers during the installation process. Deleting or adding a simple "const" keyword will affect their meaning and thus will break the building of the TDF API library. The solution is to make your system headers and the API descriptions agree. Read tspec documentation (it's not that difficult, I have had to do it myself), and/or email me if you have problems with this.

In general, the original sources are very clean and the makefiles very well behaved, so if the installation gets interrupted somewhere, you can restart it with the ./INSTALL command above; no need of deleting anything nor unpacking again.

Almost everything gets installed under /usr/local/lib/TenDRA, a few scripts go into /usr/local/bin (tcc, tchk, tspec, ld), and man pages into /usr/local/man (don't forget "makewhatis /usr/local/man" to read them).


Usage

To compile a simple C program

tcc hello.c

To compile a simple C++ program:

tcc -Yc++ hello.C

As mentioned before, the frontends don't use the system headers. Instead, they check your program against precompiled libraries of "tokens" (= macro definitions) that specify Application Programming Interfaces (APIs). These precompiled API token libraries are built during installation, using the specs given in src/lib/apis and the contents of the system headers. The TenDRA-4.1.2 distribution comes with several APIs, but only two of them can be built on standard Minix: ansi (X3.159) and posix (1003.1). APIs are chosen by specifying an environment with the -Y switch. By default, the ansi environment is used. Several -Y switches may be combined in the same command line:

tcc -Yposix -Yc++ prog.C

If you want to bypass API checking and use normal system headers, there is a special environment for doing this,

tcc -Ysystem prog.c
tcc -Ysystem -Yc++ prog.C

This is necessary to use Minix specific features (networking, for example). The compiler driver tcc behaves like any other one, accepting common options like -c (compile only), -o (name output file), etc. See the man page tcc(1). You can pass options to the linker script through the -Wl: switch; the most important use of this is to produce a separate I&D executable:

tcc -Ysystem -Wl:-i main.o module.o -lcurses

Important notes

Of course, there is list of caveats about this program.

  • No Standard C++ Library is included in the package (not even iostream). See the documentation for some advice on how to port GNU libio (although I haven't tried myself).
  • The -g switch (emit debug info) is a complete nonsense. Never use it. I have wiped diagnostics off the Minix specific parts of the 80x86 installer (= the compiler backend), but the common part will still produce some output. Anyway, the ACK assembler cannot understand AT&T style debug information, so if you compile with -g, you will just get a stream of error messages from the assembler.
  • I doubt that the -p switch (emit profiling data) works. I am not sure, but I think Minix has no support for profiling.
  • Linking ACK object code with TenDRA object code is not possible in general. Two binary incompatibilities arise: (1) ACK uses ebx as a scratch register, this means it indulges in overwriting ebx without making a copy; (2) ACK returns float/double values in eax/edx, while TenDRA uses st(0) for this. You may have noticed that libc and libcurses are completely rebuilt with the TenDRA C compiler during installation. You will have to do so for other libraries as well.
  • If you are used to dirty C programming, then you will find that it is almost impossible to compile a "normal" program with TenDRA. The frontends are very strict about languages and standards. This strictness can be suspended using suitable #pragmas. There is a plethora of them (they are also a way of expressing TDF constructs). For example, if you want to be able to assign a data pointer to a function pointer (something explicitly forbidden in ANSI C), you must put this #pragma somewhere in your code
    #pragma TenDRA function pointer as pointer allow
    See also the switch -X (compilation mode) in the documentation.

Comments

The principle underlying this port has been: do it the simplest way possible, no matter how inelegant it might result. Inelegant doesn't mean buggy. I have corrected two important bugs (bugs 17 and 18 of http://bugs.ten15.org), and I think that the compilers are now very safe (the original code, as I said before, is particularly stable and clean). I have made some tests involving relatively complex inheritance hierarchies, with template classes, virtual bases, virtual tables, and exceptions, and everything has worked fine.

I don't plan to develop this package very actively, but I want it to be bug free. If you find some problem other than the five warnings I made above, please tell me (email me at the address josejuanmr@users.sourceforge.net) and I'll try to fix it (you'll have to be patient).


Jose Juan Mendoza Rodriguez (josejuanmr@users.sourceforge.net)
25 Feb 2004