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-} 97PLATFORM={- $config{target} -} 98OPTIONS={- $config{options} -} 99CONFIGURE_ARGS=({- join(", ",quotify_l(@{$config{perlargv}})) -}) 100SRCDIR={- $config{sourcedir} -} 101BLDDIR={- $config{builddir} -} 102 103# Allow both V and VERBOSE to indicate verbosity. This only applies 104# to testing. 105VERBOSE=$(V) 106 107VERSION={- $config{version} -} 108MAJOR={- $config{major} -} 109MINOR={- $config{minor} -} 110SHLIB_VERSION_NUMBER={- $config{shlib_version_number} -} 111SHLIB_VERSION_HISTORY={- $config{shlib_version_history} -} 112SHLIB_MAJOR={- $config{shlib_major} -} 113SHLIB_MINOR={- $config{shlib_minor} -} 114SHLIB_TARGET={- $target{shared_target} -} 115 116EXE_EXT=.EXE 117LIB_EXT=.OLB 118SHLIB_EXT=.EXE 119OBJ_EXT=.OBJ 120DEP_EXT=.D 121 122LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @libs) -} 123SHLIBS={- join(", ", map { "-\n\t".$_.".EXE" } @shlibs) -} 124ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{engines}}) -} 125PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{programs}}) -} 126SCRIPTS={- join(", ", map { "-\n\t".$_ } @{$unified_info{scripts}}) -} 127{- output_off() if $disabled{makedepend}; "" -} 128DEPS={- 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}; "" -} 133GENERATED_MANDATORY={- join(", ", map { "-\n\t".$_ } @{$unified_info{depends}->{""}} ) -} 134GENERATED={- # common0.tmpl provides @generated 135 join(", ", map { (my $x = $_) =~ s|\.[sS]$|.asm|; "-\n\t".$x } 136 @generated) -} 137 138INSTALL_LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @install_libs) -} 139INSTALL_SHLIBS={- join(", ", map { "-\n\t".$_.".EXE" } @install_shlibs) -} 140INSTALL_ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{install}->{engines}}) -} 141INSTALL_PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{install}->{programs}}) -} 142{- output_off() if $disabled{apps}; "" -} 143BIN_SCRIPTS=[.tools]c_rehash.pl 144MISC_SCRIPTS=[.apps]CA.pl, [.apps]tsget.pl 145{- output_on() if $disabled{apps}; "" -} 146 147APPS_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. 156DESTDIR= 157 158# Do not edit this manually. Use Configure --prefix=DIR to change this! 159INSTALLTOP={- our $installtop = 160 catdir($config{prefix}) || "SYS\$COMMON:[OPENSSL]"; 161 $installtop -} 162SYSTARTUP={- catdir($installtop, '[.SYS$STARTUP]'); -} 163# This is the standard central area to store certificates, private keys... 164OPENSSLDIR={- catdir($config{openssldir}) or 165 $config{prefix} ? catdir($config{prefix},"COMMON") 166 : "SYS\$COMMON:[OPENSSL-COMMON]" -} 167# The same, but for C 168OPENSSLDIR_C={- $osslprefix -}DATAROOT:[000000] 169# Where installed engines reside, for C 170ENGINESDIR_C={- $osslprefix -}ENGINES{- $sover_dirname.$target{pointer_size} -}: 171 172##### User defined commands and flags ################################ 173 174CC={- $config{CC} -} 175CPP={- $config{CPP} -} 176DEFINES={- our $defines1 = join('', map { ",$_" } @{$config{CPPDEFINES}}) -} 177INCLUDES={- our $includes1 = join(',', @{$config{CPPINCLUDES}}) -} 178CPPFLAGS={- our $cppflags1 = join('', @{$config{CPPFLAGS}}) -} 179CFLAGS={- join('', @{$config{CFLAGS}}) -} 180LDFLAGS={- join('', @{$config{LFLAGS}}) -} 181EX_LIBS={- join('', map { ",$_" } @{$config{LDLIBS}}) -} 182 183PERL={- $config{PERL} -} 184 185AS={- $config{AS} -} 186ASFLAGS={- join(' ', @{$config{ASFLAGS}}) -} 187 188##### Special command flags ########################################## 189 190ASOUTFLAG={- $target{asoutflag} -}$(OSSL_EMPTY) 191 192##### Project flags ################################################## 193 194# Variables starting with CNF_ are common variables for all product types 195 196CNF_ASFLAGS={- join('', $target{asflags} || (), 197 @{$config{asflags}}) -} 198CNF_DEFINES={- our $defines2 = join('', map { ",$_" } @{$target{defines}}, 199 @{$config{defines}}) -} 200CNF_INCLUDES={- our $includes2 = join(',', @{$target{includes}}, 201 @{$config{includes}}) -} 202CNF_CPPFLAGS={- our $cppflags2 = join('', $target{cppflags} || (), 203 @{$config{cppflags}}) -} 204CNF_CFLAGS={- join('', $target{cflags} || (), 205 @{$config{cflags}}) -} 206CNF_CXXFLAGS={- join('', $target{cxxflags} || (), 207 @{$config{cxxflags}}) -} 208CNF_LDFLAGS={- join('', $target{lflags} || (), 209 @{$config{lflags}}) -} 210CNF_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 219LIB_ASFLAGS={- join(' ', $target{lib_asflags} || (), 220 @{$config{lib_asflags}}, 221 '$(CNF_ASFLAGS)', '$(ASFLAGS)') -} 222LIB_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)') -} 231LIB_INCLUDES={- our $lib_includes = 232 join(',', @{$target{lib_includes}}, 233 @{$target{shared_includes}}, 234 @{$config{lib_includes}}, 235 @{$config{shared_includes}}) -} 236LIB_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)') -} 245LIB_CFLAGS={- join('', $target{lib_cflags} || (), 246 $target{shared_cflag} || (), 247 @{$config{lib_cflags}}, 248 @{$config{shared_cflag}}, 249 '$(CNF_CFLAGS)', '$(CFLAGS)') -} 250LIB_LDFLAGS={- join('', $target{lib_lflags} || (), 251 $target{shared_ldflag} || (), 252 @{$config{lib_lflags}}, 253 @{$config{shared_ldflag}}, 254 '$(CNF_LDFLAGS)', '$(LDFLAGS)') -} 255LIB_EX_LIBS=$(CNF_EX_LIBS)$(EX_LIBS) 256DSO_ASFLAGS={- join(' ', $target{dso_asflags} || (), 257 $target{module_asflags} || (), 258 @{$config{dso_asflags}}, 259 @{$config{module_asflags}}, 260 '$(CNF_ASFLAGS)', '$(ASFLAGS)') -} 261DSO_DEFINES={- join('', (map { ",$_" } @{$target{dso_defines}}, 262 @{$target{module_defines}}, 263 @{$config{dso_defines}}, 264 @{$config{module_defines}}), 265 '$(CNF_DEFINES)', '$(DEFINES)') -} 266DSO_INCLUDES={- join(',', @{$target{dso_includes}}, 267 @{$target{module_includes}}, 268 @{$config{dso_includes}}, 269 @{$config{module_includes}}) -} 270DSO_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)') -} 277DSO_CFLAGS={- join('', $target{dso_cflags} || (), 278 $target{module_cflags} || (), 279 @{$config{dso_cflags}}, 280 @{$config{module_cflags}}, 281 '$(CNF_CFLAGS)', '$(CFLAGS)') -} 282DSO_LDFLAGS={- join('', $target{dso_lflags} || (), 283 $target{module_ldflags} || (), 284 @{$config{dso_lflags}}, 285 @{$config{module_ldflags}}, 286 '$(CNF_LDFLAGS)', '$(LDFLAGS)') -} 287DSO_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS) 288BIN_ASFLAGS={- join(' ', $target{bin_asflags} || (), 289 @{$config{bin_asflags}}, 290 '$(CNF_ASFLAGS)', '$(ASFLAGS)') -} 291BIN_DEFINES={- join('', (map { ",$_" } @{$target{bin_defines}}, 292 @{$config{bin_defines}}), 293 '$(CNF_DEFINES)', '$(DEFINES)') -} 294BIN_INCLUDES={- join(',', @{$target{bin_includes}}, 295 @{$config{bin_includes}}) -} 296BIN_CPPFLAGS={- join('', "'qual_includes'", 297 '/DEFINE=(__dummy$(DSO_DEFINES))', 298 $target{bin_cppflags} || (), 299 @{$config{bin_cppflag}}, 300 '$(CNF_CPPFLAGS)', '$(CPPFLAGS)') -} 301BIN_CFLAGS={- join('', $target{bin_cflag} || (), 302 @{$config{bin_cflag}}, 303 '$(CNF_CFLAGS)', '$(CFLAGS)') -} 304BIN_LDFLAGS={- join('', $target{bin_lflags} || (), 305 @{$config{bin_lflags}} || (), 306 '$(CNF_LDFLAGS)', '$(LDFLAGS)') -} 307BIN_EX_LIBS=$(CNF_EX_LIBS) $(EX_LIBS) 308NO_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)') -} 315NO_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)') -} 322NO_INST_BIN_CFLAGS={- join('', $target{no_inst_bin_cflags} 323 // $target{bin_cflags} 324 // (), 325 @{$config{bin_cflags}}, 326 '$(CNF_CFLAGS)', '$(CFLAGS)') -} 327 328PERLASM_SCHEME={- $target{perlasm_scheme} -} 329 330# CPPFLAGS_Q is used for one thing only: to build up buildinf.h 331CPPFLAGS_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. 351NODEBUG=@ 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 411build_generated : $(GENERATED_MANDATORY) 412build_libs_nodep : $(LIBS), $(SHLIBS) 413build_engines_nodep : $(ENGINES) 414build_programs_nodep : $(PROGRAMS), $(SCRIPTS) 415 416# Kept around for backward compatibility 417build_apps build_tests : build_programs 418 419# Convenience target to prebuild all generated files, not just the mandatory 420# ones 421build_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 428test : 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 449list-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 458install : 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 483check_install : 484 spawn/nolog @ossl_installroot:[SYSTEST]openssl_ivp{- $osslver -}.com 485 486uninstall : 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. 490libclean : 491 {- join("\n\t", map { "- DELETE $_.OLB;*" } @libs) || "@ !" -} 492 {- join("\n\t", map { "- DELETE $_.EXE;*,$_.MAP;*" } @shlibs) || "@ !" -} 493 494clean : 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 508distclean : clean 509 - DELETE configdata.pm;* 510 - DELETE descrip.mms;* 511 512depend : descrip.mms 513descrip.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 520install_sw : install_dev install_engines install_runtime - 521 install_startup install_ivp 522 523uninstall_sw : uninstall_dev uninstall_engines uninstall_runtime - 524 uninstall_startup uninstall_ivp 525 526install_docs : install_html_docs 527 528uninstall_docs : uninstall_html_docs 529 530install_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 552install_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 563install_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 572install_runtime : install_programs 573 574install_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 584install_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 594install_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 604install_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 633vmsconfig.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 658install_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 664check_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 674debug_logicals : 675 SH LOGICAL/PROC openssl,internal,ossl_installroot,ossl_dataroot 676 677# Building targets ################################################### 678 679configdata.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 688reconfigure 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 > \$\@ 764EOF 765 } else { 766 return <<"EOF"; 767$target : $args{generator}->[0] $deps 768 \$(PERL)$generator_incs $generator > \$\@ 769EOF 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; 806EOF 807 } 808 # Otherwise.... 809 return <<"EOF"; 810$target : $args{generator}->[0] $deps 811 $generator \$\@ 812EOF 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 821EOF 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 884EOF 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 899EOF 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 915EOF 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 959EOF 960 . ($config{target} =~ m|alpha| ? "" : <<"EOF" 961 SET IMAGE/FLAGS=(NOCALL_DEBUG) \$\@ 962EOF 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 1001EOF 1002 . ($config{target} =~ m|alpha| ? "" : <<"EOF" 1003 SET IMAGE/FLAGS=(NOCALL_DEBUG) \$\@ 1004EOF 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 1019EOF 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 1106EOF 1107 . ($config{target} =~ m|alpha| ? "" : <<"EOF" 1108 SET IMAGE/FLAGS=(NOCALL_DEBUG) \$\@ 1109EOF 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 1126EOF 1127 } 1128 "" # Important! This becomes part of the template result. 1129-} 1130