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

  (our $osslprefix_q = platform->osslprefix()) =~ s/\$/\\\$/;

  our $sover_dirname = platform->shlib_version_as_filename();
  our $osslver = sprintf "%02d", split(/\./, $config{version});

  our $sourcedir = $config{sourcedir};
  our $builddir = $config{builddir};
  sub make_unix_path {
      # Split the native path
      (my $vol, my $dirs, my $file) = File::Spec->splitpath($_[0]);
      my @dirs = File::Spec->splitdir($dirs);

      # Reassemble it as a Unix path
      $vol =~ s|:$||;
      return File::Spec::Unix->catpath(
          '', File::Spec::Unix->catdir('', $vol ? $vol : (), @dirs), $file);
  }
  sub sourcefile {
      catfile($sourcedir, @_);
  }
  sub buildfile {
      catfile($builddir, @_);
  }
  sub sourcedir {
      catdir($sourcedir, @_);
  }
  sub builddir {
      catdir($builddir, @_);
  }
  sub tree {
      (my $x = shift) =~ s|\]$|...]|;
      $x
  }

  # Because we need to make two computations of these data,
  # we store them in arrays for reuse
  our @libs =
      map { platform->staticname($_) }
      @{$unified_info{libraries}};
  our @shlibs =
      map { platform->sharedname($_) // () }
      @{$unified_info{libraries}};
  our @install_libs =
      map { platform->staticname($_) }
      grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
      @{$unified_info{libraries}};
  our @install_shlibs =
      map { platform->sharedname($_) // () }
      grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
      @{$unified_info{libraries}};
  our @install_engines =
      grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
             && $unified_info{attributes}->{modules}->{$_}->{engine} }
      @{$unified_info{modules}};
  our @install_modules =
      grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
             && !$unified_info{attributes}->{modules}->{$_}->{engine}
             && !$unified_info{attributes}->{modules}->{$_}->{fips} }
      @{$unified_info{modules}};
  our @install_fipsmodules =
      grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
             && $unified_info{attributes}->{modules}->{$_}->{fips} }
      @{$unified_info{modules}};
  our @install_programs =
      grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} }
      @{$unified_info{programs}};
  our @install_bin_scripts =
      grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
             && !$unified_info{attributes}->{scripts}->{$_}->{misc} }
      @{$unified_info{scripts}};
  our @install_misc_scripts =
      grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
             && $unified_info{attributes}->{scripts}->{$_}->{misc} }
      @{$unified_info{scripts}};

  # Configured flags

  our @cnf_asflags = ($target{asflags} || (), @{$config{asflags}});
  our @cnf_defines = (@{$target{defines}}, @{$config{defines}});
  our @cnf_includes = (@{$target{includes}}, @{$config{includes}});
  our @cnf_cppflags = ($target{cppflags} || (), @{$config{cppflags}});
  our @cnf_cflags = ($target{cflags} || (), @{$config{cflags}});
  our @cnf_cxxflags = ($target{cxxflags} || (), @{$config{cxxflags}});
  our @cnf_ldflags = ($target{lflags} || (), @{$config{lflags}});
  our @cnf_ex_libs = (map{ ",$_" } @{$target{ex_libs}}, @{$config{ex_libs}});

  # Variables starting with $lib_ are used to build library object files
  # and shared libraries.
  # Variables starting with $dso_ are used to build DSOs and their object files.
  # Variables starting with $bin_ are used to build programs and their object
  # files.

  # The following array is special and is treated separately from the rest of
  # the lib_ variables.
  our @lib_cppincludes = (@{$target{lib_includes}}, @{$target{shared_includes}},
                          @{$config{lib_includes}}, @{$config{shared_includes}},
                          @cnf_includes);

  our $lib_cppdefines =
      join(',', @{$target{lib_defines}}, @{$target{shared_defines}},
                @{$config{lib_defines}}, @{$config{shared_defines}},
                @cnf_defines,
                'OPENSSLDIR="""$(OPENSSLDIR_C)"""',
                'ENGINESDIR="""$(ENGINESDIR_C)"""',
                'MODULESDIR="""$(MODULESDIR_C)"""'
                )
      . '$(DEFINES)'
      . "'extradefines'";
  our $lib_asflags =
      join(' ', $target{lib_asflags} || (), @{$config{lib_asflags}},
                @cnf_asflags, '$(ASFLAGS)');
  our $lib_cppflags =
      join('', $target{lib_cppflags} || (), $target{shared_cppflags} || (),
               @{$config{lib_cppflags}}, @{$config{shared_cppflag}},
               @cnf_cppflags, '/DEFINE=('.$lib_cppdefines.')', '$(CPPFLAGS)');
  my @lib_cflags = ( $target{lib_cflags} // () );
  my @lib_cflags_no_inst = ( $target{no_inst_lib_cflags} // @lib_cflags );
  my @lib_cflags_cont = ( $target{shared_cflag} || (),
                          @{$config{lib_cflags}}, @{$config{shared_cflag}},
                          $cnf_cflags, '$(CFLAGS)');
  our $lib_cflags = join('', @lib_cflags, @lib_cflags_cont );
  our $lib_cflags_no_inst = join('', @lib_cflags_no_inst, @lib_cflags_cont );
  our $lib_ldflags =
      join('', $target{lib_lflags} || (), $target{shared_ldflag} || (),
               @{$config{lib_lflags}}, @{$config{shared_ldflag}},
               @cnf_ldflags, '$(LDFLAGS)');
  our $lib_ex_libs = join('', @cnf_ex_libs, '$(EX_LIBS)');

  # The following array is special and is treated separately from the rest of
  # the dso_ variables.
  our @dso_cppincludes = (@{$target{dso_includes}}, @{$target{module_includes}},
                          @{$config{dso_includes}}, @{$config{module_includes}},
                          @cnf_includes);

  our $dso_cppdefines =
      join(',', @{$target{dso_defines}}, @{$target{module_defines}},
                @{$config{dso_defines}}, @{$config{module_defines}},
                @cnf_defines,
                )
      . '$(DEFINES)'
      . "'extradefines'";
  our $dso_asflags =
      join(' ', $target{dso_asflags} || (), $target{module_asflags} || (),
                @{$config{dso_asflags}}, @{$config{module_asflags}},
                @cnf_asflags, '$(ASFLAGS)');
  our $dso_cppflags =
      join('', $target{dso_cppflags} || (), $target{module_cppflags} || (),
               @{$config{dso_cppflags}}, @{$config{module_cppflag}},
               @cnf_cppflags,
               '/DEFINE=('.$dso_cppdefines.')',
               '$(CPPFLAGS)');
  my @dso_cflags = ( $target{dso_cflags} // () );
  my @dso_cflags_no_inst = ( $target{no_inst_dso_cflags} // @dso_cflags );
  my @dso_cflags_cont = ( $target{module_cflag} || (),
                          @{$config{dso_cflags}}, @{$config{module_cflag}},
                          $cnf_cflags, '$(CFLAGS)');
  our $dso_cflags = join('', @dso_cflags, @dso_cflags_cont );
  our $dso_cflags_no_inst = join('', @dso_cflags_no_inst, @dso_cflags_cont );
  our $dso_ldflags =
      join('', $target{dso_lflags} || (), $target{module_ldflag} || (),
               @{$config{dso_lflags}}, @{$config{module_ldflag}},
               @cnf_ldflags, '$(LDFLAGS)');
  our $dso_ex_libs = join('', @cnf_ex_libs, '$(EX_LIBS)');

  # The following array is special and is treated separately from the rest of
  # the bin_ variables.
  our @bin_cppincludes = (@{$target{bin_includes}},
                          @{$config{bin_includes}},
                          @cnf_includes);

  our $bin_cppdefines =
      join(',', @{$target{bin_defines}},
                @{$config{bin_defines}},
                @cnf_defines,
                )
      . '$(DEFINES)'
      . "'extradefines'";
  our $bin_asflags =
      join(' ', $target{bin_asflags} || (),
                @{$config{bin_asflags}},
                @cnf_asflags, '$(ASFLAGS)');
  our $bin_cppflags =
      join('', $target{bin_cppflags} || (),
               @{$config{bin_cppflags}},
               @cnf_cppflags,
               '/DEFINE=('.$bin_cppdefines.')',
               '$(CPPFLAGS)');
  my @bin_cflags = ( $target{bin_cflags} // () );
  my @bin_cflags_no_inst = ( $target{no_inst_bin_cflags} // @bin_cflags );
  my @bin_cflags_cont = ( @{$config{bin_cflags}},
                          $cnf_cflags, '$(CFLAGS)');
  our $bin_cflags = join('', @bin_cflags, @bin_cflags_cont );
  our $bin_cflags_no_inst = join('', @bin_cflags_no_inst, @bin_cflags_cont );
  our $bin_cflags =
      join('', $target{bin_cflags} || (),
               @{$config{bin_cflags}},
               @cnf_cflags, '$(CFLAGS)');
  our $bin_ldflags =
      join('', $target{bin_lflags} || (),
               @{$config{bin_lflags}},
               @cnf_ldflags, '$(LDFLAGS)');
  our $bin_ex_libs = join('', @cnf_ex_libs, '$(EX_LIBS)');

  # This is a horrible hack, but is needed because recursive inclusion of files
  # in different directories does not work well with VMS C.  We try to help by
  # specifying extra relative directories.  They must always be in Unix format,
  # relative to the directory where the .c file is located.  The logic is that
  # any inclusion, merged with one of these relative directories, will find the
  # requested inclusion file.
  foreach (grep /\[\.crypto\.async\.arch\].*\.o$/, keys %{$unified_info{sources}}) {
      my $obj = platform->obj($_);
      push @{$unified_info{includes_extra}->{$obj}}, qw(../);
  }
  foreach (grep /\[\.crypto\.ec\.curve448\].*?\.o$/, keys %{$unified_info{sources}}) {
      my $obj = platform->obj($_);
      push @{$unified_info{includes_extra}->{$obj}}, qw(./arch_32 ./arch64);
  }
  foreach (grep /\[\.crypto\.ec\.curve448.arch_(?:32|64)\].*?\.o$/, keys %{$unified_info{sources}}) {
      my $obj = platform->obj($_);
      push @{$unified_info{includes_extra}->{$obj}}, qw(../);
  }
  foreach (grep /\[\.ssl\.(?:record|statem)\].*?\.o$/, keys %{$unified_info{sources}}) {
      my $obj = platform->obj($_);
      # Most of the files in [.ssl.record] and [.ssl.statem] include
      # "../ssl_local.h", which includes things like "record/record.h".
      # Adding "../" as an inclusion directory helps making this sort of header
      # from these directories.
      push @{$unified_info{includes_extra}->{$obj}}, qw(../);

  }
  foreach (grep /\[\.test\].*?\.o$/, keys %{$unified_info{sources}}) {
      my $obj = platform->obj($_);
      push @{$unified_info{includes_extra}->{$obj}}, qw(../ssl ./helpers);
  }
  foreach (grep /\[\.test\.helpers\].*?\.o$/, keys %{$unified_info{sources}}) {
      my $obj = platform->obj($_);
      push @{$unified_info{includes_extra}->{$obj}}, qw(../../ssl);
  }

  # This makes sure things get built in the order they need
  # to. You're welcome.
  sub dependmagic {
      my $target = shift;

      return "$target : build_generated\n\t\pipe \$(MMS) \$(MMSQUALIFIERS) depend && \$(MMS) \$(MMSQUALIFIERS) _$target\n_$target";
  }
  "";
-}
PLATFORM={- $config{target} -}
OPTIONS={- $config{options} -}
CONFIGURE_ARGS=({- join(", ",quotify_l(@{$config{perlargv}})) -})
SRCDIR={- $config{sourcedir} -}
BLDDIR={- $config{builddir} -}
FIPSKEY={- $config{FIPSKEY} -}

# Allow both V and VERBOSE to indicate verbosity.  This only applies
# to testing.
VERBOSE=$(V)
VERBOSE_FAILURE=$(VF)

VERSION={- "$config{full_version}" -}
VERSION_NUMBER={- "$config{version}" -}
MAJOR={- $config{major} -}
MINOR={- $config{minor} -}
SHLIB_VERSION_NUMBER={- $config{shlib_version} -}
SHLIB_TARGET={- $target{shared_target} -}

LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @libs) -}
SHLIBS={- join(", ", map { "-\n\t".$_.".EXE" } @shlibs) -}
MODULES={- join(", ", map { "-\n\t".$_.".EXE" }
                      # Drop all modules that are dependencies, they will
                      # be processed through their dependents
                      grep { my $x = $_;
                             !grep { grep { $_ eq $x } @$_ }
                                   values %{$unified_info{depends}} }
                      @{$unified_info{modules}}) -}
FIPSMODULE={- # We do some extra checking here, as there should be only one
              use File::Basename;
              our @fipsmodules =
                  grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
                         && $unified_info{attributes}->{modules}->{$_}->{fips} }
                  @{$unified_info{modules}};
              die "More that one FIPS module" if scalar @fipsmodules > 1;
              join(" ", map { platform->dso($_) } @fipsmodules) -}
FIPSMODULENAME={- die "More that one FIPS module" if scalar @fipsmodules > 1;
                  join(", ", map { basename(platform->dso($_)) } @fipsmodules) -}
PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{programs}}) -}
SCRIPTS={- join(", ", map { "-\n\t".$_ } @{$unified_info{scripts}}) -}
{- output_off() if $disabled{makedepend}; "" -}
DEPS={- our @deps = map { platform->isobj($_) ? platform->dep($_) : $_ }
                    grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
                    keys %{$unified_info{sources}};
        join(", ", map { "-\n\t".$_ } @deps); -}
{- output_on() if $disabled{makedepend}; "" -}
GENERATED_MANDATORY={- join(", ",
                            map { "-\n\t".$_ } @{$unified_info{depends}->{""}} ) -}
GENERATED_PODS={- # common0.tmpl provides @generated
                  join(", ",
                       map { my $x = $_;
                             (
                               grep { 
                                      $unified_info{attributes}->{depends}
                                      ->{$x}->{$_}->{pod} // 0
                                    }
                                   keys %{$unified_info{attributes}->{depends}->{$x}}
                             ) ? "-\n\t".$x : ();
                           }
                           @generated) -}
GENERATED={- # common0.tmpl provides @generated
             join(", ", map { platform->convertext($_) } @generated) -}

INSTALL_LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @install_libs) -}
INSTALL_SHLIBS={- join(", ", map { "-\n\t".$_.".EXE" } @install_shlibs) -}
INSTALL_ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @install_engines) -}
INSTALL_MODULES={- join(", ", map { "-\n\t".$_.".EXE" } @install_modules) -}
INSTALL_FIPSMODULE={- join(", ", map { "-\n\t".$_.".EXE" } @install_fipsmodules) -}
INSTALL_FIPSMODULECONF=[.providers]fipsmodule.cnf
INSTALL_PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } @install_programs) -}
BIN_SCRIPTS={- join(", ", @install_bin_scripts) -}
MISC_SCRIPTS={- join(", ", @install_misc_scripts) -}
HTMLDOCS1={- join(", ", map { "-\n\t".$_ } @{$unified_info{htmldocs}->{man1}}) -}
HTMLDOCS3={- join(", ", map { "-\n\t".$_ } @{$unified_info{htmldocs}->{man3}}) -}
HTMLDOCS5={- join(", ", map { "-\n\t".$_ } @{$unified_info{htmldocs}->{man5}}) -}
HTMLDOCS7={- join(", ", map { "-\n\t".$_ } @{$unified_info{htmldocs}->{man7}}) -}

APPS_OPENSSL="{- use File::Spec::Functions;
                 catfile("apps","openssl") -}"

# 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={- our $installtop =
                  catdir($config{prefix}) || "SYS\$COMMON:[OPENSSL]";
              $installtop -}
SYSTARTUP={- catdir($installtop, '[.SYS$STARTUP]'); -}
# This is the standard central area to store certificates, private keys...
OPENSSLDIR={- catdir($config{openssldir}) or
              $config{prefix} ? catdir($config{prefix},"COMMON")
                              : "SYS\$COMMON:[OPENSSL-COMMON]" -}
# The same, but for C
OPENSSLDIR_C={- platform->osslprefix() -}DATAROOT:[000000]
# Where installed ENGINE modules reside, for C
ENGINESDIR_C={- platform->osslprefix() -}ENGINES{- $sover_dirname.$target{pointer_size} -}:
# Where modules reside, for C
MODULESDIR_C={- platform->osslprefix() -}MODULES{- $target{pointer_size} -}:

##### User defined commands and flags ################################

CC={- $config{CC} -}
CPP={- $config{CPP} -}
DEFINES={- our $defines = join('', map { ",$_" } @{$config{CPPDEFINES}}) -}
#INCLUDES={- our $includes = join(',', @{$config{CPPINCLUDES}}) -}
CPPFLAGS={- our $cppflags = join('', @{$config{CPPFLAGS}}) -}
CFLAGS={- join('', @{$config{CFLAGS}}) -}
LDFLAGS={- join('', @{$config{LFLAGS}}) -}
EX_LIBS={- join('', map { ",$_" } @{$config{LDLIBS}}) -}

PERL={- $config{PERL} -}

AS={- $config{AS} -}
ASFLAGS={- join(' ', @{$config{ASFLAGS}}) -}

##### Special command flags ##########################################

ASOUTFLAG={- $target{asoutflag} -}$(OSSL_EMPTY)

PERLASM_SCHEME={- $target{perlasm_scheme} -}

# CPPFLAGS_Q is used for one thing only: to build up buildinf.h
CPPFLAGS_Q={- (my $c = $lib_cppflags.$cppflags) =~ s|"|""|g;
              (my $d = $lib_cppdefines) =~ s|"|""|g;
              my $i = join(',', @lib_cppincludes || (), '$(INCLUDES)');
              my $x = $c;
              $x .= "/INCLUDE=($i)" if $i;
              $x .= "/DEFINE=($d)" if $d;
              $x; -}

# .FIRST and .LAST are special targets with MMS and MMK.
NODEBUG=@
.FIRST :
        {- join( "\n        \$(NODEBUG) ", @{ $target{setup_commands} // [] },
                                           '!' ) -}
        $(NODEBUG) sourcetop = F$PARSE("$(SRCDIR)","[]A.;",,,"SYNTAX_ONLY,NO_CONCEAL") - ".][000000" - "[000000." - "][" - "]A.;" + ".]"
        $(NODEBUG) DEFINE ossl_sourceroot 'sourcetop'
        $(NODEBUG) !
        $(NODEBUG) staging_dir = "$(DESTDIR)"
        $(NODEBUG) staging_instdir = ""
        $(NODEBUG) staging_datadir = ""
        $(NODEBUG) IF staging_dir .NES. "" THEN -
                staging_instdir = F$PARSE("A.;",staging_dir,"[]",,"SYNTAX_ONLY")
        $(NODEBUG) IF staging_instdir - "]A.;" .NES. staging_instdir THEN -
                staging_instdir = staging_instdir - "]A.;" + ".OPENSSL-INSTALL]"
        $(NODEBUG) IF staging_instdir - "A.;" .NES. staging_instdir THEN -
                staging_instdir = staging_instdir - "A.;" + "[OPENSSL-INSTALL]"
        $(NODEBUG) IF staging_dir .NES. "" THEN -
                staging_datadir = F$PARSE("A.;",staging_dir,"[]",,"SYNTAX_ONLY")
        $(NODEBUG) IF staging_datadir - "]A.;" .NES. staging_datadir THEN -
                staging_datadir = staging_datadir - "]A.;" + ".OPENSSL-COMMON]"
        $(NODEBUG) IF staging_datadir - "A.;" .NES. staging_datadir THEN -
                staging_datadir = staging_datadir - "A.;" + "[OPENSSL-COMMON]"
        $(NODEBUG) !
        $(NODEBUG) ! Installation logical names
        $(NODEBUG) !
        $(NODEBUG) ! This also creates a few DCL variables that are used for
        $(NODEBUG) ! the "install_msg" target.
        $(NODEBUG) !
        $(NODEBUG) installroot = F$PARSE(staging_instdir,"$(INSTALLTOP)","[]A.;",,"SYNTAX_ONLY,NO_CONCEAL") - ".][000000" - "[000000." - "][" - "]A.;"
        $(NODEBUG) installtop = installroot + ".]"
        $(NODEBUG) dataroot = F$PARSE(staging_datadir,"$(OPENSSLDIR)","[]A.;",,"SYNTAX_ONLY,NO_CONCEAL") - ".][000000" - "[000000." - "][" - "]A.;"
        $(NODEBUG) datatop = dataroot + ".]"
        $(NODEBUG) DEFINE ossl_installroot 'installtop'
        $(NODEBUG) DEFINE ossl_dataroot 'datatop'
        $(NODEBUG) !
        $(NODEBUG) ! Override disturbing system logicals.  We can't deassign
        $(NODEBUG) ! them, so we create it instead.  This is an unfortunate
        $(NODEBUG) ! necessity.
        $(NODEBUG) !
        $(NODEBUG) openssl_inc1 = F$PARSE("[.include.openssl]","A.;",,,"syntax_only") - "A.;"
        $(NODEBUG) openssl_inc2 = F$PARSE("sourcetop:[include.openssl]","A.;",,,"SYNTAX_ONLY") - "A.;"
        $(NODEBUG) DEFINE openssl 'openssl_inc1','openssl_inc2'
        $(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)" } @shlibs) || "!" -}

.LAST :
        $(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEASSIGN ".uc($_) } @shlibs) || "!" -}
        $(NODEBUG) DEASSIGN openssl
        $(NODEBUG) DEASSIGN ossl_dataroot
        $(NODEBUG) DEASSIGN ossl_installroot
        $(NODEBUG) DEASSIGN ossl_sourceroot
.DEFAULT :
        @ ! MMS cannot handle no actions...

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

{- dependmagic('build_sw'); -} : build_libs_nodep, build_modules_nodep, build_programs_nodep
{- dependmagic('build_libs'); -} : build_libs_nodep
{- dependmagic('build_modules'); -} : build_modules_nodep
{- dependmagic('build_programs'); -} : build_programs_nodep

build_generated_pods : $(GENERATED_PODS)
build_docs : build_html_docs
build_html_docs : $(HTMLDOCS1) $(HTMLDOCS3) $(HTMLDOCS5) $(HTMLDOCS7)

build_generated : $(GENERATED_MANDATORY)
build_libs_nodep : $(LIBS), $(SHLIBS)
build_modules_nodep : $(MODULES)
build_programs_nodep : $(PROGRAMS), $(SCRIPTS)

# Kept around for backward compatibility
build_apps build_tests : build_programs

# Convenience target to prebuild all generated files, not just the mandatory
# ones
build_all_generated : $(GENERATED_MANDATORY) $(GENERATED) build_docs
	@ ! {- output_off() if $disabled{makedepend}; "" -}
	@ WRITE SYS$OUTPUT "Warning: consider configuring with no-makedepend, because if"
	@ WRITE SYS$OUTPUT "         target system doesn't have $(PERL),"
	@ WRITE SYS$OUTPUT "         then make will fail..."
	@ ! {- output_on() if $disabled{makedepend}; "" -}

all : build_sw build_docs

test : tests
{- dependmagic('tests'); -} : build_programs_nodep, build_modules_nodep run_tests
run_tests :
        @ ! {- output_off() if $disabled{tests}; "" -}
        DEFINE SRCTOP "$(SRCDIR)"
        DEFINE BLDTOP "$(BLDDIR)"
        DEFINE FIPSKEY "$(FIPSKEY)"
        IF "$(VERBOSE)" .NES. "" THEN DEFINE VERBOSE "$(VERBOSE)"
        $(PERL) {- sourcefile("test", "run_tests.pl") -} $(TESTS)
        DEASSIGN BLDTOP
        DEASSIGN SRCTOP
        DEASSIGN FIPSKEY
        @ ! {- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
        @ WRITE SYS$OUTPUT "Tests are not supported with your chosen Configure options"
        @ ! {- output_on() if !$disabled{tests}; "" -}

list-tests :
        @ ! {- output_off() if $disabled{tests}; "" -}
        @ DEFINE SRCTOP "$(SRCDIR)"
        @ $(PERL) {- sourcefile("test", "run_tests.pl") -} list
        @ DEASSIGN SRCTOP
        @ ! {- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
        @ WRITE SYS$OUTPUT "Tests are not supported with your chosen Configure options"
        @ ! {- output_on() if !$disabled{tests}; "" -}

install : install_sw install_ssldirs install_docs {- $disabled{fips} ? "" : "install_fips" -} install_msg

install_msg :
        @ WRITE SYS$OUTPUT ""
        @ WRITE SYS$OUTPUT "######################################################################"
        @ WRITE SYS$OUTPUT ""
        @ IF "$(DESTDIR)" .EQS. "" THEN -
             @{- sourcefile("VMS", "msg_install.com") -} "$(SYSTARTUP)" "{- $osslver -}"
        @ IF "$(DESTDIR)" .NES. "" THEN -
             @{- sourcefile("VMS", "msg_staging.com") -} -
             "''installroot']" "''dataroot']" "$(INSTALLTOP)" "$(OPENSSLDIR)" -
             "$(SYSTARTUP)" "{- $osslver -}"

check_install :
        spawn/nolog @ossl_installroot:[SYSTEST]openssl_ivp{- $osslver -}.com

uninstall : uninstall_docs uninstall_sw {- $disabled{fips} ? "" : "uninstall_fips" -}

# Because VMS wants the generation number (or *) to delete files, we can't
# use $(LIBS), $(PROGRAMS), $(GENERATED) and $(MODULES) directly.
libclean :
        {- join("\n\t", map { "- DELETE $_.OLB;*" } @libs) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_.EXE;*,$_.MAP;*" } @shlibs) || "@ !" -}

clean : libclean
        {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{htmldocs}->{man1}}) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{htmldocs}->{man3}}) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{htmldocs}->{man5}}) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{htmldocs}->{man7}}) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_.EXE;*,$_.OPT;*" } @{$unified_info{programs}}) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_.EXE;*,$_.OPT;*" } @{$unified_info{modules}}) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{scripts}}) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{depends}->{""}}) || "@ !" -}
        {- join("\n\t", map { "- DELETE $_;*" } @generated) || "@ !" -}
        - DELETE [...]*.MAP;*
        - DELETE [...]*.D;*
        - DELETE [...]*.OBJ;*,*.LIS;*
        - DELETE []CXX$DEMANGLER_DB.;*
        - DELETE [.VMS]openssl_startup.com;*
        - DELETE [.VMS]openssl_shutdown.com;*
        - DELETE []vmsconfig.pm;*

distclean : clean
        - DELETE configdata.pm;*
        - DELETE descrip.mms;*

depend : descrip.mms
descrip.mms : FORCE
	@ ! {- output_off() if $disabled{makedepend}; "" -}
	@ $(PERL) {- sourcefile("util", "add-depends.pl") -} "{- $config{makedep_scheme} -}"
	@ ! {- output_on() if $disabled{makedepend}; "" -}

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

install_sw : install_dev install_engines install_modules -
             install_runtime install_startup install_ivp

uninstall_sw : uninstall_dev uninstall_modules uninstall_engines -
               uninstall_runtime uninstall_startup uninstall_ivp

install_docs : install_html_docs

uninstall_docs : uninstall_html_docs

{- output_off() if $disabled{fips}; "" -}
install_fips : build_sw $(INSTALL_FIPSMODULECONF)
	@ WRITE SYS$OUTPUT "*** Installing FIPS module"
	- CREATE/DIR ossl_installroot:[MODULES{- $target{pointer_size} -}.'arch']
	- CREATE/DIR/PROT=(S:RWED,O:RWE,G:RE,W:RE) OSSL_DATAROOT:[000000]
	COPY/PROT=W:RE $(INSTALL_FIPSMODULES) -
                ossl_installroot:[MODULES{- $target{pointer_size} -}.'arch']$(FIPSMODULENAME)
	@ WRITE SYS$OUTPUT "*** Installing FIPS module configuration"
	COPY/PROT=W:RE $(INSTALL_FIPSMODULECONF) OSSL_DATAROOT:[000000]

uninstall_fips :
	@ WRITE SYS$OUTPUT "*** Uninstalling FIPS module configuration"
	DELETE OSSL_DATAROOT:[000000]fipsmodule.cnf;*
	@ WRITE SYS$OUTPUT "*** Uninstalling FIPS module"
	DELETE ossl_installroot:[MODULES{- $target{pointer_size} -}.'arch']$(FIPSMODULENAME);*
{- output_on() if $disabled{fips}; "" -}

install_ssldirs : check_INSTALLTOP
        - CREATE/DIR/PROT=(S:RWED,O:RWE,G:RE,W:RE) OSSL_DATAROOT:[000000]
        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 F$SEARCH("OSSL_DATAROOT:[000000]PRIVATE.DIR;1") .EQS. "" THEN -
                CREATE/DIR/PROT=(S:RWED,O:RWE,G,W) OSSL_DATAROOT:[PRIVATE]
        IF F$SEARCH("OSSL_DATAROOT:[000000]MISC.DIR;1") .EQS. "" THEN -
                CREATE/DIR/PROT=(S:RWED,O:RWE,G,W) OSSL_DATAROOT:[MISC]
        COPY/PROT=W:RE $(MISC_SCRIPTS) OSSL_DATAROOT:[MISC]
        @ ! Install configuration file
        COPY/PROT=W:R {- sourcefile("apps", "openssl-vms.cnf") -} -
                ossl_dataroot:[000000]openssl.cnf-dist
        IF F$SEARCH("OSSL_DATAROOT:[000000]openssl.cnf") .EQS. "" THEN -
                COPY/PROT=W:R {- sourcefile("apps", "openssl-vms.cnf") -} -
                        ossl_dataroot:[000000]openssl.cnf
        @ ! Install CTLOG configuration file
        COPY/PROT=W:R {- sourcefile("apps", "ct_log_list.cnf") -} -
                ossl_dataroot:[000000]ct_log_list.cnf-dist
        IF F$SEARCH("OSSL_DATAROOT:[000000]ct_log_list.cnf") .EQS. "" THEN -
                COPY/PROT=W:R {- sourcefile("apps", "ct_log_list.cnf") -} -
                        ossl_dataroot:[000000]ct_log_list.cnf

install_dev : check_INSTALLTOP install_runtime_libs
        @ WRITE SYS$OUTPUT "*** Installing development files"
        @ ! Install header files
        - CREATE/DIR ossl_installroot:[include.openssl]
        COPY/PROT=W:R ossl_sourceroot:[include.openssl]*.h -
                ossl_installroot:[include.openssl]
        COPY/PROT=W:R [.include.openssl]*.h ossl_installroot:[include.openssl]
        @ ! Install static (development) libraries
        - CREATE/DIR ossl_installroot:[LIB.'arch']
        {- join("\n        ",
                map { "COPY/PROT=W:R $_.OLB ossl_installroot:[LIB.'arch']" }
                @install_libs) -}

install_engines : check_INSTALLTOP install_runtime_libs build_modules
        @ {- output_off() unless scalar @install_engines; "" -} !
        @ WRITE SYS$OUTPUT "*** Installing engines"
        - CREATE/DIR ossl_installroot:[ENGINES{- $sover_dirname.$target{pointer_size} -}.'arch']
        {- join("\n        ",
                map { "COPY/PROT=W:RE $_.EXE ossl_installroot:[ENGINES$sover_dirname$target{pointer_size}.'arch']" }
                @install_engines) -}
        @ {- output_on() unless scalar @install_engines; "" -} !

install_modules : check_INSTALLTOP install_runtime_libs build_modules
        @ {- output_off() unless scalar @install_modules; "" -} !
        @ WRITE SYS$OUTPUT "*** Installing modules"
        - CREATE/DIR ossl_installroot:[MODULES{- $target{pointer_size} -}.'arch']
        {- join("\n        ",
                map { "COPY/PROT=W:RE $_.EXE ossl_installroot:[MODULES$target{pointer_size}.'arch']" }
                @install_modules) -}
        @ {- output_on() unless scalar @install_modules; "" -} !

install_runtime : install_programs

install_runtime_libs : check_INSTALLTOP build_libs
        @ {- output_off() if $disabled{shared}; "" -} !
        @ WRITE SYS$OUTPUT "*** Installing shareable images"
        @ ! Install shared (runtime) libraries
        - CREATE/DIR ossl_installroot:[LIB.'arch']
        {- join("\n        ",
                map { "COPY/PROT=W:R $_.EXE ossl_installroot:[LIB.'arch']" }
                @install_shlibs) -}
        @ {- output_on() if $disabled{shared}; "" -} !

install_programs : check_INSTALLTOP install_runtime_libs build_programs
        @ {- output_off() if $disabled{apps}; "" -} !
        @ ! Install the main program
        - CREATE/DIR ossl_installroot:[EXE.'arch']
        COPY/PROT=W:RE [.APPS]openssl.EXE -
                ossl_installroot:[EXE.'arch']openssl{- $osslver -}.EXE
        @ ! Install scripts
        COPY/PROT=W:RE $(BIN_SCRIPTS) ossl_installroot:[EXE]
        @ ! {- output_on() if $disabled{apps}; "" -}

install_startup : [.VMS]openssl_startup.com [.VMS]openssl_shutdown.com -
                 [.VMS]openssl_utils.com, check_INSTALLTOP
        - CREATE/DIR ossl_installroot:[SYS$STARTUP]
        COPY/PROT=W:RE [.VMS]openssl_startup.com -
                ossl_installroot:[SYS$STARTUP]openssl_startup{- $osslver -}.com
        COPY/PROT=W:RE [.VMS]openssl_shutdown.com -
                ossl_installroot:[SYS$STARTUP]openssl_shutdown{- $osslver -}.com
        COPY/PROT=W:RE [.VMS]openssl_utils.com -
                ossl_installroot:[SYS$STARTUP]openssl_utils{- $osslver -}.com

install_ivp : [.VMS]openssl_ivp.com check_INSTALLTOP
        - CREATE/DIR ossl_installroot:[SYSTEST]
        COPY/PROT=W:RE [.VMS]openssl_ivp.com -
                ossl_installroot:[SYSTEST]openssl_ivp{- $osslver -}.com

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

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

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

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

vmsconfig.pm : configdata.pm
        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 %disabled);"
        WRITE CONFIG "our %config = ("
        WRITE CONFIG "  target => '","{- $config{target} -}","',"
        WRITE CONFIG "  version => '","{- $config{version} -}","',"
        WRITE CONFIG "  shlib_version => '","{- $config{shlib_version} -}","',"
        WRITE CONFIG "  shlib_major => '","{- $config{shlib_major} -}","',"
        WRITE CONFIG "  shlib_minor => '","{- $config{shlib_minor} -}","',"
        WRITE CONFIG "  no_shared => '","{- $disabled{shared} -}","',"
        WRITE CONFIG "  INSTALLTOP => '$(INSTALLTOP)',"
        WRITE CONFIG "  OPENSSLDIR => '$(OPENSSLDIR)',"
        WRITE CONFIG "  pointer_size => '","{- $target{pointer_size} -}","',"
        WRITE CONFIG ");"
        WRITE CONFIG "our %target = ();"
        WRITE CONFIG "our %disabled = ();"
        WRITE CONFIG "our %withargs = ();"
        WRITE CONFIG "our %unified_info = ();"
        WRITE CONFIG "1;"
        CLOSE CONFIG

install_html_docs : check_INSTALLTOP build_html_docs
        @ WRITE SYS$OUTPUT "*** Installing HTML docs"
        - CREATE/DIR ossl_installroot:[HTML.MAN1]
        - CREATE/DIR ossl_installroot:[HTML.MAN3]
        - CREATE/DIR ossl_installroot:[HTML.MAN5]
        - CREATE/DIR ossl_installroot:[HTML.MAN7]
        {- join("\n        ",
                ( map { "COPY/PROT=W:RE $_ ossl_installroot:[HTML.MAN1]" }
                  @{$unified_info{htmldocs}->{man1}} ),
                ( map { "COPY/PROT=W:RE $_ ossl_installroot:[HTML.MAN3]" }
                  @{$unified_info{htmldocs}->{man3}} ),
                ( map { "COPY/PROT=W:RE $_ ossl_installroot:[HTML.MAN5]" }
                  @{$unified_info{htmldocs}->{man5}} ),
                ( map { "COPY/PROT=W:RE $_ ossl_installroot:[HTML.MAN7]" }
                  @{$unified_info{htmldocs}->{man7}} )) -}

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

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

debug_logicals :
        SH LOGICAL/PROC openssl,internal,ossl_installroot,ossl_dataroot

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

configdata.pm : $(SRCDIR)Configure $(SRCDIR)config.com {- join(" ", @{$config{build_file_templates}}, @{$config{build_infos}}, @{$config{conf_files}}) -}
        perl configdata.pm -r
        @ WRITE SYS$OUTPUT "*************************************************"
        @ WRITE SYS$OUTPUT "***                                           ***"
        @ WRITE SYS$OUTPUT "***   Please run the same mms command again   ***"
        @ WRITE SYS$OUTPUT "***                                           ***"
        @ WRITE SYS$OUTPUT "*************************************************"
        @ PIPE ( EXIT %X10000000 )

reconfigure reconf :
	perl configdata.pm -r

{-
  use File::Basename;
  use File::Spec::Functions qw/abs2rel rel2abs catfile catdir/;
  use File::Spec::Unix;

  # Helper function to convert dependencies in platform agnostic form to
  # dependencies in platform form.
  sub compute_platform_depends {
      map { my $x = $_;

            grep { $x eq $_ } @{$unified_info{programs}} and platform->bin($x)
            or grep { $x eq $_ } @{$unified_info{modules}} and platform->dso($x)
            or grep { $x eq $_ } @{$unified_info{libraries}} and platform->lib($x)
            or platform->convertext($x); } @_;
  }

  # Helper function to figure out dependencies on libraries
  # It takes a list of library names and outputs a list of dependencies
  sub compute_lib_depends {
      # Depending on shared libraries:
      # On Windows POSIX layers, we depend on {libname}.dll.a
      # On Unix platforms, we depend on {shlibname}.so
      return map {
          { lib   => platform->sharedlib($_) // platform->staticlib($_),
            attrs => $unified_info{attributes}->{libraries}->{$_} }
      } @_;
  }

  # Helper function to deal with inclusion directory specs.
  # We're dealing with two issues:
  # 1. A lot of include directory specs take up a lot of command line real
  #    estate, and the DCL command line is very limited (2KiB).
  # 2. For optimal usage, include directory paths must be in Unix form,
  #    that's the only way the C compiler can merge multiple include paths
  #    in a sane way (we can stop worrying about 1.h including foo/2.h
  #    including ../3.h).
  #
  # To resolve 1, we need to create a file with include directory pragmas,
  # and let the compiler use it with /FIRST_INCLUDE=.
  # To resolve 2, we convert all include directory specs we get to Unix,
  # with available File::Spec functions.
  #
  # We use CRC-24 from https://tools.ietf.org/html/rfc4880#section-6,
  # reimplemented in Perl to get a workable and constant file name for each
  # combination of include directory specs.  It is assumed that the order of
  # these directories don't matter.
  #
  # This function takes as input a list of include directories
  # This function returns a list two things:
  # 1. The file name to use with /FIRST_INCLUDE=
  # 2. Text to insert into descrip.mms (may be the empty string)
  sub crc24 {
      my $input = shift;

      my $init_value = 0x00B704CE;
      my $poly_value = 0x01864CFB;

      my $crc = $init_value;

      foreach my $x (unpack ('C*', $input)) {
          $crc ^= $x << 16;

          for (my $i; $i < 8; $i++) {
              $crc <<= 1;
              if ($crc & 0x01000000) {
                  $crc ^= $poly_value;
              }
          }
      }
      $crc &= 0xFFFFFF;

      return $crc;
  }
  my %includefile_cache;
  sub make_includefile {
      my %dirs = map {
          my $udir = make_unix_path(rel2abs($_));

          $udir => 1;
      } @_;
      my @dirs = sort keys %dirs;
      my $filename = sprintf 'incdirs_%x.h', crc24(join(',', @dirs));

      if ($includefile_cache{$filename}) {
          return ($filename, "");
      }

      my $scripture = <<"EOF";
$filename :
	open/write inc_output $filename
EOF
      foreach (@dirs) {
          $scripture .= <<"EOF";
	write inc_output "#pragma include_directory ""$_"""
EOF
      }
      $scripture .= <<"EOF";
	close inc_output
EOF
      $includefile_cache{$filename} = $scripture;

      return ($filename, $scripture);
  }

  # On VMS, (some) header file directories include the files
  # __DECC_INCLUDE_EPILOGUE.H and __DECC_INCLUDE_PROLOGUE.H.
  # When header files are generated, and the build directory
  # isn't the same as the source directory, these files must
  # be copied alongside the generated header file, or their
  # effect will be lost.
  # We use the same include file cache as make_includefile
  # to check if the scripture to copy these files has already
  # been generated.
  sub make_decc_include_files {
      my $outd = shift;
      my $ind = shift;

      # If the build directory and the source directory are the
      # same, there's no need to copy the prologue and epilogue
      # files.
      return ('') if $outd eq $ind;

      my $outprologue = catfile($outd, '__DECC_INCLUDE_PROLOGUE.H');
      my $outepilogue = catfile($outd, '__DECC_INCLUDE_EPILOGUE.H');
      my $inprologue = catfile($ind, '__DECC_INCLUDE_PROLOGUE.H');
      my $inepilogue = catfile($ind, '__DECC_INCLUDE_EPILOGUE.H');
      my @filenames = ();
      my $scripture = '';

      if ($includefile_cache{$outprologue}) {
          push @filenames, $outprologue;
      } elsif (-f $inprologue) {
          my $local_scripture .= <<"EOF";
$outprologue : $inprologue
	COPY $inprologue $outprologue
EOF
          $includefile_cache{$outprologue} = $local_scripture;

          push @filenames, $outprologue;
          $scripture .= $local_scripture;
      }
      if ($includefile_cache{$outepilogue}) {
          push @filenames, $outepilogue;
      } elsif (-f $inepilogue) {
          my $local_scripture .= <<"EOF";
$outepilogue : $inepilogue
	COPY $inepilogue $outepilogue
EOF
          $includefile_cache{$outepilogue} = $local_scripture;

          push @filenames, $outepilogue;
          $scripture .= $local_scripture;
      }

      return (@filenames, $scripture);
  }

  sub generatetarget {
      my %args = @_;
      my $deps = join(" ", compute_platform_depends(@{$args{deps}}));
      return <<"EOF";
$args{target} : $deps
EOF
  }

  sub generatesrc {
      my %args = @_;
      my $gen0 = $args{generator}->[0];
      my $gen_args = join('', map { " $_" }
                              @{$args{generator}}[1..$#{$args{generator}}]);
      my $gen_incs = join("", map { ' "-I'.$_.'"' } @{$args{generator_incs}});
      my $deps = join(", -\n\t\t",
                      compute_platform_depends(@{$args{generator_deps}},
                                               @{$args{deps}}));

      if ($args{src} =~ /\.html$/) {
          #
          # HTML generator
          #
          my $title = basename($args{src}, ".html");
          my $pod = $gen0;
          my $mkpod2html = sourcefile('util', 'mkpod2html.pl');
          my $srcdoc = sourcedir('doc');
          return <<"EOF";
$args{src} : $pod
	\$(PERL) $mkpod2html -i $pod -o \$\@ -t "$title" -r "$srcdoc"
EOF
      } elsif ($args{src} =~ /\.(\d)$/) {
          #
          # Man-page generator, on VMS we simply ignore man-pages
          #
          return "";
      } elsif (platform->isdef($args{src})) {
          #
          # Linker script-ish generator
          #
          my $target = platform->def($args{src});
          my $mkdef = sourcefile('util', 'mkdef.pl');
          my $ord_ver = $args{intent} eq 'lib' ? ' --version $(VERSION_NUMBER)' : '';
          my $ord_name =
              $args{generator}->[1] || basename($args{product}, '.EXE');
          my $case_insensitive =
              $target{$args{intent}.'_cflags'} =~ m|/NAMES=[^/]*AS_IS|i
              ? '' : ' --case-insensitive';
          return <<"EOF";
$target : $gen0 $deps $mkdef
	\$(PERL) $mkdef$ord_ver --ordinals $gen0 --name $ord_name "--OS" "VMS"$case_insensitive > $target
EOF
      } elsif (platform->isasm($args{src})) {
          #
          # Assembler generator
          #
          my $cppflags =
              { shlib => "$lib_cflags $lib_cppflags",
                lib => "$lib_cflags $lib_cppflags",
                dso => "$dso_cflags $dso_cppflags",
                bin => "$bin_cflags $bin_cppflags" } -> {$args{intent}};
          my $defs = join("", map { ",".$_ } @{$args{defs}});
          my $target = platform->asm($args{src});

          my $generator;
          if ($gen0 =~ /\.pl$/) {
              $generator = '$(PERL)'.$gen_incs.' '.$gen0.$gen_args
                  .' '.$cppflags;
          } elsif ($gen0 =~ /\.S$/) {
              $generator = undef;
          } else {
              die "Generator type for $src unknown: $gen0.$gen_args\n";
          }

          if (defined($generator)) {
              # If the target is named foo.S in build.info, we want to
              # end up generating foo.s in two steps.
              if ($args{src} =~ /\.S$/) {
                   return <<"EOF";
$target : $gen0 $deps
	$generator \$\@-S
        \@ extradefines = "$defs"
	PIPE \$(CPP) $cppflags \$\@-S | -
             \$(PERL) -ne "/^#(\\s*line)?\\s*[0-9]+\\s+""/ or print" > \$\@-i
        \@ DELETE/SYMBOL/LOCAL extradefines
        RENAME \$\@-i \$\@
        DELETE \$\@-S;
EOF
              }
              # Otherwise....
              return <<"EOF";
$target : $gen0 $deps
        \@ extradefines = "$defs"
	$generator \$\@
        \@ DELETE/SYMBOL/LOCAL extradefines
EOF
          }
          return <<"EOF";
$target : $gen0 $deps
        \@ extradefines = "$defs"
        PIPE \$(CPP) $cppflags $gen0 | -
        \$(PERL) "-ne" "/^#(\\s*line)?\\s*[0-9]+\\s+""/ or print" > \$\@
        \@ DELETE/SYMBOL/LOCAL extradefines
EOF
      } elsif ($gen0 =~ m|^.*\.in$|) {
          #
          # "dofile" generator (file.in -> file)
          #
          my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
                                               "util", "dofile.pl")),
                               rel2abs($config{builddir}));
          my @perlmodules = ( 'configdata.pm',
                              grep { $_ =~ m|\.pm$| } @{$args{deps}} );
          my %perlmoduleincs = map { '"-I'.dirname($_).'"' => 1 } @perlmodules;
          my @decc_include_data
              = make_decc_include_files(dirname($args{src}), dirname($gen0));
          my $decc_include_scripture = pop @decc_include_data;
          $deps = join(' ', $deps, @decc_include_data,
                            compute_platform_depends(@perlmodules));
          @perlmodules = map { '"-M'.basename($_, '.pm').'"' } @perlmodules;
          my $perlmodules = join(' ', '', sort keys %perlmoduleincs, @perlmodules);

          return <<"EOF";
$args{src} : $gen0 $deps
	\$(PERL)$perlmodules $dofile "-o$target{build_file}" $gen0$gen_args > \$\@
$decc_include_scripture
EOF
      } elsif (grep { $_ eq $gen0 } @{$unified_info{programs}}) {
          #
          # Generic generator using OpenSSL programs
          #

          # Redo $gen0, to ensure that we have the proper extension
          $gen0 = platform->bin($gen0);
          return <<"EOF";
$args{src} : $gen0 $deps
	PIPE MCR $gen0$gen_args > \$@
EOF
      } else {
          #
          # Generic generator using Perl
          #
          return <<"EOF";
$args{src} : $gen0 $deps
	\$(PERL)$gen_incs $gen0$gen_args > \$\@
EOF
      }
  }

  sub src2obj {
      my $asmext = platform->asmext();
      my %args = @_;
      my @srcs =
          map { my $x = $_;
                (platform->isasm($x) && grep { $x eq $_ } @generated)
                ? platform->asm($x) : $x }
          ( @{$args{srcs}} );
      my $obj = platform->obj($args{obj});
      my $dep = platform->dep($args{obj});
      my $deps = join(", -\n\t\t", @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 $depd = abs2rel(rel2abs(dirname($dep)), rel2abs($forward));
      my $depn = basename($dep);
      my $srcs =
          join(", ", map { abs2rel(rel2abs($_), rel2abs($forward)) } @srcs);
      my $incextra = join(',', map { "\"$_\"" }
                               @{$unified_info{includes_extra}->{$obj}});
      $incextra = "/INCLUDE=($incextra)" if $incextra;

      my $cflags;
      if ($args{attrs}->{noinst}) {
          $cflags .= { shlib => $lib_cflags_no_inst,
                       lib => $lib_cflags_no_inst,
                       dso => $dso_cflags_no_inst,
                       bin => $bin_cflags_no_inst } -> {$args{intent}};
      } else {
          $cflags .= { shlib => $lib_cflags,
                       lib => $lib_cflags,
                       dso => $dso_cflags,
                       bin => $bin_cflags } -> {$args{intent}};
      }
      $cflags .= { shlib => $lib_cppflags,
		   lib => $lib_cppflags,
		   dso => $dso_cppflags,
		   bin => $bin_cppflags } -> {$args{intent}};
      $cflags .= $incextra;
      my $defs = join("", map { ",".$_ } @{$args{defs}});
      my $asflags = { shlib => $lib_asflags,
		      lib => $lib_asflags,
		      dso => $dso_asflags,
		      bin => $bin_asflags } -> {$args{intent}};

      if ($srcs[0] =~ /\Q${asmext}\E$/) {
          return <<"EOF";
$obj : $deps
        SET DEFAULT $forward
        \$(AS) $asflags \$(ASOUTFLAG)${objd}${objn} $srcs
        SET DEFAULT $backward
        - PURGE $obj
EOF
      } elsif ($srcs[0] =~ /.S$/) {
         return <<"EOF";
$obj : $deps
        SET DEFAULT $forward
        \@ $incs_on
        \@ extradefines = "$defs"
        PIPE \$(CPP) ${cflags} $srcs | -
             \$(PERL) -ne "/^#(\\s*line)?\\s*[0-9]+\\s+""/ or print" -
             > ${objd}${objn}-asm
        \@ DELETE/SYMBOL/LOCAL extradefines
        \@ $incs_off
        SET DEFAULT $backward
        \$(AS) $asflags \$(ASOUTFLAG)$obj $obj-asm
        - PURGE $obj
EOF
      }

      my ($incdir_filename, $incdir_scripture) =
          make_includefile(@{ { shlib => [ @lib_cppincludes ],
                                lib => [ @lib_cppincludes ],
                                dso => [ @dso_cppincludes ],
                                bin => [ @bin_cppincludes ] } -> {$args{intent}} },
                           @{$args{incs}});
      $deps .= ", -\n\t\t$incdir_filename";
      $cflags =
          $target{cflag_incfirst}
          . '"'.make_unix_path(rel2abs($incdir_filename)).'"'
          . $cflags;

      my $depbuild = $disabled{makedepend} ? ""
          : " /MMS=(FILE=${depd}${depn},TARGET=$obj)";

      return <<"EOF";
$obj : $deps
        SET DEFAULT $forward
        \@ $incs_on
        \@ extradefines = "$defs"
        \$(CC) ${cflags}${depbuild} /OBJECT=${objd}${objn} /REPOSITORY=$backward $srcs
        \@ DELETE/SYMBOL/LOCAL extradefines
        \@ $incs_off
        SET DEFAULT $backward
        - PURGE $obj
$incdir_scripture
EOF
  }
  sub obj2shlib {
      my %args = @_;
      my $shlibname = platform->sharedname($args{lib});
      my $shlib = platform->sharedlib($args{lib});
      my @objs = map { platform->convertext($_) }
                 grep { platform->isobj($_) }
                 @{$args{objs}};
      my @defs = map { platform->convertext($_) }
                 grep { platform->isdef($_) }
                 @{$args{objs}};
      my @deps = compute_lib_depends(@{$args{deps}});
      die "More than one symbol vector" if scalar @defs > 1;
      my $deps = join(", -\n\t\t", @objs, @defs, map { $_->{lib} } @deps);
      my $shlib_target = $disabled{shared} ? "" : $target{shared_target};
      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_opt1 =
          join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
                                 "WRITE OPT_FILE \"$x" } @objs).
          "\"";
      my $write_opt2 =
          join("\n\t", map { my $x = $_->{lib} =~ /\[/
                                 ? $_->{lib} : "[]".$_->{lib};
                             $x =~ s|(\.EXE)|$1/SHARE|;
                             $x =~ s|(\.OLB)|$1/LIB|;
                             "WRITE OPT_FILE \"$x\"" } @deps)
          || "\@ !";
      return <<"EOF"
$shlib : $deps
        \$(PERL) $translatesyms_pl \$(BLDDIR)CXX\$DEMANGLER_DB. < $defs[0] > $defs[0]-translated
        OPEN/WRITE/SHARE=READ OPT_FILE $shlibname-components.OPT
        $write_opt1
        $write_opt2
        CLOSE OPT_FILE
        LINK ${lib_ldflags}/SHARE=\$\@ $defs[0]-translated/OPT,-
                $shlibname-components.OPT/OPT \$(LIB_EX_LIBS)
        DELETE $defs[0]-translated;*,$shlibname-components.OPT;*
        PURGE $shlibname.EXE,$shlibname.MAP
EOF
        . ($config{target} =~ m|alpha| ? "" : <<"EOF"
        SET IMAGE/FLAGS=(NOCALL_DEBUG) \$\@
EOF
        );
  }
  sub obj2dso {
      my %args = @_;
      my $dsoname = platform->dsoname($args{module});
      my $dso = platform->dso($args{module});
      my @objs = map { platform->convertext($_) }
                 grep { platform->isobj($_) }
                 @{$args{objs}};
      my @defs = map { platform->convertext($_) }
                 grep { platform->isdef($_) }
                 @{$args{objs}};
      my @deps = compute_lib_depends(@{$args{deps}});
      my $deps = join(", -\n\t\t", @objs, @defs, map { $_->{lib} } @deps);
      die "More than one symbol vector" if scalar @defs > 1;
      my $shlib_target = $disabled{shared} ? "" : $target{shared_target};
      # 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_opt1 =
          join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
                                 "WRITE OPT_FILE \"$x" } @objs).
          "\"";
      my $write_opt2 =
          join("\n\t", map { my $x = $_->{lib} =~ /\[/
                                 ? $_->{lib} : "[]".$_->{lib};
                             $x =~ s|(\.EXE)|$1/SHARE|;
                             $x =~ s|(\.OLB)|$1/LIB|;
                             "WRITE OPT_FILE \"$x\"" } @deps)
          || "\@ !";
      return <<"EOF"
$dso : $deps
        OPEN/WRITE/SHARE=READ OPT_FILE $dsoname-components.OPT
        $write_opt1
        $write_opt2
        CLOSE OPT_FILE
        LINK ${dso_ldflags}/SHARE=\$\@ $defs[0]/OPT,-
		$dsoname-components.OPT/OPT \$(DSO_EX_LIBS)
        - PURGE $dsoname.EXE,$dsoname.OPT,$dsoname.MAP
EOF
        . ($config{target} =~ m|alpha| ? "" : <<"EOF"
        SET IMAGE/FLAGS=(NOCALL_DEBUG) \$\@
EOF
        );
  }
  sub obj2lib {
      my %args = @_;
      my $lib = platform->staticlib($args{lib});
      my @objs = map { platform->convertext($_) }
                 grep { platform->isobj($_) }
                 @{$args{objs}};
      my $objs = join(", -\n\t\t", @objs);
      my $fill_lib = join("\n\t", (map { "LIBRARY/REPLACE $lib $_" } @objs));
      return <<"EOF";
$lib : $objs
        LIBRARY/CREATE/OBJECT $lib
        $fill_lib
        - PURGE $lib
EOF
  }
  sub obj2bin {
      my %args = @_;
      my $bin = platform->bin($args{bin});
      my $binname = platform->binname($args{bin});
      my @objs = map { platform->convertext($_) }
                 grep { platform->isobj($_) }
                 @{$args{objs}};
      my $objs = join(",", @objs);
      my @deps = compute_lib_depends(@{$args{deps}});
      my $deps = join(", -\n\t\t", @objs, map { $_->{lib} } @deps);

      my $olb_count = scalar grep(m|\.OLB$|, map { $_->{lib} } @deps);
      my $analyse_objs = "@ !";
      if ($olb_count > 0) {
          my $analyse_quals =
              $config{target} =~ m|alpha| ? "/GSD" : "/SECTIONS=SYMTAB";
          $analyse_objs = "- pipe ANALYSE/OBJECT$analyse_quals $objs | SEARCH SYS\$INPUT \"\"\"main\"\"\" ; nomain = \$severity .NE. 1"
      }
      # 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_opt1 =
          join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
                                 "\@ WRITE OPT_FILE \"$x" } @objs).
          "\"";
      my $write_opt2 =
          join("\n\t", "WRITE OPT_FILE \"CASE_SENSITIVE=YES\"",
                       map { my @lines = ();
                             use Data::Dumper;
                             my $x = $_->{lib} =~ /\[/
                                 ? $_->{lib} : "[]".$_->{lib};
                             if ($x =~ m|\.EXE$|) {
                                 push @lines, "\@ WRITE OPT_FILE \"$x/SHARE\"";
                             } elsif ($x =~ m|\.OLB$|) {
                                 # Special hack to include the MAIN object
                                 # module explicitly.  This will only be done
                                 # if there isn't a 'main' in the program's
                                 # object modules already.
                                 my $main = $_->{attrs}->{has_main}
                                     ? '/INCLUDE=main' : '';
                                 push @lines,
                                     "\@ IF nomain THEN WRITE OPT_FILE \"$x/LIB$main\"",
                                     "\@ IF .NOT. nomain THEN WRITE OPT_FILE \"$x/LIB\""
                             }
                             @lines
                           } @deps)
          || "\@ !";
      # The linking commands looks a bit complex, but it's for good reason.
      # When you link, say, foo.obj, bar.obj and libsomething.exe/share, and
      # bar.obj happens to have a symbol that also exists in libsomething.exe,
      # the linker will warn about it, loudly, and will then choose to pick
      # the first copy encountered (the one in bar.obj in this example).
      # On Unix and on Windows, the corresponding maneuver goes through
      # silently with the same effect.
      # With some test programs, made for checking the internals of OpenSSL,
      # we do this kind of linking deliberately, picking a few specific object
      # files from within [.crypto] or [.ssl] so we can reach symbols that are
      # otherwise unreachable (since the shareable images only exports the
      # symbols listed in [.util]*.num), and then with the shared libraries
      # themselves.  So we need to silence the warning about multiply defined
      # symbols, to mimic the way linking work on Unix and Windows, and so
      # the build isn't interrupted (MMS stops when warnings are signaled,
      # by default), and so someone building doesn't have to worry where it
      # isn't necessary.  If there are other warnings, however, we show them
      # and let it break the build.
      return <<"EOF"
$bin : $deps
        $analyse_objs
        @ OPEN/WRITE/SHARE=READ OPT_FILE $binname.OPT
        $write_opt1
        $write_opt2
        @ CLOSE OPT_FILE
        TYPE $binname.OPT ! For debugging
        - pipe SPAWN/WAIT/NOLOG/OUT=$binname.LINKLOG -
                    LINK ${bin_ldflags}/EXEC=\$\@ $binname.OPT/OPT \$(BIN_EX_LIBS) ; -
               link_status = \$status ; link_severity = link_status .AND. 7
        @ search_severity = 1
        -@ IF link_severity .EQ. 0 THEN -
                pipe SEARCH $binname.LINKLOG "%","-"/MATCH=AND | -
                     SPAWN/WAIT/NOLOG/OUT=NLA0: -
                          SEARCH SYS\$INPUT: "-W-MULDEF,"/MATCH=NOR ; -
                     search_severity = \$severity
        @ ! search_severity is 3 when the last search didn't find any matching
        @ ! string: %SEARCH-I-NOMATCHES, no strings matched
        @ ! If that was the result, we pretend linking got through without
        @ ! fault or warning.
        @ IF search_severity .EQ. 3 THEN link_severity = 1
        @ ! At this point, if link_severity shows that there was a fault
        @ ! or warning, make sure to restore the linking status.
        -@ IF .NOT. link_severity THEN TYPE $binname.LINKLOG
        -@ DELETE $binname.LINKLOG;*
        @ IF .NOT. link_severity THEN SPAWN/WAIT/NOLOG EXIT 'link_status'
        - PURGE $bin,$binname.OPT
EOF
      . ($config{target} =~ m|alpha| ? "" : <<"EOF"
        SET IMAGE/FLAGS=(NOCALL_DEBUG) \$\@
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 configdata.pm
        \$(PERL) "-I\$(BLDDIR)" "-Mconfigdata" $dofile -
	    "-o$target{build_file}" $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.
-}
