## descrip.mms to build OpenSSL on OpenVMS
##
## {- join("\n## ", @autowarntext) -}
{-
  use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;

  # Our prefix, claimed when speaking with the VSI folks Tuesday
  # January 26th 2016
  our $osslprefix = 'OSSL$';
  (our $osslprefix_q = $osslprefix) =~ s/\$/\\\$/;

  our $sourcedir = $config{sourcedir};
  our $builddir = $config{builddir};
  sub sourcefile {
      catfile($sourcedir, @_);
  }
  sub buildfile {
      catfile($builddir, @_);
  }
  sub sourcedir {
      catdir($sourcedir, @_);
  }
  sub builddir {
      catdir($builddir, @_);
  }
  sub tree {
      (my $x = shift) =~ s|\]$|...]|;
      $x
  }
  sub move {
      my $f = catdir(@_);
      my $b = abs2rel(rel2abs("."),rel2abs($f));
      $sourcedir = catdir($b,$sourcedir)
          if !file_name_is_absolute($sourcedir);
      $builddir = catdir($b,$builddir)
          if !file_name_is_absolute($builddir);
      "";
  }

  # This is a horrible hack, but is needed because recursive inclusion of files
  # in different directories does not work well with HP C.
  my $sd = sourcedir("crypto", "async", "arch");
  foreach (grep /\[\.crypto\.async\.arch\].*\.o$/, keys %{$unified_info{sources}}) {
      (my $x = $_) =~ s|\.o$|.OBJ|;
      $unified_info{before}->{$x}
          = qq(arch = F\$PARSE("$sd","A.;",,,"SYNTAX_ONLY") - "A.;"
        define arch 'arch');
      $unified_info{after}->{$x}
          = qq(deassign arch);
  }
  my $sd1 = sourcedir("ssl","record");
  my $sd2 = sourcedir("ssl","statem");
  $unified_info{before}->{"[.crypto.ct]ct_lib.OBJ"}
      = $unified_info{before}->{"[.test]heartbeat_test.OBJ"}
      = $unified_info{before}->{"[.test]ssltest.OBJ"}
      = qq(record = F\$PARSE("$sd1","A.;",,,"SYNTAX_ONLY") - "A.;"
        define record 'record'
        statem = F\$PARSE("$sd2","A.;",,,"SYNTAX_ONLY") - "A.;"
        define statem 'statem');
  $unified_info{after}->{"[.crypto.ct]ct_lib.OBJ"}
      = $unified_info{after}->{"[.test]heartbeat_test.OBJ"}
      = $unified_info{after}->{"[.test]ssltest.OBJ"}
      = qq(deassign statem
        deassign record);
  foreach (grep /^\[\.ssl\.(?:record|statem)\].*\.o$/, keys %{$unified_info{sources}}) {
      (my $x = $_) =~ s|\.o$|.OBJ|;
      $unified_info{before}->{$x}
          = qq(record = F\$PARSE("$sd1","A.;",,,"SYNTAX_ONLY") - "A.;"
        define record 'record'
        statem = F\$PARSE("$sd2","A.;",,,"SYNTAX_ONLY") - "A.;"
        define statem 'statem');
      $unified_info{after}->{$x}
          = qq(deassign statem
        deassign record);
  }
  #use Data::Dumper;
  #print STDERR "DEBUG: before:\n", Dumper($unified_info{before});
  #print STDERR "DEBUG: after:\n", Dumper($unified_info{after});
  "";
-}
PLATFORM={- $config{target} -}
OPTIONS={- $config{options} -}
CONFIGURE_ARGS=({- join(", ",quotify_l(@{$config{perlargv}})) -})
SRCDIR={- $config{sourcedir} -}
BUILDDIR={- $config{builddir} -}

VERSION={- $config{version} -}
MAJOR={- $config{major} -}
MINOR={- $config{minor} -}
SHLIB_VERSION_NUMBER={- $config{shlib_version_number} -}
SHLIB_VERSION_HISTORY={- $config{shlib_version_history} -}
SHLIB_MAJOR={- $config{shlib_major} -}
SHLIB_MINOR={- $config{shlib_minor} -}
SHLIB_TARGET={- $target{shared_target} -}

EXE_EXT=.EXE
LIB_EXT=.OLB
SHLIB_EXT=.EXE
OBJ_EXT=.OBJ
DEP_EXT=.MMS

LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @{$unified_info{libraries}}) -}
SHLIBS={- join(" ", map { $_."\$(SHLIB_EXT)" } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) -}
ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{engines}}) -}
PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } grep { !m|^\[\.test\]| } @{$unified_info{programs}}) -}
TESTPROGS={- join(", ", map { "-\n\t".$_.".EXE" } grep { m|^\[\.test\]| } @{$unified_info{programs}}) -}
SCRIPTS={- join(", ", map { "-\n\t".$_ } @{$unified_info{scripts}}) -}

# DESTDIR is for package builders so that they can configure for, say,
# SYS$COMMON:[OPENSSL] and yet have everything installed in STAGING:[USER].
# In that case, configure with --prefix=SYS$COMMON:[OPENSSL] and then run
# MMS with /MACROS=(DESTDIR=STAGING:[USER]).  The result will end up in
# STAGING:[USER.OPENSSL].
# Normally it is left empty.
DESTDIR=

# Do not edit this manually. Use Configure --prefix=DIR to change this!
INSTALLTOP={- catdir($config{prefix}) || "SYS\$COMMON:[OPENSSL-\$(MAJOR).\$(MINOR)]" -}
# This is the standard central area to store certificates, private keys...
OPENSSLDIR={- catdir($config{openssldir}) ||
              $config{prefix} ? catdir($config{prefix},"SSL")
                              : "SYS\$COMMON:[SSL]" -}
# Where installed engines reside
ENGINESDIR={- $osslprefix -}ENGINES:

CC= {- $target{cc} -}
CFLAGS= /DEFINE=({- join(",", @{$config{defines}},"OPENSSLDIR=\"\"\"\$(OPENSSLDIR)\"\"\"","ENGINESDIR=\"\"\"\$(ENGINESDIR)\"\"\"") -}) {- $config{cflags} -}
DEPFLAG= /DEFINE=({- join(",", @{$config{depdefines}}) -})
LDFLAGS= {- $config{lflags} -}
EX_LIBS= {- $config{ex_libs} ? ",".$config{ex_libs} : "" -}

PERL={- $config{perl} -}

# We let the C compiler driver to take care of .s files. This is done in
# order to be excused from maintaining a separate set of architecture
# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC
# gcc, then the driver will automatically translate it to -xarch=v8plus
# and pass it down to assembler.
AS={- $target{as} -}
ASFLAG={- $target{asflags} -}

# .FIRST and .LAST are special targets with MMS and MMK.
# The defines in there are for C.  includes that look like
# this:
#
#    #include <openssl/foo.h>
#    #include "internal/bar.h"
#
# will use the logical names to find the files.  Expecting
# DECompHP C to find files in subdirectories of whatever was
# given with /INCLUDE is a fantasy, unfortunately.
NODEBUG=@
.FIRST :
        $(NODEBUG) openssl_inc1 = F$PARSE("[.include.openssl]","A.;",,,"syntax_only") - "A.;"
        $(NODEBUG) openssl_inc2 = F$PARSE("{- catdir($config{sourcedir},"[.include.openssl]") -}","a.;",,,"SYNTAX_ONLY") - "A.;"
        $(NODEBUG) internal_inc1 = F$PARSE("[.crypto.include.internal]","A.;",,,"SYNTAX_ONLY") - "A.;"
        $(NODEBUG) internal_inc2 = F$PARSE("{- catdir($config{sourcedir},"[.include.internal]") -}","A.;",,,"SYNTAX_ONLY") - "A.;"
        $(NODEBUG) internal_inc3 = F$PARSE("{- catdir($config{sourcedir},"[.crypto.include.internal]") -}","A.;",,,"SYNTAX_ONLY") - "A.;"
        $(NODEBUG) DEFINE openssl 'openssl_inc1','openssl_inc2'
        $(NODEBUG) DEFINE internal 'internal_inc1','internal_inc2','internal_inc3'
        $(NODEBUG) staging_dir = "$(DESTDIR)"
        $(NODEBUG) IF staging_dir .NES. "" THEN -
                staging_dir = F$PARSE("A.;",staging_dir,"[]",,"SYNTAX_ONLY") - "A.;"
        $(NODEBUG) !
        $(NODEBUG) ! Installation logical names
        $(NODEBUG) !
        $(NODEBUG) installtop_dev = F$PARSE(staging_dir,"$(INSTALLTOP)",,"DEVICE","SYNTAX_ONLY")
        $(NODEBUG) ! Because there are no routines to merge directories, we have to
        $(NODEBUG) ! do it ourselves
        $(NODEBUG) IF staging_dir .NES. "" THEN -
                staging_dir = F$PARSE(staging_dir,"[000000]",,"DIRECTORY","SYNTAX_ONLY")
        $(NODEBUG) installtop_dir = F$PARSE("$(INSTALLTOP)","[000000]",,"DIRECTORY","SYNTAX_ONLY")
        $(NODEBUG) IF staging_dir .NES. "" .AND. staging_dir .NES. "[000000]" THEN -
                installtop_dir = staging_dir - "]" + "." + (installtop_dir - "[")
        $(NODEBUG) installtop_dir = installtop_dir - "]" + ".]"
        $(NODEBUG) DEFINE ossl_installroot 'installtop_dev''installtop_dir'
        $(NODEBUG) !
        $(NODEBUG) datatop = F$PARSE("$(OPENSSLDIR)","[000000]A.;",,,"SYNTAX_ONLY") -
                - "]A.;" + ".]"
        $(NODEBUG) IF "$(DESTDIR)" .EQS. "" THEN -
                DEFINE ossl_dataroot 'datatop'
        $(NODEBUG) !
        $(NODEBUG) ! Figure out the architecture
        $(NODEBUG) !
        $(NODEBUG) arch == f$edit( f$getsyi( "arch_name"), "upcase")
        $(NODEBUG) !
        $(NODEBUG) ! Set up logical names for the libraries, so LINK and
        $(NODEBUG) ! running programs can use them.
        $(NODEBUG) !
        $(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEFINE ".uc($_)." 'F\$ENV(\"DEFAULT\")'".uc($_)."\$(SHLIB_EXT)" } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) || "!" -}

.LAST :
        $(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEASSIGN ".uc($_) } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) || "!" -}
        $(NODEBUG) IF "$(DESTDIR)" .EQS. "" THEN DEASSIGN ossl_dataroot
        $(NODEBUG) DEASSIGN ossl_installroot
        $(NODEBUG) DEASSIGN internal
        $(NODEBUG) DEASSIGN openssl
.DEFAULT :
        @ ! MMS cannot handle no actions...

# The main targets ###################################################

all : descrip.mms, build_libs, build_engines, build_apps

build_libs : $(LIBS)
build_engines : $(ENGINES)
build_apps : $(PROGRAMS), $(SCRIPTS)
build_tests : $(TESTPROGS)

test tests : build_tests, rehash
        SET DEFAULT [.test]{- move("test") -}
        DEFINE SRCTOP {- sourcedir() -}
        DEFINE BLDTOP {- builddir() -}
        $(PERL) {- sourcefile("test", "run_tests.pl") -} $(TESTS)
        DEASSIGN BLDTOP
        DEASSIGN SRCTOP
        SET DEFAULT [-]{- move("..") -}

list-tests :
        @ TOP=$(SRCDIR) PERL=$(PERL) $(PERL) {- catfile($config{sourcedir},"test", "run_tests.pl") -} list

# Because VMS wants the generation number (or *) to delete files, we can't
# use $(LIBS), $(PROGRAMS) and $(TESTPROGS) directly.
libclean :
        - DELETE []OSSL$LIB*.OLB;*,OSSL$LIB*.LIS;*
        - DELETE [.crypto...]*.OBJ;*,*.LIS;*
        - DELETE [.ssl...]*.OBJ;*,*.LIS;*
        - DELETE [.engines...]*.OBJ;*,*.LIS;*
        - DELETE []CXX$DEMANGLER_DB.;*

install : install_sw install_docs

uninstall : uninstall_docs uninstall_sw

clean : libclean
        - DELETE []OSSL$LIB*.EXE;*,OSSL$LIB*.MAP;*,OSSL$LIB*.OPT;*
        - DELETE [.engines...]LIB*.EXE;*,LIB*.MAP;*,LIB*.OPT;*
        - DELETE [.apps]*.EXE;*,*.MAP;*,*.OPT;*
        - DELETE [.apps]*.OBJ;*,*.LIS;*
        - DELETE [.test]*.EXE;*,*.MAP;*,*.OPT;*
        - DELETE [.test]*.OBJ;*,*.LIS;*
        - DELETE [.test]*.LOG;*
        - DELETE []*.MAP;*

DCLEAN_CMD=$(PERL) -pe "if (/^# DO NOT DELETE.*/) { exit(0); }"
dclean :
        $(DCLEAN_CMD) < descrip.mms > descrip.mms.new
        RENAME descrip.mms.new descrip.mms
        PURGE descrip.mms

{- our @deps = map { (my $x = $_) =~ s|\.o$|\$(DEP_EXT)|; $x; }
               grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
               keys %{$unified_info{sources}};
   ""; -}
depend : {- join(",-\n\t", @deps); -}
        $(DCLEAN_CMD) < descrip.mms > descrip.mms.new
        OPEN/APPEND DESCRIP descrip.mms.new
        WRITE DESCRIP "# DO NOT DELETE THIS LINE -- make depend depends on it."
        {- join("\n\t", map { "TYPE $_ /OUTPUT=DESCRIP:" } @deps); -}
        CLOSE DESCRIP
        RENAME descrip.mms.new descrip.mms
        PURGE descrip.mms

# Install helper targets #############################################

install_sw : all install_dev install_engines install_runtime install_config
        @ WRITE SYS$OUTPUT ""
        @ WRITE SYS$OUTPUT "######################################################################"
        @ WRITE SYS$OUTPUT ""
        @ WRITE SYS$OUTPUT "Installation complete"
        @ WRITE SYS$OUTPUT ""
        @ IF "$(DESTDIR)" .NES. "" THEN EXIT 1
        @ WRITE SYS$OUTPUT "Run @$(INSTALLTOP)openssl_startup to set up logical names"
        @ WRITE SYS$OUTPUT "then run @$(INSTALLTOP)openssl_setup to define commands"
        @ WRITE SYS$OUTPUT ""

uninstall_sw : uninstall_dev uninstall_engines uninstall_runtime uninstall_config

install_docs : install_man_docs install_html_docs

uninstall_docs : uninstall_man_docs uninstall_html_docs

install_dev : check_INSTALLTOP
        @ WRITE SYS$OUTPUT "*** Installing development files"
        @ ! Install header files
        CREATE/DIR ossl_installroot:[include.openssl]
        COPY/PROT=W:R openssl:*.h ossl_installroot:[include.openssl]
        @ ! Install libraries
        CREATE/DIR ossl_installroot:['arch'.LIB]
        {- join("\n        ",
                map { "COPY/PROT=W:R $_.OLB ossl_installroot:['arch'.LIB]" }
                @{$unified_info{libraries}}) -}
        @ {- output_off() if $config{no_shared}; "" -} !
        {- join("\n        ",
                map { "COPY/PROT=W:RE $_.EXE ossl_installroot:['arch'.LIB]" }
                map { $unified_info{sharednames}->{$_} || () } 
                @{$unified_info{libraries}}) -}
        @ {- output_on() if $config{no_shared}; "" -} !

install_runtime : check_INSTALLTOP
        @ WRITE SYS$OUTPUT "*** Installing runtime files"
        @ ! Install the main program
        CREATE/DIR ossl_installroot:['arch'.EXE]
        COPY/PROT=W:RE [.APPS]openssl.EXE ossl_installroot:['arch'.EXE]
        @ ! Install scripts
        CREATE/DIR ossl_installroot:[EXE]
        COPY/PROT=W:RE [.APPS]CA.pl ossl_installroot:[EXE]
        COPY/PROT=W:RE [.TOOLS]c_rehash. ossl_installroot:[EXE]c_rehash.pl
        @ ! Install configuration file
        COPY/PROT=W:RE {- sourcefile("apps", "openssl-vms.cnf") -} -
                ossl_installroot:[000000]openssl.cnf

install_engines : check_INSTALLTOP
        @ {- output_off() if $config{no_shared}; "" -} !
        @ WRITE SYS$OUTPUT "*** Installing engines"
        CREATE/DIR ossl_installroot:['arch'.ENGINES]
        COPY/PROT=W:RE [.ENGINES]*.EXE ossl_installroot:['arch'.ENGINES]
        @ {- output_on() if $config{no_shared}; "" -} !

install_config : [.VMS]openssl_startup.com [.VMS]openssl_shutdown.com -
                 check_INSTALLTOP
        IF "$(DESTDIR)" .EQS. "" THEN -
                IF F$SEARCH("OSSL_DATAROOT:[000000]CERTS.DIR;1") .EQS. "" THEN -
                CREATE/DIR/PROT=(S:RWED,O:RWE,G:RE,W:RE) OSSL_DATAROOT:[CERTS]
        IF "$(DESTDIR)" .EQS. "" THEN -
                IF F$SEARCH("OSSL_DATAROOT:[000000]PRIVATE.DIR;1") .EQS. "" THEN -
                CREATE/DIR/PROT=(S:RWED,O:RWE,G:,W:) OSSL_DATAROOT:[PRIVATE]
        CREATE/DIR ossl_installroot:[SYS$STARTUP]
        COPY/PROT=W:RE -
                [.VMS]openssl_startup.com,openssl_shutdown.com -
                ossl_installroot:[SYS$STARTUP]
        COPY/PROT=W:RE -
                {- sourcefile("VMS", "openssl_utils.com") -} -
                ossl_installroot:[SYS$STARTUP]

[.VMS]openssl_startup.com : vmsconfig.pm
        CREATE/DIR [.VMS]
        $(PERL) "-I." "-Mvmsconfig" {- sourcefile("util", "dofile.pl") -} -
                {- sourcefile("VMS", "openssl_startup.com.in") -} -
                > [.VMS]openssl_startup.com

[.VMS]openssl_shutdown.com : vmsconfig.pm
        CREATE/DIR [.VMS]
        $(PERL) "-I." "-Mvmsconfig" {- sourcefile("util", "dofile.pl") -} -
                {- sourcefile("VMS", "openssl_shutdown.com.in") -} -
                > [.VMS]openssl_shutdown.com

vmsconfig.pm : descrip.mms
        OPEN/WRITE/SHARE=READ CONFIG []vmsconfig.pm
        WRITE CONFIG "package vmsconfig;"
        WRITE CONFIG "use strict; use warnings;"
        WRITE CONFIG "use Exporter;"
        WRITE CONFIG "our @ISA = qw(Exporter);"
        WRITE CONFIG "our @EXPORT = qw(%config %target %withargs %unified_info);"
        WRITE CONFIG "our %config = ("
        WRITE CONFIG "  target => '{- $config{target} -}',"
        WRITE CONFIG "  version => '$(MAJOR).$(MINOR)',"
        WRITE CONFIG "  no_shared => '","{- $config{no_shared} -}","',"
        WRITE CONFIG "  INSTALLTOP => '$(INSTALLTOP)',"
        WRITE CONFIG "  OPENSSLDIR => '$(OPENSSLDIR)',"
        WRITE CONFIG "  pointersize => '","{- $target{pointersize} -}","',"
        WRITE CONFIG "  shared_libs => ["
        {- join("\n        ", map { "WRITE CONFIG \"    '$_'," } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) || "\@ !" -}
        WRITE CONFIG "  ],"
        WRITE CONFIG ");"
        WRITE CONFIG "our %target = ();"
        WRITE CONFIG "our %withargs = ();"
        WRITE CONFIG "our %unified_info = ();"
        WRITE CONFIG "1;"
        CLOSE CONFIG

check_INSTALLTOP :
        @ IF "$(INSTALLTOP)" .EQS. "" THEN -
                WRITE SYS$ERROR "INSTALLTOP should not be empty"
        @ IF "$(INSTALLTOP)" .EQS. "" THEN -
                EXIT %x10000002

# Helper targets #####################################################

rehash : [.apps]openssl.exe, copy-certs
        !MCR [.apps]openssl.exe rehash {- builddir("certs", "demo") -}
        $(PERL) [.tools]c_rehash. [.certs.demo]

copy-certs :
        @ IF F$SEARCH("{- buildfile("certs.dir") -}") .EQS. "" THEN -
             CREATE/DIR {- builddir("certs") -}
        -@ IF "{- sourcedir("certs") -}" .NES. "{- builddir("certs") -}" THEN -
             COPY {- tree(sourcedir("certs")) -}*.* {- tree(builddir("certs")) -}

# Developer targets ##################################################

debug_logicals :
        SH LOGICAL/PROC openssl,internal,ossl_installroot
        IF "$(DESTDIR)" .EQS. "" THEN -
                SH LOGICAL/PROC ossl_dataroot

# Building targets ###################################################

descrip.mms : {- sourcefile("Configurations", "descrip.mms.tmpl") -} $(SRCDIR)Configure ! $(SRCDIR)config.com
        @ WRITE SYS$OUTPUT "descrip.mms is older than $?."
        @ WRITE SYS$OUTPUT "Reconfiguring..."
        perl $(SRCDIR)Configure reconf
        @ WRITE SYS$OUTPUT "*************************************************"
        @ WRITE SYS$OUTPUT "***                                           ***"
        @ WRITE SYS$OUTPUT "***   Please run the same mms command again   ***"
        @ WRITE SYS$OUTPUT "***                                           ***"
        @ WRITE SYS$OUTPUT "*************************************************"
        @ exit %10000000

{-
  use File::Basename;
  use File::Spec::Functions qw/abs2rel rel2abs catfile catdir/;
  sub src2dep {
      my %args = @_;
      my $dep = $args{obj};
      my $deps = join(", -\n\t\t", @{$args{srcs}}, @{$args{deps}});

      # Because VMS C isn't very good at combining a /INCLUDE path with
      # #includes having a relative directory (like '#include "../foo.h"),
      # the best choice is to move to the first source file's intended
      # directory before compiling, and make sure to write the object file
      # in the correct position (important when the object tree is other
      # than the source tree).
      my $forward = dirname($args{srcs}->[0]);
      my $backward = abs2rel(rel2abs("."), rel2abs($forward));
      my $depd = abs2rel(rel2abs(dirname($dep)), rel2abs($forward));
      my $depn = basename($dep);
      my $srcs =
          join(", ",
               map { abs2rel(rel2abs($_), rel2abs($forward)) } @{$args{srcs}});
      my $incs =
          "/INCLUDE=(".join(",",
                            map {
                               file_name_is_absolute($_)
                               ? $_ : catdir($backward,$_)
                            } @{$args{incs}}).")";
      my $before = $unified_info{before}->{$dep.".OBJ"} || "\@ !";
      my $after = $unified_info{after}->{$dep.".OBJ"} || "\@ !";

      return <<"EOF";
$dep.MMS : $deps
        ${before}
        SET DEFAULT $forward
        \$(CC) \$(CFLAGS)${incs} /MMS=(TARGET=.OBJ)/OBJECT=${depd}${depn}.MMS $srcs
        SET DEFAULT $backward
        ${after}
        - PURGE $dep.MMS
EOF
  }
  sub src2obj {
      my %args = @_;
      my $obj = $args{obj};
      my $deps = join(", -\n\t\t", @{$args{srcs}}, @{$args{deps}});

      # Because VMS C isn't very good at combining a /INCLUDE path with
      # #includes having a relative directory (like '#include "../foo.h"),
      # the best choice is to move to the first source file's intended
      # directory before compiling, and make sure to write the object file
      # in the correct position (important when the object tree is other
      # than the source tree).
      my $forward = dirname($args{srcs}->[0]);
      my $backward = abs2rel(rel2abs("."), rel2abs($forward));
      my $objd = abs2rel(rel2abs(dirname($obj)), rel2abs($forward));
      my $objn = basename($obj);
      my $srcs =
          join(", ",
               map { abs2rel(rel2abs($_), rel2abs($forward)) } @{$args{srcs}});
      my $incs =
          "/INCLUDE=(".join(",",
                            map {
                               file_name_is_absolute($_)
                               ? $_ : catdir($backward,$_)
                            } @{$args{incs}}).")";
      my $before = $unified_info{before}->{$obj.".OBJ"} || "\@ !";
      my $after = $unified_info{after}->{$obj.".OBJ"} || "\@ !";

      return <<"EOF";
$obj.OBJ : $deps
        ${before}
        SET DEFAULT $forward
        \$(CC) \$(CFLAGS)${incs} /OBJECT=${objd}${objn}.OBJ /REPOSITORY=$backward $srcs
        SET DEFAULT $backward
        ${after}
        - PURGE $obj.OBJ
EOF
  }
  sub libobj2shlib {
      my %args = @_;
      my $lib = $args{lib};
      my $shlib = $args{shlib};
      my $libd = dirname($lib);
      my $libn = basename($lib);
      (my $mkdef_key = $libn) =~ s/^${osslprefix_q}lib//i;
      my @deps = map {
          $config{no_shared} ? $_.".OLB"
              : $unified_info{sharednames}->{$_}.".EXE"; } @{$args{deps}};
      my $deps = join(", -\n\t\t", @deps);
      my $shlib_target = $config{no_shared} ? "" : $target{shared_target};
      my $ordinalsfile = defined($args{ordinals}) ? $args{ordinals}->[1] : "";
      my $engine_opt = abs2rel(rel2abs(catfile($config{sourcedir},
                                               "VMS", "engine.opt")),
                               rel2abs($config{builddir}));
      my $mkdef_pl = abs2rel(rel2abs(catfile($config{sourcedir},
                                             "util", "mkdef.pl")),
                             rel2abs($config{builddir}));
      my $translatesyms_pl = abs2rel(rel2abs(catfile($config{sourcedir},
                                                     "VMS", "translatesyms.pl")),
                                     rel2abs($config{builddir}));
      # The "[]" hack is because in .OPT files, each line inherits the
      # previous line's file spec as default, so if no directory spec
      # is present in the current line and the previous line has one that
      # doesn't apply, you're in for a surprise.
      my $write_opt =
          join("\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
                             $x =~ s|(\.EXE)|$1/SHARE|;
                             $x =~ s|(\.LIB)|$1/LIB|;
                             "WRITE OPT_FILE \"$x\"" } @deps)
          || "\@ !";
      return <<"EOF";
$shlib.EXE : $lib.OLB $deps $ordinalsfile
        IF "$mkdef_key" .EQS. "ssl" .OR. "$mkdef_key" .EQS. "crypto" THEN -
           \$(PERL) $mkdef_pl "$mkdef_key" "VMS" > $shlib.SYMVEC-tmp
        IF "$mkdef_key" .EQS. "ssl" .OR. "$mkdef_key" .EQS. "crypto" THEN -
           \$(PERL) $translatesyms_pl \$(BUILDDIR)CXX\$DEMANGLER_DB. < $shlib.SYMVEC-tmp > $shlib.SYMVEC
        OPEN/WRITE/SHARE=READ OPT_FILE $shlib.OPT
        WRITE OPT_FILE "IDENTIFICATION=""V$config{version}"""
        IF "$mkdef_key" .NES. "ssl" .AND. "$mkdef_key" .NES. "crypto" THEN -
           TYPE $engine_opt /OUTPUT=OPT_FILE:
        IF "$mkdef_key" .EQS. "ssl" .OR. "$mkdef_key" .EQS. "crypto" THEN -
           TYPE $shlib.SYMVEC /OUTPUT=OPT_FILE:
        WRITE OPT_FILE "$lib.OLB/LIBRARY"
        $write_opt ! Comment to protect from empty line
        CLOSE OPT_FILE
        LINK /MAP=$shlib.MAP /FULL/SHARE=$shlib.EXE $shlib.OPT/OPT \$(EX_LIBS)
        - DELETE $shlib.SYMVEC;*
        - PURGE $shlib.EXE,$shlib.OPT,$shlib.MAP
EOF
  }
  sub obj2dynlib {
      my %args = @_;
      my $lib = $args{lib};
      my $libd = dirname($lib);
      my $libn = basename($lib);
      (my $libn_nolib = $libn) =~ s/^lib//;
      my @objs = map { "$_.OBJ" } @{$args{objs}};
      my @deps = map {
          $config{no_shared} ? $_.".OLB"
              : $unified_info{sharednames}->{$_}.".EXE"; } @{$args{deps}};
      my $deps = join(", -\n\t\t", @objs, @deps);
      my $shlib_target = $config{no_shared} ? "" : $target{shared_target};
      my $engine_opt = abs2rel(rel2abs(catfile($config{sourcedir},
                                               "VMS", "engine.opt")),
                               rel2abs($config{builddir}));
      # The "[]" hack is because in .OPT files, each line inherits the
      # previous line's file spec as default, so if no directory spec
      # is present in the current line and the previous line has one that
      # doesn't apply, you're in for a surprise.
      my $write_opt =
          join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
                                 "WRITE OPT_FILE \"$x" } @objs).
          "\"\n\t".
          join("\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
                             $x =~ s|(\.EXE)|$1/SHARE|;
                             $x =~ s|(\.LIB)|$1/LIB|;
                             "WRITE OPT_FILE \"$x\"" } @deps)
          || "\@ !";
      return <<"EOF";
$lib.EXE : $deps
        OPEN/WRITE/SHARE=READ OPT_FILE $lib.OPT
        TYPE $engine_opt /OUTPUT=OPT_FILE:
        $write_opt
        CLOSE OPT_FILE
        LINK /MAP=$lib.MAP /FULL/SHARE=$lib.EXE $lib.OPT/OPT \$(EX_LIBS)
        - PURGE $lib.EXE,$lib.OPT,$lib.MAP
EOF
  }
  sub obj2lib {
      my %args = @_;
      my $lib = $args{lib};
      my $objs = join(", -\n\t\t", map { $_.".OBJ" } (@{$args{objs}}));
      my $fill_lib = join("\n\t", (map { "LIBRARY/REPLACE $lib.OLB $_.OBJ" }
                                    @{$args{objs}}));
      return <<"EOF";
$lib.OLB : $objs
        LIBRARY/CREATE/OBJECT $lib
        $fill_lib
        - PURGE $lib.OLB
EOF
  }
  sub obj2bin {
      my %args = @_;
      my $bin = $args{bin};
      my $bind = dirname($bin);
      my $binn = basename($bin);
      my @objs = map { "$_.OBJ" } @{$args{objs}};
      my @deps = map {
          $config{no_shared} ? $_.".OLB"
              : $unified_info{sharednames}->{$_}.".EXE"; } @{$args{deps}};
      my $deps = join(", -\n\t\t", @objs, @deps);
      # The "[]" hack is because in .OPT files, each line inherits the
      # previous line's file spec as default, so if no directory spec
      # is present in the current line and the previous line has one that
      # doesn't apply, you're in for a surprise.
      my $write_opt =
          join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
                                 "WRITE OPT_FILE \"$x" } @objs).
          "\"\n\t".
          join("\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
                             $x =~ s|(\.EXE)|$1/SHARE|;
                             $x =~ s|(\.OLB)|$1/LIB|;
                             "WRITE OPT_FILE \"$x\"" } @deps)
          || "\@ !";
      return <<"EOF";
$bin.EXE : $deps
        OPEN/WRITE/SHARE=READ OPT_FILE $bin.OPT
        $write_opt
        CLOSE OPT_FILE
        LINK/EXEC=$bin.EXE \$(LDFLAGS) $bin.OPT/OPT \$(EX_LIBS)
        - PURGE $bin.EXE,$bin.OPT
EOF
  }
  sub in2script {
      my %args = @_;
      my $script = $args{script};
      return "" if grep { $_ eq $script } @{$args{sources}}; # No overwrite!
      my $sources = join(" ", @{$args{sources}});
      my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
                                           "util", "dofile.pl")),
                           rel2abs($config{builddir}));
      return <<"EOF";
$script : $sources
        \$(PERL) "-I\$(BUILDDIR)" "-Mconfigdata" $dofile $sources > $script
        SET FILE/PROT=(S:RWED,O:RWED,G:RE,W:RE) $script
        PURGE $script
EOF
  }
  ""    # Important!  This becomes part of the template result.
-}
