mkshared.com 13 KB

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