$! 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.
$!              Note, you must match the pointer size that the OpenSSL
$!              shared image expects.
$!              Currently curl is not building properly with 64 bit pointers
$!              on VMS because it is trying to cast pointers to 32 bit
$!              integers and some OpenVMS library routines called by curl
$!              do not yet support 64 bit pointers.
$!    CCQUAL=x  Add "x" to the C compiler qualifiers.
$!              Default qualifiers are:
$!                  /standard=relaxed
$!                  /names=(as_is, shortened)
$!                  /repository=[.'arch']
$!                  /nested_include_directory=none
$!                  /define=(_LARGEFILE=1,_USE_STD_STAT=1) (non-vax)
$!                  /float=ieee/ieee_mode=denorm_results (non-vax)
$!    DEBUG     Compile debug and nooptimize
$!              Alpha/IA64 always compiles /debug.
$!              Always link a debug image.
$!    NOIEEE    Do not use IEEE floating point.  (Alpha/I64)
$!              VAX must always use DFLOAT
$!    NOLARGE   Disable large-file support if large file support available.
$!              (Non-VAX, VMS >= V7.2.)
$!    NOLDAP    Disable LDAP support if LDAP is available.
$!    NOKERBEROS   Disable Kerberos support if Kerberos is available.
$!    LIST      Create C compiler listings and linker maps.
$!                 /list/show=(expan,includ)/machine
$!    FULLLIST  Full detailed listing.
$!                 /list/show=(all, nomessages)/machine
$!    NOHPSSL   Don't use HP SSL, even if available.
$!              Note, you must match the pointer size that the OpenSSL
$!              shared image expects.  This procedure will select the
$!              correct HP OpenSSL image.
$!    NOSSL     Don't use any SSL, even if available.
$!    OSSLOLB   Use OpenSSL object libraries (.OLB), even if shared
$!              images (.EXE) are available.
$!    NOZLIB    Don't use GNV$ZLIB shared image even if available.
$!    REALCLEAN Delete product files for all host architectures.  (No
$!              build done.)  Alias for CLEAN_ALL
$!
$! 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.
$! 01-Jan-2013  J. Malmberg
$!                   VMS build procedures need to be able to work with
$!                   the default set to a search list, with created or
$!                   modified files only in the first member of the search
$!                   list.
$!                   Whitespace change to be more compatible with current
$!                   practices.
$!                   One pass option parsing instead of loop.
$!                   GNV ZLIB shared image support.
$!                   KERBEROS support where available.
$!                   LDAP default to on where available
$!                   LARGEFILE default to on where available
$!                   IEEE float default to on where available.
$!                   Generate the curl_config.h file from system inspection.
$!                   Linker finds ldap with out option file.
$! 13-Mar-2013, Tom Grace
$!                   Added missing slash in cc_full_list.
$!                   Removed unwanted extra quotes inside symbol tool_main
$!                   for non-VAX architectures that triggered link failure.
$!                   Replaced curl_sys_inc with sys_inc.
$! 19-Mar-2013, John Malmberg
$!                   symbol tool_main needs to be quoted when parse style is
$!                   set to exended in versions of VMS greater than 7.3-1.
$!                   Remove curlbuild.h generation as it should be pre-built
$!                   in the curl release or daily tarball.
$! 12-Jul-2013, John Malmberg
$!                   Adjust to find and use ZLIB from the Jean-Francois
$!                   Pieronne shared image and newer GNV ZLIB kit that
$!                   is upward compatible with Jean-Francois's kit.
$!                   Remove tabs from file.
$!                   Fixed DCL formatting as follows:
$!                      * Labels have no space after leading $.
$!                      * 1 space after $ for first level.
$!                      * 3 spaces after $ for second level.  Line start + 4.
$!                      * 7 spaces after $ for third level.  Line start + 8.
$!                      * Each level after that indents 4 characters.
$!                      * then/else/endif same indentation as if statement.
$! 17-Nov-2014, Michael Steve
$!                   Modified build to handle new location of the VTLS lib
$!                   source within zip archive. Not a pretty fix.
$!
$!===========================================================================
$!
$!
$! 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_fid = f$file_attributes(proc, "FID")
$ proc_dev = f$parse(proc, , , "DEVICE")
$ proc_dir = f$parse(proc, , , "DIRECTORY")
$ proc_name = f$parse(proc, , , "NAME")
$ proc_type = f$parse(proc, , , "TYPE")
$ proc_dev_dir = proc_dev + proc_dir
$!
$! Have to manually parse the device for a search list.
$! Can not use the f$parse() as it will return the first name
$! in the search list.
$!
$ orig_def_dev = f$element(0, ":", orig_def) + ":"
$ if orig_def_dev .eqs. "::" then orig_def_dev = "sys$disk:"
$ test_proc = orig_def_dev + proc_dir + proc_name + proc_type
$!
$! If we can find this file using the default directory
$! then we know that we should use the original device from the
$! default directory which could be a search list.
$!
$ test_proc_fid = f$file_attributes(test_proc, "FID")
$!
$ if (test_proc_fid .eq. proc_fid)
$ then
$   proc_dev_dir = orig_def_dev + proc_dir
$ endif
$!
$!
$! 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
$! "]" or ">" is the one at the end.)
$!
$! Some non-US VMS installations report ">" for the directory delimiter
$! so do not assume that it is "]".
$!
$ orig_def_len = f$length(orig_def)
$ delim = f$extract(orig_def_len - 1, 1, orig_def)
$!
$ set default 'proc_dev_dir'
$ set default [--]
$ base_dev_dir = f$environment("default")
$ top_dev_dir = base_dev_dir - delim
$!
$!
$!
$! Define the architecture-specific product file destination directory
$! name(s).
$!
$ parse_style = "TRADITIONAL"
$ 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"
$!
$!   Extended parsing option starts with VMS 7.3-1.
$!   There is no 7.4, so that simplifies the parse a bit.
$!
$    node_swvers = f$getsyi("node_swvers")
$    version_patch = f$extract(1, f$length(node_swvers), node_swvers)
$    maj_ver = f$element(0, ".", version_patch)
$    min_ver_patch = f$element(1, ".", version_patch)
$    min_ver = f$element(0, "-", min_ver_patch)
$    patch = f$element(1, "-", min_ver_patch)
$    if patch .eqs. "-" then patch = ""
$    parse_x = 0
$    if maj_ver .ges. "8"
$    then
$       parse_x = 1
$    else
$       if maj_ver .eqs. "7" .and. min_ver .ges. "3" .and. patch .nes. ""
$       then
$          parse_x = 1
$       endif
$    endif
$    if parse_x
$    then
$       parse_style = f$getjpi("", "parse_style_perm")
$    endif
$ endif
$!
$ exedir = proc_dev_dir - delim + ".''arch_name'" + delim
$ lisdir = exedir
$ objdir = exedir
$!
$! When building on a search list, need to do a create to make sure that
$! the output directory exists, since the clean procedure tries to delete
$! it.
$ create/dir 'exedir'/prot=o:rwed
$!
$! Interpret command-line options.
$!
$ hpssl = 0
$ ldap = 1
$ list = 0
$ full_list = 0
$ nohpssl = 0
$ nossl = 0
$ openssl = 0
$ osslolb = 0
$ nozlib = 0
$ nokerberos = 0
$ cc_names = "/names=(shortened, as_is)/repository='exedir'
$ cc_defs = "HAVE_CONFIG_H=1"
$ cc_list = "/list='objdir'/show=(expan, includ)/machine
$ cc_full_list = "/list='objdir'/show=(all, nomessages)/machine
$ link_qual = ""
$ if arch_name .eqs. "VAX"
$ then
$    cc_debug = "/nodebug/optimize"
$    !cc_defs = cc_defs + ""
$    cc_float = ""
$    cc_large = ""
$ else
$    cc_debug = "/debug/optimize"
$    cc_defs = cc_defs + ",_USE_STD_STAT"
$    cc_float = "/float=ieee/ieee_mode=denorm_results"
$    cc_large = ",_LARGEFILE"
$ endif
$ cc_qual1 = ""
$ cc_qual2 = ""
$ if (f$type(CURL_CCDEFS) .nes. "")
$ then
$    CURL_CCDEFS = f$edit(CURL_CCDEFS, "TRIM")
$    cc_defs = cc_defs + ", " + CURL_CCDEFS
$ endif
$ msg_qual = "/object = ''objdir'"
$ ssl_opt = ""
$!
$! Allow arguments to be grouped together with comma or separated by spaces
$! Do no know if we will need more than 8.
$ args = "," + p1 + "," + p2 + "," + p3 + "," + p4 + ","
$ args = args + p5 + "," + p6 + "," + p7 + "," + p8 + ","
$!
$! Provide lower case version to simplify parsing.
$ args_lower = f$edit(args, "LOWERCASE,COLLAPSE")
$!
$ args_len = f$length(args)
$ args_lower_len = f$length(args_lower)
$!
$ clean = 0
$ if f$locate(",clean,", args_lower) .lt. args_lower_len
$ then
$   clean = 1
$ endif
$ clean_all = 0
$ if f$locate(",clean_all,", args_lower) .lt. args_lower_len
$ then
$    clean = 1
$    clean_all = 1
$ endif
$ if f$locate(",realclean,", args_lower) .lt. args_lower_len
$ then
$    clean = 1
$    clean_all = 1
$ endif
$!
$ if clean .ne. 0
$ 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 set prot=o:rwed 'prods'
$   if (f$search(prods) .nes. "") then delete /log 'prods'
$   file = "[]config_vms.h"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[]config.h"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[]curl-config."
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[]libcurl.pc"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[.lib.cxx_repository]cxx$demangler_db."
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[.src.cxx_repository]cxx$demangler_db."
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[.lib]config_vms.h"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]curl_crtl_init"
$   if f$search("''file'.lis") .nes. "" then delete/log 'file'.lis;*
$   if f$search("''file'.obj") .nes. "" then delete/log 'file'.obj;*
$   file = "[...]gnv$curlmsg"
$   if f$search("''file'.lis") .nes. "" then delete/log 'file'.lis;*
$   if f$search("''file'.obj") .nes. "" then delete/log 'file'.obj;*
$   if f$search("''file'.exe") .nes. "" then delete/log 'file'.exe;*
$   file = "[...]curlmsg"
$   if f$search("''file'.lis") .nes. "" then delete/log 'file'.lis;*
$   if f$search("''file'.obj") .nes. "" then delete/log 'file'.obj;*
$   if f$search("''file'.exe") .nes. "" then delete/log 'file'.exe;*
$   file = "[...]report_openssl_version"
$   if f$search("''file'.lis") .nes. "" then delete/log 'file'.lis;*
$   if f$search("''file'.obj") .nes. "" then delete/log 'file'.obj;*
$   if f$search("''file'.exe") .nes. "" then delete/log 'file'.exe;*
$   file = "[...]hp_ssl_release_info.txt"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]gnv_libcurl_xfer.mar_exact"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]gnv_libcurl_xfer"
$   if f$search("''file'.lis") .nes. "" then delete/log 'file'.lis;*
$   if f$search("''file'.obj") .nes. "" then delete/log 'file'.obj;*
$   if f$search("''file'.opt") .nes. "" then delete/log 'file'.opt;*
$   file = "[...]curl-*_original_src.bck"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]curl_d-*_original_src.bck"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]curl-*_vms_src.bck"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]curl_d-*_vms_src.bck"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]curl-*.release_notes"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]curl_d-*.release_notes"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]*curl*.pcsi$desc"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]*curl_d*.pcsi$desc"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]*curl*.pcsi$text"
$   if f$search(file) .nes. "" then delete/log 'file';*
$   file = "[...]*curl_d*.pcsi$text"
$   if f$search(file) .nes. "" then delete/log 'file';*
$!
$   if clean_all .eq. 0 then goto Common_Exit
$ endif
$!
$!
$ if clean_all .ne. 0
$ then
$   file = "[...]gnv$libcurl"
$   if f$search("''file'.exe") .nes. "" then delete/log 'file'.exe;*
$   if f$search("''file'.map") .nes. "" then delete/log 'file'.map;*
$   if f$search("''file'.dsf") .nes. "" then delete/log 'file'.dsf;*
$   file = "[.src]curl"
$   if f$search("''file'.exe") .nes. "" then delete/log 'file'.exe;*
$   if f$search("''file'.map") .nes. "" then delete/log 'file'.map;*
$   if f$search("''file'.dsf") .nes. "" then delete/log 'file'.dsf;*
$   prods = proc_dev_dir - delim + ".ALPHA" + delim + "*.*;*"
$   if (f$search(prods) .nes. "") then delete /log 'prods'
$   prods = proc_dev_dir + "ALPHA" + ".DIR;1"
$   if (f$search(prods) .nes. "") then set prot=o:rwed 'prods'
$   if (f$search(prods) .nes. "") then delete /log 'prods'
$   prods = proc_dev_dir - delim + ".IA64" + delim + "*.*;*"
$   if (f$search(prods) .nes. "") then delete /log 'prods'
$   prods = proc_dev_dir + "IA64" + ".DIR;1"
$   if (f$search(prods) .nes. "") then set prot=o:rwed 'prods'
$   if (f$search(prods) .nes. "") then delete /log 'prods'
$   prods = proc_dev_dir - delim + ".VAX" + delim + "*.*;*"
$   if (f$search(prods) .nes. "") then delete /log 'prods'
$   prods = proc_dev_dir + "VAX"+ ".DIR;1"
$   if (f$search(prods) .nes. "") then set prot=o:rwed 'prods'
$   if (f$search(prods) .nes. "") then delete /log 'prods'
$   file = "[...]macro32_exactcase"
$   if f$search("''file'.exe") .nes. "" then delete/log 'file'.exe;*
$   if f$search("''file'.jnl") .nes. "" then delete/log 'file'.jnl;*
$   goto Common_Exit
$ endif
$!
$ build_64 = 0
$ if f$locate(",64,", args_lower) .lt. args_lower_len
$ then
$   cc_qual1 = cc_qual1 + " /POINTER = 64"
$   build_64 = 1
$ endif
$!
$ args_loc = f$locate(",ccqual=", args_lower)
$ if args_loc .lt. args_lower_len
$ then
$   arg = f$extract(args_loc + 1, args_lower_len, args_lower)
$   arg_val = f$element(0, ",", arg)
$   cc_qual2 = f$element(1, "=", arg_val);
$ endif
$!
$! On Alpha/IA64 no size penalty for compiling /debug/optimize
$! by default.
$ if f$locate(",debug,", args_lower) .lt. args_lower_len
$ then
$   cc_debug = "/debug/nooptimize"
$ endif
$!
$! We normally want IEEE float if it is available.  Programs that are
$! calling libcurl will typically prefer IEEE behavior, unless on the
$! VAX where we have no choice.
$!
$ if f$locate(",noieee,", args_lower) .lt. args_lower_len
$ then
$   cc_float = ""
$ endif
$!
$! Normally we want large file if it is available.
$ if f$locate(",nolarge,", args_lower) .lt. args_lower_len
$ then
$   write sys$output "Handling of large files disabled."
$   cc_large = ""
$ endif
$ if cc_large .nes. ""
$ then
$   cc_defs = cc_defs + cc_large
$ endif
$!
$ if f$locate(",noldap,", args_lower) .lt. args_lower_len
$ then
$   ldap = 0
$ endif
$!
$ if f$locate(",list,", args_lower) .lt. args_lower_len
$ then
$   list = 1
$ endif
$ if f$locate(",fulllist,", args_lower) .lt. args_lower_len
$ then
$    list = 1
$    full_list = 1
$ endif
$!
$ if f$locate(",nohpssl,", args_lower) .lt. args_lower_len
$ then
$   nohpssl = 1
$ endif
$!
$ if f$locate(",nossl,", args_lower) .lt. args_lower_len
$ then
$   nossl = 1
$ endif
$!
$ if f$locate(",osslolb,", args_lower) .lt. args_lower_len
$ then
$    osslolb = 1
$ endif
$!
$ if f$locate(",nozlib,", args_lower) .lt. args_lower_len
$ then
$   nozlib = 1
$ endif
$!
$ if f$locate(",nokerberos,", args_lower) .lt. args_lower_len
$ then
$   nokerberos = 1
$ endif
$!
$!
$! 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"
$   msg_qual = msg_qual + "/nolist"
$ else
$   msg_qual = msg_qual + "/list='objdir'"
$   if (full_list .ne. 0)
$   then
$       cc_qual1 = cc_qual1 + cc_full_list
$   else
$       cc_qual1 = cc_qual1 + cc_list
$   endif
$ endif
$ cc_qual1 = cc_qual1 + cc_names + cc_float + cc_debug
$!
$! 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.
$!
$ libsslshr_line = ""
$ libcryptoshr_line = ""
$ if (.not. nossl)
$ then
$   if (f$trnlnm("OPENSSL") .nes. "")
$   then
$!        cc_defs = cc_defs + ", USE_OPENSSL=1"
$        if ((f$trnlnm("SSL$INCLUDE") .nes. "") .and. (.not. nohpssl))
$        then
$!          Use HP SSL.
$           hpssl = 1
$!
$!          Older SSL only has lib*_shr32 images
$!-----------------------------------------------
$           libsslshr = "sys$share:ssl$libssl_shr"
$           if (f$search("''libsslshr'.exe") .eqs. "") .or. (.not. build_64)
$           then
$               libsslshr = libsslshr + "32"
$           endif
$           libcryptoshr = "sys$share:ssl$libcrypto_shr"
$           if (f$search("''libcryptoshr'.exe") .eqs. "") .or. (.not. build_64)
$           then
$               libcryptoshr = libcryptoshr + "32"
$           endif
$           libsslshr_line = "''libsslshr'.exe/share"
$           libcryptoshr_line = "''libcryptoshr'.exe/share"
$       else
$!          Use OpenSSL.  Assume object libraries, unless shared images
$!          are found (and not prohibited).
$!          TODO: We do not know how to automatically choose based on the
$!          pointer size.
$!
$           openssl = 1
$           libsslshr_line = "ssllib:libssl.olb/lib"
$           libcryptoshr_line = "ssllib:libcrypto.olb/lib"
$           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
$                    libsslshr_line = "ssllib:ssl_libssl_shr.exe/share"
$                    libcryptoshr_line = "ssllib:ssl_libcrypto_shr.exe/share"
$                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
$                        libsslshr_line = "ssllib:libssl_shr.exe/share"
$                        libcryptoshr_line = "ssllib:libcrypto_shr.exe/share"
$                    endif
$                endif
$           endif
$       endif
$   endif
$ endif
$!
$! LDAP.
$!
$ if f$search("SYS$SHARE:LDAP$SHR.EXE") .eqs. ""
$ then
$   ldap = 0
$ endif
$ if (ldap .eq. 0)
$ then
$!   cc_defs = cc_defs + ", CURL_DISABLE_LDAP=1"
$ else
$   'vo_c' "%CURL-I-BLDHPLDAP, building with HP LDAP support"
$ endif
$!
$! KERBEROS
$ gssrtlshr_line = ""
$ try_shr = "sys$share:gss$rtl"
$ if f$search("''try_shr'.exe") .eqs. ""
$ then
$   nokerberos = 1
$ endif
$ curl_sys_krbinc = ""
$ if nokerberos .eq. 0
$ then
$   'vo_c' "%CURL-I-BLDHPKERBEROS, building with HP KERBEROS support"
$   curl_sys_krbinc = "sys$sysroot:[kerberos.include]"
$   gssrtlshr_line = "''try_shr'/share"
$ endif
$!
$!
$! LIBZ
$ libzshr_line = ""
$ try_shr = "gnv$libzshr"
$ if build_64
$ then
$!  First look for 64 bit
$   if f$search("''try_shr'64") .eqs. ""
$   then
$!      Second look for the J.F. Pieronne 64 bit shared image
$       try_shr = "LIBZ_SHR64"
$       if f$search(try_shr) .eqs. "" then nozlib = 1
$   endif
$ else
$!  First look for 32 bit
$   if f$search("''try_shr'32") .eqs. ""
$   then
$!      Second look for old 32 bit image
$       if f$search(try_shr) .eqs. ""
$       then
$!          Third look for the J.F. Pieronne 32 bit shared image
$           try_shr = "LIBZ_SHR32"
$           if f$search(try_shr) .eqs. "" then nozlib = 1
$       endif
$   endif
$ endif
$ if f$search(try_shr) .eqs. ""
$ then
$   nozlib = 1
$ endif
$ curl_sys_zlibinc = ""
$ if nozlib .eq. 0
$ then
$   libzshr_line = "''try_shr'/share"
$   if f$locate("LIBZ", try_shr) .eq. 0
$   then
$       'vo_c' "%CURL-I-BLDJFPLIBZ, building with JFP LIBZ support"
$       curl_sys_zlibinc = "LIBZ:"
$   else
$       'vo_c' "%CURL-I-BLDGNVLIBZ, building with GNV LIBZ support"
$       curl_sys_zlibinc = "GNV$ZLIB_INCLUDE:"
$   endif
$ endif
$!
$! Form CC qualifiers.
$!
$ cc_defs = "/define = (''cc_defs')"
$ cc_qual2 = cc_qual2 + " /object = ''objdir'"
$ cc_qual2 = cc_qual2 + "/nested_include_directory=none"
$!
$ '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'"
$!
$! TODO: Why are we translating the logical name?
$! The logical aname used to find the shared image should just be used
$! as translating it could result in the wrong location at run time.
$   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
$ curl_logical = top_dev_dir + ".include.curl" + delim
$ curl_sys_inc2 = curl_logical
$ curl_sys_inc1 = top_dev_dir + ".include" + delim
$! define curl 'top_dev_dir'.include.curl'delim'
$!
$! Generate config file into the product directory.
$!
$! call MoveIfDiff [.lib]config-vms.h 'objdir'curl_config.h
$!
$ conf_params = ""
$ if nossl .ne. 0 then conf_params = conf_params + ",nossl"
$ if nohpssl .ne. 0 then conf_params = conf_params + ",nohpssl,"
$ if ldap .eq. 0 then conf_params = conf_params + ",noldap,"
$ if nozlib .ne. 0 then conf_params = conf_params + ",nozlib,"
$ if nokerberos .ne. 0 then conf_params = conf_params + ",nokerberos"
$ conf_params = conf_params - ","
$!
$!
$ new_conf = f$search("''objdir'curl_config.h")
$ if new_conf .eqs. ""
$ then
$!   set ver
$   write sys$output "Generating curl custom config_vms.h"
$   @'proc_dev_dir'generate_config_vms_h_curl.com ''conf_params'
$!
$   write sys$output "Generating curl_config.h"
$   conf_in = f$search("[.lib]curl_config*.*in")
$   if conf_in .eqs. ""
$   then
$       write sys$output "Can not find [.lib]curl_config*.*in file!"
$       goto common_exit
$   endif
$   @'proc_dev_dir'config_h.com 'conf_in'
$   copy config.h 'objdir'curl_config.h
$   delete config.h;
$!   set nover
$ endif
$!
$!
$ on control_y then goto Common_Exit
$!
$ set default 'proc_dev_dir'
$ sys_inc = "''curl_sys_inc1', ''curl_sys_inc2', ''curl_logical'"
$ if curl_sys_krbinc .nes. ""
$ then
$   sys_inc = sys_inc + ",''curl_sys_krbinc'"
$ endif
$ if curl_sys_zlibinc .nes. ""
$ then
$   sys_inc = sys_inc + ",''curl_sys_zlibinc'"
$ endif
$! Build LIB
$ cc_include = "/include=([-.lib],[-.lib.vtls],[-.packages.vms]"
$ cc_include = cc_include + ",[-.packages.vms.''arch_name'])"
$ call build "[--.lib]" "*.c" "''objdir'CURLLIB.OLB" "amigaos, nwlib, nwos"
$ if ($status .eq. ctrl_y) then goto Common_Exit
$! Build VTLS
$ cc_include = "/include=([--.lib.vtls],[--.lib],[--.src]"
$ cc_include = cc_include + ",[--.packages.vms],[--.packages.vms.''arch_name'])"
$ call build "[--.lib.vtls]" "*.c" "''objdir'CURLLIB.OLB" "amigaos, nwlib, nwos"
$! Build SRC
$ cc_include = "/include=([-.src],[-.lib],[-.lib.vtls]"
$ cc_include = cc_include + ",[-.packages.vms],[-.packages.vms.''arch_name'])"
$ call build "[--.src]" "*.c" "''objdir'CURLSRC.OLB"
$ if ($status .eq. ctrl_y) then goto Common_Exit
$! Build MSG
$ call build "[]" "*.msg" "''objdir'CURLSRC.OLB"
$ if ($status .eq. ctrl_y) then goto Common_Exit
$!
$!
$ 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
$!
$!
$! GNV helper files for building the test curl binary.
$!-----------------------------------------------
$ create 'exedir'gnv$curl.opt
$ open/append opt 'exedir'gnv$curl.opt
$ if libzshr_line .nes. "" then write opt libzshr_line
$ if gssrtlshr_line .nes. "" then write opt gssrtlshr_line
$ if libcryptoshr_line .nes. "" then write opt libcryptoshr_line
$ if libsslshr_line .nes. "" then write opt libsslshr_line
$ close opt
$!
$!
$! Create the libcurl
$!------------------------------------------------------
$ create 'exedir'gnv_libcurl_linker.opt
$ open/append opt 'exedir'gnv_libcurl_linker.opt
$ if libzshr_line .nes. "" then write opt libzshr_line
$ if gssrtlshr_line .nes. "" then write opt gssrtlshr_line
$ if libcryptoshr_line .nes. "" then write opt libcryptoshr_line
$ if libsslshr_line .nes. "" then write opt libsslshr_line
$ close opt
$!
$!
$! If we are not on VAX, then we want the debug symbol table in
$! a separate file.
$! VAX needs the tool_main unquoted in uppercase,
$! Alpha and IA64 need tool_main quoted in exact case when parse style is
$! extended.
$ link_dsf1 = ""
$ link_dsf2 = ""
$ tool_main = "tool_main"
$ if arch_name .nes. "VAX"
$ then
$   if parse_style .eqs. "EXTENDED"
$   then
$      tool_main = """tool_main"""
$   endif
$   link_dsf1 = "/dsf=" + exedir + "CURL.DSF"
$   link_dsf2 = "/dsf=" + exedir + "CURL_DEBUG.DSF"
$ endif
$ if (list .eq. 0)
$ then
$   link_map1 = "/nomap"
$   link_map2 = "/nomap"
$ else
$   link_map1 = "/map=" + exedir + "CURL.MAP"
$   link_map2 = "/map=" + exedir + "CURL_DEBUG.MAP"
$ endif
$!
$!
$! Make a normal image.
$ set ver
$ link 'link_map1' 'link_dsf1' /executable = 'exedir'CURL.EXE -
   'objdir'curlsrc.olb /library /include = ('tool_main', curlmsg), -
   'objdir'curllib.olb /library, -
   'exedir'gnv$curl.opt/opt
$!
$! Also make a debug copy.
$ link/debug 'link_map2' 'link_dsf2' /executable = 'exedir'CURL_DEBUG.EXE -
   'objdir'curlsrc.olb /library /include = ('tool_main', curlmsg), -
   'objdir'curllib.olb /library, -
   'exedir'gnv$curl.opt/opt
$ set nover
$!
$ 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 = "sys$disk:" + 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
$       define/user curl 'curl_logical'
$       if curl_sys_krbinc .nes. "" then define/user gssapi 'curl_sys_krbinc'
$       define/user decc$system_include 'sys_inc'
$       CC 'cc_defs' -
         'cc_qual1' -
         'cc_qual2' -
         'cc_include' -
         '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'
$ exit
