HELP POPC

John Gibson Nov 1993


This file is a user-guide for the Pop-11 object-module compilation and linking system. It describes how to run Popc, the object-module compiler for Pop-11 programs, and the associated utilities Poplink and Poplibr. See REF * POPC for a description of the concepts involved, and how to make Pop-11 programs compile under Popc.

Contents

Select headings to return to index

Overview

The Pop-11 object-module compilation and linking system consists of three programs: Popc, Poplink, and Poplibr.

Popc compiles Pop-11 program files to object modules. Each source file name.p is compiled to an ordinary O/S object file name.o, plus an associated file name.w (called a w-file). Together, these two files comprise a composite 'Pop object file'.

Poplink links an executable image from Pop object files and library modules. It may be run as a separate program, but (like cc running ld in Unix), is normally run automatically by Popc.

Poplibr creates and maintains object libraries. A set of Pop object files is combined into an ordinary O/S object library libname.olb, plus an associated file libname.wlb (called a w-library). Together, these two files comprise a composite 'Pop object library'.

Program Options in General

Program options whose names end with the suffix -list may be either a single argument, or a sequence of zero or more arguments enclosed in parentheses (parentheses must be escaped with \ in Unix). For example, the Popc option

-include file-list

will allow any of the following:

-include foo.ph -include ( ) -include ( foo.ph ) -include ( foo.ph baz.ph )

Individual options may restrict this where necessary (e.g. insist that a list be non-empty).

Object & Library File Arguments

With all three programs, a Pop object file is always specified by its w-file name, i.e. as name.w. Similarily, a Pop object library is always specified by its w-library name, i.e. as libname.wlb. (The O/S object and library files name.o and libname.olb are never referred to explicitly.)

A w-library may also be given as a directory pathname dirpath, which is interpreted as follows: if dirpath specifies a directory anywhere in the tree

$usepop/pop/...

then the remainder of the path from $usepop/pop/ downwards is automatically mapped to a filename in $popobjlib, e.g.

$usepop/pop/x/ved/src/ --> $popobjlib/xvedsrc.wlb

Otherwise, if dirpath is not a sub-directory of $usepop/pop/, it is interpreted as the file

dirpath/src.wlb

Note that in either case, dirpath must be syntactically recognisable as a directory pathname, that is end with `/` in Unix, or `:` or `]` in VMS.

Standard Libraries in $popobjlib

In the normal Poplog distribution, $popobjlib contains only those w-libraries needed to link $popsys/basepop11, i.e. corresponding to the core source directories

src ved/src x/ved/src

Thus to use Popc, you may first need to run the command file

$popcom/buildobjlib (Unix) popcom:buildobjlib.com (VMS)

This creates w-libraries in $popobjlib for other library directories: currently, these are

lib/auto lib/lib lib/ved lib/sun lib/ved/term
x/pop/auto x/pop/lib
x/pop/lib/Xpw x/pop/lib/Xm x/pop/lib/Xol x/pop/lib/Xaw
x/ved/src x/ved/lib x/ved/auto
x/ui/lib

Popc

Popc compiles Pop-11 source files to object-module form, and then (unless the -c option is present, or compilation errors have occurred) runs Poplink to link the resulting files into an executable image.

The general format of a Popc command is

popc options files

where files may be any sequence of Pop-11 program files (extension .p), or files to be input to Poplink (w-files and w-libraries). These may occur in any order; each .p file is compiled to its corresponding .w/.o pair, and then replaced by its w-file name in the list passed to Poplink.

Note that if Poplink is to be run (i.e. -c absent), and only a single source file is supplied, then the .w/.o files are created as temporaries and deleted afterwards.

The allowable options are described below. options may also include any valid options to Poplink, which are passed to that program along with the file arguments.

popc.args

To enable a set of options to be specified automatically for all files in a given directory, on startup Popc looks for a file called

popc.args

in the current directory. If this exists, arguments are read from it and prepended to the normal argument list. Arguments in popc.args should be whitespace-separated; end-of-line comments flagged by ;;; are recognised.

W-Libraries for Extracting Declarations

By default, Popc uses the w-libraries specified by the directories in popsyslist for extracting permanent identifier declarations (interpreting the directory names as described by Object & Library File Arguments above). Changes to popsyslist caused by compiling libraries which extend it (such as LIB * POPXLIB) are taken into account.

You can also specify other w-libraries for declaration-extraction with the -wlb and -wlib options (which are searched before any popsyslist ones). The -nosys option causes only -wlb and -wlib libraries to be searched, i.e. disables the use of popsyslist.

Options

    -include file-list
            Causes each file  from file-list  to be  #_INCLUDEed at  the
            beginning of  every source  file compiled.  (This option  is
            normally used  to supply  a  .ph file  containing  permanent
            identifier declarations which are required for Popc, but not
            for ordinary interactive compilation.)
    -a      Produce assembler output  (.a files) and  w-files only.  (If
            Poplink is to be run, it is passed the -a option also.)
-c Compile source files only, don't run Poplink.
    -createwlib w-library
            If w-library  does not  already  exist, compiles  the  given
            source files and then runs
poplibr -c w-library w-files
to create it from the set of w-files produced by the compilation and/or supplied explicitly, all of which are deleted afterwards. (Poplink is not run.)
If w-library exists already, a warning message is printed and Popc exits.
    -g [ name ] source-file-list
            This option  enables the  group of  source files  given  by
            source-file-list to be compiled  to a single w/object  file
            called name.w/.o.
The name argument is optional, and because of this, source-file-list MUST be a list (i.e. enclosed in parentheses), since this is used to detect whether name is present or not. If name is absent, the name of the first source file is used instead.
    -l      Causes each filename to be  listed as it is compiled.  (This
            happens anyway, except when compiling a single source file.)
    -m idname=expr-list
            Define  Pop-11   macro(s).  Each   argument  of   the   form
            idname=expr is used to define a macro
constant macro idname = expr;
in the top-level section. (The definition is compiled in non-Popc mode, see REF * POPC.)
    -norec
            Don't recompile any source file for which the  corresponding
            .w/.o files exist already.
    -nosys
            Stops popsyslist being included in the list of libraries  to
            be used  for  extracting permanent  identifier  declarations
            (see W-Libraries for Extracting Declarations above).
    -od directory
            Produce output files in  directory (can occur anywhere,  and
            affects all following source files).
    -u arg-list
            Use Pop-11  source  libraries:  for each  arg  in  arg-list,
            compiles
uses-now arg;
    -wlb w-library-list
            List of  libraries  to  be  used  for  extracting  permanent
            identifier  declarations  (see  W-Libraries  for  Extracting
            Declarations above).  These will  be  used only  for  source
            files preceding the option (i.e. not for any following it).
    -wlib w-library-list
            Same as -wlb, except that the specified libraries are put at
            the end,  i.e.  after  any other  file  arguments  (and  are
            therefore used for all source files).

Poplink

Poplink links an executable image from a set of Pop object files and libraries (i.e. w-files and w-libraries). It performs the global structure linking necessary in a Pop program, and outputs the results as additional object files. Poplink then passes these, together with all O/S object files/libraries corresponding to the w-files/libraries used, as input to the O/S linker. Poplink may also be supplied with other object file or library arguments to be passed directly to the O/S linker.

The format of a Poplink command is

poplink options-and-files

where the options (described below) generally appear before any files arguments, although some (such as -in, -ex, -wlb, -wlbused, etc) actually specify input files and should therefore occur at the appropriate place within the file arguments.

Any argument not beginning with `-` is an input file, and must be either a w-file or a w-library; these are processed and incorporated into the link in the order given.

Use of W-Libraries

While an input w-file is included unconditionally in the linked program, a w-library is used for conditional 'search extraction' of modules, that is, only those library modules which provide initialisations for uninitialised identifiers are extracted. The library is searched repeatedly until no further identifiers can be extracted, after which that library is skipped (i.e. Poplink does not go back to it at a later point).

The -wlb option enables a group of libraries to be searched recursively (effectively treating them as a single library). The files in the group are cycled through, each being searched as above, until a complete pass through all of them fails to extract any further identifiers.

If you wish to force library modules to be included in the link unconditionally, use the -in or -ex option (see below).

HOWEVER, aside from special uses of -in or -ex, it should normally never be necessary to specify any w-libraries, except via the -wlbused option. The reason for this is that (as described in REF * POPC), every w-module keeps a record of which w-libraries were used for extracting identifier declarations when it was compiled. Thus each w-module knows which w-libraries it needs.

As Poplink incorporates w-modules during linking, it accumulates a running list of the w-libraries they referenced. The -wlbused option then represents this list as a group for recursive search extract (i.e. as if specified with -wlb). Moreover, as further modules are extracted from libraries in the list, any new libraries that those modules in turn reference are added to the end of the list, causing it to expand dynamically.

In other words, linking a program should normally require no more than specifying a set of w-files followed by -wlbused, i.e.

poplink foo.w baz.w ... -wlbused

which will cause all necessary libraries to be supplied automatically. When Poplink is run from Popc, the -wlbused option is added by the latter; thus the above is equivalent to

popc foo.w baz.w ...

or

popc foo.p baz.p ...

after source file compilation.

Additional Files Produced by Poplink

The linked global data structures generated by Poplink are output as additional object files. By default, these are created as temporaries and deleted afterwards. However, specifying the -p option causes them to be created as permanent files in the same directory as the image being linked, where they can be used to perform a 'quick' relink with the -q option. These files are

poplink_1.o poplink_2.o poplink_3.o poplink_4.o poplink_dat.o poplink_cmnd

The file poplink_cmnd is a CShell/DCL command file containing the O/S link command that was obeyed to link the executable image.

External Startup & Linking

As described in REF * POPC, Embedding Pop in C, Popc-compiled code may be linked into and called from a C program. There are two Poplink options to enable this: -exmain and -exlink.

On the one hand, -exmain simply tells Poplink that the program will start up in an external main function. Poplink does not then incorporate Pop's own main in the linked code, and one of your C modules from a -lo option must define it instead. Aside from this, Poplink behaves as normal.

-exlink, on the other hand, tells Poplink that it is not responsible for linking the final executable image at all. In this case, not only is Pop's main function omitted, but poplink_cmnd will simply contain a list of the object files and libraries needed by the Pop part of the program; this can then be supplied to any required linking command.

For example, in Unix it could be incorporated into a cc command, as follows:

% cc foo.o baz.o ... `cat poplink_cmnd`

In VMS, poplink_cmnd will be linker options file, which can be given directly to the linker with a /options qualifier:

$ link foo.obj baz.obj ... poplink_cmnd./options

Options

    -a      Produce the files poplink_*.a and poplink_cmnd only (implies
            -p).
    -e procedure-name
            Name of  the entry  procedure  to be  called on  startup  --
            defaults  to  $-Pop$-Main  if   not  specified.  The   entry
            procedure must be  declared as  'constant procedure'.  (Note
            that this option is not valid in combination with -exmain or
            -exlink.)
    -emb    External make base -- causes image-name.stb to be made. (For
            system use.)
    -exmain
    -exlink
            These options specify  external startup,  with -exlink  also
            specifying external linking. See External Startup &  Linking
            above; of necessity, the -exlink option also implies -ponly.
            (Note that these options are  not valid in combination  with
            -e.)
    -date date
            Date string to be  given to image, and  which will form  the
            last part of  popversion in  the linked  image. Defaults  to
            sysdaytime().
    -defc  idname=expr-list
    -defv  idname=expr-list
    -defcm idname=expr-list
    -defvm idname=expr-list
            Define (or declare) identifiers in the linked output  (where
            each idname  may  begin with  a  section pathname,  with  or
            without the leading $-).
Constant/variable and identprops are specified by the option: c = constant, v = variable, and m = macro (identprops default to 0 without m).
=expr can be omitted to merely declare an identifier. Otherwise, expr may be a Pop-11 expression consisting of any combination of integers, booleans, strings, words, lists and vectors. It should not reference any Pop identifiers except true, false and []. (In particular, note that these options do not declare identifiers in the Pop namespace, and so cannot be referred to themselves.)
    -ident integer
            Image identification value. (System use only.)
    -idexp letters
            Identifier export:  forces  identifiers  to  appear  in  the
            run-time  dictionary/section  tree.  letters  is  a   single
            argument (possibly empty) consisting of any of the following
            letters:
                w   Export all top-level identifiers whose name has been
                    used as a quoted word (this is the default).
s Export all syntax words.
m Export all macros.
    -lf arg-list
            O/S link  command flags  (these will  be added  to the  link
            command before  any  object file  arguments  specified  with
            -lo).
    -lo arg-list
            Other O/S  object  file  and library  arguments.  These  are
            merged with any exload  input files resulting from  external
            loads in program modules (see REF * EXTERNAL), and added  to
            the link command after the Pop object file arguments.
As with exload, an argument beginning with == is assumed to specify an environment variable/logical name, and is replaced by the list of strings (i.e. the exlibs result) returned by * sys_translate_exlibs applied to it.
If in addition the translation of any == environment variable specifies an X link type, then this determines the X link type for the program -- see Poplog Image X Link Specification in REF * X. If no such -lo argument is present, and Poplog modules containing X code have been incorporated into the program, the default will be ==POP_XLINK_EXLIBS. (It is an error if the resulting X link type is incompatible with that required by any module incorporated in the image.)
Note that the -x* options are shorthand for specifying
-lo ==POP_X*_EXLIBS
(-xlink thus corresponds to the default.)
    -noshare
            Link image without using shareable libraries.
    -o image-name
            Name of the executable image  to link. Defaults to a.out  in
            the current directory.
    -port   (System use only.)  For porting: implies  -a, and stops  the
            addition of $popexternlib/libpop.olb to the link command.
    -p      Causes  the  files  poplink_*.o   and  poplink_cmnd  to   be
            generated in the current directory (as described above), for
            use with a later 'quick' relink with -q.
    -ponly  Do Pop  part  of  link  only; similar  to  -p,  but  doesn't
            actually obey poplink_cmnd to link the image.
    -q      Following a link with  -p, do a  'quick' relink: instead  of
            redoing  the  Pop  part  of  the  link,  do  only  the   O/S
            object-file  link,  using   the  existing  poplink_?.o   and
            poplink_cmnd  files  (a   new  poplink_dat.o  is   generated
            however, since  this ensures  that the  image date  will  be
            different).
Note that this option can be used ONLY when no changes have been made to the declarations, initialisations, or locations of any permanent identifiers. (Otherwise, the data contained in the existing poplink_?.o files will be incorrect.)
(Note that you have to respecify the image name with this option, otherwise it defaults as for an ordinary link.)
    -s section-list
            Names of sections to be set up at run-time. All  identifiers
            in each section are exported to the dictionary.
    -tr     Trace loading, i.e. list w-files and w-library modules used.
            Where a w-library module is conditionally extracted (i.e. by
            virtue of defining an undefined identifier), the name of the
            identifier causing the extraction is given in brackets after
            the module name.
    -uses idname-list
            Mark the specified identifers  strongly used (forcing  their
            extraction from libraries,  etc). For each  idname, this  is
            equivalent to specifying the Pop-11 code
uses (idname);
somewhere in one or more program files.
    -ubn idname-list
            Uses  by  name  --  as  for  uses,  but  also  exports   the
            identifiers  to  the  dictionary  (like  -idexp).  For  each
            idname, this is equivalent to specifying the Pop-11 code
uses-by_name (idname);
somewhere in one or more program files.
    -unum letters
            Use number  keys: letters  is  a single  argument  (possibly
            empty) consisting of any of the following letters:
b biginteger_key r ratio_key f (d)decimal_key c complex_key
Thus -unum br is equivalent to
-uses ( biginteger_key ratio_key )
etc. The default is brf (i.e. you have to ask for complex_key explicitly).
    -wlb w-library-list
            Group of w-libraries for  recursive search extract. See  Use
            of W-Libraries above.
    -wlbused
            Stands for  the set  of w-libraries  used by  all  w-modules
            incorporated so far, as a -wlb group. See Use of W-Libraries
            above.
    -x_complete
            Special used by  the system pglink  command (only  operative
            for MIPS).
    -x*     Where * is a  sequence of lowercase alphanumeric,  specifies
            the type of X link, and is the same as supplying the option
-lo ==POP_X*_EXLIBS
where X* is the same in uppercase. See -lo above.
    w-library -in module-list
    w-library -ex module-list
            Following a  w-library  name,  unconditionally  incorporates
            modules from that library in the link, where module-list  is
            a list of module names.
-in means include only the named modules in the link.
-ex means include all modules from w-library in the link, excluding the named ones (thus an empty list ( ) for -ex means include all modules).

Poplibr

Poplibr creates and maintains Pop object libraries, where each library consists of two files, libname.wlb and libname.olb.

The format of a Poplibr command is

poplibr option w-library w-files

where option is one of the single options described below.

w-files is a sequence of w-file names. For each of these, the actual file name part (i.e. the sys_fname_name part) is used as the module name within the library; thus the whole argument is used by those options requiring an actual file (-c, -r, -x), whereas any directory path on the name is ignored by those options requiring only a module name (-d, -l, etc).

Options

    -c      Create w-library  from  w-files. w-library  must  not  exist
            already.
-d Delete the modules specified by w-files from w-library.
    -l      List the modules in w-library  specified by w-files (or  all
            modules if none specified).
    -lcs    For each module  in w-library specified  by w-files (or  all
            modules  if  none   specified),  list  the   names  of   the
            corresponding (.p  or .s)  source files  whose last  changed
            date is later than the module date.
-ld As -l, but give module dates.
-r Replace (or add) the specified w-files in w-library.
    -x      Extract the modules specified by w-files from w-library  (or
            all modules if none specified; in this case the w-files  are
            created in the current directory).

--- C.all/help/popc --- Copyright University of Sussex 1993. All rights reserved.