Provided by: iraf-dev_2.16.1+2018.11.01-2_amd64 bug

NAME

       mkpkg - make or update an IRAF package or library

SYNOPSIS

       mkpkg [options] [ module ...  ] [ name=value ...  ]

ARGUMENTS

       -d[ddd]
              Debug  mode.   Print  detailed  messages describing what mkpkg is doing.  There are
              four levels of debug messages, selected by  repeating  the  "d"  character  in  the
              switch, e.g., "-d" is level one, "-dd" is level two, and so on.  The debug messages
              get  progressively  more  detailed  as  the  debug  level  increases.   Debug  mode
              automatically enables the verbose mode messages.

       -f file
              Set  the  name of the file to be interpreted (default: "mkpkg").  The special value
              "stdin" (lower case) allows commands to be entered interactively from the  standard
              input, e.g., for debugging mkpkg.

       -i     Ignore errors.  Execution continues even if an error occurs.  In most cases it does
              anyhow, so this switch has little effect at present.

       -n     No execute.  Go through the motions, but do not touch any files.  No  execute  mode
              automatically  enables  verbose  mode  (flag  "-v").  This switch should be used to
              verify new mkpkg files before execution.

       -p pkgname
              Load the package environment for the named external package, e.g., "mkpkg  -p  noao
              update".   If  the  same  package  is  always specified the environment variable or
              logical name PKGENV may be defined at the host level to accomplish the same  thing.
              The  package  name must be specified when doing software development in an external
              or layered package.

       -u [AOSVS/IRAF only]
              Forcibly update the dates of improperly dated library modules.  This option is used
              when a binary archive is restored on a machine which cannot restore the file modify
              dates.  In this case, all source file dates would  appear  to  have  been  modified
              since the libraries were updated, causing all sources to be recompiled.  By running
              mkpkg with the -u flag, one can update the library module dates without recompiling
              the  associated  files.  This is done by setting the date of each library module to
              be no older than the file hlib$iraf.h, which should be "touched" after  the  system
              has  fully  been  restored  to disk to mark the installation time.  Note that files
              which have been modified since the system was restored to disk will still cause the
              affected library modules to be updated, even when the -u flag is specified.

       -v     Verbose  mode.   A message is printed whenever a file is touched.  Recommended when
              running large mkpkg jobs in batch mode.

       module The names of the module or modules (named  entries  in  the  "mkpkg"  file)  to  be
              executed.  If no module is named the first module encountered is executed, unless a
              mkpkg macro preprocessor directive  at  the  beginning  of  the  file  specifies  a
              different default action.

       name=value [name=value ...]
              Enter  the  named  symbol/value  pair  into  the  symbol  table  of the mkpkg macro
              preprocessor.  The symbols XFLAGS (for the XC compiler) and LFLAGS (for the linker)
              are predefined but may be redefined on the command line.  Case is ignored in symbol
              names for portability reasons.

DESCRIPTION

       The mkpkg utility is used to make or update IRAF packages or libraries.  mkpkg is used  to
       bootstrap  the  IRAF  system  hence is implemented as a foreign task, callable either from
       within the IRAF environment or from the host system.  Usage is identical  in  either  case
       (except  that  the  details  of when a particular argument may need to be quoted will vary
       depending on the command language used).  mkpkg is upwards compatible with the  old  mklib
       utility.

1. Introduction

       Mkpkg provides two major facilities: a library update capability and a macro preprocessor.
       The macro preprocessor provides symbol definition and replacement, conditional  execution,
       and  a  number of builtin commands.  The usefulness of these facilities is enhanced by the
       ability of mkpkg to update entire directory trees, or to  enter  the  hierarchy  of  mkpkg
       descriptors  at any level.  For example, typing "mkpkg" in the root directory of IRAF will
       make or update the entire system, whereas in the "iraf$sys" directory  mkpkg  will  update
       only  the system libraries, and in the "iraf$sys/fio" directory mkpkg will update only the
       FIO portion of the system library "libsys.a".

       The mkpkg utility is quite simple to use to maintain small packages or libraries,  despite
       the complexity of the discussion which follows.  The reader is encouraged to study several
       examples of working mkpkg-files before reading further; examples will be found  throughout
       the IRAF system.  The mkpkg files for applications packages tend to be very similar to one
       another, and it is quite possible to successfully copy  and  modify  the  mkpkg-file  from
       another package without studying the reference information given here.

2. Lexical Conventions

       The  lexical  conventions  employed in mkpkg are those used throughout IRAF.  Comments may
       occur anywhere, begin with the character #, and extend to the end  of  the  current  line.
       Blank  lines  are  ignored virtually everywhere.  Newline may be escaped with backslash to
       continue on the next line.  All filenames are IRAF virtual filenames  with  the  following
       extensions.

               .a          object library
               .c          C source
               .e          executable (e.g., "x_package.e")
               .f          Fortran source
               .gc         generic C source
               .gx         generic SPP source
               .h          C or SPP header file
               .inc        include file
               .l          Lex source
               .o          object file
               .r          Ratfor source
               .s          assembler source
               .y          Yacc source

       Since mkpkg is an IRAF utility it recognizes the major IRAF logical directories; these are
       summarized in the list below.  The IRAF (or UNIX) pathname convention is used  to  specify
       pathnames rooted in the current directory or a logical directory.

               as$         where .s files go             host$as/
               bin$        installed executables         iraf$bin/
               dev$        device tables                 iraf$dev/
               hlib$       machdep header files          host$hlib/
               host$       host system interface         [MACHDEP]
               iraf$       the root directory of IRAF    [MACHDEP]
               lib$        system library                iraf$lib/
               math$       math sources                  iraf$math/
               pkg$        applications packages         iraf$pkg/
               sys$        the VOS, system libraries     iraf$sys/
               tmp$        where temporary files go      [MACHDEP]

       All  other  directories  should  be  referenced by giving the path from either the current
       directory or from one of  the  system  logical  directories  shown  above.   For  example,
       "pkg$system/"  is  the root directory of the SYSTEM package, and ".." is the directory one
       level up from the current directory.

3. Maintaining Libraries with MKPKG

       Libraries are described by a member list module in the "mkpkg"  file.   The  syntax  of  a
       library  member list module is shown below.  Note that the mkpkg module name for a library
       member list module is the same as the name of the actual library, hence must end with  the
       extension ".a".

               libname.a:
                   member1         dep1 dep2 ... depN
                   member2         dep1 dep2 ... depN
                     ...
                   memberN         dep1 dep2 ... depN
                   ;

       Here,  "libname.a"  is  the  IRAF  virtual  filename  of  the  library (regardless of what
       directory it resides in), "memberN" is the name of a source file  which  may  contain  any
       number  of  actual library object modules, and "depN" is the name of a file upon which the
       named  member  depends.   If  any  of  the  named  dependency  files  is  newer  than  the
       corresponding  member source file, or if the member source file is newer than the compiled
       library object module, the source file is recompiled and replaced in  the  library.   Both
       source  files  and  dependency  files  may  reside  in  remote  directories.  The names of
       dependency  files  in  system  libraries  should  be  enclosed  in  <>  delimiters,  e.g.,
       "<fset.h>".  Each member must be described on a separate line.

       If  the  library  being  updated  does not reside in the current directory (directory from
       which the "mkpkg" command was entered) then the library  must  be  "checked  out"  of  the
       remote  directory before it can be updated, and checked back in when updating is complete.
       These operations are performed by macro preprocessor directives, e.g.:

               $checkout libsys.a lib$
               $update   libsys.a
               $checkin  libsys.a lib$
               $exit

               libsys.a:
                   @symtab      # update libsys.a in ./symtab
                   brktime.x    <time.h>
                   environ.x    environ.com environ.h <ctype.h>
                                <fset.h> <knet.h>
                   main.x       <clset.h> <config.h> <ctype.h>
                                <error.h> <fset.h> <knet.h>
                                <printf.h> <xwhen.h>
                   onentry.x    <clset.h> <fset.h> <knet.h>
                   spline.x     <math.h> <math/interp.h>
                   ;

       Note that the checkout operation is required only in the directory from which the  "mkpkg"
       command was entered, since the library has already been checked out when the mkpkg-file in
       a subdirectory is called to update its portion of the library (as in the "@symtab" in  the
       example  above).  The checkout commands should however be included in each mkpkg-file in a
       hierarchy in such a way that the library will be automatically checked out and back in  if
       mkpkg  is run from that directory.  The checkout commands are ignored if the mkpkg-file is
       entered when updating the library from a higher level, because in  that  case  mkpkg  will
       search  for  the  named entry for the library being updated, ignoring the remainder of the
       mkpkg-file.

       Sometimes it is necessary or desirable to break the library member list up  into  separate
       modules  within  the  same mkpkg-file, e.g., to temporarily change the value of the symbol
       XFLAGS when compiling certain modules.  To do this use the "@" indirection operator in the
       primary  module  list  to  reference  a  named  sublist,  as in the example below.  Normal
       indirection cannot be used unless the sublist resides in a subdirectory or in a  different
       file  in  the current directory, e.g., "@./mki2", since a single mkpkg-file cannot contain
       two modules with the same name.  The same restrictions apply to the $update operator.

               libpkg.a:
                   @(i2)
                   alpha.x
                   beta.x
                   zeta.f
                   ;
               i2:
                   $set    XFLAGS = "-cO -i2"
                   gamma.f
                   delta.f
                   ;

       In the example above five object modules are to be updated in the library "libpkg.a".  The
       files  listed in module "i2", if out of date, will be compiled with the nonstandard XFLAGS
       (compiler flags) specified by the $set statement shown.

4. The MKPKG Macro Preprocessor

       The mkpkg macro preprocessor provides a simple recursive symbol definition and replacement
       facility,  an  include  file  facility,  conditional  execution  facilities,  an OS escape
       facility, and a number of builtin directives.  The names of  the  preprocessor  directives
       always  begin  with a dollar sign; whitespace is not permitted between the dollar sign and
       the remainder of the name.  Several preprocessor directives may be given on  one  line  if
       desired.   Preprocessor  directives  are  executed as they are encountered, and may appear
       anywhere, even in the member list for a library.

4.1. Symbol Replacement

       Symbol substitution in the mkpkg macro preprocessor is carried out at the character  level
       rather than at the token level, allowing macro expansion within tokens, quoted strings, or
       OS escape commands.  Macros are recursively expanded but may not have arguments.

       Macros may be defined on the mkpkg command line, in  the  argument  list  to  a  $call  or
       $update  directive (see below), in an include file referenced with the $include directive,
       or in a $set directive.  All symbols are global and hence available  to  all  lower  level
       modules,  but  symbols  are  automatically discarded whenever a module exits, hence cannot
       affect higher level modules.  A local symbol may redefine  a  previously  defined  symbol.
       The IRAF and host system environment is treated as an extension of the mkpkg symbol table,
       i.e., a logical directory such as "iraf" may be referenced like a locally defined symbol.

       Macro replacement occurs only when explicitly indicated in  the  input  text,  as  in  the
       following  example,  which  prints  the  pathname  of  the  dev$graphcap file on the mkpkg
       standard output.  The sequence "$(" triggers macro substitution.  The value  of  a  symbol
       may  be obtained interactively from the standard input by adding a question mark after the
       left parenthesis, i.e., "$(?terminal)" (this does not work with the -f stdin  flag).   The
       contents  of  a  file  may  be included using the notation "$(@file)".   Note that case is
       ignored in macro names; by convention, logical directories are  normally  given  in  lower
       case, and locally defined symbols in upper case.

               $echo $(dev)graphcap
               !xc $(XFLAGS) filea.x fileb.x

       Symbols are most commonly defined locally with the $set directive.  The $include directive
       is useful for sharing symbols amongst different modules,  or  for  isolating  any  machine
       dependent   definitions   in  a  separate  file.   The  IRAF  mkpkg  system  include  file
       hlib$mkpkg.inc is automatically included whenever mkpkg is run.

       $set symbol = value
              Enter the named symbol into the symbol table with  the  given  string  value.   Any
              existing  symbol  will  be silently redefined.  Symbols defined within a module are
              discarded when the module exits.

       $include filename
              Read commands (e.g., $set directives) from the named  include  file.   The  include
              filename  may be any legal virtual filename, but only the major logical directories
              are recognized, e.g., "iraf$", "host$", "hlib$", "lib$", "pkg$", and so on.

              The use of the $set directive is  illustrated  in  the  example  below.   Note  the
              doubling  of  the preprocessor metacharacter to avoid macro expansion when entering
              the value of the GEN macro into the symbol table.  The sequence "$$" is replaced by
              a single "$" whenever it is encountered in the input stream.

                      $set GFLAGS = "-k -t silrdx -p ak/"
                      $set GEN    = "$generic $$(GFLAGS)"

                      ifolder (amulr.x, amul.x) $(GEN) amul.x $endif

4.2 Conditional Execution

       Conditional  control  flow  is  implemented  by  the $if directives introduced in the last
       example and described below.  The character "n" may be inserted after the "$if" prefix  of
       any  directive  to  negate  the sense of the test, e.g., "$ifndef" tests whether the named
       symbol does not exist.  Nesting is permitted.

       $ifdef (symbol [, symbol, ...])

              Test for the existence of one of the named symbols.

       $ifeq (symbol, value [, value, ...])

              Test if the value of the named symbol matches one of the listed value strings.

       $iferr

              Test for an error return from the last directive executed which touched a file.

       $iffile (file [, file, ...])

              Test for the existence of any of the named files.

       $ifnewer (file, filea)
       $ifnewer (file: filea [, fileb, ...])

              Test if the named file is newer (has been modified more recently) than any  of  the
              named  files to the right.  The colon syntax may be used for clarity when comparing
              one file to many, but a comma will do.

       $ifolder (file, filea)
       $ifolder (file: filea [, fileb, ...])

              Test if the named file is older than any of the named files.

       $else

              Marks the else clause of an if statement.  The else-if construct is implemented  as
              "$else $if", i.e., as a combination of the two more primitive constructs.

       $endif

              Terminates a $if or $if-$else statement.

       $end

              Terminates an arbitrary number of $if or $if-$else statements.  This is most useful
              for terminating a long list of $if-$else clauses, where the alternative would be  a
              long string of $endif directives.

       $exit  Terminate  the  current  program;  equivalent  to  a  semicolon,  but the latter is
              normally used only at the end of the program to match the colon at  the  beginning,
              whereas $exit is used in conditionals.

4.3 Calling Modules

       The  following preprocessor directives are available for calling mkpkg modules or altering
       the normal flow of control.

       $call module[@subdir[/file]] [name=value ...]

              Call the named mkpkg-file module as a subroutine.  In most cases the called  module
              will  be  in  the  current  mkpkg-file, but the full module name syntax permits the
              module to be in any file of any subdirectory ("./file" references a different  file
              in  the current directory).  Arguments may be passed to the called module using the
              symbol definition facility; any symbols defined in this fashion  are  available  to
              any modules called in turn by the called module, but the symbols are discarded when
              the called module returns.

       $update module[@subdir[/file]] [name=value ...]

              Identical to $call except that the named module  is  understood  to  be  a  library
              member  list.   The  current  value of the symbol XFLAGS is used if XC is called to
              compile any files.  If the named library does not exist  one  will  be  created  (a
              warning message is issued).

       $goto

              Causes  execution  to resume at the line following the indicated label.  The syntax
              of a goto label is identical to that of a mkpkg-file  module  name,  i.e.,  a  line
              starting   with   the  given  name  followed  by  a  colon.   The  $goto  statement
              automatically cancels any $if nesting.

4.4 Preprocessor Directives

       The  remaining  preprocessor  directives  are  described  below  in  alphabetical   order.
       Additional  capability  is  available  via  OS  escapes,  provided  the  resultant machine
       dependence is acceptable.

       $echo message

              Print the given message string on the standard output.  The string must  be  quoted
              if it contains any spaces.

       $checkout file directory

              Check  the named file out of the indicated directory.  The checkout operation makes
              the file accessible as if it were in the current directory; checkout is implemented
              either  as  a  symbolic  link  or  as  a physical file copy depending upon the host
              system.  The referenced directory may be a logical directory, e.g.,  "lib$",  or  a
              path, e.g, "pkg$images/".  Checkout is not disabled by the "-n" flag.

       $checkin file directory

              Check  the  named file back into the indicated directory.  The checkin operation is
              implemented either as a remove link or copy and  delete  depending  upon  the  host
              system.  Checkin is not disabled by the "-n" flag.

       $copy filea fileb

              Make  a  copy  fileb of the existing file filea.  On a UNIX host the copy operation
              will preserve the file modify date if the file is a library (to avoid  the  "symbol
              table out of date" syndrome).

       $delete file [file ...]

              Delete the named file or files.

       $generic [-k] [-p prefix] [-t types] [-o root] files

              Run  the  generic  preprocessor on the named files.  The generic preprocessor is an
              IRAF bootstrap utility and may not be available on non-UNIX hosts.

       $link [switches] file1 file2 ... fileN [-o file.e]

              Call XC with the given argument list to link the  indicated  files  and  libraries.
              The  value  of  the  symbol LFLAGS (default value the null string) is automatically
              inserted at the beginning  of  the  command  line.   This  is  equivalent  to  "!xc
              $(LFLAGS) ...".

       $move file destination

              Move  the  named file to the indicated directory, or rename the file in the current
              directory.

       $omake file [dep1] [dep2 ...]

              Compile the named source file if it does not have a corresponding  object  file  in
              the  current  directory,  if  the  object  file  is  older, or if any of the listed
              dependency files are newer (or not found).  The current value of the symbol  XFLAGS
              is used if XC is called to compile the file.

       $purge directory

              Delete  all  old  versions of all files in the named directory.  Nothing is done if
              the system does not support multiple file versions.

       $special directory : filelist ;

              Add one or more files to the special file list for the  host  system.   This  is  a
              system  facility,  not  intended  for use in applications mkpkg files.  The special
              file list is a list of all source files needing special processing  for  the  local
              host  system.  Examples of special files are files which are optimized in assembler
              (or some other nonstandard language), or files which must be compiled in a  special
              way to get around bugs in a host compiler.  The special file list makes it possible
              to flag arbitrary files for  special  processing,  without  having  to  modify  the
              standard  software  distribution.   In  the  IRAF  system, the special file list is
              defined  in  the  file  "hlib$mkpkg.sf"  which   is   included   automatically   by
              "hlib$mkpkg.inc" whenever mkpkg is run.

              The syntax of a filelist entry is as follows:

                      modname source_file mkobj_command

              where modname is the filename of a library module as it appears in a library module
              list for the named directory, source_file is the virtual  pathname  of  the  source
              file  to  be  used  in  lieu  of  the  standard  portable  source file modname, and
              mkobj_command is the mkpkg command (e.g., $xc or an OS escape) to  be  executed  to
              compile  the  named  module.  The character "&" appearing in either the source file
              name or mkobj command is replaced by modname.  If the mkobj_command is omitted  the
              specified source file will be compiled with $XC using the current value of XFLAGS.

       $xc [switches] file1 file2 ... fileN

              Call the XC compiler to compile the named files.  Note that the value of the symbol
              XFLAGS is not used when XC is explicitly called in this fashion (XFLAGS is used  by
              $update and $omake).

       $debug [on|off]

              Turn  debug  mode  on  or off.  If no argument is supplied debug mode is turned on.
              Turning on debug mode automatically enables verbose mode.

       $verbose [on|off]

              Turn verbose mode on or off.  If no argument is supplied verbose mode is turned on.

5. Error Recovery

       mkpkg is implemented in such  a  way  that  it  is  restartable.   If  a  mkpkg  operation
       terminates  prematurely for some reason, e.g., because of a compile error, execution error
       (such as cannot find the mkpkgfile in a subdirectory), interrupt,  etc.,  then  the  mkpkg
       command  can  be  repeated  after  correcting  the error, without repeating the operations
       already completed.  If mkpkg is interrupted  it  may  leave  checked  out  files,  objects
       compiled  but not yet updated in a library, etc. lying about, but this is harmless and the
       intermediate files will be cleaned up when the errors have  been  corrected  and  the  run
       successfully completes.

       EXAMPLES
              Update the current package.

                      cl> mkpkg

              Update the package library but do not relink.

                      cl> mkpkg libpkg.a

              Make a listing of the package.

                      cl> mkpkg listing

              Sample mkpkg-file for the above commands:

                      # Make my package.

                      $call relink
                      $exit

                      relink:
                          $update libpkg.a
                          $omake  x_mypkg.x
                          $link   x_mypkg.o -lxtools
                          ;

                      libpkg.a:
                          task1.x     pkg.h
                          task2.x
                          filea.x     pkg.com pkg.h <fset.h>
                          fileb.x     pkg.com
                          ;

                      listing:
                          !pr task1.x task2.x file[ab].x | vpr -Pvup
                          ;

SEE ALSO

       generic(1), xc(1).

       There is also information in the README.softools in the IRAF documentation directory.

AUTHOR

       This manual page was taken from the IRAF mkpkg.hlp help file.