$! BUILD_VMS.COM
$!
$! I've taken the original build_vms.com, supplied by Nico Baggus, if
$! memory serves me correctly, and made some modifications.
$!
$! SSL support is controlled by logical names.  If SSL$INCLUDE is
$! defined, then it is assumed that HP's SSL product has been installed.
$! If OPENSSL is defined, but SSL$INCLUDE is not, then OpenSSL will be
$! used.  If neither logical name is defined, then SSL support will not
$! be compiled/linked in.  Command-line options NOHPSSL and NOSSL can be
$! specified to override the automatic SSL selection.
$!
$! Command-line Options:
$!
$!    CLEAN     Delete product files for this host architecture.  (No
$!              build done.)
$!    CLEAN_ALL Delete product files for all host architectures.  (No
$!              build done.)
$!
$!    64        Compile with 64-bit pointers.
$!    CCQUAL=x  Add "x" to the C compiler qualifiers.
$!    DEBUG     Compile and link with debug.
$!    IEEE      Use IEEE floating point.  (Alpha.)
$!    LARGE     Enable large-file support.  (Non-VAX, VMS >= V7.2.)
$!    LDAP      Enable LDAP support.
$!    LIST      Create C compiler listings and linker maps.
$!    NOHPSSL   Don't use HP SSL, even if available.
$!    NOSSL     Don't use any SSL, even if available.
$!    OSSLOLB   Use OpenSSL object libraries (.OLB), even if shared
$!              images (.EXE) are available.
$!
$! DCL Symbols:
$!
$!    CURL_CCDEFS="c_macro_1=value1 [, c_macro_2=value2 [...]]"
$!              Compile with these additional C macros defined.
$!
$! Revisions:
$!
$!  2-DEC-2003, MSK, the "original" version.
$!                   It works for me.  Your mileage may vary.
$! 13-JAN-2004, MSK, moved this procedure to the [.packages.vms] directory
$!                   and updated it to do hardware dependent builds.
$! 29-JAN-2004, MSK, moved logical defines into defines.com
$!  6-FEB-2004, MSK, put in various SSL support bits
$!  9-MAR-2004, MSK, the config-vms.h* files are now copied to the lib and
$!                   src directories as curl_config.h.
$! 15-MAR-2004, MSK, All of the curlmsg*.* files have also been moved to
$!                   this build directory.  They will be copied to the src
$!                   directory before build.  The .msg file will be compiled
$!                   to get the .obj for messages, but the .h and .sdl files
$!                   are not automatically created since they partly rely on
$!                   the freeware SDL tool.
$!  8-FEB-2005, MSK, merged the two config-vms.h* files into one that uses
$!                   USE_SSLEAY to define if the target has SSL support built
$!                   in.  Changed the cc/define parameter accordingly.
$! 11-FEB-2005, MSK, If [--.LIB]AMIGAOS.C and NWLIB.C are there, rename them
$! 23-MAR-2005, MSK, relocated cc_qual define so that DEBUG option would work
$! 25-APR-2007, STL, allow compilation in 64-bit mode.
$! 13-DEC-2009. SMS, Changed to skip unwanted source files without
$!                   renaming the original files.
$!                   Eliminated needless, persistent logical names.
$!                   Added CURL_CCDEFS DCL symbol for user-specified C
$!                   macro definitions.
$!                   Added CLEAN and CLEAN_ALL options.
$!                   Added CCQUAL option for user-specified C compiler
$!                   qualifiers.
$!                   Added IEEE option for IEEE floating point (Alpha).
$!                   Added LARGE option for large-file support.
$!                   Added OSSLOLB option, and support for OpenSSL
$!                   shared images.
$!                   Changed to put listing and map files into lisdir:.
$!                   Changed to avoid case confusion on ODS5 disks.
$!                   Added more default dev:[dir] save+restore.
$!                   Moved remaining "defines.com" code (back) into
$!                   here, eliminating the hard-coded OpenSSL nonsense.
$!                   Changed to use F$GETSYI( "ARCH_NAME") (or
$!                   equivalent) to name architecture-specific product
$!                   file destination directory, and to create the
$!                   directory if needed (obviating inclusion of these
$!                   directories and dummy files in the distribution
$!                   kit).
$!                   Changed the "compile" subroutine to break the CC
$!                   command across multiple lines to avoid DCL
$!                   line-too-long problems.
$!                   Changed "vo_c" messages to show the CC qualifiers
$!                   once, not with every compile command.
$!
$!
$! Save the original default dev:[dir], and arrange for its restoration
$! at exit.
$!
$ curl = ""
$ orig_def = f$environment( "DEFAULT")
$ on error then goto Common_Exit
$ on control_y then goto Common_Exit
$!
$ ctrl_y  = 1556
$ proc = f$environment( "PROCEDURE")
$ proc_dev_dir = -
   f$parse( proc, , , "DEVICE")+ f$parse( proc, , , "DIRECTORY")
$!
$! Verbose output message stuff.  Define symbol to "write sys$output" or "!".
$! vo_c - verbose output for compile
$! vo_l - link
$! vo_o - object check
$!
$ vo_c = "write sys$output"
$ vo_l = "write sys$output"
$ vo_o = "!"
$!
$! Determine the main distribution directory ("[--]") in an
$! ODS5-tolerant (case-insensitive) way.  (We do assume that the only
$! "]" is the one at the end.)
$!
$ set default 'proc_dev_dir'
$ set default [--]
$ top_dev_dir = f$environment( "DEFAULT")- "]"
$!
$! Define the architecture-specific product file destination directory
$! name(s).
$!
$ if (f$getsyi( "HW_MODEL") .lt. 1024)
$ then
$    arch_name = "VAX"
$ else
$    arch_name = ""
$    arch_name = arch_name+ f$edit( f$getsyi( "ARCH_NAME"), "UPCASE")
$    if (arch_name .eqs. "") then arch_name = "UNK"
$ endif
$!
$ exedir = proc_dev_dir- "]"+ ".''arch_name']"
$ lisdir = exedir
$ objdir = exedir
$!
$! Interpret command-line options.
$!
$ hpssl = 0
$ ldap = 0
$ list = 0
$ nohpssl = 0
$ nossl = 0
$ openssl = 0
$ osslolb = 0
$ cc_qual1 = ""
$ cc_qual2 = ""
$ cc_defs = "HAVE_CONFIG_H=1"
$ if (f$type( CURL_CCDEFS) .nes. "")
$ then
$    CURL_CCDEFS = f$edit( CURL_CCDEFS, "TRIM")
$    cc_defs = cc_defs+ ", "+ CURL_CCDEFS
$ endif
$ link_qual = ""
$ msg_qual = "/object = ''objdir'"
$ ssl_opt = ""
$!
$ arg = 1
$arg_loop:
$    p = "p''arg'"
$    arg_val = 'p'
$    if (arg_val .eqs. "") then goto arg_loop_out
$    arg_val = f$edit( arg_val, "upcase")
$!
$    if (arg_val .eqs. "CLEAN")
$    then
$       prods = "''exedir'*.*;*"
$       if (f$search( prods) .nes. "") then delete /log 'prods'
$       prods = proc_dev_dir+ arch_name+ ".DIR;1"
$       if (f$search( prods) .nes. "") then delete /log 'prods'
$       goto Common_Exit
$    endif
$!
$    if (arg_val .eqs. "CLEAN_ALL")
$    then
$       prods = proc_dev_dir- "]"+ ".ALPHA]*.*;*"
$       if (f$search( prods) .nes. "") then delete /log 'prods'
$       prods = proc_dev_dir+ "ALPHA"+ ".DIR;1"
$       if (f$search( prods) .nes. "") then delete /log 'prods'
$       prods = proc_dev_dir- "]"+ ".IA64]*.*;*"
$       if (f$search( prods) .nes. "") then delete /log 'prods'
$       prods = proc_dev_dir+ "IA64"+ ".DIR;1"
$       if (f$search( prods) .nes. "") then delete /log 'prods'
$       prods = proc_dev_dir- "]"+ ".VAX]*.*;*"
$       if (f$search( prods) .nes. "") then delete /log 'prods'
$       prods = proc_dev_dir+ "VAX"+ ".DIR;1"
$       if (f$search( prods) .nes. "") then delete /log 'prods'
$       goto Common_Exit
$    endif
$!
$    if (arg_val .eqs. "64")
$    then
$       cc_qual1 = cc_qual1+ " /POINTER = 64"
$       goto arg_loop_end
$    endif
$!
$    if (f$extract( 0, 6, arg_val) .eqs. "CCQUAL")
$    then
$       opts = f$edit( arg_val, "COLLAPSE")
$       eq = f$locate( "=", opts)
$       cc_qual2 = f$extract( (eq+ 1), 1000, opts)
$       goto arg_loop_end
$    endif
$!
$    if (arg_val .eqs. "DEBUG")
$    then
$       cc_qual1 = cc_qual1+ " /debug /nooptimize"
$       link_qual = link_qual+ " /debug"
$       goto arg_loop_end
$    endif
$!
$    if (arg_val .eqs. "IEEE")
$    then
$       cc_qual1 = cc_qual1+ " /FLOAT = IEEE_FLOAT"
$       goto arg_loop_end
$    endif
$!
$    if (arg_val .eqs. "LARGE")
$    then
$       if (arch_name .eqs. "VAX")
$       then
$          write sys$output """LARGE"" is ignored on VAX."
$       else
$          cc_defs = cc_defs+ ", _LARGEFILE=1"
$       endif
$       goto arg_loop_end
$    endif
$!
$    if (arg_val .eqs. "LDAP")
$    then
$       ldap = 1
$       goto arg_loop_end
$    endif
$!
$    if (f$extract( 0, 4, arg_val) .eqs. "LIST")
$    then
$       list = 1
$       cc_qual1 = cc_qual1+ " /list = ''lisdir' /show = (all, nomessages)"
$       link_qual = link_qual+ " /map = ''lisdir'"
$       msg_qual = msg_qual+ " /list = ''lisdir'"
$       goto arg_loop_end
$    endif
$!
$    if (arg_val .eqs. "NOHPSSL")
$    then
$       nohpssl = 1
$       goto arg_loop_end
$    endif
$!
$    if (arg_val .eqs. "NOSSL")
$    then
$       nossl = 1
$       goto arg_loop_end
$    endif
$!
$    if (arg_val .eqs. "OSSLOLB")
$    then
$       osslolb = 1
$       goto arg_loop_end
$    endif
$!
$    write sys$output "Unrecognized command-line option: ''arg_val'"
$    goto Common_Exit
$!
$arg_loop_end:
$ arg = arg+ 1
$ goto arg_loop
$arg_loop_out:
$!
$! CC /LIST, LINK /MAP, and MESSAGE /LIST are defaults in batch mode,
$! so be explicit when they're not desired.
$!
$ if (list .eq. 0)
$ then
$    cc_qual1 = cc_qual1+ " /nolist"
$    link_qual = link_qual+ " /nomap"
$    msg_qual = msg_qual+ " /nolist"
$ endif
$!
$! Create product directory, if needed.
$!
$ if (f$search( proc_dev_dir+ arch_name+ ".DIR;1") .eqs. "")
$ then
$    create /directory 'exedir'
$ endif
$!
$! Detect available (but not prohibited) SSL software.
$!
$ if (.not. nossl)
$ then
$    if (f$trnlnm( "OPENSSL") .nes. "")
$    then
$       cc_defs = cc_defs+ ", USE_SSLEAY=1"
$       if ((f$trnlnm( "SSL$INCLUDE") .nes. "") .and. (.not. nohpssl))
$       then
$!         Use HP SSL.
$          hpssl = 1
$          ssl_opt = ", ''proc_dev_dir'hpssl_"+ -
            f$getsyi("ARCH_NAME")+ ".opt /options"
$       else
$!         Use OpenSSL.  Assume object libraries, unless shared images
$!         are found (and not prohibited).
$          openssl = 1
$          ssl_opt = ", ssllib:libssl.olb /library"+ -
            ", ssllib:libcrypto.olb /library"
$          if (osslolb .eq. 0)
$          then
              if ((f$search( "ssllib:ssl_libcrypto.exe") .nes. "") .and. -
               (f$search( "ssllib:ssl_libssl.exe") .nes. ""))
$             then
$!               OpenSSL shared images with "SSL_xxx.EXE names.
$                openssl = 2
$                ssl_opt = ", ''proc_dev_dir'openssl_ssl_"+ -
                  f$getsyi("ARCH_NAME")+ ".opt /options"
$             else
$                if ((f$search( "ssllib:libcrypto.exe") .nes. "") .and. -
                  (f$search( "ssllib:libssl.exe") .nes. ""))
$                then
$!                  OpenSSL shared images with "xxx.EXE names.
$                   openssl = 3
$                   ssl_opt = ", ''proc_dev_dir'openssl_"+ -
                     f$getsyi("ARCH_NAME")+ ".opt /options"
$                endif
$             endif
$          endif
$       endif
$    endif
$ endif
$!
$! LDAP.
$!
$ if (ldap .eq. 0)
$ then
$    cc_defs = cc_defs+ ", CURL_DISABLE_LDAP=1"
$ endif
$!
$! Form CC qualifiers.
$!
$ cc_defs = "/define = (''cc_defs')"
$ cc_qual2 = cc_qual2+ " /object = ''objdir'"+ -
   " /include = ([-.lib], [-.src],"+ -
   " [-.packages.vms], [-.packages.vms.''arch_name'])"
$!
$ 'vo_c' "CC opts:", -
  " ''cc_defs'", -
  " ''cc_qual1'", -
  " ''cc_qual2'"
$!
$! Inform the victim of our plans.
$!
$ if (hpssl)
$ then
$    'vo_c' "%CURL-I-BLDHPSSL, building with HP SSL support"
$ else
$    if (openssl .ne. 0)
$    then
$       if (openssl .eq. 1)
$       then
$          'vo_c' -
 "%CURL-I-BLDOSSL_OLB, building with OpenSSL (object library) support"
$       else
$          'vo_c' -
 "%CURL-I-BLDOSSL_EXE, building with OpenSSL (shared image) support"
$       endif
$    else
$       'vo_c' "%CURL-I-BLDNOSSL, building with NO SSL support"
$    endif
$ endif
$!
$! Announce destination and SSL directories.
$!
$ 'vo_c' "   OBJDIR = ''objdir'"
$ 'vo_c' "   EXEDIR = ''exedir'"
$!
$ if (openssl .ne. 0)
$ then
$    ssllib = f$trnlnm( "ssllib")
$    if (ssllib .eqs. "")
$    then
$        ssllib = "(undefined)"
$    endif
$    'vo_c' "   SSLLIB = ''ssllib'"
$!
$    if (openssl .eq. 1)
$    then
$       ossl_lib1 = f$trnlnm( "ssllib")+ "LIBSSL.OLB"
$       ossl_lib2 = f$trnlnm( "ssllib")+ "LIBCRYPTO.OLB"
$       msg = "object libraries"
$    else
$       if (openssl .eq. 2)
$       then
$          ossl_lib1 = f$trnlnm( "ssllib")+ "SSL_LIBSSL.EXE"
$          ossl_lib2 = f$trnlnm( "ssllib")+ "SSL_LIBCRYPTO.EXE"
$       else
$          ossl_lib1 = f$trnlnm( "ssllib")+ "LIBSSL.EXE"
$          ossl_lib2 = f$trnlnm( "ssllib")+ "LIBCRYPTO.EXE"
$       endif
$       msg = "shared images"
$    endif
$    if ((f$search( ossl_lib1) .eqs. "") .or. -
      (f$search( ossl_lib2) .eqs. ""))
$    then
$       write sys$output "Can't find OpenSSL ''msg':"
$       write sys$output "   ''ossl_lib1'"
$       write sys$output "   ''ossl_lib2'"
$       goto Common_Exit
$    endif
$ endif
$!
$! Define the "curl" (process) logical name for "#include <curl/xxx.h>".
$!
$ curl = f$trnlnm( "curl", "LNM$PROCESS")
$ if (curl .nes. "")
$ then
$    write sys$output ""
$    write sys$output -
 "Process logical name ""curl"" is already defined, but this procedure"
$    write sys$output -
 "would override that definition.  Use a command like"
$    write sys$output -
 "      deassign /process curl"
$    write sys$output -
 "to cancel that logical name definition, and then and re-run this procedure."
$    write sys$output ""
$    goto Common_Exit
$ endif
$ define curl 'top_dev_dir'.include.curl]
$!
$! Copy the VMS-specific config file into the product directory.
$!
$ call MoveIfDiff 'top_dev_dir'.lib]config-vms.h 'objdir'curl_config.h
$!
$ on control_y then goto Common_Exit
$!
$ set default 'proc_dev_dir'
$ call build "[--.lib]" "*.c" "''objdir'CURLLIB.OLB" "amigaos, nwlib, nwos"
$ if ($status .eq. ctrl_y) then goto Common_Exit
$ call build "[--.src]" "*.c" "''objdir'CURLSRC.OLB"
$ if ($status .eq. ctrl_y) then goto Common_Exit
$ call build "[]" "*.msg" "''objdir'CURLSRC.OLB"
$ if ($status .eq. ctrl_y) then goto Common_Exit
$!
$ ldap_opt = ""
$ if (ldap .ne. 0) then ldap_opt = ", ''proc_dev_dir'ldap.opt /options"
$!
$ if (openssl .ne. 0)
$ then
$    if (openssl .eq. 1)
$    then
$       'vo_l' "%CURL-I-LINK_OSSL, linking with OpenSSL (object library)"
$    else
$       'vo_l' "%CURL-I-LINK_HPSSL, linking with OpenSSL (shared image)"
$    endif
$ else
$    if (hpssl)
$    then
$       'vo_l' "%CURL-I-LINK_HPSSL, linking with HP SSL"
$    else
$       'vo_l' "%CURL-I-LINK_NOSSL, linking with NO SSL support"
$    endif
$ endif
$!
$ link 'link_qual' /executable = 'exedir'CURL.EXE -
   'objdir'curlsrc.olb /library /include = (main, curlmsg), -
   'objdir'curllib.olb /library -
   'ssl_opt' -
   'ldap_opt'
$!
$ goto Common_Exit
$!
$! Subroutine to build everything with a filetype passed in via P2 in
$! the directory passed in via P1 and put it in the object library named
$! via P3.  Exclude items in P4.
$!
$build:   subroutine
$    build_def = f$environment( "default")
$    on control_y then goto EndLoop ! SS$_CONTROLY
$    sts = 1 ! SS$_NORMAL.
$!    set noon
$    set default 'p1'
$    search = p2
$    reset = f$search("reset")
$    if f$search( p3) .eqs. ""
$    then
$       librarian /create /object 'p3'
$    endif
$    reject_list__ = ","+ f$edit( p4, "COLLAPSE, UPCASE")+ ","
$    reject_list___len = f$length( reject_list__)
$    reset = f$search( "reset", 1)
$Loop:
$    file = f$search( search, 1)
$    if file .eqs. "" then goto EndLoop
$!      Skip a name if it's in the P4 exclusion list.
$       if (p4 .nes. "")
$       then
$          name__ = ","+ -
            f$edit( f$parse( file, , , "NAME", "SYNTAX_ONLY"), "UPCASE")+ -
            ","
$          if (f$locate( name__, reject_list__) .lt. reject_list___len)
$          then
$             goto Loop
$          endif
$       endif
$       objfile = f$parse( "''objdir'.OBJ;", file)
$       obj = f$search( objfile, 2)
$       if (obj .nes. "")
$       then
$          if (f$cvtime(f$file(file,"rdt")) .gts. f$cvtime(f$file(obj,"rdt")))
$          then
$             call compile 'file'
$             sts = $status
$             if .not. sts
$             then
$                goto EndLoop
$             endif
$             librarian /object 'p3' 'objfile'
$          else
$             'vo_o' "%CURL-I-OBJUTD, ", objfile, " is up to date"
$          endif
$       else
$          'vo_o' "%CURL-I-OBJDNE, ", file, " does not exist"
$          call compile 'file'
$          sts = $status
$          if .not. sts
$          then
$             goto EndLoop
$          endif
$          librarian /object 'p3' 'objfile'
$       endif
$    goto Loop
$EndLoop:
$!!!    purge
$    set default 'build_def'
$    exit 'sts'
$ endsubroutine   ! Build
$!
$! Based on the file TYPE, do the right compile command.
$! Only C and MSG supported.
$!
$compile:   subroutine
$    on control_y then return ctrl_y ! SS$_CONTROLY
$!    set noon
$    file = p1
$    qual = p2+ p3+ p4+ p5+ p6+ p7+ p8
$    typ = f$edit( f$parse( file, , , "TYPE"), "UPCASE") - "."
$    if (typ .eqs. "C")
$    then
$       'vo_c' "CC (opts) ", file
$       CC 'cc_defs' -
         'cc_qual1' -
         'cc_qual2' -
         'file'
$    else
$       cmd_msg = "MESSAGE "+ msg_qual
$       x = cmd_'typ'
$       'vo_c' x," ",file
$       'x' 'file'
$    endif
$ ENDSUBROUTINE   ! Compile
$!
$! Do a diff of the file specified in P1 with that in P2.  If different
$! copy P1 to P2.  This also covers if P2 doesn't exist, but not if P2
$! is an invalid filespec.
$!
$MoveIfDiff:  subroutine
$    set NoOn
$    define /user_mode sys$error nl:
$    define /user_mode sys$output nl:
$    differences 'p1' 'p2'
$    status = $status
$    if ( status .ne. %X006C8009) ! if status is not "no diff"
$    then
$       copy 'p1' 'p2'
$       purge /nolog 'p2'
$    endif
$    on control_y then return ctrl_y ! SS$_CONTROLY
$ ENDSUBROUTINE   ! MoveIfDiff
$!
$Common_Exit:
$ set default 'orig_def'
$ if ((curl .eqs. "") .and. (f$trnlnm( "curl", "LNM$PROCESS") .nes. ""))
$ then
$    deassign curl
$ endif
$ exit
