PR: 2100
[openssl.git] / VMS / mkshared.com
1 $! MKSHARED.COM -- script to created shareable images on VMS
2 $!
3 $! No command line parameters.  This should be run at the start of the source
4 $! tree (the same directory where one finds INSTALL.VMS).
5 $!
6 $! Input:       [.UTIL]LIBEAY.NUM,[.xxx.EXE.CRYPTO]LIBCRYPTO.OLB
7 $!              [.UTIL]SSLEAY.NUM,[.xxx.EXE.SSL]LIBSSL.OLB
8 $! Output:      [.xxx.EXE.CRYPTO]LIBCRYPTO.OPT,.MAP,.EXE
9 $!              [.xxx.EXE.SSL]LIBSSL.OPT,.MAP,.EXE
10 $!
11 $! So far, tests have only been made on VMS for Alpha.  VAX will come in time.
12 $! ===========================================================================
13 $
14 $! ----- Prepare info for processing: version number and file info
15 $ gosub read_version_info
16 $ if libver .eqs. ""
17 $ then
18 $   write sys$error "ERROR: Couldn't find any library version info..."
19 $   exit
20 $ endif
21 $
22 $ if (f$getsyi("cpu").lt.128)
23 $ then
24 $     arch := VAX
25 $ else
26 $     arch = f$edit( f$getsyi( "ARCH_NAME"), "UPCASE")
27 $     if (arch .eqs. "") then arch = "UNK"
28 $ endif
29 $
30 $ if arch .nes. "VAX"
31 $ then
32 $   arch_vax = 0
33 $   libid  = "Crypto"
34 $   libnum = "[.UTIL]LIBEAY.NUM"
35 $   libdir = "[.''ARCH'.EXE.CRYPTO]"
36 $   libolb = "''libdir'LIBCRYPTO.OLB"
37 $   libopt = "''libdir'LIBCRYPTO.OPT"
38 $   libmap = "''libdir'LIBCRYPTO.MAP"
39 $   libgoal= "''libdir'LIBCRYPTO.EXE"
40 $   libref = ""
41 $   gosub create_nonvax_shr
42 $   libid  = "SSL"
43 $   libnum = "[.UTIL]SSLEAY.NUM"
44 $   libdir = "[.''ARCH'.EXE.SSL]"
45 $   libolb = "''libdir'LIBSSL.OLB"
46 $   libopt = "''libdir'LIBSSL.OPT"
47 $   libmap = "''libdir'LIBSSL.MAP"
48 $   libgoal= "''libdir'LIBSSL.EXE"
49 $   libref = "[.''ARCH'.EXE.CRYPTO]LIBCRYPTO.EXE"
50 $   gosub create_nonvax_shr
51 $ else
52 $   arch_vax = 1
53 $   libtit = "CRYPTO_TRANSFER_VECTOR"
54 $   libid  = "Crypto"
55 $   libnum = "[.UTIL]LIBEAY.NUM"
56 $   libdir = "[.''ARCH'.EXE.CRYPTO]"
57 $   libmar = "''libdir'LIBCRYPTO.MAR"
58 $   libolb = "''libdir'LIBCRYPTO.OLB"
59 $   libopt = "''libdir'LIBCRYPTO.OPT"
60 $   libobj = "''libdir'LIBCRYPTO.OBJ"
61 $   libmap = "''libdir'LIBCRYPTO.MAP"
62 $   libgoal= "''libdir'LIBCRYPTO.EXE"
63 $   libref = ""
64 $   libvec = "LIBCRYPTO"
65 $   gosub create_vax_shr
66 $   libtit = "SSL_TRANSFER_VECTOR"
67 $   libid  = "SSL"
68 $   libnum = "[.UTIL]SSLEAY.NUM"
69 $   libdir = "[.''ARCH'.EXE.SSL]"
70 $   libmar = "''libdir'LIBSSL.MAR"
71 $   libolb = "''libdir'LIBSSL.OLB"
72 $   libopt = "''libdir'LIBSSL.OPT"
73 $   libobj = "''libdir'LIBSSL.OBJ"
74 $   libmap = "''libdir'LIBSSL.MAP"
75 $   libgoal= "''libdir'LIBSSL.EXE"
76 $   libref = "[.''ARCH'.EXE.CRYPTO]LIBCRYPTO.EXE"
77 $   libvec = "LIBSSL"
78 $   gosub create_vax_shr
79 $ endif
80 $ exit
81 $
82 $! ----- Soubroutines to build the shareable libraries
83 $! For each supported architecture, there's a main shareable library
84 $! creator, which is called from the main code above.
85 $! The creator will define a number of variables to tell the next levels of
86 $! subroutines what routines to use to write to the option files, call the
87 $! main processor, read_func_num, and when that is done, it will write version
88 $! data at the end of the .opt file, close it, and link the library.
89 $!
90 $! read_func_num reads through a .num file and calls the writer routine for
91 $! each line.  It's also responsible for checking that order is properly kept
92 $! in the .num file, check that each line applies to VMS and the architecture,
93 $! and to fill in "holes" with dummy entries.
94 $!
95 $! The creator routines depend on the following variables:
96 $! libnum       The name of the .num file to use as input
97 $! libolb       The name of the object library to build from
98 $! libid        The identification string of the shareable library
99 $! libopt       The name of the .opt file to write
100 $! libtit       The title of the assembler transfer vector file (VAX only)
101 $! libmar       The name of the assembler transfer vector file (VAX only)
102 $! libmap       The name of the map file to write
103 $! libgoal      The name of the shareable library to write
104 $! libref       The name of a shareable library to link in
105 $!
106 $! read_func_num depends on the following variables from the creator:
107 $! libwriter    The name of the writer routine to call for each .num file line
108 $! -----
109 $
110 $! ----- Subroutines for non-VAX
111 $! -----
112 $! The creator routine
113 $ create_nonvax_shr:
114 $   open/write opt 'libopt'
115 $   write opt "identification=""",libid," ",libverstr,""""
116 $   write opt libolb,"/lib"
117 $   if libref .nes. "" then write opt libref,"/SHARE"
118 $   write opt "SYMBOL_VECTOR=(-"
119 $   libfirstentry := true
120 $   libwrch   := opt
121 $   libwriter := write_nonvax_transfer_entry
122 $   textcount = 0
123 $   gosub read_func_num
124 $   write opt ")"
125 $   write opt "GSMATCH=",libvmatch,",",libver
126 $   close opt
127 $   link/map='libmap'/full/share='libgoal' 'libopt'/option
128 $   return
129 $
130 $! The record writer routine
131 $ write_nonvax_transfer_entry:
132 $   if libentry .eqs. ".dummy" then return
133 $   if info_kind .eqs. "VARIABLE"
134 $   then
135 $     pr:=DATA
136 $   else
137 $     pr:=PROCEDURE
138 $   endif
139 $   textcount_this = f$length(pr) + f$length(libentry) + 5
140 $   if textcount + textcount_this .gt. 1024
141 $   then
142 $     write opt ")"
143 $     write opt "SYMBOL_VECTOR=(-"
144 $     textcount = 16
145 $     libfirstentry := true
146 $   endif
147 $   if libfirstentry
148 $   then
149 $     write 'libwrch' "    ",libentry,"=",pr," -"
150 $   else
151 $     write 'libwrch' "    ,",libentry,"=",pr," -"
152 $   endif
153 $   libfirstentry := false
154 $   textcount = textcount + textcount_this
155 $   return
156 $
157 $! ----- Subroutines for VAX
158 $! -----
159 $! The creator routine
160 $ create_vax_shr:
161 $   open/write mar 'libmar'
162 $   type sys$input:/out=mar:
163 ;
164 ; Transfer vector for VAX shareable image
165 ;
166 $   write mar " .TITLE ",libtit
167 $   write mar " .IDENT /",libid,"/"
168 $   type sys$input:/out=mar:
169 ;
170 ; Define macro to assist in building transfer vector entries.  Each entry
171 ; should take no more than 8 bytes.
172 ;
173         .MACRO FTRANSFER_ENTRY routine
174         .ALIGN QUAD
175         .TRANSFER routine
176         .MASK   routine
177         JMP     routine+2
178         .ENDM FTRANSFER_ENTRY
179 ;
180 ; Place entries in own program section.
181 ;
182 $   write mar " .PSECT $$",libvec,",QUAD,PIC,USR,CON,REL,LCL,SHR,EXE,RD,NOWRT"
183 $   write mar libvec,"_xfer:"
184 $   libwrch   := mar
185 $   libwriter := write_vax_ftransfer_entry
186 $   gosub read_func_num
187 $   type sys$input:/out=mar:
188 ;
189 ; Allocate extra storage at end of vector to allow for expansion.
190 ;
191 $   write mar " .BLKB 32768-<.-",libvec,"_xfer> ; 64 pages total."
192 $!   libwriter := write_vax_vtransfer_entry
193 $!   gosub read_func_num
194 $   write mar " .END"
195 $   close mar
196 $   open/write opt 'libopt'
197 $   write opt "identification=""",libid," ",libverstr,""""
198 $   write opt libobj
199 $   write opt libolb,"/lib"
200 $   if libref .nes. "" then write opt libref,"/SHARE"
201 $   type sys$input:/out=opt:
202 !
203 ! Ensure transfer vector is at beginning of image
204 !
205 CLUSTER=FIRST
206 $   write opt "COLLECT=FIRST,$$",libvec
207 $   write opt "GSMATCH=",libvmatch,",",libver
208 $   type sys$input:/out=opt:
209 !
210 ! make psects nonshareable so image can be installed.
211 !
212 PSECT_ATTR=$CHAR_STRING_CONSTANTS,NOWRT
213 $   libwrch   := opt
214 $   libwriter := write_vax_psect_attr
215 $   gosub read_func_num
216 $   close opt
217 $   macro/obj='libobj' 'libmar'
218 $   link/map='libmap'/full/share='libgoal' 'libopt'/option
219 $   return
220 $
221 $! The record writer routine for VAX functions
222 $ write_vax_ftransfer_entry:
223 $   if info_kind .nes. "FUNCTION" then return
224 $   if libentry .eqs ".dummy"
225 $   then
226 $     write 'libwrch' " .BLKB 8" ! Dummy is zeroes...
227 $   else
228 $     write 'libwrch' " FTRANSFER_ENTRY ",libentry
229 $   endif
230 $   return
231 $! The record writer routine for VAX variables (should never happen!)
232 $ write_vax_psect_attr:
233 $   if info_kind .nes. "VARIABLE" then return
234 $   if libentry .eqs ".dummy" then return
235 $   write 'libwrch' "PSECT_ATTR=",libentry,",NOSHR"
236 $   return
237 $
238 $! ----- Common subroutines
239 $! -----
240 $! The .num file reader.  This one has great responsability.
241 $ read_func_num:
242 $   open libnum 'libnum'
243 $   goto read_nums
244 $
245 $ read_nums:
246 $   libentrynum=0
247 $   liblastentry:=false
248 $   entrycount=0
249 $   loop:
250 $     read/end=loop_end/err=loop_end libnum line
251 $     entrynum=f$int(f$element(1," ",f$edit(line,"COMPRESS,TRIM")))
252 $     entryinfo=f$element(2," ",f$edit(line,"COMPRESS,TRIM"))
253 $     curentry=f$element(0," ",f$edit(line,"COMPRESS,TRIM"))
254 $     info_exist=f$element(0,":",entryinfo)
255 $     info_platforms=","+f$element(1,":",entryinfo)+","
256 $     info_kind=f$element(2,":",entryinfo)
257 $     info_algorithms=","+f$element(3,":",entryinfo)+","
258 $     if info_exist .eqs. "NOEXIST" then goto loop
259 $     truesum = 0
260 $     falsesum = 0
261 $     negatives = 1
262 $     plat_i = 0
263 $     loop1:
264 $       plat_entry = f$element(plat_i,",",info_platforms)
265 $       plat_i = plat_i + 1
266 $       if plat_entry .eqs. "" then goto loop1
267 $       if plat_entry .nes. ","
268 $       then
269 $         if f$extract(0,1,plat_entry) .nes. "!" then negatives = 0
270 $         if f$getsyi("CPU") .lt. 128
271 $         then
272 $           if plat_entry .eqs. "EXPORT_VAR_AS_FUNCTION" then -
273 $             truesum = truesum + 1
274 $           if plat_entry .eqs. "!EXPORT_VAR_AS_FUNCTION" then -
275 $             falsesum = falsesum + 1
276 $         endif
277 $!
278 $         if ((plat_entry .eqs. "VMS") .or. -
279             (arch_vax .and. (plat_entry .eqs. "VMSVAX"))) then -
280             truesum = truesum + 1
281 $!
282 $         if ((plat_entry .eqs. "!VMS") .or. -
283             (arch_vax .and. (plat_entry .eqs. "!VMSVAX"))) then -
284             falsesum = falsesum + 1
285 $!
286 $         goto loop1
287 $       endif
288 $     endloop1:
289 $!DEBUG!$     if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms
290 $!DEBUG!$     then
291 $!DEBUG!$       write sys$output line
292 $!DEBUG!$       write sys$output "        truesum = ",truesum,-
293 $!DEBUG!                ", negatives = ",negatives,", falsesum = ",falsesum
294 $!DEBUG!$     endif
295 $     if falsesum .ne. 0 then goto loop
296 $     if truesum+negatives .eq. 0 then goto loop
297 $     alg_i = 0
298 $     loop2:
299 $       alg_entry = f$element(alg_i,",",info_algorithms)
300 $       alg_i = alg_i + 1
301 $       if alg_entry .eqs. "" then goto loop2
302 $       if alg_entry .nes. ","
303 $       then
304 $         if alg_entry .eqs. "KRB5" then goto loop ! Special for now
305 $         if alg_entry .eqs. "STATIC_ENGINE" then goto loop ! Special for now
306 $         if f$trnlnm("OPENSSL_NO_"+alg_entry) .nes. "" then goto loop
307 $         goto loop2
308 $       endif
309 $     endloop2:
310 $     if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms
311 $     then
312 $!DEBUG!$     write sys$output curentry," ; ",entrynum," ; ",entryinfo
313 $     endif
314 $   redo:
315 $     next:=loop
316 $     tolibentry=curentry
317 $     if libentrynum .ne. entrynum
318 $     then
319 $       entrycount=entrycount+1
320 $       if entrycount .lt. entrynum
321 $       then
322 $!DEBUG!$         write sys$output "Info: entrycount: ''entrycount', entrynum: ''entrynum' => 0"
323 $         tolibentry=".dummy"
324 $         next:=redo
325 $       endif
326 $       if entrycount .gt. entrynum
327 $       then
328 $         write sys$error "Decreasing library entry numbers!  Can't continue"
329 $         write sys$error """",line,""""
330 $         close libnum
331 $         return
332 $       endif
333 $       libentry=tolibentry
334 $!DEBUG!$       write sys$output entrycount," ",libentry," ",entryinfo
335 $       if libentry .nes. "" .and. libwriter .nes. "" then gosub 'libwriter'
336 $     else
337 $       write sys$error "Info: ""''curentry'"" is an alias for ""''libentry'"".  Overriding..."
338 $     endif
339 $     libentrynum=entrycount
340 $     goto 'next'
341 $   loop_end:
342 $   close libnum
343 $   return
344 $
345 $! The version number reader
346 $ read_version_info:
347 $   libver = ""
348 $   open/read vf [.CRYPTO]OPENSSLV.H
349 $   loop_rvi:
350 $     read/err=endloop_rvi/end=endloop_rvi vf rvi_line
351 $     if rvi_line - "SHLIB_VERSION_NUMBER """ .eqs. rvi_line then -
352         goto loop_rvi
353 $     libverstr = f$element(1,"""",rvi_line)
354 $     libvmajor = f$element(0,".",libverstr)
355 $     libvminor = f$element(1,".",libverstr)
356 $     libvedit = f$element(2,".",libverstr)
357 $     libvpatch = f$cvui(0,8,f$extract(1,1,libvedit)+"@")-f$cvui(0,8,"@")
358 $     libvedit = f$extract(0,1,libvedit)
359 $     libver = f$string(f$int(libvmajor)*100)+","+-
360         f$string(f$int(libvminor)*100+f$int(libvedit)*10+f$int(libvpatch))
361 $     if libvmajor .eqs. "0"
362 $     then
363 $       libvmatch = "EQUAL"
364 $     else
365 $       ! Starting with the 1.0 release, backward compatibility should be
366 $       ! kept, so switch over to the following
367 $       libvmatch = "LEQUAL"
368 $     endif
369 $   endloop_rvi:
370 $   close vf
371 $   return