Home | History | Annotate | Line # | Download | only in Configurations
descrip.mms.tmpl revision 1.1.1.5.2.1
      1 ## descrip.mms to build OpenSSL on OpenVMS
      2 ##
      3 ## {- join("\n## ", @autowarntext) -}
      4 {-
      5   use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;
      6   use File::Basename;
      7 
      8   # Our prefix, claimed when speaking with the VSI folks Tuesday
      9   # January 26th 2016
     10   our $osslprefix = 'OSSL$';
     11   (our $osslprefix_q = $osslprefix) =~ s/\$/\\\$/;
     12 
     13   our $sover_dirname = sprintf "%02d%02d", split(/\./, $config{shlib_version_number});
     14   our $osslver = sprintf "%02d%02d", split(/\./, $config{version});
     15 
     16   our $sourcedir = $config{sourcedir};
     17   our $builddir = $config{builddir};
     18   sub sourcefile {
     19       catfile($sourcedir, @_);
     20   }
     21   sub buildfile {
     22       catfile($builddir, @_);
     23   }
     24   sub sourcedir {
     25       catdir($sourcedir, @_);
     26   }
     27   sub builddir {
     28       catdir($builddir, @_);
     29   }
     30   sub tree {
     31       (my $x = shift) =~ s|\]$|...]|;
     32       $x
     33   }
     34   sub move {
     35       my $f = catdir(@_);
     36       my $b = abs2rel(rel2abs("."),rel2abs($f));
     37       $sourcedir = catdir($b,$sourcedir)
     38           if !file_name_is_absolute($sourcedir);
     39       $builddir = catdir($b,$builddir)
     40           if !file_name_is_absolute($builddir);
     41       "";
     42   }
     43 
     44   # Because we need to make two computations of these data,
     45   # we store them in arrays for reuse
     46   our @libs =
     47       map { (my $x = $_) =~ s/\.a$//; $x }
     48       @{$unified_info{libraries}};
     49   our @shlibs =
     50       map { $unified_info{sharednames}->{$_} || () }
     51       grep(!/\.a$/, @{$unified_info{libraries}});
     52   our @install_libs =
     53       map { (my $x = $_) =~ s/\.a$//; $x }
     54       @{$unified_info{install}->{libraries}};
     55   our @install_shlibs =
     56       map { $unified_info{sharednames}->{$_} || () }
     57       grep(!/\.a$/, @{$unified_info{install}->{libraries}});
     58 
     59   # This is a horrible hack, but is needed because recursive inclusion of files
     60   # in different directories does not work well with HP C.
     61   my $sd = sourcedir("crypto", "async", "arch");
     62   foreach (grep /\[\.crypto\.async\.arch\].*\.o$/, keys %{$unified_info{sources}}) {
     63       (my $x = $_) =~ s|\.o$|.OBJ|;
     64       $unified_info{before}->{$x}
     65           = qq(arch_include = F\$PARSE("$sd","A.;",,,"SYNTAX_ONLY") - "A.;"
     66         define arch 'arch_include');
     67       $unified_info{after}->{$x}
     68           = qq(deassign arch);
     69   }
     70   my $sd1 = sourcedir("ssl","record");
     71   my $sd2 = sourcedir("ssl","statem");
     72   my @ssl_locl_users = grep(/^\[\.(?:ssl\.(?:record|statem)|test)\].*\.o$/,
     73                             keys %{$unified_info{sources}});
     74   foreach (@ssl_locl_users) {
     75       (my $x = $_) =~ s|\.o$|.OBJ|;
     76       $unified_info{before}->{$x}
     77           = qq(record_include = F\$PARSE("$sd1","A.;",,,"SYNTAX_ONLY") - "A.;"
     78         define record 'record_include'
     79         statem_include = F\$PARSE("$sd2","A.;",,,"SYNTAX_ONLY") - "A.;"
     80         define statem 'statem_include');
     81       $unified_info{after}->{$x}
     82           = qq(deassign statem
     83         deassign record);
     84   }
     85   # This makes sure things get built in the order they need
     86   # to. You're welcome.
     87   sub dependmagic {
     88       my $target = shift;
     89 
     90       return "$target : build_generated\n\t\pipe \$(MMS) \$(MMSQUALIFIERS) depend && \$(MMS) \$(MMSQUALIFIERS) _$target\n_$target";
     91   }
     92   #use Data::Dumper;
     93   #print STDERR "DEBUG: before:\n", Dumper($unified_info{before});
     94   #print STDERR "DEBUG: after:\n", Dumper($unified_info{after});
     95   "";
     96 -}
     97 PLATFORM={- $config{target} -}
     98 OPTIONS={- $config{options} -}
     99 CONFIGURE_ARGS=({- join(", ",quotify_l(@{$config{perlargv}})) -})
    100 SRCDIR={- $config{sourcedir} -}
    101 BLDDIR={- $config{builddir} -}
    102 
    103 # Allow both V and VERBOSE to indicate verbosity.  This only applies
    104 # to testing.
    105 VERBOSE=$(V)
    106 
    107 VERSION={- $config{version} -}
    108 MAJOR={- $config{major} -}
    109 MINOR={- $config{minor} -}
    110 SHLIB_VERSION_NUMBER={- $config{shlib_version_number} -}
    111 SHLIB_VERSION_HISTORY={- $config{shlib_version_history} -}
    112 SHLIB_MAJOR={- $config{shlib_major} -}
    113 SHLIB_MINOR={- $config{shlib_minor} -}
    114 SHLIB_TARGET={- $target{shared_target} -}
    115 
    116 EXE_EXT=.EXE
    117 LIB_EXT=.OLB
    118 SHLIB_EXT=.EXE
    119 OBJ_EXT=.OBJ
    120 DEP_EXT=.D
    121 
    122 LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @libs) -}
    123 SHLIBS={- join(", ", map { "-\n\t".$_.".EXE" } @shlibs) -}
    124 ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{engines}}) -}
    125 PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{programs}}) -}
    126 SCRIPTS={- join(", ", map { "-\n\t".$_ } @{$unified_info{scripts}}) -}
    127 {- output_off() if $disabled{makedepend}; "" -}
    128 DEPS={- our @deps = map { (my $x = $_) =~ s|\.o$|\$(DEP_EXT)|; $x; }
    129                     grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
    130                     keys %{$unified_info{sources}};
    131         join(", ", map { "-\n\t".$_ } @deps); -}
    132 {- output_on() if $disabled{makedepend}; "" -}
    133 GENERATED_MANDATORY={- join(", ", map { "-\n\t".$_ } @{$unified_info{depends}->{""}} ) -}
    134 GENERATED={- # common0.tmpl provides @generated
    135              join(", ", map { (my $x = $_) =~ s|\.[sS]$|.asm|; "-\n\t".$x }
    136                         @generated) -}
    137 
    138 INSTALL_LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @install_libs) -}
    139 INSTALL_SHLIBS={- join(", ", map { "-\n\t".$_.".EXE" } @install_shlibs) -}
    140 INSTALL_ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{install}->{engines}}) -}
    141 INSTALL_PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{install}->{programs}}) -}
    142 {- output_off() if $disabled{apps}; "" -}
    143 BIN_SCRIPTS=[.tools]c_rehash.pl
    144 MISC_SCRIPTS=[.apps]CA.pl, [.apps]tsget.pl
    145 {- output_on() if $disabled{apps}; "" -}
    146 
    147 APPS_OPENSSL={- use File::Spec::Functions;
    148                 catfile("apps","openssl") -}
    149 
    150 # DESTDIR is for package builders so that they can configure for, say,
    151 # SYS$COMMON:[OPENSSL] and yet have everything installed in STAGING:[USER].
    152 # In that case, configure with --prefix=SYS$COMMON:[OPENSSL] and then run
    153 # MMS with /MACROS=(DESTDIR=STAGING:[USER]).  The result will end up in
    154 # STAGING:[USER.OPENSSL].
    155 # Normally it is left empty.
    156 DESTDIR=
    157 
    158 # Do not edit this manually. Use Configure --prefix=DIR to change this!
    159 INSTALLTOP={- our $installtop =
    160                   catdir($config{prefix}) || "SYS\$COMMON:[OPENSSL]";
    161               $installtop -}
    162 SYSTARTUP={- catdir($installtop, '[.SYS$STARTUP]'); -}
    163 # This is the standard central area to store certificates, private keys...
    164 OPENSSLDIR={- catdir($config{openssldir}) or
    165               $config{prefix} ? catdir($config{prefix},"COMMON")
    166                               : "SYS\$COMMON:[OPENSSL-COMMON]" -}
    167 # The same, but for C
    168 OPENSSLDIR_C={- $osslprefix -}DATAROOT:[000000]
    169 # Where installed engines reside, for C
    170 ENGINESDIR_C={- $osslprefix -}ENGINES{- $sover_dirname.$target{pointer_size} -}:
    171 
    172 ##### User defined commands and flags ################################
    173 
    174 CC={- $config{CC} -}
    175 CPP={- $config{CPP} -}
    176 DEFINES={- our $defines1 = join('', map { ",$_" } @{$config{CPPDEFINES}}) -}
    177 INCLUDES={- our $includes1 = join(',', @{$config{CPPINCLUDES}}) -}
    178 CPPFLAGS={- our $cppflags1 = join('', @{$config{CPPFLAGS}}) -}
    179 CFLAGS={- join('', @{$config{CFLAGS}}) -}
    180 LDFLAGS={- join('', @{$config{LFLAGS}}) -}
    181 EX_LIBS={- join('', map { ",$_" } @{$config{LDLIBS}}) -}
    182 
    183 PERL={- $config{PERL} -}
    184 
    185 AS={- $config{AS} -}
    186 ASFLAGS={- join(' ', @{$config{ASFLAGS}}) -}
    187 
    188 ##### Special command flags ##########################################
    189 
    190 ASOUTFLAG={- $target{asoutflag} -}$(OSSL_EMPTY)
    191 
    192 ##### Project flags ##################################################
    193 
    194 # Variables starting with CNF_ are common variables for all product types
    195 
    196 CNF_ASFLAGS={- join('', $target{asflags} || (),
    197                         @{$config{asflags}}) -}
    198 CNF_DEFINES={- our $defines2 = join('', map { ",$_" } @{$target{defines}},
    199                                                       @{$config{defines}}) -}
    200 CNF_INCLUDES={- our $includes2 = join(',', @{$target{includes}},
    201                                            @{$config{includes}}) -}
    202 CNF_CPPFLAGS={- our $cppflags2 = join('', $target{cppflags} || (),
    203                                           @{$config{cppflags}}) -}
    204 CNF_CFLAGS={- join('', $target{cflags} || (),
    205                        @{$config{cflags}}) -}
    206 CNF_CXXFLAGS={- join('', $target{cxxflags} || (),
    207                          @{$config{cxxflags}}) -}
    208 CNF_LDFLAGS={- join('', $target{lflags} || (),
    209                         @{$config{lflags}}) -}
    210 CNF_EX_LIBS={- join('', map{ ",$_" } @{$target{ex_libs}},
    211                                      @{$config{ex_libs}}) -}
    212 
    213 # Variables starting with LIB_ are used to build library object files
    214 # and shared libraries.
    215 # Variables starting with DSO_ are used to build DSOs and their object files.
    216 # Variables starting with BIN_ are used to build programs and their object
    217 # files.
    218 
    219 LIB_ASFLAGS={- join(' ', $target{lib_asflags} || (),
    220                          @{$config{lib_asflags}},
    221                          '$(CNF_ASFLAGS)', '$(ASFLAGS)') -}
    222 LIB_DEFINES={- our $lib_defines =
    223                join('', (map { ",$_" } @{$target{lib_defines}},
    224                                        @{$target{shared_defines}},
    225                                        @{$config{lib_defines}},
    226                                        @{$config{shared_defines}}));
    227                join('', $lib_defines,
    228                         (map { ",$_" } 'OPENSSLDIR="""$(OPENSSLDIR_C)"""',
    229                                        'ENGINESDIR="""$(ENGINESDIR_C)"""'),
    230                         '$(CNF_DEFINES)', '$(DEFINES)') -}
    231 LIB_INCLUDES={- our $lib_includes =
    232                 join(',', @{$target{lib_includes}},
    233                           @{$target{shared_includes}},
    234                           @{$config{lib_includes}},
    235                           @{$config{shared_includes}}) -}
    236 LIB_CPPFLAGS={- our $lib_cppflags =
    237                 join('', $target{lib_cppflags} || (),
    238                          $target{shared_cppflags} || (),
    239                          @{$config{lib_cppflags}},
    240                          @{$config{shared_cppflag}});
    241                 join('', "'qual_includes'",
    242                          '/DEFINE=(__dummy$(LIB_DEFINES))',
    243                          $lib_cppflags,
    244                          '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
    245 LIB_CFLAGS={- join('', $target{lib_cflags} || (),
    246                        $target{shared_cflag} || (),
    247                        @{$config{lib_cflags}},
    248                        @{$config{shared_cflag}},
    249                        '$(CNF_CFLAGS)', '$(CFLAGS)') -}
    250 LIB_LDFLAGS={- join('', $target{lib_lflags} || (),
    251                         $target{shared_ldflag} || (),
    252                         @{$config{lib_lflags}},
    253                         @{$config{shared_ldflag}},
    254                         '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
    255 LIB_EX_LIBS=$(CNF_EX_LIBS)$(EX_LIBS)
    256 DSO_ASFLAGS={- join(' ', $target{dso_asflags} || (),
    257                          $target{module_asflags} || (),
    258                          @{$config{dso_asflags}},
    259                          @{$config{module_asflags}},
    260                          '$(CNF_ASFLAGS)', '$(ASFLAGS)') -}
    261 DSO_DEFINES={- join('', (map { ",$_" } @{$target{dso_defines}},
    262                                        @{$target{module_defines}},
    263                                        @{$config{dso_defines}},
    264                                        @{$config{module_defines}}),
    265                         '$(CNF_DEFINES)', '$(DEFINES)') -}
    266 DSO_INCLUDES={- join(',', @{$target{dso_includes}},
    267                           @{$target{module_includes}},
    268                           @{$config{dso_includes}},
    269                           @{$config{module_includes}}) -}
    270 DSO_CPPFLAGS={- join('', "'qual_includes'",
    271                          '/DEFINE=(__dummy$(DSO_DEFINES))',
    272                          $target{dso_cppflags} || (),
    273                          $target{module_cppflags} || (),
    274                          @{$config{dso_cppflags}},
    275                          @{$config{module_cppflags}},
    276                          '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
    277 DSO_CFLAGS={- join('', $target{dso_cflags} || (),
    278                        $target{module_cflags} || (),
    279                        @{$config{dso_cflags}},
    280                        @{$config{module_cflags}},
    281                        '$(CNF_CFLAGS)', '$(CFLAGS)') -}
    282 DSO_LDFLAGS={- join('', $target{dso_lflags} || (),
    283                         $target{module_ldflags} || (),
    284                         @{$config{dso_lflags}},
    285                         @{$config{module_ldflags}},
    286                         '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
    287 DSO_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)
    288 BIN_ASFLAGS={- join(' ', $target{bin_asflags} || (),
    289                          @{$config{bin_asflags}},
    290                          '$(CNF_ASFLAGS)', '$(ASFLAGS)') -}
    291 BIN_DEFINES={- join('', (map { ",$_" } @{$target{bin_defines}},
    292                                        @{$config{bin_defines}}),
    293                         '$(CNF_DEFINES)', '$(DEFINES)') -}
    294 BIN_INCLUDES={- join(',', @{$target{bin_includes}},
    295                           @{$config{bin_includes}}) -}
    296 BIN_CPPFLAGS={- join('', "'qual_includes'",
    297                          '/DEFINE=(__dummy$(DSO_DEFINES))',
    298                          $target{bin_cppflags} || (),
    299                          @{$config{bin_cppflag}},
    300                          '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -}
    301 BIN_CFLAGS={- join('', $target{bin_cflag} || (),
    302                        @{$config{bin_cflag}},
    303                        '$(CNF_CFLAGS)', '$(CFLAGS)') -}
    304 BIN_LDFLAGS={- join('', $target{bin_lflags} || (),
    305                         @{$config{bin_lflags}} || (),
    306                         '$(CNF_LDFLAGS)', '$(LDFLAGS)') -}
    307 BIN_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS)
    308 NO_INST_LIB_CFLAGS={- join('', $target{no_inst_lib_cflags}
    309                                // $target{lib_cflags}
    310                                // (),
    311                                $target{shared_cflag} || (),
    312                                @{$config{lib_cflags}},
    313                                @{$config{shared_cflag}},
    314                                '$(CNF_CFLAGS)', '$(CFLAGS)') -}
    315 NO_INST_DSO_CFLAGS={- join('', $target{no_inst_lib_cflags}
    316                                // $target{lib_cflags}
    317                                // (),
    318                                $target{dso_cflags} || (),
    319                                @{$config{lib_cflags}},
    320                                @{$config{dso_cflags}},
    321                                '$(CNF_CFLAGS)', '$(CFLAGS)') -}
    322 NO_INST_BIN_CFLAGS={- join('', $target{no_inst_bin_cflags}
    323                                // $target{bin_cflags}
    324                                // (),
    325                                @{$config{bin_cflags}},
    326                                '$(CNF_CFLAGS)', '$(CFLAGS)') -}
    327 
    328 PERLASM_SCHEME={- $target{perlasm_scheme} -}
    329 
    330 # CPPFLAGS_Q is used for one thing only: to build up buildinf.h
    331 CPPFLAGS_Q={- (my $c = $lib_cppflags.$cppflags2.$cppflags1) =~ s|"|""|g;
    332               (my $d = $lib_defines.$defines2.$defines1) =~ s|"|""|g;
    333               my $i = join(',', $lib_includes || (), $includes2 || (),
    334                                 $includes1 || ());
    335               my $x = $c;
    336               $x .= "/INCLUDE=($i)" if $i;
    337               $x .= "/DEFINE=($d)" if $d;
    338               $x; -}
    339 
    340 # .FIRST and .LAST are special targets with MMS and MMK.
    341 # The defines in there are for C.  includes that look like
    342 # this:
    343 #
    344 #    #include <openssl/foo.h>
    345 #    #include "internal/bar.h"
    346 #    #include "crypto/something.h"
    347 #
    348 # will use the logical names to find the files.  Expecting
    349 # DECompHP C to find files in subdirectories of whatever was
    350 # given with /INCLUDE is a fantasy, unfortunately.
    351 NODEBUG=@
    352 .FIRST :
    353         $(NODEBUG) openssl_inc1 = F$PARSE("[.include.openssl]","A.;",,,"syntax_only") - "A.;"
    354         $(NODEBUG) openssl_inc2 = F$PARSE("{- catdir($config{sourcedir},"[.include.openssl]") -}","A.;",,,"SYNTAX_ONLY") - "A.;"
    355         $(NODEBUG) internal_inc1 = F$PARSE("[.include.internal]","A.;",,,"SYNTAX_ONLY") - "A.;"
    356         $(NODEBUG) internal_inc2 = F$PARSE("{- catdir($config{sourcedir},"[.include.internal]") -}","A.;",,,"SYNTAX_ONLY") - "A.;"
    357         $(NODEBUG) crypto_inc1 = F$PARSE("[.include.crypto]","A.;",,,"SYNTAX_ONLY") - "A.;"
    358         $(NODEBUG) crypto_inc2 = F$PARSE("{- catdir($config{sourcedir},"[.include.crypto]") -}","A.;",,,"SYNTAX_ONLY") - "A.;"
    359         $(NODEBUG) DEFINE openssl 'openssl_inc1','openssl_inc2'
    360         $(NODEBUG) DEFINE internal 'internal_inc1','internal_inc2'
    361         $(NODEBUG) DEFINE crypto 'crypto_inc1','crypto_inc2'
    362         $(NODEBUG) staging_dir = "$(DESTDIR)"
    363         $(NODEBUG) staging_instdir = ""
    364         $(NODEBUG) staging_datadir = ""
    365         $(NODEBUG) IF staging_dir .NES. "" THEN -
    366                 staging_instdir = F$PARSE("A.;",staging_dir,"[]",,"SYNTAX_ONLY")
    367         $(NODEBUG) IF staging_instdir - "]A.;" .NES. staging_instdir THEN -
    368                 staging_instdir = staging_instdir - "]A.;" + ".OPENSSL-INSTALL]"
    369         $(NODEBUG) IF staging_instdir - "A.;" .NES. staging_instdir THEN -
    370                 staging_instdir = staging_instdir - "A.;" + "[OPENSSL-INSTALL]"
    371         $(NODEBUG) IF staging_dir .NES. "" THEN -
    372                 staging_datadir = F$PARSE("A.;",staging_dir,"[]",,"SYNTAX_ONLY")
    373         $(NODEBUG) IF staging_datadir - "]A.;" .NES. staging_datadir THEN -
    374                 staging_datadir = staging_datadir - "]A.;" + ".OPENSSL-COMMON]"
    375         $(NODEBUG) IF staging_datadir - "A.;" .NES. staging_datadir THEN -
    376                 staging_datadir = staging_datadir - "A.;" + "[OPENSSL-COMMON]"
    377         $(NODEBUG) !
    378         $(NODEBUG) ! Installation logical names
    379         $(NODEBUG) !
    380         $(NODEBUG) installtop = F$PARSE(staging_instdir,"$(INSTALLTOP)","[]A.;",,"SYNTAX_ONLY,NO_CONCEAL") - ".][000000" - "[000000." - "][" - "]A.;" + ".]"
    381         $(NODEBUG) datatop = F$PARSE(staging_datadir,"$(OPENSSLDIR)","[]A.;",,"SYNTAX_ONLY,NO_CONCEAL") - ".][000000" - "[000000." - "][" - "]A.;" + ".]"
    382         $(NODEBUG) DEFINE ossl_installroot 'installtop'
    383         $(NODEBUG) DEFINE ossl_dataroot 'datatop'
    384         $(NODEBUG) !
    385         $(NODEBUG) ! Figure out the architecture
    386         $(NODEBUG) !
    387         $(NODEBUG) arch = f$edit( f$getsyi( "arch_name"), "upcase")
    388         $(NODEBUG) !
    389         $(NODEBUG) ! Set up logical names for the libraries, so LINK and
    390         $(NODEBUG) ! running programs can use them.
    391         $(NODEBUG) !
    392         $(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEFINE ".uc($_)." 'F\$ENV(\"DEFAULT\")'".uc($_)."\$(SHLIB_EXT)" } @shlibs) || "!" -}
    393 
    394 .LAST :
    395         $(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEASSIGN ".uc($_) } @shlibs) || "!" -}
    396         $(NODEBUG) DEASSIGN ossl_dataroot
    397         $(NODEBUG) DEASSIGN ossl_installroot
    398         $(NODEBUG) DEASSIGN crypto
    399         $(NODEBUG) DEASSIGN internal
    400         $(NODEBUG) DEASSIGN openssl
    401 .DEFAULT :
    402         @ ! MMS cannot handle no actions...
    403 
    404 # The main targets ###################################################
    405 
    406 {- dependmagic('all'); -} : build_libs_nodep, build_engines_nodep, build_programs_nodep
    407 {- dependmagic('build_libs'); -} : build_libs_nodep
    408 {- dependmagic('build_engines'); -} : build_engines_nodep
    409 {- dependmagic('build_programs'); -} : build_programs_nodep
    410 
    411 build_generated : $(GENERATED_MANDATORY)
    412 build_libs_nodep : $(LIBS), $(SHLIBS)
    413 build_engines_nodep : $(ENGINES)
    414 build_programs_nodep : $(PROGRAMS), $(SCRIPTS)
    415 
    416 # Kept around for backward compatibility
    417 build_apps build_tests : build_programs
    418 
    419 # Convenience target to prebuild all generated files, not just the mandatory
    420 # ones
    421 build_all_generated : $(GENERATED_MANDATORY) $(GENERATED)
    422 	@ ! {- output_off() if $disabled{makedepend}; "" -}
    423 	@ WRITE SYS$OUTPUT "Warning: consider configuring with no-makedepend, because if"
    424 	@ WRITE SYS$OUTPUT "         target system doesn't have $(PERL),"
    425 	@ WRITE SYS$OUTPUT "         then make will fail..."
    426 	@ ! {- output_on() if $disabled{makedepend}; "" -}
    427 
    428 test : tests
    429 {- dependmagic('tests'); -} : build_programs_nodep, build_engines_nodep
    430         @ ! {- output_off() if $disabled{tests}; "" -}
    431         SET DEFAULT [.test]{- move("test") -}
    432         CREATE/DIR [.test-runs]
    433         DEFINE SRCTOP {- sourcedir() -}
    434         DEFINE BLDTOP {- builddir() -}
    435         DEFINE RESULT_D {- builddir(qw(test test-runs)) -}
    436         DEFINE OPENSSL_ENGINES {- builddir("engines") -}
    437         DEFINE OPENSSL_DEBUG_MEMORY "on"
    438         IF "$(VERBOSE)" .NES. "" THEN DEFINE VERBOSE "$(VERBOSE)"
    439         $(PERL) {- sourcefile("test", "run_tests.pl") -} $(TESTS)
    440         DEASSIGN OPENSSL_DEBUG_MEMORY
    441         DEASSIGN OPENSSL_ENGINES
    442         DEASSIGN BLDTOP
    443         DEASSIGN SRCTOP
    444         SET DEFAULT [-]{- move("..") -}
    445         @ ! {- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
    446         @ WRITE SYS$OUTPUT "Tests are not supported with your chosen Configure options"
    447         @ ! {- output_on() if !$disabled{tests}; "" -}
    448 
    449 list-tests :
    450         @ ! {- output_off() if $disabled{tests}; "" -}
    451         @ DEFINE SRCTOP {- sourcedir() -}
    452         @ $(PERL) {- sourcefile("test", "run_tests.pl") -} list
    453         @ DEASSIGN SRCTOP
    454         @ ! {- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -}
    455         @ WRITE SYS$OUTPUT "Tests are not supported with your chosen Configure options"
    456         @ ! {- output_on() if !$disabled{tests}; "" -}
    457 
    458 install : install_sw install_ssldirs install_docs
    459         @ WRITE SYS$OUTPUT ""
    460         @ WRITE SYS$OUTPUT "######################################################################"
    461         @ WRITE SYS$OUTPUT ""
    462         @ IF "$(DESTDIR)" .EQS. "" THEN -
    463              PIPE ( WRITE SYS$OUTPUT "Installation complete" ; -
    464                     WRITE SYS$OUTPUT "" ; -
    465                     WRITE SYS$OUTPUT "Run @$(SYSTARTUP)openssl_startup{- $osslver -} to set up logical names" ; -
    466                     WRITE SYS$OUTPUT "then run @$(SYSTARTUP)openssl_utils{- $osslver -} to define commands" ; -
    467                     WRITE SYS$OUTPUT "" )
    468         @ IF "$(DESTDIR)" .NES. "" THEN -
    469              PIPE ( WRITE SYS$OUTPUT "Staging installation complete" ; -
    470                     WRITE SYS$OUTPUT "" ; -
    471                     WRITE SYS$OUTPUT "Finish or package in such a way that the contents of the directory tree" ; -
    472                     WRITE SYS$OUTPUT staging_instdir ; -
    473                     WRITE SYS$OUTPUT "ends up in $(INSTALLTOP)," ; -
    474                     WRITE SYS$OUTPUT "and that the contents of the contents of the directory tree" ; -
    475                     WRITE SYS$OUTPUT staging_datadir ; -
    476                     WRITE SYS$OUTPUT "ends up in $(OPENSSLDIR)" ; -
    477                     WRITE SYS$OUTPUT "" ; -
    478                     WRITE SYS$OUTPUT "When in its final destination," ; -
    479                     WRITE SYS$OUTPUT "Run @$(SYSTARTUP)openssl_startup{- $osslver -} to set up logical names" ; -
    480                     WRITE SYS$OUTPUT "then run @$(SYSTARTUP)openssl_utils{- $osslver -} to define commands" ; -
    481                     WRITE SYS$OUTPUT "" )
    482 
    483 check_install :
    484         spawn/nolog @ossl_installroot:[SYSTEST]openssl_ivp{- $osslver -}.com
    485 
    486 uninstall : uninstall_docs uninstall_sw
    487 
    488 # Because VMS wants the generation number (or *) to delete files, we can't
    489 # use $(LIBS), $(PROGRAMS), $(GENERATED) and $(ENGINES)directly.
    490 libclean :
    491         {- join("\n\t", map { "- DELETE $_.OLB;*" } @libs) || "@ !" -}
    492         {- join("\n\t", map { "- DELETE $_.EXE;*,$_.MAP;*" } @shlibs) || "@ !" -}
    493 
    494 clean : libclean
    495         {- join("\n\t", map { "- DELETE $_.EXE;*,$_.OPT;*" } @{$unified_info{programs}}) || "@ !" -}
    496         {- join("\n\t", map { "- DELETE $_.EXE;*,$_.OPT;*" } @{$unified_info{engines}}) || "@ !" -}
    497         {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{scripts}}) || "@ !" -}
    498         {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{depends}->{""}}) || "@ !" -}
    499         {- join("\n\t", map { "- DELETE $_;*" } @generated) || "@ !" -}
    500         - DELETE [...]*.MAP;*
    501         - DELETE [...]*.D;*
    502         - DELETE [...]*.OBJ;*,*.LIS;*
    503         - DELETE []CXX$DEMANGLER_DB.;*
    504         - DELETE [.VMS]openssl_startup.com;*
    505         - DELETE [.VMS]openssl_shutdown.com;*
    506         - DELETE []vmsconfig.pm;*
    507 
    508 distclean : clean
    509         - DELETE configdata.pm;*
    510         - DELETE descrip.mms;*
    511 
    512 depend : descrip.mms
    513 descrip.mms : FORCE
    514 	@ ! {- output_off() if $disabled{makedepend}; "" -}
    515 	@ $(PERL) {- sourcefile("util", "add-depends.pl") -} "VMS C"
    516 	@ ! {- output_on() if $disabled{makedepend}; "" -}
    517 
    518 # Install helper targets #############################################
    519 
    520 install_sw : install_dev install_engines install_runtime -
    521              install_startup install_ivp
    522 
    523 uninstall_sw : uninstall_dev uninstall_engines uninstall_runtime -
    524                uninstall_startup uninstall_ivp
    525 
    526 install_docs : install_html_docs
    527 
    528 uninstall_docs : uninstall_html_docs
    529 
    530 install_ssldirs : check_INSTALLTOP
    531         - CREATE/DIR/PROT=(S:RWED,O:RWE,G:RE,W:RE) OSSL_DATAROOT:[000000]
    532         IF F$SEARCH("OSSL_DATAROOT:[000000]CERTS.DIR;1") .EQS. "" THEN -
    533                 CREATE/DIR/PROT=(S:RWED,O:RWE,G:RE,W:RE) OSSL_DATAROOT:[CERTS]
    534         IF F$SEARCH("OSSL_DATAROOT:[000000]PRIVATE.DIR;1") .EQS. "" THEN -
    535                 CREATE/DIR/PROT=(S:RWED,O:RWE,G,W) OSSL_DATAROOT:[PRIVATE]
    536         IF F$SEARCH("OSSL_DATAROOT:[000000]MISC.DIR;1") .EQS. "" THEN -
    537                 CREATE/DIR/PROT=(S:RWED,O:RWE,G,W) OSSL_DATAROOT:[MISC]
    538         COPY/PROT=W:RE $(MISC_SCRIPTS) OSSL_DATAROOT:[MISC]
    539         @ ! Install configuration file
    540         COPY/PROT=W:R {- sourcefile("apps", "openssl-vms.cnf") -} -
    541                 ossl_dataroot:[000000]openssl.cnf-dist
    542         IF F$SEARCH("OSSL_DATAROOT:[000000]openssl.cnf") .EQS. "" THEN -
    543                 COPY/PROT=W:R {- sourcefile("apps", "openssl-vms.cnf") -} -
    544                         ossl_dataroot:[000000]openssl.cnf
    545         @ ! Install CTLOG configuration file
    546         COPY/PROT=W:R {- sourcefile("apps", "ct_log_list.cnf") -} -
    547                 ossl_dataroot:[000000]ct_log_list.cnf-dist
    548         IF F$SEARCH("OSSL_DATAROOT:[000000]ct_log_list.cnf") .EQS. "" THEN -
    549                 COPY/PROT=W:R {- sourcefile("apps", "ct_log_list.cnf") -} -
    550                         ossl_dataroot:[000000]ct_log_list.cnf
    551 
    552 install_dev : check_INSTALLTOP install_runtime_libs
    553         @ WRITE SYS$OUTPUT "*** Installing development files"
    554         @ ! Install header files
    555         - CREATE/DIR ossl_installroot:[include.openssl]
    556         COPY/PROT=W:R openssl:*.h ossl_installroot:[include.openssl]
    557         @ ! Install static (development) libraries
    558         - CREATE/DIR ossl_installroot:[LIB.'arch']
    559         {- join("\n        ",
    560                 map { "COPY/PROT=W:R $_.OLB ossl_installroot:[LIB.'arch']" }
    561                 @install_libs) -}
    562 
    563 install_engines : check_INSTALLTOP install_runtime_libs build_engines
    564         @ {- output_off() unless scalar @{$unified_info{engines}}; "" -} !
    565         @ WRITE SYS$OUTPUT "*** Installing engines"
    566         - CREATE/DIR ossl_installroot:[ENGINES{- $sover_dirname.$target{pointer_size} -}.'arch']
    567         {- join("\n        ",
    568                 map { "COPY/PROT=W:RE $_.EXE ossl_installroot:[ENGINES$sover_dirname$target{pointer_size}.'arch']" }
    569                 @{$unified_info{install}->{engines}}) -}
    570         @ {- output_on() unless scalar @{$unified_info{engines}}; "" -} !
    571 
    572 install_runtime : install_programs
    573 
    574 install_runtime_libs : check_INSTALLTOP build_libs
    575         @ {- output_off() if $disabled{shared}; "" -} !
    576         @ WRITE SYS$OUTPUT "*** Installing shareable images"
    577         @ ! Install shared (runtime) libraries
    578         - CREATE/DIR ossl_installroot:[LIB.'arch']
    579         {- join("\n        ",
    580                 map { "COPY/PROT=W:R $_.EXE ossl_installroot:[LIB.'arch']" }
    581                 @install_shlibs) -}
    582         @ {- output_on() if $disabled{shared}; "" -} !
    583 
    584 install_programs : check_INSTALLTOP install_runtime_libs build_programs
    585         @ {- output_off() if $disabled{apps}; "" -} !
    586         @ ! Install the main program
    587         - CREATE/DIR ossl_installroot:[EXE.'arch']
    588         COPY/PROT=W:RE [.APPS]openssl.EXE -
    589                 ossl_installroot:[EXE.'arch']openssl{- $osslver -}.EXE
    590         @ ! Install scripts
    591         COPY/PROT=W:RE $(BIN_SCRIPTS) ossl_installroot:[EXE]
    592         @ ! {- output_on() if $disabled{apps}; "" -}
    593 
    594 install_startup : [.VMS]openssl_startup.com [.VMS]openssl_shutdown.com -
    595                  [.VMS]openssl_utils.com, check_INSTALLTOP
    596         - CREATE/DIR ossl_installroot:[SYS$STARTUP]
    597         COPY/PROT=W:RE [.VMS]openssl_startup.com -
    598                 ossl_installroot:[SYS$STARTUP]openssl_startup{- $osslver -}.com
    599         COPY/PROT=W:RE [.VMS]openssl_shutdown.com -
    600                 ossl_installroot:[SYS$STARTUP]openssl_shutdown{- $osslver -}.com
    601         COPY/PROT=W:RE [.VMS]openssl_utils.com -
    602                 ossl_installroot:[SYS$STARTUP]openssl_utils{- $osslver -}.com
    603 
    604 install_ivp : [.VMS]openssl_ivp.com check_INSTALLTOP
    605         - CREATE/DIR ossl_installroot:[SYSTEST]
    606         COPY/PROT=W:RE [.VMS]openssl_ivp.com -
    607                 ossl_installroot:[SYSTEST]openssl_ivp{- $osslver -}.com
    608 
    609 [.VMS]openssl_startup.com : vmsconfig.pm {- sourcefile("VMS", "openssl_startup.com.in") -}
    610         - CREATE/DIR [.VMS]
    611         $(PERL) "-I." "-Mvmsconfig" {- sourcefile("util", "dofile.pl") -} -
    612                 {- sourcefile("VMS", "openssl_startup.com.in") -} -
    613                 > [.VMS]openssl_startup.com
    614 
    615 [.VMS]openssl_utils.com : vmsconfig.pm {- sourcefile("VMS", "openssl_utils.com.in") -}
    616         - CREATE/DIR [.VMS]
    617         $(PERL) "-I." "-Mvmsconfig" {- sourcefile("util", "dofile.pl") -} -
    618                 {- sourcefile("VMS", "openssl_utils.com.in") -} -
    619                 > [.VMS]openssl_utils.com
    620 
    621 [.VMS]openssl_shutdown.com : vmsconfig.pm {- sourcefile("VMS", "openssl_shutdown.com.in") -}
    622         - CREATE/DIR [.VMS]
    623         $(PERL) "-I." "-Mvmsconfig" {- sourcefile("util", "dofile.pl") -} -
    624                 {- sourcefile("VMS", "openssl_shutdown.com.in") -} -
    625                 > [.VMS]openssl_shutdown.com
    626 
    627 [.VMS]openssl_ivp.com : vmsconfig.pm {- sourcefile("VMS", "openssl_ivp.com.in") -}
    628         - CREATE/DIR [.VMS]
    629         $(PERL) "-I." "-Mvmsconfig" {- sourcefile("util", "dofile.pl") -} -
    630                 {- sourcefile("VMS", "openssl_ivp.com.in") -} -
    631                 > [.VMS]openssl_ivp.com
    632 
    633 vmsconfig.pm : configdata.pm
    634         OPEN/WRITE/SHARE=READ CONFIG []vmsconfig.pm
    635         WRITE CONFIG "package vmsconfig;"
    636         WRITE CONFIG "use strict; use warnings;"
    637         WRITE CONFIG "use Exporter;"
    638         WRITE CONFIG "our @ISA = qw(Exporter);"
    639         WRITE CONFIG "our @EXPORT = qw(%config %target %withargs %unified_info %disabled);"
    640         WRITE CONFIG "our %config = ("
    641         WRITE CONFIG "  target => '","{- $config{target} -}","',"
    642         WRITE CONFIG "  version => '","{- $config{version} -}","',"
    643         WRITE CONFIG "  shlib_version_number => '","{- $config{shlib_version_number} -}","',"
    644         WRITE CONFIG "  shlib_major => '","{- $config{shlib_major} -}","',"
    645         WRITE CONFIG "  shlib_minor => '","{- $config{shlib_minor} -}","',"
    646         WRITE CONFIG "  no_shared => '","{- $disabled{shared} -}","',"
    647         WRITE CONFIG "  INSTALLTOP => '$(INSTALLTOP)',"
    648         WRITE CONFIG "  OPENSSLDIR => '$(OPENSSLDIR)',"
    649         WRITE CONFIG "  pointer_size => '","{- $target{pointer_size} -}","',"
    650         WRITE CONFIG ");"
    651         WRITE CONFIG "our %target = ();"
    652         WRITE CONFIG "our %disabled = ();"
    653         WRITE CONFIG "our %withargs = ();"
    654         WRITE CONFIG "our %unified_info = ();"
    655         WRITE CONFIG "1;"
    656         CLOSE CONFIG
    657 
    658 install_html_docs : check_INSTALLTOP
    659         sourcedir = F$PARSE("{- $sourcedir -}A.;","[]") - "]A.;" + ".DOC]"
    660         $(PERL) {- sourcefile("util", "process_docs.pl") -} -
    661                 --sourcedir='sourcedir' --destdir=ossl_installroot:[HTML] -
    662                 --type=html
    663 
    664 check_INSTALLTOP :
    665         @ IF "$(INSTALLTOP)" .EQS. "" THEN -
    666                 WRITE SYS$ERROR "INSTALLTOP should not be empty"
    667         @ IF "$(INSTALLTOP)" .EQS. "" THEN -
    668                 EXIT %x10000002
    669 
    670 # Helper targets #####################################################
    671 
    672 # Developer targets ##################################################
    673 
    674 debug_logicals :
    675         SH LOGICAL/PROC openssl,internal,ossl_installroot,ossl_dataroot
    676 
    677 # Building targets ###################################################
    678 
    679 configdata.pm : $(SRCDIR)Configure $(SRCDIR)config.com {- join(" ", @{$config{build_file_templates}}, @{$config{build_infos}}, @{$config{conf_files}}) -}
    680         perl configdata.pm -r
    681         @ WRITE SYS$OUTPUT "*************************************************"
    682         @ WRITE SYS$OUTPUT "***                                           ***"
    683         @ WRITE SYS$OUTPUT "***   Please run the same mms command again   ***"
    684         @ WRITE SYS$OUTPUT "***                                           ***"
    685         @ WRITE SYS$OUTPUT "*************************************************"
    686         @ PIPE ( EXIT %X10000000 )
    687 
    688 reconfigure reconf :
    689 	perl configdata.pm -r
    690 
    691 {-
    692   use File::Basename;
    693   use File::Spec::Functions qw/abs2rel rel2abs catfile catdir/;
    694 
    695   # Helper function to figure out dependencies on libraries
    696   # It takes a list of library names and outputs a list of dependencies
    697   sub compute_lib_depends {
    698       if ($disabled{shared}) {
    699           return map { $_ =~ /\.a$/ ? $`.".OLB" : $_.".OLB" } @_;
    700       }
    701       return map { $_ =~ /\.a$/
    702                    ? $`.".OLB"
    703                    : $unified_info{sharednames}->{$_}.".EXE" } @_;
    704   }
    705 
    706   # Helper function to deal with inclusion directory specs.
    707   # We have to deal with two things:
    708   # 1. comma separation and no possibility of trailing comma
    709   # 2. no inclusion directories given at all
    710   # 3. long compiler command lines
    711   # To resolve 1, we need to iterate through the sources of inclusion
    712   # directories, and only add a comma when needed.
    713   # To resolve 2, we need to have a variable that will hold the whole
    714   # inclusion qualifier, or be the empty string if there are no inclusion
    715   # directories.  That's the symbol 'qual_includes' that's used in CPPFLAGS
    716   # To resolve 3, we creata a logical name TMP_INCLUDES: to hold the list
    717   # of inclusion directories.
    718   #
    719   # This function returns a list of two lists, one being the collection of
    720   # commands to execute before the compiler is called, and the other being
    721   # the collection of commands to execute after.  It takes as arguments the
    722   # collection of strings to include as directory specs.
    723   sub includes {
    724       my @stuff = ( @_ );
    725       my @before = (
    726           'qual_includes :=',
    727       );
    728       my @after = (
    729           'DELETE/SYMBOL/LOCAL qual_includes',
    730       );
    731 
    732       if (scalar @stuff > 0) {
    733           push @before, 'tmp_includes := '.shift(@stuff);
    734           while (@stuff) {
    735               push @before, 'tmp_add := '.shift(@stuff);
    736               push @before, 'IF tmp_includes .NES. "" .AND. tmp_add .NES. "" THEN tmp_includes = tmp_includes + ","';
    737               push @before, 'tmp_includes = tmp_includes + tmp_add';
    738           }
    739           push @before, "IF tmp_includes .NES. \"\" THEN DEFINE tmp_includes 'tmp_includes'";
    740           push @before, 'IF tmp_includes .NES. "" THEN qual_includes := /INCLUDE=(tmp_includes:)';
    741           push @before, 'DELETE/SYMBOL/LOCAL tmp_includes';
    742           push @before, 'DELETE/SYMBOL/LOCAL tmp_add';
    743           push @after, 'DEASSIGN tmp_includes:'
    744       }
    745       return ([ @before ], [ @after ]);
    746   }
    747 
    748   sub generatesrc {
    749       my %args = @_;
    750       (my $target = $args{src}) =~ s/\.[sS]$/.asm/;
    751       my $generator = join(" ", @{$args{generator}});
    752       my $generator_incs = join("", map { ' "-I'.$_.'"' } @{$args{generator_incs}});
    753       my $deps = join(", -\n\t\t", @{$args{generator_deps}}, @{$args{deps}});
    754 
    755       if ($target !~ /\.asm$/) {
    756           if ($args{generator}->[0] =~ m|^.*\.in$|) {
    757 	      my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
    758                                                    "util", "dofile.pl")),
    759                                    rel2abs($config{builddir}));
    760               return <<"EOF";
    761 $target : $args{generator}->[0] $deps
    762 	\$(PERL) "-I\$(BLDDIR)" "-Mconfigdata" $dofile \\
    763 	    "-o$target{build_file}" $generator > \$\@
    764 EOF
    765 	  } else {
    766               return <<"EOF";
    767 $target : $args{generator}->[0] $deps
    768 	\$(PERL)$generator_incs $generator > \$\@
    769 EOF
    770 	  }
    771       } else {
    772           if ($args{generator}->[0] =~ /\.pl$/) {
    773               $generator = '$(PERL)'.$generator_incs.' '.$generator;
    774           } elsif ($args{generator}->[0] =~ /\.S$/) {
    775               $generator = undef;
    776           } else {
    777               die "Generator type for $src unknown: $generator\n";
    778           }
    779 
    780           my $cppflags = {
    781               lib => '$(LIB_CFLAGS) $(LIB_CPPFLAGS)',
    782               dso => '$(DSO_CFLAGS) $(DSO_CPPFLAGS)',
    783               bin => '$(BIN_CFLAGS) $(BIN_CPPFLAGS)'
    784           } -> {$args{intent}};
    785           my @incs_cmds = includes({ lib => '$(LIB_INCLUDES)',
    786                                      dso => '$(DSO_INCLUDES)',
    787                                      bin => '$(BIN_INCLUDES)' } -> {$args{intent}},
    788                                    '$(CNF_INCLUDES)',
    789                                    '$(INCLUDES)',
    790                                    @{$args{incs}});
    791           my $incs_on = join("\n\t\@ ", @{$incs_cmds[0]}) || '!';
    792           my $incs_off = join("\n\t\@ ", @{$incs_cmds[1]}) || '!';
    793           if (defined($generator)) {
    794               # If the target is named foo.S in build.info, we want to
    795               # end up generating foo.s in two steps.
    796               if ($args{src} =~ /\.S$/) {
    797                    return <<"EOF";
    798 $target : $args{generator}->[0] $deps
    799 	$generator \$\@-S
    800         \@ $incs_on
    801 	PIPE \$(CPP) $cppflags \$\@-S | -
    802              \$(PERL) -ne "/^#(\\s*line)?\\s*[0-9]+\\s+""/ or print" > \$\@-i
    803         \@ $incs_off
    804         RENAME \$\@-i \$\@
    805         DELETE \$\@-S;
    806 EOF
    807               }
    808               # Otherwise....
    809               return <<"EOF";
    810 $target : $args{generator}->[0] $deps
    811 	$generator \$\@
    812 EOF
    813           }
    814           return <<"EOF";
    815 $target : $args{generator}->[0] $deps
    816         \@ $incs_on
    817         SHOW SYMBOL qual_includes
    818         PIPE \$(CPP) $cppflags $args{generator}->[0] | -
    819         \$(PERL) "-ne" "/^#(\\s*line)?\\s*[0-9]+\\s+""/ or print" > \$\@
    820         \@ $incs_off
    821 EOF
    822       }
    823   }
    824 
    825   sub src2obj {
    826       my %args = @_;
    827       my @srcs = map { (my $x = $_) =~ s/\.s$/.asm/; $x
    828                      } ( @{$args{srcs}} );
    829       (my $obj = $args{obj}) =~ s|\.o$||;
    830       my $deps = join(", -\n\t\t", @srcs, @{$args{deps}});
    831 
    832       # Because VMS C isn't very good at combining a /INCLUDE path with
    833       # #includes having a relative directory (like '#include "../foo.h"),
    834       # the best choice is to move to the first source file's intended
    835       # directory before compiling, and make sure to write the object file
    836       # in the correct position (important when the object tree is other
    837       # than the source tree).
    838       my $forward = dirname($args{srcs}->[0]);
    839       my $backward = abs2rel(rel2abs("."), rel2abs($forward));
    840       my $objd = abs2rel(rel2abs(dirname($obj)), rel2abs($forward));
    841       my $objn = basename($obj);
    842       my $srcs =
    843           join(", ", map { abs2rel(rel2abs($_), rel2abs($forward)) } @srcs);
    844       my $before = $unified_info{before}->{$obj.".OBJ"} || "\@ !";
    845       my $after = $unified_info{after}->{$obj.".OBJ"} || "\@ !";
    846 
    847       my $cflags;
    848       if ($args{installed}) {
    849           $cflags = { lib => '$(LIB_CFLAGS)',
    850                       dso => '$(DSO_CFLAGS)',
    851                       bin => '$(BIN_CFLAGS)' } -> {$args{intent}};
    852       } else {
    853           $cflags = { lib => '$(NO_INST_LIB_CFLAGS)',
    854                       dso => '$(NO_INST_DSO_CFLAGS)',
    855                       bin => '$(NO_INST_BIN_CFLAGS)' } -> {$args{intent}};
    856       }
    857       $cflags .= { lib => '$(LIB_CPPFLAGS)',
    858 		   dso => '$(DSO_CPPFLAGS)',
    859 		   bin => '$(BIN_CPPFLAGS)' } -> {$args{intent}};
    860       my $asflags = { lib => ' $(LIB_ASFLAGS)',
    861 		      dso => ' $(DSO_ASFLAGS)',
    862 		      bin => ' $(BIN_ASFLAGS)' } -> {$args{intent}};
    863 
    864       my @incs_cmds = includes({ lib => '$(LIB_INCLUDES)',
    865                                  dso => '$(DSO_INCLUDES)',
    866                                  bin => '$(BIN_INCLUDES)' } -> {$args{intent}},
    867                                '$(INCLUDES)',
    868                                map {
    869                                    file_name_is_absolute($_)
    870                                    ? $_ : catdir($backward,$_)
    871                                } @{$args{incs}});
    872       my $incs_on = join("\n\t\@ ", @{$incs_cmds[0]}) || '!';
    873       my $incs_off = join("\n\t\@ ", @{$incs_cmds[1]}) || '!';
    874 
    875       if ($srcs[0] =~ /\.asm$/) {
    876           return <<"EOF";
    877 $obj.OBJ : $deps
    878         ${before}
    879         SET DEFAULT $forward
    880         \$(AS) $asflags \$(ASOUTFLAG)${objd}${objn}.OBJ $srcs
    881         SET DEFAULT $backward
    882         ${after}
    883         - PURGE $obj.OBJ
    884 EOF
    885       } elsif ($srcs[0] =~ /.S$/) {
    886          return <<"EOF";
    887 $obj.OBJ : $deps
    888         ${before}
    889         SET DEFAULT $forward
    890         \@ $incs_on
    891         PIPE \$(CPP) ${cflags} $srcs | -
    892              \$(PERL) -ne "/^#(\\s*line)?\\s*[0-9]+\\s+""/ or print" -
    893              > ${objd}${objn}.asm
    894         \@ $incs_off
    895         SET DEFAULT $backward
    896         ${after}
    897         \$(AS) $asflags \$(ASOUTFLAG)$obj.OBJ $obj.asm
    898         - PURGE $obj.OBJ
    899 EOF
    900       }
    901 
    902       my $depbuild = $disabled{makedepend} ? ""
    903           : " /MMS=(FILE=${objd}${objn}.D,TARGET=$obj.OBJ)";
    904 
    905       return <<"EOF";
    906 $obj.OBJ : $deps
    907         ${before}
    908         SET DEFAULT $forward
    909         \@ $incs_on
    910         \$(CC) ${cflags}${depbuild} /OBJECT=${objd}${objn}.OBJ /REPOSITORY=$backward $srcs
    911         \@ $incs_off
    912         SET DEFAULT $backward
    913         ${after}
    914         - PURGE $obj.OBJ
    915 EOF
    916   }
    917   sub libobj2shlib {
    918       my %args = @_;
    919       my $lib = $args{lib};
    920       my $shlib = $args{shlib};
    921       my $libd = dirname($lib);
    922       my $libn = basename($lib);
    923       my @objs = map { (my $x = $_) =~ s|\.o$|.OBJ|; $x }
    924                  grep { $_ =~ m|\.o$| }
    925                  @{$args{objs}};
    926       my @defs = grep { $_ =~ /\.opt$/ } @{$args{objs}};
    927       my @deps = compute_lib_depends(@{$args{deps}});
    928       die "More than one symbol vector" if scalar @defs > 1;
    929       my $deps = join(", -\n\t\t", @defs, @deps);
    930       my $shlib_target = $disabled{shared} ? "" : $target{shared_target};
    931       my $translatesyms_pl = abs2rel(rel2abs(catfile($config{sourcedir},
    932                                                      "VMS", "translatesyms.pl")),
    933                                      rel2abs($config{builddir}));
    934       # The "[]" hack is because in .OPT files, each line inherits the
    935       # previous line's file spec as default, so if no directory spec
    936       # is present in the current line and the previous line has one that
    937       # doesn't apply, you're in for a surprise.
    938       my $write_opt1 =
    939           join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
    940                                  "WRITE OPT_FILE \"$x" } @objs).
    941           "\"";
    942       my $write_opt2 =
    943           join("\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
    944                              $x =~ s|(\.EXE)|$1/SHARE|;
    945                              $x =~ s|(\.OLB)|$1/LIB|;
    946                              "WRITE OPT_FILE \"$x\"" } @deps)
    947           || "\@ !";
    948       return <<"EOF"
    949 $shlib.EXE : $lib.OLB $deps
    950         \$(PERL) $translatesyms_pl \$(BLDDIR)CXX\$DEMANGLER_DB. < $defs[0] > $defs[0]-translated
    951         OPEN/WRITE/SHARE=READ OPT_FILE $lib-components.OPT
    952         $write_opt1
    953         $write_opt2
    954         CLOSE OPT_FILE
    955         LINK \$(LIB_LDFLAGS)/SHARE=\$\@ $defs[0]-translated/OPT,-
    956                 $lib-components.OPT/OPT \$(LIB_EX_LIBS)
    957         DELETE $defs[0]-translated;*,$lib-components.OPT;*
    958         PURGE $shlib.EXE,$shlib.MAP
    959 EOF
    960         . ($config{target} =~ m|alpha| ? "" : <<"EOF"
    961         SET IMAGE/FLAGS=(NOCALL_DEBUG) \$\@
    962 EOF
    963         );
    964   }
    965   sub obj2dso {
    966       my %args = @_;
    967       my $lib = $args{lib};
    968       my $libd = dirname($lib);
    969       my $libn = basename($lib);
    970       (my $libn_nolib = $libn) =~ s/^lib//;
    971       my @objs = map { (my $x = $_) =~ s|\.o$|.OBJ|; $x } @{$args{objs}};
    972       my @deps = compute_lib_depends(@{$args{deps}});
    973       my $deps = join(", -\n\t\t", @objs, @deps);
    974       my $shlib_target = $disabled{shared} ? "" : $target{shared_target};
    975       my $engine_opt = abs2rel(rel2abs(catfile($config{sourcedir},
    976                                                "VMS", "engine.opt")),
    977                                rel2abs($config{builddir}));
    978       # The "[]" hack is because in .OPT files, each line inherits the
    979       # previous line's file spec as default, so if no directory spec
    980       # is present in the current line and the previous line has one that
    981       # doesn't apply, you're in for a surprise.
    982       my $write_opt1 =
    983           join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
    984                                  "WRITE OPT_FILE \"$x" } @objs).
    985           "\"";
    986       my $write_opt2 =
    987           join("\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
    988                              $x =~ s|(\.EXE)|$1/SHARE|;
    989                              $x =~ s|(\.OLB)|$1/LIB|;
    990                              "WRITE OPT_FILE \"$x\"" } @deps)
    991           || "\@ !";
    992       return <<"EOF"
    993 $lib.EXE : $deps
    994         OPEN/WRITE/SHARE=READ OPT_FILE $lib.OPT
    995         TYPE $engine_opt /OUTPUT=OPT_FILE:
    996         $write_opt1
    997         $write_opt2
    998         CLOSE OPT_FILE
    999         LINK \$(DSO_LDFLAGS)/SHARE=\$\@ $lib.OPT/OPT \$(DSO_EX_LIBS)
   1000         - PURGE $lib.EXE,$lib.OPT,$lib.MAP
   1001 EOF
   1002         . ($config{target} =~ m|alpha| ? "" : <<"EOF"
   1003         SET IMAGE/FLAGS=(NOCALL_DEBUG) \$\@
   1004 EOF
   1005         );
   1006   }
   1007   sub obj2lib {
   1008       my %args = @_;
   1009       (my $lib = $args{lib}) =~ s/\.a$//;
   1010       my @objs = map { (my $x = $_) =~ s|\.o$|.OBJ|; $x } @{$args{objs}};
   1011       my $objs = join(", -\n\t\t", @objs);
   1012       my $fill_lib = join("\n\t", (map { "LIBRARY/REPLACE $lib.OLB $_" }
   1013                                    @objs));
   1014       return <<"EOF";
   1015 $lib.OLB : $objs
   1016         LIBRARY/CREATE/OBJECT $lib.OLB
   1017         $fill_lib
   1018         - PURGE $lib.OLB
   1019 EOF
   1020   }
   1021   sub obj2bin {
   1022       my %args = @_;
   1023       my $bin = $args{bin};
   1024       my $bind = dirname($bin);
   1025       my $binn = basename($bin);
   1026       my @objs = map { (my $x = $_) =~ s|\.o$|.OBJ|; $x } @{$args{objs}};
   1027       my $objs = join(",", @objs);
   1028       my @deps = compute_lib_depends(@{$args{deps}});
   1029       my $deps = join(", -\n\t\t", @objs, @deps);
   1030 
   1031       my $olb_count = scalar grep(m|\.OLB$|, @deps);
   1032       my $analyse_objs = "@ !";
   1033       if ($olb_count > 0) {
   1034           my $analyse_quals =
   1035               $config{target} =~ m|alpha| ? "/GSD" : "/SECTIONS=SYMTAB";
   1036           $analyse_objs = "- pipe ANALYSE/OBJECT$analyse_quals $objs | SEARCH SYS\$INPUT \"\"\"main\"\"\" ; nomain = \$severity .NE. 1"
   1037       }
   1038       # The "[]" hack is because in .OPT files, each line inherits the
   1039       # previous line's file spec as default, so if no directory spec
   1040       # is present in the current line and the previous line has one that
   1041       # doesn't apply, you're in for a surprise.
   1042       my $write_opt1 =
   1043           join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
   1044                                  "\@ WRITE OPT_FILE \"$x" } @objs).
   1045           "\"";
   1046       my $write_opt2 =
   1047           join("\n\t", map { my @lines = ();
   1048                              my $x = $_ =~ /\[/ ? $_ : "[]".$_;
   1049                              if ($x =~ m|\.EXE$|) {
   1050                                  push @lines, "\@ WRITE OPT_FILE \"$x/SHARE\"";
   1051                              } elsif ($x =~ m|\.OLB$|) {
   1052                                  (my $l = $x) =~ s/\W/_/g;
   1053                                  push @lines,
   1054                                      "\@ IF nomain THEN WRITE OPT_FILE \"$x/LIB\$(INCLUDE_MAIN_$l)\"",
   1055                                      "\@ IF .NOT. nomain THEN WRITE OPT_FILE \"$x/LIB\""
   1056                              }
   1057                              @lines
   1058                            } @deps)
   1059           || "\@ !";
   1060       # The linking commands looks a bit complex, but it's for good reason.
   1061       # When you link, say, foo.obj, bar.obj and libsomething.exe/share, and
   1062       # bar.obj happens to have a symbol that also exists in libsomething.exe,
   1063       # the linker will warn about it, loudly, and will then choose to pick
   1064       # the first copy encountered (the one in bar.obj in this example).
   1065       # On Unix and on Windows, the corresponding maneuvre goes through
   1066       # silently with the same effect.
   1067       # With some test programs, made for checking the internals of OpenSSL,
   1068       # we do this kind of linking deliberately, picking a few specific object
   1069       # files from within [.crypto] or [.ssl] so we can reach symbols that are
   1070       # otherwise unreachable (since the shareable images only exports the
   1071       # symbols listed in [.util]*.num), and then with the shared libraries
   1072       # themselves.  So we need to silence the warning about multiply defined
   1073       # symbols, to mimic the way linking work on Unix and Windows, and so
   1074       # the build isn't interrupted (MMS stops when warnings are signaled,
   1075       # by default), and so someone building doesn't have to worry where it
   1076       # isn't necessary.  If there are other warnings, however, we show them
   1077       # and let it break the build.
   1078       return <<"EOF"
   1079 $bin.EXE : $deps
   1080         $analyse_objs
   1081         @ OPEN/WRITE/SHARE=READ OPT_FILE $bin.OPT
   1082         $write_opt1
   1083         $write_opt2
   1084         @ CLOSE OPT_FILE
   1085         TYPE $bin.opt ! For debugging
   1086         - pipe SPAWN/WAIT/NOLOG/OUT=$bin.LINKLOG -
   1087                     LINK \$(BIN_LDFLAGS)/EXEC=\$\@ $bin.OPT/OPT \$(BIN_EX_LIBS) ; -
   1088                link_status = \$status ; link_severity = link_status .AND. 7
   1089         @ search_severity = 1
   1090         -@ IF link_severity .EQ. 0 THEN -
   1091                 pipe SEARCH $bin.LINKLOG "%","-"/MATCH=AND | -
   1092                      SPAWN/WAIT/NOLOG/OUT=NLA0: -
   1093                           SEARCH SYS\$INPUT: "-W-MULDEF,"/MATCH=NOR ; -
   1094                      search_severity = \$severity
   1095         @ ! search_severity is 3 when the last search didn't find any matching
   1096         @ ! string: %SEARCH-I-NOMATCHES, no strings matched
   1097         @ ! If that was the result, we pretend linking got through without
   1098         @ ! fault or warning.
   1099         @ IF search_severity .EQ. 3 THEN link_severity = 1
   1100         @ ! At this point, if link_severity shows that there was a fault
   1101         @ ! or warning, make sure to restore the linking status.
   1102         -@ IF .NOT. link_severity THEN TYPE $bin.LINKLOG
   1103         -@ DELETE $bin.LINKLOG;*
   1104         @ IF .NOT. link_severity THEN SPAWN/WAIT/NOLOG EXIT 'link_status'
   1105         - PURGE $bin.EXE,$bin.OPT
   1106 EOF
   1107       . ($config{target} =~ m|alpha| ? "" : <<"EOF"
   1108         SET IMAGE/FLAGS=(NOCALL_DEBUG) \$\@
   1109 EOF
   1110         );
   1111   }
   1112   sub in2script {
   1113       my %args = @_;
   1114       my $script = $args{script};
   1115       return "" if grep { $_ eq $script } @{$args{sources}}; # No overwrite!
   1116       my $sources = join(" ", @{$args{sources}});
   1117       my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
   1118                                            "util", "dofile.pl")),
   1119                            rel2abs($config{builddir}));
   1120       return <<"EOF";
   1121 $script : $sources
   1122         \$(PERL) "-I\$(BLDDIR)" "-Mconfigdata" $dofile -
   1123 	    "-o$target{build_file}" $sources > $script
   1124         SET FILE/PROT=(S:RWED,O:RWED,G:RE,W:RE) $script
   1125         PURGE $script
   1126 EOF
   1127   }
   1128   ""    # Important!  This becomes part of the template result.
   1129 -}
   1130