bionic (1) mkpkg.1.gz

Provided by: iraf-dev_2.16.1+2018.03.10-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.