354 lines
11 KiB
Plaintext
354 lines
11 KiB
Plaintext
$! MKSHARED.COM -- script to created shareable images on VMS
|
|
$!
|
|
$! No command line parameters. This should be run at the start of the source
|
|
$! tree (the same directory where one finds INSTALL.VMS).
|
|
$!
|
|
$! Input: [.UTIL]LIBEAY.NUM,[.AXP.EXE.CRYPTO]LIBCRYPTO.OLB
|
|
$! [.UTIL]SSLEAY.NUM,[.AXP.EXE.SSL]LIBSSL.OLB
|
|
$! Output: [.AXP.EXE.CRYPTO]LIBCRYPTO.OPT,.MAP,.EXE
|
|
$! [.AXP.EXE.SSL]LIBSSL.OPT,.MAP,.EXE
|
|
$!
|
|
$! So far, tests have only been made on VMS for Alpha. VAX will come in time.
|
|
$! ===========================================================================
|
|
$
|
|
$! ----- Prepare info for processing: version number and file info
|
|
$ gosub read_version_info
|
|
$ if libver .eqs. ""
|
|
$ then
|
|
$ write sys$error "ERROR: Couldn't find any library version info..."
|
|
$ exit
|
|
$ endif
|
|
$
|
|
$ if f$getsyi("CPU") .ge. 128
|
|
$ then
|
|
$ libid = "Crypto"
|
|
$ libnum = "[.UTIL]LIBEAY.NUM"
|
|
$ libdir = "[.AXP.EXE.CRYPTO]"
|
|
$ libolb = "''libdir'LIBCRYPTO.OLB"
|
|
$ libopt = "''libdir'LIBCRYPTO.OPT"
|
|
$ libmap = "''libdir'LIBCRYPTO.MAP"
|
|
$ libgoal= "''libdir'LIBCRYPTO.EXE"
|
|
$ libref = ""
|
|
$ gosub create_axp_shr
|
|
$ libid = "SSL"
|
|
$ libnum = "[.UTIL]SSLEAY.NUM"
|
|
$ libdir = "[.AXP.EXE.SSL]"
|
|
$ libolb = "''libdir'LIBSSL.OLB"
|
|
$ libopt = "''libdir'LIBSSL.OPT"
|
|
$ libmap = "''libdir'LIBSSL.MAP"
|
|
$ libgoal= "''libdir'LIBSSL.EXE"
|
|
$ libref = "[.AXP.EXE.CRYPTO]LIBCRYPTO.EXE"
|
|
$ gosub create_axp_shr
|
|
$ else
|
|
$ libtit = "CRYPTO_TRANSFER_VECTOR"
|
|
$ libid = "Crypto"
|
|
$ libnum = "[.UTIL]LIBEAY.NUM"
|
|
$ libdir = "[.VAX.EXE.CRYPTO]"
|
|
$ libmar = "''libdir'LIBCRYPTO.MAR"
|
|
$ libolb = "''libdir'LIBCRYPTO.OLB"
|
|
$ libopt = "''libdir'LIBCRYPTO.OPT"
|
|
$ libobj = "''libdir'LIBCRYPTO.OBJ"
|
|
$ libmap = "''libdir'LIBCRYPTO.MAP"
|
|
$ libgoal= "''libdir'LIBCRYPTO.EXE"
|
|
$ libref = ""
|
|
$ libvec = "LIBCRYPTO"
|
|
$ gosub create_vax_shr
|
|
$ libtit = "SSL_TRANSFER_VECTOR"
|
|
$ libid = "SSL"
|
|
$ libnum = "[.UTIL]SSLEAY.NUM"
|
|
$ libdir = "[.VAX.EXE.SSL]"
|
|
$ libmar = "''libdir'LIBSSL.MAR"
|
|
$ libolb = "''libdir'LIBSSL.OLB"
|
|
$ libopt = "''libdir'LIBSSL.OPT"
|
|
$ libobj = "''libdir'LIBSSL.OBJ"
|
|
$ libmap = "''libdir'LIBSSL.MAP"
|
|
$ libgoal= "''libdir'LIBSSL.EXE"
|
|
$ libref = "[.VAX.EXE.CRYPTO]LIBCRYPTO.EXE"
|
|
$ libvec = "LIBSSL"
|
|
$ gosub create_vax_shr
|
|
$ endif
|
|
$ exit
|
|
$
|
|
$! ----- Soubroutines to actually build the shareable libraries
|
|
$! The way things work, there's a main shareable library creator for each
|
|
$! supported architecture, which is called from the main code above.
|
|
$! The creator will define a number of variables to tell the next levels of
|
|
$! subroutines what routines to use to write to the option files, call the
|
|
$! main processor, read_func_num, and when that is done, it will write version
|
|
$! data at the end of the .opt file, close it, and link the library.
|
|
$!
|
|
$! read_func_num reads through a .num file and calls the writer routine for
|
|
$! each line. It's also responsible for checking that order is properly kept
|
|
$! in the .num file, check that each line applies to VMS and the architecture,
|
|
$! and to fill in "holes" with dummy entries.
|
|
$!
|
|
$! The creator routines depend on the following variables:
|
|
$! libnum The name of the .num file to use as input
|
|
$! libolb The name of the object library to build from
|
|
$! libid The identification string of the shareable library
|
|
$! libopt The name of the .opt file to write
|
|
$! libtit The title of the assembler transfer vector file (VAX only)
|
|
$! libmar The name of the assembler transfer vector file (VAX only)
|
|
$! libmap The name of the map file to write
|
|
$! libgoal The name of the shareable library to write
|
|
$! libref The name of a shareable library to link in
|
|
$!
|
|
$! read_func_num depends on the following variables from the creator:
|
|
$! libwriter The name of the writer routine to call for each .num file line
|
|
$! -----
|
|
$
|
|
$! ----- Subroutines for AXP
|
|
$! -----
|
|
$! The creator routine
|
|
$ create_axp_shr:
|
|
$ open/write opt 'libopt'
|
|
$ write opt "identification=""",libid," ",libverstr,""""
|
|
$ write opt libolb,"/lib"
|
|
$ if libref .nes. "" then write opt libref,"/SHARE"
|
|
$ write opt "SYMBOL_VECTOR=(-"
|
|
$ libfirstentry := true
|
|
$ libwrch := opt
|
|
$ libwriter := write_axp_transfer_entry
|
|
$ textcount = 0
|
|
$ gosub read_func_num
|
|
$ write opt ")"
|
|
$ write opt "GSMATCH=",libvmatch,",",libver
|
|
$ close opt
|
|
$ link/map='libmap'/full/share='libgoal' 'libopt'/option
|
|
$ return
|
|
$
|
|
$! The record writer routine
|
|
$ write_axp_transfer_entry:
|
|
$ if libentry .eqs. ".dummy" then return
|
|
$ if info_kind .eqs. "VARIABLE"
|
|
$ then
|
|
$ pr:=DATA
|
|
$ else
|
|
$ pr:=PROCEDURE
|
|
$ endif
|
|
$ textcount_this = f$length(pr) + f$length(libentry) + 5
|
|
$ if textcount + textcount_this .gt. 1024
|
|
$ then
|
|
$ write opt ")"
|
|
$ write opt "SYMBOL_VECTOR=(-"
|
|
$ textcount = 16
|
|
$ libfirstentry := true
|
|
$ endif
|
|
$ if libfirstentry
|
|
$ then
|
|
$ write 'libwrch' " ",libentry,"=",pr," -"
|
|
$ else
|
|
$ write 'libwrch' " ,",libentry,"=",pr," -"
|
|
$ endif
|
|
$ libfirstentry := false
|
|
$ textcount = textcount + textcount_this
|
|
$ return
|
|
$
|
|
$! ----- Subroutines for AXP
|
|
$! -----
|
|
$! The creator routine
|
|
$ create_vax_shr:
|
|
$ open/write mar 'libmar'
|
|
$ type sys$input:/out=mar:
|
|
;
|
|
; Transfer vector for VAX shareable image
|
|
;
|
|
$ write mar " .TITLE ",libtit
|
|
$ write mar " .IDENT /",libid,"/"
|
|
$ type sys$input:/out=mar:
|
|
;
|
|
; Define macro to assist in building transfer vector entries. Each entry
|
|
; should take no more than 8 bytes.
|
|
;
|
|
.MACRO FTRANSFER_ENTRY routine
|
|
.ALIGN QUAD
|
|
.TRANSFER routine
|
|
.MASK routine
|
|
JMP routine+2
|
|
.ENDM FTRANSFER_ENTRY
|
|
;
|
|
; Place entries in own program section.
|
|
;
|
|
$ write mar " .PSECT $$",libvec,",QUAD,PIC,USR,CON,REL,LCL,SHR,EXE,RD,NOWRT"
|
|
$ write mar libvec,"_xfer:"
|
|
$ libwrch := mar
|
|
$ libwriter := write_vax_ftransfer_entry
|
|
$ gosub read_func_num
|
|
$ type sys$input:/out=mar:
|
|
;
|
|
; Allocate extra storage at end of vector to allow for expansion.
|
|
;
|
|
$ write mar " .BLKB 32768-<.-",libvec,"_xfer> ; 64 pages total."
|
|
$! libwriter := write_vax_vtransfer_entry
|
|
$! gosub read_func_num
|
|
$ write mar " .END"
|
|
$ close mar
|
|
$ open/write opt 'libopt'
|
|
$ write opt "identification=""",libid," ",libverstr,""""
|
|
$ write opt libobj
|
|
$ write opt libolb,"/lib"
|
|
$ if libref .nes. "" then write opt libref,"/SHARE"
|
|
$ type sys$input:/out=opt:
|
|
!
|
|
! Ensure transfer vector is at beginning of image
|
|
!
|
|
CLUSTER=FIRST
|
|
$ write opt "COLLECT=FIRST,$$",libvec
|
|
$ write opt "GSMATCH=",libvmatch,",",libver
|
|
$ type sys$input:/out=opt:
|
|
!
|
|
! make psects nonshareable so image can be installed.
|
|
!
|
|
PSECT_ATTR=$CHAR_STRING_CONSTANTS,NOWRT
|
|
$ libwrch := opt
|
|
$ libwriter := write_vax_psect_attr
|
|
$ gosub read_func_num
|
|
$ close opt
|
|
$ macro/obj='libobj' 'libmar'
|
|
$ link/map='libmap'/full/share='libgoal' 'libopt'/option
|
|
$ return
|
|
$
|
|
$! The record writer routine for VAX functions
|
|
$ write_vax_ftransfer_entry:
|
|
$ if info_kind .nes. "FUNCTION" then return
|
|
$ if libentry .eqs ".dummy"
|
|
$ then
|
|
$ write 'libwrch' " .BLKB 8" ! Dummy is zeroes...
|
|
$ else
|
|
$ write 'libwrch' " FTRANSFER_ENTRY ",libentry
|
|
$ endif
|
|
$ return
|
|
$! The record writer routine for VAX variables (should never happen!)
|
|
$ write_vax_psect_attr:
|
|
$ if info_kind .nes. "VARIABLE" then return
|
|
$ if libentry .eqs ".dummy" then return
|
|
$ write 'libwrch' "PSECT_ATTR=",libentry,",NOSHR"
|
|
$ return
|
|
$
|
|
$! ----- Common subroutines
|
|
$! -----
|
|
$! The .num file reader. This one has great responsability.
|
|
$ read_func_num:
|
|
$ open libnum 'libnum'
|
|
$ goto read_nums
|
|
$
|
|
$ read_nums:
|
|
$ libentrynum=0
|
|
$ liblastentry:=false
|
|
$ entrycount=0
|
|
$ loop:
|
|
$ read/end=loop_end/err=loop_end libnum line
|
|
$ entrynum=f$int(f$element(1," ",f$edit(line,"COMPRESS,TRIM")))
|
|
$ entryinfo=f$element(2," ",f$edit(line,"COMPRESS,TRIM"))
|
|
$ curentry=f$element(0," ",f$edit(line,"COMPRESS,TRIM"))
|
|
$ info_exist=f$element(0,":",entryinfo)
|
|
$ info_platforms=","+f$element(1,":",entryinfo)+","
|
|
$ info_kind=f$element(2,":",entryinfo)
|
|
$ info_algorithms=","+f$element(3,":",entryinfo)+","
|
|
$ if info_exist .eqs. "NOEXIST" then goto loop
|
|
$ truesum = 0
|
|
$ falsesum = 0
|
|
$ negatives = 1
|
|
$ plat_i = 0
|
|
$ loop1:
|
|
$ plat_entry = f$element(plat_i,",",info_platforms)
|
|
$ plat_i = plat_i + 1
|
|
$ if plat_entry .eqs. "" then goto loop1
|
|
$ if plat_entry .nes. ","
|
|
$ then
|
|
$ if f$extract(0,1,plat_entry) .nes. "!" then negatives = 0
|
|
$ if f$getsyi("CPU") .lt. 128
|
|
$ then
|
|
$ if plat_entry .eqs. "EXPORT_VAR_AS_FUNCTION" then -
|
|
$ truesum = truesum + 1
|
|
$ if plat_entry .eqs. "!EXPORT_VAR_AS_FUNCTION" then -
|
|
$ falsesum = falsesum + 1
|
|
$ endif
|
|
$ if plat_entry .eqs. "VMS" then truesum = truesum + 1
|
|
$ if plat_entry .eqs. "!VMS" then falsesum = falsesum + 1
|
|
$ goto loop1
|
|
$ endif
|
|
$ endloop1:
|
|
$!DEBUG!$ if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms
|
|
$!DEBUG!$ then
|
|
$!DEBUG!$ write sys$output line
|
|
$!DEBUG!$ write sys$output " truesum = ",truesum,-
|
|
$!DEBUG! ", negatives = ",negatives,", falsesum = ",falsesum
|
|
$!DEBUG!$ endif
|
|
$ if falsesum .ne. 0 then goto loop
|
|
$ if truesum+negatives .eq. 0 then goto loop
|
|
$ alg_i = 0
|
|
$ loop2:
|
|
$ alg_entry = f$element(alg_i,",",info_algorithms)
|
|
$ alg_i = alg_i + 1
|
|
$ if alg_entry .eqs. "" then goto loop2
|
|
$ if alg_entry .nes. ","
|
|
$ then
|
|
$ if alg_entry .eqs. "KRB5" then goto loop ! Special for now
|
|
$ if f$trnlnm("OPENSSL_NO_"+alg_entry) .nes. "" then goto loop
|
|
$ goto loop2
|
|
$ endif
|
|
$ endloop2:
|
|
$ if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms
|
|
$ then
|
|
$!DEBUG!$ write sys$output curentry," ; ",entrynum," ; ",entryinfo
|
|
$ endif
|
|
$ redo:
|
|
$ next:=loop
|
|
$ tolibentry=curentry
|
|
$ if libentrynum .ne. entrynum
|
|
$ then
|
|
$ entrycount=entrycount+1
|
|
$ if entrycount .lt. entrynum
|
|
$ then
|
|
$!DEBUG!$ write sys$output "Info: entrycount: ''entrycount', entrynum: ''entrynum' => 0"
|
|
$ tolibentry=".dummy"
|
|
$ next:=redo
|
|
$ endif
|
|
$ if entrycount .gt. entrynum
|
|
$ then
|
|
$ write sys$error "Decreasing library entry numbers! Can't continue"
|
|
$ write sys$error """",line,""""
|
|
$ close libnum
|
|
$ return
|
|
$ endif
|
|
$ libentry=tolibentry
|
|
$!DEBUG!$ write sys$output entrycount," ",libentry," ",entryinfo
|
|
$ if libentry .nes. "" .and. libwriter .nes. "" then gosub 'libwriter'
|
|
$ else
|
|
$ write sys$error "Info: ""''curentry'"" is an alias for ""''libentry'"". Overriding..."
|
|
$ endif
|
|
$ libentrynum=entrycount
|
|
$ goto 'next'
|
|
$ loop_end:
|
|
$ close libnum
|
|
$ return
|
|
$
|
|
$! The version number reader
|
|
$ read_version_info:
|
|
$ libver = ""
|
|
$ open/read vf [.CRYPTO]OPENSSLV.H
|
|
$ loop_rvi:
|
|
$ read/err=endloop_rvi/end=endloop_rvi vf rvi_line
|
|
$ if rvi_line - "SHLIB_VERSION_NUMBER """ .eqs. rvi_line then -
|
|
goto loop_rvi
|
|
$ libverstr = f$element(1,"""",rvi_line)
|
|
$ libvmajor = f$element(0,".",libverstr)
|
|
$ libvminor = f$element(1,".",libverstr)
|
|
$ libvedit = f$element(2,".",libverstr)
|
|
$ libvpatch = f$cvui(0,8,f$extract(1,1,libvedit)+"@")-f$cvui(0,8,"@")
|
|
$ libvedit = f$extract(0,1,libvedit)
|
|
$ libver = f$string(f$int(libvmajor)*100)+","+-
|
|
f$string(f$int(libvminor)*100+f$int(libvedit)*10+f$int(libvpatch))
|
|
$ if libvmajor .eqs. "0"
|
|
$ then
|
|
$ libvmatch = "EQUAL"
|
|
$ else
|
|
$ ! Starting with the 1.0 release, backward compatibility should be
|
|
$ ! kept, so switch over to the following
|
|
$ libvmatch = "LEQUAL"
|
|
$ endif
|
|
$ endloop_rvi:
|
|
$ close vf
|
|
$ return
|