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