a717738b45
In most builds, we can assume that engines live in the build tree subdirectory "engines". This was hard coded into the tests that use the engine ossltest. However, that hard coding is tedious, it would need to be done in every test recipe, and it's an incorrect assumption in some cases. This change has us play it safe and let the build files tell the testing framework where the engines are. Reviewed-by: Viktor Dukhovni <viktor@openssl.org>
626 lines
27 KiB
Cheetah
626 lines
27 KiB
Cheetah
## descrip.mms to build OpenSSL on OpenVMS
|
|
##
|
|
## {- join("\n## ", @autowarntext) -}
|
|
{-
|
|
use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;
|
|
|
|
# Our prefix, claimed when speaking with the VSI folks Tuesday
|
|
# January 26th 2016
|
|
our $osslprefix = 'OSSL$';
|
|
(our $osslprefix_q = $osslprefix) =~ s/\$/\\\$/;
|
|
|
|
our $sourcedir = $config{sourcedir};
|
|
our $builddir = $config{builddir};
|
|
sub sourcefile {
|
|
catfile($sourcedir, @_);
|
|
}
|
|
sub buildfile {
|
|
catfile($builddir, @_);
|
|
}
|
|
sub sourcedir {
|
|
catdir($sourcedir, @_);
|
|
}
|
|
sub builddir {
|
|
catdir($builddir, @_);
|
|
}
|
|
sub tree {
|
|
(my $x = shift) =~ s|\]$|...]|;
|
|
$x
|
|
}
|
|
sub move {
|
|
my $f = catdir(@_);
|
|
my $b = abs2rel(rel2abs("."),rel2abs($f));
|
|
$sourcedir = catdir($b,$sourcedir)
|
|
if !file_name_is_absolute($sourcedir);
|
|
$builddir = catdir($b,$builddir)
|
|
if !file_name_is_absolute($builddir);
|
|
"";
|
|
}
|
|
|
|
# This is a horrible hack, but is needed because recursive inclusion of files
|
|
# in different directories does not work well with HP C.
|
|
my $sd = sourcedir("crypto", "async", "arch");
|
|
foreach (grep /\[\.crypto\.async\.arch\].*\.o$/, keys %{$unified_info{sources}}) {
|
|
(my $x = $_) =~ s|\.o$|.OBJ|;
|
|
$unified_info{before}->{$x}
|
|
= qq(arch = F\$PARSE("$sd","A.;",,,"SYNTAX_ONLY") - "A.;"
|
|
define arch 'arch');
|
|
$unified_info{after}->{$x}
|
|
= qq(deassign arch);
|
|
}
|
|
my $sd1 = sourcedir("ssl","record");
|
|
my $sd2 = sourcedir("ssl","statem");
|
|
$unified_info{before}->{"[.test]heartbeat_test.OBJ"}
|
|
= $unified_info{before}->{"[.test]ssltest.OBJ"}
|
|
= qq(record = F\$PARSE("$sd1","A.;",,,"SYNTAX_ONLY") - "A.;"
|
|
define record 'record'
|
|
statem = F\$PARSE("$sd2","A.;",,,"SYNTAX_ONLY") - "A.;"
|
|
define statem 'statem');
|
|
$unified_info{after}->{"[.test]heartbeat_test.OBJ"}
|
|
= $unified_info{after}->{"[.test]ssltest.OBJ"}
|
|
= qq(deassign statem
|
|
deassign record);
|
|
foreach (grep /^\[\.ssl\.(?:record|statem)\].*\.o$/, keys %{$unified_info{sources}}) {
|
|
(my $x = $_) =~ s|\.o$|.OBJ|;
|
|
$unified_info{before}->{$x}
|
|
= qq(record = F\$PARSE("$sd1","A.;",,,"SYNTAX_ONLY") - "A.;"
|
|
define record 'record'
|
|
statem = F\$PARSE("$sd2","A.;",,,"SYNTAX_ONLY") - "A.;"
|
|
define statem 'statem');
|
|
$unified_info{after}->{$x}
|
|
= qq(deassign statem
|
|
deassign record);
|
|
}
|
|
#use Data::Dumper;
|
|
#print STDERR "DEBUG: before:\n", Dumper($unified_info{before});
|
|
#print STDERR "DEBUG: after:\n", Dumper($unified_info{after});
|
|
"";
|
|
-}
|
|
PLATFORM={- $config{target} -}
|
|
OPTIONS={- $config{options} -}
|
|
CONFIGURE_ARGS=({- join(", ",quotify_l(@{$config{perlargv}})) -})
|
|
SRCDIR={- $config{sourcedir} -}
|
|
BUILDDIR={- $config{builddir} -}
|
|
|
|
VERSION={- $config{version} -}
|
|
MAJOR={- $config{major} -}
|
|
MINOR={- $config{minor} -}
|
|
SHLIB_VERSION_NUMBER={- $config{shlib_version_number} -}
|
|
SHLIB_VERSION_HISTORY={- $config{shlib_version_history} -}
|
|
SHLIB_MAJOR={- $config{shlib_major} -}
|
|
SHLIB_MINOR={- $config{shlib_minor} -}
|
|
SHLIB_TARGET={- $target{shared_target} -}
|
|
|
|
EXE_EXT=.EXE
|
|
LIB_EXT=.OLB
|
|
SHLIB_EXT=.EXE
|
|
OBJ_EXT=.OBJ
|
|
DEP_EXT=.MMS
|
|
|
|
LIBS={- join(", ", map { "-\n\t".$_.".OLB" } @{$unified_info{libraries}}) -}
|
|
SHLIBS={- join(" ", map { $_."\$(SHLIB_EXT)" } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) -}
|
|
ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @{$unified_info{engines}}) -}
|
|
PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } grep { !m|^\[\.test\]| } @{$unified_info{programs}}) -}
|
|
TESTPROGS={- join(", ", map { "-\n\t".$_.".EXE" } grep { m|^\[\.test\]| } @{$unified_info{programs}}) -}
|
|
SCRIPTS={- join(", ", map { "-\n\t".$_ } @{$unified_info{scripts}}) -}
|
|
{- output_off() if $disabled{makedepend}; "" -}
|
|
DEPS={- our @deps = map { (my $x = $_) =~ s|\.o$|\$(DEP_EXT)|; $x; }
|
|
grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
|
|
keys %{$unified_info{sources}};
|
|
join(", ", map { "-\n\t".$_ } @deps); -}
|
|
{- output_on() if $disabled{makedepend}; "" -}
|
|
|
|
# DESTDIR is for package builders so that they can configure for, say,
|
|
# SYS$COMMON:[OPENSSL] and yet have everything installed in STAGING:[USER].
|
|
# In that case, configure with --prefix=SYS$COMMON:[OPENSSL] and then run
|
|
# MMS with /MACROS=(DESTDIR=STAGING:[USER]). The result will end up in
|
|
# STAGING:[USER.OPENSSL].
|
|
# Normally it is left empty.
|
|
DESTDIR=
|
|
|
|
# Do not edit this manually. Use Configure --prefix=DIR to change this!
|
|
INSTALLTOP={- catdir($config{prefix}) || "SYS\$COMMON:[OPENSSL-\$(MAJOR).\$(MINOR)]" -}
|
|
# This is the standard central area to store certificates, private keys...
|
|
OPENSSLDIR={- catdir($config{openssldir}) ||
|
|
$config{prefix} ? catdir($config{prefix},"SSL")
|
|
: "SYS\$COMMON:[SSL]" -}
|
|
# Where installed engines reside
|
|
ENGINESDIR={- $osslprefix -}ENGINES:
|
|
|
|
CC= {- $target{cc} -}
|
|
CFLAGS= /DEFINE=({- join(",", @{$target{defines}}, @{$config{defines}},"OPENSSLDIR=\"\"\"\$(OPENSSLDIR)\"\"\"","ENGINESDIR=\"\"\"\$(ENGINESDIR)\"\"\"") -}) {- $target{cflags} -} {- $config{cflags} -}
|
|
CFLAGS_Q=$(CFLAGS)
|
|
DEPFLAG= /DEFINE=({- join(",", @{$config{depdefines}}) -})
|
|
LDFLAGS= {- $target{lflags} -}
|
|
EX_LIBS= {- $target{ex_libs} ? ",".$target{ex_libs} : "" -}{- $config{ex_libs} ? ",".$config{ex_libs} : "" -}
|
|
|
|
PERL={- $config{perl} -}
|
|
|
|
# We let the C compiler driver to take care of .s files. This is done in
|
|
# order to be excused from maintaining a separate set of architecture
|
|
# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC
|
|
# gcc, then the driver will automatically translate it to -xarch=v8plus
|
|
# and pass it down to assembler.
|
|
AS={- $target{as} -}
|
|
ASFLAG={- $target{asflags} -}
|
|
|
|
# .FIRST and .LAST are special targets with MMS and MMK.
|
|
# The defines in there are for C. includes that look like
|
|
# this:
|
|
#
|
|
# #include <openssl/foo.h>
|
|
# #include "internal/bar.h"
|
|
#
|
|
# will use the logical names to find the files. Expecting
|
|
# DECompHP C to find files in subdirectories of whatever was
|
|
# given with /INCLUDE is a fantasy, unfortunately.
|
|
NODEBUG=@
|
|
.FIRST :
|
|
$(NODEBUG) openssl_inc1 = F$PARSE("[.include.openssl]","A.;",,,"syntax_only") - "A.;"
|
|
$(NODEBUG) openssl_inc2 = F$PARSE("{- catdir($config{sourcedir},"[.include.openssl]") -}","A.;",,,"SYNTAX_ONLY") - "A.;"
|
|
$(NODEBUG) internal_inc1 = F$PARSE("[.crypto.include.internal]","A.;",,,"SYNTAX_ONLY") - "A.;"
|
|
$(NODEBUG) internal_inc2 = F$PARSE("{- catdir($config{sourcedir},"[.include.internal]") -}","A.;",,,"SYNTAX_ONLY") - "A.;"
|
|
$(NODEBUG) internal_inc3 = F$PARSE("{- catdir($config{sourcedir},"[.crypto.include.internal]") -}","A.;",,,"SYNTAX_ONLY") - "A.;"
|
|
$(NODEBUG) DEFINE openssl 'openssl_inc1','openssl_inc2'
|
|
$(NODEBUG) DEFINE internal 'internal_inc1','internal_inc2','internal_inc3'
|
|
$(NODEBUG) staging_dir = "$(DESTDIR)"
|
|
$(NODEBUG) IF staging_dir .NES. "" THEN -
|
|
staging_dir = F$PARSE("A.;",staging_dir,"[]",,"SYNTAX_ONLY") - "A.;"
|
|
$(NODEBUG) !
|
|
$(NODEBUG) ! Installation logical names
|
|
$(NODEBUG) !
|
|
$(NODEBUG) installtop_dev = F$PARSE(staging_dir,"$(INSTALLTOP)",,"DEVICE","SYNTAX_ONLY")
|
|
$(NODEBUG) ! Because there are no routines to merge directories, we have to
|
|
$(NODEBUG) ! do it ourselves
|
|
$(NODEBUG) IF staging_dir .NES. "" THEN -
|
|
staging_dir = F$PARSE(staging_dir,"[000000]",,"DIRECTORY","SYNTAX_ONLY")
|
|
$(NODEBUG) installtop_dir = F$PARSE("$(INSTALLTOP)","[000000]",,"DIRECTORY","SYNTAX_ONLY")
|
|
$(NODEBUG) IF staging_dir .NES. "" .AND. staging_dir .NES. "[000000]" THEN -
|
|
installtop_dir = staging_dir - "]" + "." + (installtop_dir - "[")
|
|
$(NODEBUG) installtop_dir = installtop_dir - "]" + ".]"
|
|
$(NODEBUG) DEFINE ossl_installroot 'installtop_dev''installtop_dir'
|
|
$(NODEBUG) !
|
|
$(NODEBUG) datatop = F$PARSE("$(OPENSSLDIR)","[000000]A.;",,,"SYNTAX_ONLY") -
|
|
- "]A.;" + ".]"
|
|
$(NODEBUG) IF "$(DESTDIR)" .EQS. "" THEN -
|
|
DEFINE ossl_dataroot 'datatop'
|
|
$(NODEBUG) !
|
|
$(NODEBUG) ! Figure out the architecture
|
|
$(NODEBUG) !
|
|
$(NODEBUG) arch == f$edit( f$getsyi( "arch_name"), "upcase")
|
|
$(NODEBUG) !
|
|
$(NODEBUG) ! Set up logical names for the libraries, so LINK and
|
|
$(NODEBUG) ! running programs can use them.
|
|
$(NODEBUG) !
|
|
$(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEFINE ".uc($_)." 'F\$ENV(\"DEFAULT\")'".uc($_)."\$(SHLIB_EXT)" } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) || "!" -}
|
|
|
|
.LAST :
|
|
$(NODEBUG) {- join("\n\t\$(NODEBUG) ", map { "DEASSIGN ".uc($_) } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) || "!" -}
|
|
$(NODEBUG) IF "$(DESTDIR)" .EQS. "" THEN DEASSIGN ossl_dataroot
|
|
$(NODEBUG) DEASSIGN ossl_installroot
|
|
$(NODEBUG) DEASSIGN internal
|
|
$(NODEBUG) DEASSIGN openssl
|
|
.DEFAULT :
|
|
@ ! MMS cannot handle no actions...
|
|
|
|
# The main targets ###################################################
|
|
|
|
all : configdata.pm, -
|
|
build_libs_nodep, build_engines_nodep, build_apps_nodep, -
|
|
depend
|
|
|
|
build_libs : configdata.pm, build_libs_nodep, depend
|
|
build_libs_nodep : $(LIBS)
|
|
build_engines : configdata.pm, build_engines_nodep, depend
|
|
build_engines_nodep : $(ENGINES)
|
|
build_apps : configdata.pm, build_apps_nodep, depend
|
|
build_apps_nodep : $(PROGRAMS), $(SCRIPTS)
|
|
build_tests : configdata.pm, build_tests_nodep, depend
|
|
build_tests_nodep : $(TESTPROGS)
|
|
|
|
test tests : configdata.pm, -
|
|
build_apps_nodep, build_engines_nodep, build_tests_nodep, -
|
|
depend
|
|
SET DEFAULT [.test]{- move("test") -}
|
|
DEFINE SRCTOP {- sourcedir() -}
|
|
DEFINE BLDTOP {- builddir() -}
|
|
DEFINE OPENSSL_ENGINES {- builddir("engines") -}
|
|
$(PERL) {- sourcefile("test", "run_tests.pl") -} $(TESTS)
|
|
DEASSIGN OPENSSL_ENGINES
|
|
DEASSIGN BLDTOP
|
|
DEASSIGN SRCTOP
|
|
SET DEFAULT [-]{- move("..") -}
|
|
|
|
list-tests :
|
|
@ TOP=$(SRCDIR) PERL=$(PERL) $(PERL) {- catfile($config{sourcedir},"test", "run_tests.pl") -} list
|
|
|
|
# Because VMS wants the generation number (or *) to delete files, we can't
|
|
# use $(LIBS), $(PROGRAMS) and $(TESTPROGS) directly.
|
|
libclean :
|
|
- DELETE []OSSL$LIB*.OLB;*,OSSL$LIB*.LIS;*
|
|
- DELETE [.crypto...]*.OBJ;*,*.LIS;*
|
|
- DELETE [.ssl...]*.OBJ;*,*.LIS;*
|
|
- DELETE [.engines...]*.OBJ;*,*.LIS;*
|
|
- DELETE []CXX$DEMANGLER_DB.;*
|
|
|
|
install : install_sw install_docs
|
|
@ WRITE SYS$OUTPUT ""
|
|
@ WRITE SYS$OUTPUT "######################################################################"
|
|
@ WRITE SYS$OUTPUT ""
|
|
@ WRITE SYS$OUTPUT "Installation complete"
|
|
@ WRITE SYS$OUTPUT ""
|
|
@ IF "$(DESTDIR)" .EQS. "" THEN -
|
|
PIPE ( WRITE SYS$OUTPUT "Run @$(INSTALLTOP)openssl_startup to set up logical names" ; -
|
|
WRITE SYS$OUTPUT "then run @$(INSTALLTOP)openssl_setup to define commands" ; -
|
|
WRITE SYS$OUTPUT "" )
|
|
|
|
uninstall : uninstall_docs uninstall_sw
|
|
|
|
clean : libclean
|
|
- DELETE []OSSL$LIB*.EXE;*,OSSL$LIB*.MAP;*,OSSL$LIB*.OPT;*
|
|
- DELETE [.engines...]LIB*.EXE;*,LIB*.MAP;*,LIB*.OPT;*
|
|
- DELETE [.apps]*.EXE;*,*.MAP;*,*.OPT;*
|
|
- DELETE [.apps]*.OBJ;*,*.LIS;*
|
|
- DELETE [.test]*.EXE;*,*.MAP;*,*.OPT;*
|
|
- DELETE [.test]*.OBJ;*,*.LIS;*
|
|
- DELETE [.test]*.LOG;*
|
|
- DELETE []*.MAP;*
|
|
|
|
depend : descrip.mms
|
|
descrip.mms : FORCE
|
|
@ ! {- output_off() if $disabled{makedepend}; "" -}
|
|
@ $(PERL) -pe "if (/^# DO NOT DELETE.*/) { exit(0); }" -
|
|
< descrip.mms > descrip.mms-new
|
|
@ OPEN/APPEND DESCRIP descrip.mms-new
|
|
@ WRITE DESCRIP "# DO NOT DELETE THIS LINE -- make depend depends on it."
|
|
{- join("\n\t", map { "\@ IF F\$SEARCH(\"$_\") .NES. \"\" THEN TYPE $_ /OUTPUT=DESCRIP:" } @deps); -}
|
|
@ CLOSE DESCRIP
|
|
@ PIPE ( $(PERL) -e "use File::Compare qw/compare_text/; my $x = compare_text(""descrip.mms"",""descrip.mms-new""); exit(0x10000000 + ($x == 0));" || -
|
|
RENAME descrip.mms-new descrip.mms )
|
|
@ IF F$SEARCH("descrip.mms-new") .NES. "" THEN DELETE descrip.mms-new;*
|
|
-@ SPAWN/OUTPUT=NLA0: PURGE/NOLOG descrip.mms
|
|
@ ! {- output_on() if $disabled{makedepend}; "" -}
|
|
|
|
# Install helper targets #############################################
|
|
|
|
install_sw : all install_dev install_engines install_runtime install_config
|
|
|
|
uninstall_sw : uninstall_dev uninstall_engines uninstall_runtime uninstall_config
|
|
|
|
install_docs : install_man_docs install_html_docs
|
|
|
|
uninstall_docs : uninstall_man_docs uninstall_html_docs
|
|
|
|
install_dev : check_INSTALLTOP
|
|
@ WRITE SYS$OUTPUT "*** Installing development files"
|
|
@ ! Install header files
|
|
CREATE/DIR ossl_installroot:[include.openssl]
|
|
COPY/PROT=W:R openssl:*.h ossl_installroot:[include.openssl]
|
|
@ ! Install libraries
|
|
CREATE/DIR ossl_installroot:[LIB.'arch']
|
|
{- join("\n ",
|
|
map { "COPY/PROT=W:R $_.OLB ossl_installroot:[LIB.'arch']" }
|
|
@{$unified_info{libraries}}) -}
|
|
@ {- output_off() if $disabled{shared}; "" -} !
|
|
{- join("\n ",
|
|
map { "COPY/PROT=W:RE $_.EXE ossl_installroot:[LIB.'arch']" }
|
|
map { $unified_info{sharednames}->{$_} || () }
|
|
@{$unified_info{libraries}}) -}
|
|
@ {- output_on() if $disabled{shared}; "" -} !
|
|
|
|
install_runtime : check_INSTALLTOP
|
|
@ WRITE SYS$OUTPUT "*** Installing runtime files"
|
|
@ ! Install the main program
|
|
CREATE/DIR ossl_installroot:[EXE.'arch']
|
|
COPY/PROT=W:RE [.APPS]openssl.EXE ossl_installroot:[EXE.'arch']
|
|
@ ! Install scripts
|
|
CREATE/DIR ossl_installroot:[EXE]
|
|
COPY/PROT=W:RE [.APPS]CA.pl ossl_installroot:[EXE]
|
|
COPY/PROT=W:RE [.TOOLS]c_rehash. ossl_installroot:[EXE]c_rehash.pl
|
|
@ ! Install configuration file
|
|
COPY/PROT=W:RE {- sourcefile("apps", "openssl-vms.cnf") -} -
|
|
ossl_installroot:[000000]openssl.cnf
|
|
|
|
install_engines : check_INSTALLTOP
|
|
@ {- output_off() unless scalar @{$unified_info{engines}}; "" -} !
|
|
@ WRITE SYS$OUTPUT "*** Installing engines"
|
|
CREATE/DIR ossl_installroot:[ENGINES.'arch']
|
|
{- join("\n ",
|
|
map { "COPY/PROT=W:RE $_.EXE ossl_installroot:[ENGINES.'arch']" }
|
|
grep(!m|ossltest$|i, @{$unified_info{engines}})) -}
|
|
@ {- output_on() unless scalar @{$unified_info{engines}}; "" -} !
|
|
|
|
install_config : [.VMS]openssl_startup.com [.VMS]openssl_shutdown.com -
|
|
check_INSTALLTOP
|
|
IF "$(DESTDIR)" .EQS. "" THEN -
|
|
IF F$SEARCH("OSSL_DATAROOT:[000000]CERTS.DIR;1") .EQS. "" THEN -
|
|
CREATE/DIR/PROT=(S:RWED,O:RWE,G:RE,W:RE) OSSL_DATAROOT:[CERTS]
|
|
IF "$(DESTDIR)" .EQS. "" THEN -
|
|
IF F$SEARCH("OSSL_DATAROOT:[000000]PRIVATE.DIR;1") .EQS. "" THEN -
|
|
CREATE/DIR/PROT=(S:RWED,O:RWE,G:,W:) OSSL_DATAROOT:[PRIVATE]
|
|
CREATE/DIR ossl_installroot:[SYS$STARTUP]
|
|
COPY/PROT=W:RE -
|
|
[.VMS]openssl_startup.com,openssl_shutdown.com -
|
|
ossl_installroot:[SYS$STARTUP]
|
|
COPY/PROT=W:RE -
|
|
{- sourcefile("VMS", "openssl_utils.com") -} -
|
|
ossl_installroot:[SYS$STARTUP]
|
|
|
|
[.VMS]openssl_startup.com : vmsconfig.pm
|
|
CREATE/DIR [.VMS]
|
|
$(PERL) "-I." "-Mvmsconfig" {- sourcefile("util", "dofile.pl") -} -
|
|
{- sourcefile("VMS", "openssl_startup.com.in") -} -
|
|
> [.VMS]openssl_startup.com
|
|
|
|
[.VMS]openssl_shutdown.com : vmsconfig.pm
|
|
CREATE/DIR [.VMS]
|
|
$(PERL) "-I." "-Mvmsconfig" {- sourcefile("util", "dofile.pl") -} -
|
|
{- sourcefile("VMS", "openssl_shutdown.com.in") -} -
|
|
> [.VMS]openssl_shutdown.com
|
|
|
|
vmsconfig.pm : configdata.pm
|
|
OPEN/WRITE/SHARE=READ CONFIG []vmsconfig.pm
|
|
WRITE CONFIG "package vmsconfig;"
|
|
WRITE CONFIG "use strict; use warnings;"
|
|
WRITE CONFIG "use Exporter;"
|
|
WRITE CONFIG "our @ISA = qw(Exporter);"
|
|
WRITE CONFIG "our @EXPORT = qw(%config %target %withargs %unified_info %disabled);"
|
|
WRITE CONFIG "our %config = ("
|
|
WRITE CONFIG " target => '{- $config{target} -}',"
|
|
WRITE CONFIG " version => '$(MAJOR).$(MINOR)',"
|
|
WRITE CONFIG " no_shared => '","{- $disabled{shared} -}","',"
|
|
WRITE CONFIG " INSTALLTOP => '$(INSTALLTOP)',"
|
|
WRITE CONFIG " OPENSSLDIR => '$(OPENSSLDIR)',"
|
|
WRITE CONFIG " pointersize => '","{- $target{pointersize} -}","',"
|
|
WRITE CONFIG " shared_libs => ["
|
|
{- join("\n ", map { "WRITE CONFIG \" '$_'," } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) || "\@ !" -}
|
|
WRITE CONFIG " ],"
|
|
WRITE CONFIG ");"
|
|
WRITE CONFIG "our %target = ();"
|
|
WRITE CONFIG "our %disabled = ();"
|
|
WRITE CONFIG "our %withargs = ();"
|
|
WRITE CONFIG "our %unified_info = ();"
|
|
WRITE CONFIG "1;"
|
|
CLOSE CONFIG
|
|
|
|
check_INSTALLTOP :
|
|
@ IF "$(INSTALLTOP)" .EQS. "" THEN -
|
|
WRITE SYS$ERROR "INSTALLTOP should not be empty"
|
|
@ IF "$(INSTALLTOP)" .EQS. "" THEN -
|
|
EXIT %x10000002
|
|
|
|
# Helper targets #####################################################
|
|
|
|
# Developer targets ##################################################
|
|
|
|
debug_logicals :
|
|
SH LOGICAL/PROC openssl,internal,ossl_installroot
|
|
IF "$(DESTDIR)" .EQS. "" THEN -
|
|
SH LOGICAL/PROC ossl_dataroot
|
|
|
|
# Building targets ###################################################
|
|
|
|
configdata.pm : {- join(" ", sourcefile("Configurations", "descrip.mms.tmpl"), sourcefile("Configurations", "common.tmpl")) -} $(SRCDIR)Configure $(SRCDIR)config.com {- join(" ", @{$config{build_infos}}) -}
|
|
@ WRITE SYS$OUTPUT "Detected changed: $?"
|
|
@ WRITE SYS$OUTPUT "Reconfiguring..."
|
|
perl $(SRCDIR)Configure reconf
|
|
@ WRITE SYS$OUTPUT "*************************************************"
|
|
@ WRITE SYS$OUTPUT "*** ***"
|
|
@ WRITE SYS$OUTPUT "*** Please run the same mms command again ***"
|
|
@ WRITE SYS$OUTPUT "*** ***"
|
|
@ WRITE SYS$OUTPUT "*************************************************"
|
|
@ PIPE ( EXIT %X10000000 )
|
|
|
|
{-
|
|
use File::Basename;
|
|
use File::Spec::Functions qw/abs2rel rel2abs catfile catdir/;
|
|
|
|
sub generatesrc {
|
|
my %args = @_;
|
|
my $generator = join(" ", @{$args{generator}});
|
|
|
|
if ($args{src} !~ /\.[sS]$/) {
|
|
return <<"EOF";
|
|
$args{src} : $args{generator}->[0]
|
|
\$(PERL) $generator > \$@
|
|
EOF
|
|
} else {
|
|
die "No method to generate assembler source present.\n";
|
|
}
|
|
}
|
|
|
|
sub src2obj {
|
|
my %args = @_;
|
|
my $obj = $args{obj};
|
|
my $deps = join(", -\n\t\t", @{$args{srcs}}, @{$args{deps}});
|
|
|
|
# Because VMS C isn't very good at combining a /INCLUDE path with
|
|
# #includes having a relative directory (like '#include "../foo.h"),
|
|
# the best choice is to move to the first source file's intended
|
|
# directory before compiling, and make sure to write the object file
|
|
# in the correct position (important when the object tree is other
|
|
# than the source tree).
|
|
my $forward = dirname($args{srcs}->[0]);
|
|
my $backward = abs2rel(rel2abs("."), rel2abs($forward));
|
|
my $objd = abs2rel(rel2abs(dirname($obj)), rel2abs($forward));
|
|
my $objn = basename($obj);
|
|
my $srcs =
|
|
join(", ",
|
|
map { abs2rel(rel2abs($_), rel2abs($forward)) } @{$args{srcs}});
|
|
my $incs =
|
|
"/INCLUDE=(".join(",",
|
|
map {
|
|
file_name_is_absolute($_)
|
|
? $_ : catdir($backward,$_)
|
|
} @{$args{incs}}).")";
|
|
my $before = $unified_info{before}->{$obj.".OBJ"} || "\@ !";
|
|
my $after = $unified_info{after}->{$obj.".OBJ"} || "\@ !";
|
|
my $depbuild = $disabled{makedepend} ? ""
|
|
: " /MMS=(FILE=${objd}${objn}.tmp-MMS,TARGET=$obj.OBJ)";
|
|
|
|
return <<"EOF";
|
|
$obj.OBJ : $deps
|
|
${before}
|
|
SET DEFAULT $forward
|
|
\$(CC) \$(CFLAGS)${incs}${depbuild} /OBJECT=${objd}${objn}.OBJ /REPOSITORY=$backward $srcs
|
|
SET DEFAULT $backward
|
|
${after}
|
|
\@ PIPE ( \$(PERL) -e "use File::Compare qw/compare_text/; my \$x = compare_text(""$obj.MMS"",""$obj.tmp-MMS""); exit(0x10000000 + (\$x == 0));" || -
|
|
RENAME $obj.tmp-MMS $obj.mms )
|
|
\@ IF F\$SEARCH("$obj.tmp-MMS") .NES. "" THEN DELETE $obj.tmp-MMS;*
|
|
- PURGE $obj.OBJ
|
|
EOF
|
|
}
|
|
sub libobj2shlib {
|
|
my %args = @_;
|
|
my $lib = $args{lib};
|
|
my $shlib = $args{shlib};
|
|
my $libd = dirname($lib);
|
|
my $libn = basename($lib);
|
|
(my $mkdef_key = $libn) =~ s/^${osslprefix_q}lib//i;
|
|
my @deps = map {
|
|
$disabled{shared} ? $_.".OLB"
|
|
: $unified_info{sharednames}->{$_}.".EXE"; } @{$args{deps}};
|
|
my $deps = join(", -\n\t\t", @deps);
|
|
my $shlib_target = $disabled{shared} ? "" : $target{shared_target};
|
|
my $ordinalsfile = defined($args{ordinals}) ? $args{ordinals}->[1] : "";
|
|
my $engine_opt = abs2rel(rel2abs(catfile($config{sourcedir},
|
|
"VMS", "engine.opt")),
|
|
rel2abs($config{builddir}));
|
|
my $mkdef_pl = abs2rel(rel2abs(catfile($config{sourcedir},
|
|
"util", "mkdef.pl")),
|
|
rel2abs($config{builddir}));
|
|
my $translatesyms_pl = abs2rel(rel2abs(catfile($config{sourcedir},
|
|
"VMS", "translatesyms.pl")),
|
|
rel2abs($config{builddir}));
|
|
# The "[]" hack is because in .OPT files, each line inherits the
|
|
# previous line's file spec as default, so if no directory spec
|
|
# is present in the current line and the previous line has one that
|
|
# doesn't apply, you're in for a surprise.
|
|
my $write_opt =
|
|
join("\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
|
|
$x =~ s|(\.EXE)|$1/SHARE|;
|
|
$x =~ s|(\.OLB)|$1/LIB|;
|
|
"WRITE OPT_FILE \"$x\"" } @deps)
|
|
|| "\@ !";
|
|
return <<"EOF";
|
|
$shlib.EXE : $lib.OLB $deps $ordinalsfile
|
|
IF "$mkdef_key" .EQS. "ssl" .OR. "$mkdef_key" .EQS. "crypto" THEN -
|
|
\$(PERL) $mkdef_pl "$mkdef_key" "VMS" > $shlib.SYMVEC-tmp
|
|
IF "$mkdef_key" .EQS. "ssl" .OR. "$mkdef_key" .EQS. "crypto" THEN -
|
|
\$(PERL) $translatesyms_pl \$(BUILDDIR)CXX\$DEMANGLER_DB. < $shlib.SYMVEC-tmp > $shlib.SYMVEC
|
|
OPEN/WRITE/SHARE=READ OPT_FILE $shlib.OPT
|
|
WRITE OPT_FILE "IDENTIFICATION=""V$config{version}"""
|
|
IF "$mkdef_key" .NES. "ssl" .AND. "$mkdef_key" .NES. "crypto" THEN -
|
|
TYPE $engine_opt /OUTPUT=OPT_FILE:
|
|
IF "$mkdef_key" .EQS. "ssl" .OR. "$mkdef_key" .EQS. "crypto" THEN -
|
|
TYPE $shlib.SYMVEC /OUTPUT=OPT_FILE:
|
|
WRITE OPT_FILE "$lib.OLB/LIBRARY"
|
|
$write_opt ! Comment to protect from empty line
|
|
CLOSE OPT_FILE
|
|
LINK /MAP=$shlib.MAP /FULL/SHARE=$shlib.EXE $shlib.OPT/OPT \$(EX_LIBS)
|
|
- DELETE $shlib.SYMVEC;*
|
|
- PURGE $shlib.EXE,$shlib.OPT,$shlib.MAP
|
|
EOF
|
|
}
|
|
sub obj2dso {
|
|
my %args = @_;
|
|
my $lib = $args{lib};
|
|
my $libd = dirname($lib);
|
|
my $libn = basename($lib);
|
|
(my $libn_nolib = $libn) =~ s/^lib//;
|
|
my @objs = map { "$_.OBJ" } @{$args{objs}};
|
|
my @deps = map {
|
|
$disabled{shared} ? $_.".OLB"
|
|
: $unified_info{sharednames}->{$_}.".EXE"; } @{$args{deps}};
|
|
my $deps = join(", -\n\t\t", @objs, @deps);
|
|
my $shlib_target = $disabled{shared} ? "" : $target{shared_target};
|
|
my $engine_opt = abs2rel(rel2abs(catfile($config{sourcedir},
|
|
"VMS", "engine.opt")),
|
|
rel2abs($config{builddir}));
|
|
# The "[]" hack is because in .OPT files, each line inherits the
|
|
# previous line's file spec as default, so if no directory spec
|
|
# is present in the current line and the previous line has one that
|
|
# doesn't apply, you're in for a surprise.
|
|
my $write_opt =
|
|
join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
|
|
"WRITE OPT_FILE \"$x" } @objs).
|
|
"\"\n\t".
|
|
join("\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
|
|
$x =~ s|(\.EXE)|$1/SHARE|;
|
|
$x =~ s|(\.OLB)|$1/LIB|;
|
|
"WRITE OPT_FILE \"$x\"" } @deps)
|
|
|| "\@ !";
|
|
return <<"EOF";
|
|
$lib.EXE : $deps
|
|
OPEN/WRITE/SHARE=READ OPT_FILE $lib.OPT
|
|
TYPE $engine_opt /OUTPUT=OPT_FILE:
|
|
$write_opt
|
|
CLOSE OPT_FILE
|
|
LINK /MAP=$lib.MAP /FULL/SHARE=$lib.EXE $lib.OPT/OPT \$(EX_LIBS)
|
|
- PURGE $lib.EXE,$lib.OPT,$lib.MAP
|
|
EOF
|
|
}
|
|
sub obj2lib {
|
|
my %args = @_;
|
|
my $lib = $args{lib};
|
|
my $objs = join(", -\n\t\t", map { $_.".OBJ" } (@{$args{objs}}));
|
|
my $fill_lib = join("\n\t", (map { "LIBRARY/REPLACE $lib.OLB $_.OBJ" }
|
|
@{$args{objs}}));
|
|
return <<"EOF";
|
|
$lib.OLB : $objs
|
|
LIBRARY/CREATE/OBJECT $lib
|
|
$fill_lib
|
|
- PURGE $lib.OLB
|
|
EOF
|
|
}
|
|
sub obj2bin {
|
|
my %args = @_;
|
|
my $bin = $args{bin};
|
|
my $bind = dirname($bin);
|
|
my $binn = basename($bin);
|
|
my @objs = map { "$_.OBJ" } @{$args{objs}};
|
|
my @deps = map {
|
|
$disabled{shared} ? $_.".OLB"
|
|
: $unified_info{sharednames}->{$_}.".EXE"; } @{$args{deps}};
|
|
my $deps = join(", -\n\t\t", @objs, @deps);
|
|
# The "[]" hack is because in .OPT files, each line inherits the
|
|
# previous line's file spec as default, so if no directory spec
|
|
# is present in the current line and the previous line has one that
|
|
# doesn't apply, you're in for a surprise.
|
|
my $write_opt =
|
|
join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
|
|
"WRITE OPT_FILE \"$x" } @objs).
|
|
"\"\n\t".
|
|
join("\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_;
|
|
$x =~ s|(\.EXE)|$1/SHARE|;
|
|
$x =~ s|(\.OLB)|$1/LIB|;
|
|
"WRITE OPT_FILE \"$x\"" } @deps)
|
|
|| "\@ !";
|
|
return <<"EOF";
|
|
$bin.EXE : $deps
|
|
OPEN/WRITE/SHARE=READ OPT_FILE $bin.OPT
|
|
$write_opt
|
|
CLOSE OPT_FILE
|
|
LINK/EXEC=$bin.EXE \$(LDFLAGS) $bin.OPT/OPT \$(EX_LIBS)
|
|
- PURGE $bin.EXE,$bin.OPT
|
|
EOF
|
|
}
|
|
sub in2script {
|
|
my %args = @_;
|
|
my $script = $args{script};
|
|
return "" if grep { $_ eq $script } @{$args{sources}}; # No overwrite!
|
|
my $sources = join(" ", @{$args{sources}});
|
|
my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
|
|
"util", "dofile.pl")),
|
|
rel2abs($config{builddir}));
|
|
return <<"EOF";
|
|
$script : $sources
|
|
\$(PERL) "-I\$(BUILDDIR)" "-Mconfigdata" $dofile -
|
|
"-o$target{build_file}" $sources > $script
|
|
SET FILE/PROT=(S:RWED,O:RWED,G:RE,W:RE) $script
|
|
PURGE $script
|
|
EOF
|
|
}
|
|
"" # Important! This becomes part of the template result.
|
|
-}
|