summaryrefslogtreecommitdiff
path: root/sys/doc/ape.ms
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2011-07-18 11:01:22 +0200
committeraiju <aiju@phicode.de>2011-07-18 11:01:22 +0200
commit8c4c1f39f4e369d7c590c9d119f1150a2215e56d (patch)
treecd430740860183fc01de1bc1ddb216ceff1f7173 /sys/doc/ape.ms
parent11bf57fb2ceb999e314cfbe27a4e123bf846d2c8 (diff)
added /sys/doc
Diffstat (limited to 'sys/doc/ape.ms')
-rw-r--r--sys/doc/ape.ms537
1 files changed, 537 insertions, 0 deletions
diff --git a/sys/doc/ape.ms b/sys/doc/ape.ms
new file mode 100644
index 000000000..8b19fda25
--- /dev/null
+++ b/sys/doc/ape.ms
@@ -0,0 +1,537 @@
+.HTML "APE — The ANSI/POSIX Environment
+.de XX
+.IP \ \ \ \-
+..
+.TL
+APE \(em The ANSI/POSIX Environment
+.AU
+Howard Trickey
+howard@plan9.bell-labs.com
+.SH
+Introduction
+.PP
+When a large or frequently-updated program must be ported
+to or from Plan 9, the ANSI/POSIX environment known as APE can be useful.
+APE combines the set of headers and object code libraries specified by
+the ANSI C standard (ANSI X3.159-1989) with the POSIX operating system
+interface standard (IEEE 1003.1-1990, ISO 9945-1), the part of POSIX
+defining the basic operating system functions.
+Using APE will cause slower compilation and marginally slower execution speeds,
+so if the importing or exporting happens only infrequently, due consideration
+should be given to using the usual Plan 9 compilation environment instead.
+Another factor to consider is that the Plan 9 header organization is
+much simpler to remember and use.
+.PP
+There are some aspects of required POSIX behavior that are impossible or
+very hard to simulate in Plan 9. They are described below.
+Experience has shown, however, that the simulation is adequate for the
+vast majority of programs. A much more common problem is that
+many programs use functions or headers not defined by POSIX.
+APE has some extensions to POSIX to help in this regard.
+Extensions must be explicitly enabled with an appropriate
+.CW #define ,
+in order that the APE environment be a good aid for testing
+ANSI/POSIX compliance of programs.
+.SH
+Pcc
+.PP
+The
+.CW pcc
+command acts as a front end to the Plan 9 C compilers and loaders.
+It runs an ANSI C preprocessor over source files, using the APE
+headers to satisfy
+.CW "#include <\fIfile\fP>"
+directives; then it runs a Plan 9 C compiler; finally, it may load
+with APE libraries to produce an executable program.
+The document
+.I "How to Use the Plan 9 C Compiler"
+explains how environment variables are used by convention to
+handle compilation for differing architectures.
+The environment variable
+.CW $objtype
+controls which Plan 9 compiler and loader are used by
+.CW pcc ,
+as well as the location of header and library files.
+For example, if
+.CW $objtype
+is
+.CW mips ,
+then
+.CW pcc
+has
+.CW cpp
+look for headers in
+.CW /mips/include/ape
+followed by
+.CW /sys/include/ape ;
+then
+.CW pcc
+uses
+.CW vc
+to create
+.CW .v
+object files;
+finally,
+.CW vl
+is used to create an executable using libraries in
+.CW /mips/lib/ape .
+.SH
+Psh and Cc
+.PP
+The
+.CW pcc
+command is intended for uses where the source code is
+ANSI/POSIX, but the programs are built in the usual Plan 9
+manner \(em with
+.CW mk
+and producing object files with names ending in
+.CW .v ,
+etc.
+Sometimes it is best to use the standard POSIX
+.CW make
+and
+.CW cc
+(which produces object files with names ending in
+.CW .o ,
+and automatically calls the loader unless
+.CW -c
+is specified).
+Under these circumstances, execute the command:
+.DS
+.CW "ape/psh"
+.DE
+This starts a POSIX shell, with an environment that
+includes the POSIX commands
+.CW ar89 ,
+.CW c89 ,
+.CW cc ,
+.CW basename ,
+.CW dirname ,
+.CW expr ,
+.CW false ,
+.CW grep ,
+.CW kill ,
+.CW make ,
+.CW rmdir ,
+.CW sed ,
+.CW sh ,
+.CW stty ,
+.CW true ,
+.CW uname ,
+and
+.CW yacc .
+There are also a few placeholders for commands that cannot be
+implemented in Plan 9:
+.CW chown ,
+.CW ln ,
+and
+.CW umask .
+.PP
+The
+.CW cc
+command accepts the options mandated for
+the POSIX command
+.CW c89 ,
+as specified in the C-Language Development Utilities Option
+annex of the POSIX Shell and Utilities standard.
+It also accepts the following nonstandard options:
+.CW -v
+for echoing the commands for each pass to stdout;
+.CW -A
+to turn on ANSI prototype warnings;
+.CW -S
+to leave assembly language in
+.I file .s;
+.CW -Wp,\fIargs\fP
+to pass
+.I args
+to the
+.CW cpp ;
+.CW -W0,\fIargs\fP
+to pass
+.I args
+to 2c, etc.;
+and
+.CW -Wl,\fIargs\fP
+to pass
+.I args
+to 2l, etc.
+.PP
+The
+.CW sh
+command is pdksh, a mostly POSIX-compliant public domain Korn Shell.
+The Plan 9 implementation does not include
+the emacs and vi editing modes.
+.PP
+The
+.CW stty
+command only has effect if the
+.CW ape/ptyfs
+command has been started to interpose a pseudo-tty interface
+between
+.CW /dev/cons
+and the running command.
+None of the distributed commands do this automatically.
+.SH
+Symbols
+.PP
+The C and POSIX standards require that certain symbols be
+defined in headers.
+They also require that certain other classes of symbols not
+be defined in the headers, and specify certain other
+symbols that may be defined in headers at the discretion
+of the implementation.
+POSIX defines
+.I "feature test macros" ,
+which are preprocessor symbols beginning with an underscore
+and then a capital letter; if the program
+.CW #defines
+a feature test macro before the inclusion of any headers,
+then it is requesting that certain symbols be visible in the headers.
+The most important feature test macro is
+.CW _POSIX_SOURCE :
+when it is defined, exactly the symbols required by POSIX are
+visible in the appropriate headers.
+Consider
+.CW <signal.h>
+for example:
+ANSI defines some names that must be defined in
+.CW <signal.h> ,
+but POSIX defines others, such as
+.CW sigset_t ,
+which are not allowed according to ANSI.
+The solution is to make the additional symbols visible only when
+.CW _POSIX_SOURCE
+is defined.
+.PP
+To export a program, it helps to know whether it fits
+in one of the following categories:
+.IP 1.
+Strictly conforming ANSI C program. It only uses features of the language,
+libraries, and headers explicitly required by the C standard. It does not
+depend on unspecified, undefined, or implementation-dependent behavior,
+and does not exceed any minimum implementation limit.
+.IP 2.
+Strictly conforming POSIX program. Similar, but for the POSIX standard as well.
+.IP 3.
+Some superset of POSIX, with extensions. Each extension
+is selected by a feature test macro, so it is clear which extensions
+are being used.
+.PP
+With APE, if headers are always included to declare any library functions
+used, then the set of feature test macros defined by a program will
+show which of the above categories the program is in.
+To accomplish this, no symbol is defined in a header if it is not required
+by the C or POSIX standard, and those required by the POSIX standard
+are protected by
+.CW "#ifdef _POSIX_SOURCE" .
+For example,
+.CW <errno.h>
+defines
+.CW EDOM ,
+.CW ERANGE ,
+and
+.CW errno ,
+as required by the C standard.
+The C standard allows more names beginning with
+.CW E ,
+but our header defines only those unless
+.CW _POSIX_SOURCE
+is defined, in which case the symbols required by POSIX are also defined.
+This means that a program that uses
+.CW ENAMETOOLONG
+cannot masquerade as a strictly conforming ANSI C program.
+.PP
+.CW Pcc
+and
+.CW cc
+do not predefine any preprocessor symbols except those required by
+the ANSI C standard:
+.CW __STDC__ ,
+.CW __LINE__ ,
+.CW __FILE__ ,
+.CW __DATE__ ,
+and
+.CW __TIME__ .
+Any others must be defined in the program itself or by using
+.CW -D
+on the command line.
+.SH
+Extensions
+.PP
+The discipline enforced by putting only required
+names in the headers is useful for exporting programs,
+but it gets in the way when importing programs.
+The compromise is to allow additional symbols in headers,
+additional headers, and additional library functions,
+but only under control of extension feature test macros.
+The following extensions are provided; unless otherwise
+specified, the additional library functions are in the
+default APE library.
+.XX
+.CW _LIBG_EXTENSION .
+This allows the use of the Plan 9 graphics library.
+The functions are as described in the Plan 9 manual (see
+.I graphics (2))
+except that
+.CW div
+had to be renamed
+.CW ptdiv .
+Include the
+.CW <libg.h>
+header to declare the needed types and functions.
+.XX
+.CW _LIMITS_EXTENSION .
+POSIX does not require that names such as
+.CW PATH_MAX
+and
+.CW OPEN_MAX
+be defined in
+.CW <limits.h> ,
+but many programs assume they are defined there.
+If
+.CW _LIMITS_EXTENSION
+is defined, those names will all be defined when
+.CW <limits.h>
+is included.
+.XX
+.CW _BSD_EXTENSION .
+This extension includes not only Berkeley Unix routines,
+but also a grab bag of other miscellaneous routines often
+found in Unix implementations.
+The extension allows the inclusion of any of:
+.CW <bsd.h>
+for
+.CW bcopy() ,
+.CW bcmp() ,
+and similar Berkeley functions;
+.CW <netdb.h>
+for
+.CW gethostbyname() ,
+etc.,
+and associated structures;
+.CW <select.h>
+for the Berkeley
+.CW select
+function and associated types and macros
+for dealing with multiple input sources;
+.CW <sys/ioctl.h>
+for the
+.CW ioctl
+function (minimally implemented);
+.CW <sys/param.h>
+for
+.CW NOFILES_MAX ;
+.CW <sys/pty.h>
+for pseudo-tty support via the
+.CW ptsname(int)
+and
+.CW ptmname(int)
+functions;
+.CW <sys/resource.h> ;
+.CW <sys/socket.h>
+for socket structures, constants, and functions;
+.CW <sys/time.h>
+for definitions of the
+.CW timeval
+and
+.CW timezone
+structures;
+and
+.CW <sys/uio.h>
+for the
+.CW iovec
+structure and the
+.CW writev
+and
+.CW readv
+functions used for scatter/gather I/O.
+Defining
+.CW _BSD_EXTENSION
+also enables various extra definitions in
+.CW <ctype.h> ,
+.CW <signal.h> ,
+.CW <stdio.h> ,
+.CW <unistd.h> ,
+.CW <sys/stat.h> ,
+and
+.CW <sys/times.h> .
+.XX
+.CW _NET_EXTENSION .
+This extension allows inclusion of
+.CW <libnet.h> ,
+which defines the networking functions described in the Plan 9 manual page
+.I dial (2).
+.XX
+.CW _PLAN9_EXTENSION .
+This extension allows inclusion of
+.CW <u.h> ,
+.CW <lock.h> ,
+.CW <qlock.h> ,
+.CW <utf.h> ,
+.CW <fmt.h> ,
+and
+.CW <draw.h> .
+These are pieces of Plan 9 source code ported into APE,
+mostly from
+.CW <libc.h> .
+.XX
+.CW _REGEXP_EXTENSION .
+This extension allows inclusion of
+.CW <regexp.h> ,
+which defines the regular expression matching functions described
+in the Plan 9 manual page
+.I regexp (2).
+.XX
+.CW _RESEARCH_SOURCE .
+This extension enables a small library of functions from the Tenth Edition Unix
+Research System (V10).
+These functions and the types needed to use them are all defined in the
+.CW <libv.h>
+header.
+The provided functions are:
+.CW srand ,
+.CW rand ,
+.CW nrand ,
+.CW lrand ,
+and
+.CW frand
+(better random number generators);
+.CW getpass ,
+.CW tty_echoon ,
+.CW tty_echooff
+(for dealing with the common needs for mucking with terminal
+characteristics);
+.CW min
+and
+.CW max ;
+.CW nap ;
+and
+.CW setfields ,
+.CW getfields ,
+and
+.CW getmfields
+(for parsing a line into fields).
+See the Research Unix System Programmer's Manual, Tenth Edition, for a description
+of these functions.
+.XX
+.CW _C99_SNPRINTF_EXTENSION .
+This extension permits the use of the return values of
+.I snprintf
+and
+.I vsnprintf .
+Before C99, the 1999 C standard,
+these functions usually returned the number of bytes,
+excluding terminating NUL,
+actually stored in the target string.
+(GNU, as usual, had to be different and returned -1 if the target
+string was too small.)
+C99 requires them to instead return the number of bytes,
+excluding terminating NUL,
+that would have been written into the target string if it were infinitely large
+or a negative value if an `encoding error' occurs,
+so old programs compiled under C99 rules will be prone to overrunning
+their buffers.
+This extension is a way for the programmer to declare that he or she understands
+the situation and has adjusted the code being compiled to compensate.
+.SH
+Common Problems
+.PP
+Some large systems, including X11, have been ported successfully
+to Plan 9 using APE
+(the X11 port is not included in the distribution, however,
+because supporting it properly is too big a job).
+The problems encountered fall into three categories:
+(1) non-ANSI C/POSIX features used; (2) inadequate simulation of POSIX functions;
+and (3) compiler/loader bugs.
+By far the majority of problems are in the first category.
+.PP
+POSIX is just starting to be a target for programmers.
+Most existing code is written to work with one or both of a BSD or a System V Unix.
+System V is fairly close to POSIX, but there are some differences.
+Also, many System V systems have imported some BSD features that are
+not part of POSIX.
+A good strategy for porting external programs is to first try using
+.CW CFLAGS=-D_POSIX_SOURCE ;
+if that doesn't work, try adding
+.CW _D_BSD_EXTENSION
+and perhaps include
+.CW <bsd.h>
+in source files.
+Here are some solutions to problems that might remain:
+.XX
+Third (environment) argument to
+.CW main .
+Use the
+.CW environ
+global instead.
+.XX
+.CW OPEN_MAX ,
+.CW PATH_MAX ,
+etc., assumed in
+.CW <limits.h> .
+Rewrite to call
+.CW sysconf
+or define
+.CW _LIMITS_EXTENSION .
+.XX
+.CW <varargs.h> .
+Rewrite to use
+.CW <stdarg.h> .
+.PP
+The second class of problems has to do with inadequacies in the Plan 9
+simulation of POSIX functions.
+These shortcomings have rarely gotten in the way
+(except, perhaps, for the
+.CW link
+problem).
+.XX
+Functions for setting the userid, groupid, effective userid and effective groupid
+do not do anything useful. The concept is impossible to simulate in Plan 9.
+.CW Chown
+also does nothing.
+.XX
+.CW execlp
+and the related functions do not look at the
+.CW PATH
+environment variable. They just try the current directory and
+.CW /bin
+if the pathname is not absolute.
+.XX
+Advisory locking via
+.CW fcntl
+is not implemented.
+.XX
+.CW isatty
+is hard to do correctly.
+The approximation used is only sometimes correct.
+.XX
+.CW link
+always fails.
+.XX
+With
+.CW open ,
+the
+.CW O_NOCTTY
+option has no effect.
+The concept of a controlling tty is foreign to Plan 9.
+.XX
+.CW setsid
+forks the name space and note group,
+which is only approximately the right behavior.
+.XX
+The functions dealing with stacking signals,
+.CW sigpending ,
+.CW sigprocmask
+and
+.CW sigsuspend ,
+do not work.
+.XX
+.CW umask
+has no effect, as there is no such concept in Plan 9.
+.XX
+code that does
+.CW getenv("HOME")
+should be changed to
+.CW getenv("home")
+on Plan 9.