1$! make libz under VMS written by 2$! Martin P.J. Zinser 3$! <zinser@zinser.no-ip.info or zinser@sysdev.deutsche-boerse.com> 4$! 5$ on error then goto err_exit 6$! 7$! 8$! Just some general constants... 9$! 10$ true = 1 11$ false = 0 12$ tmpnam = "temp_" + f$getjpi("","pid") 13$ SAY = "WRITE SYS$OUTPUT" 14$! 15$! Setup variables holding "config" information 16$! 17$ Make = "" 18$ name = "Zlib" 19$ version = "?.?.?" 20$ v_string = "ZLIB_VERSION" 21$ v_file = "zlib.h" 22$ ccopt = "" 23$ lopts = "" 24$ linkonly = false 25$ optfile = name + ".opt" 26$ its_decc = false 27$ its_vaxc = false 28$ its_gnuc = false 29$ axp = f$getsyi("HW_MODEL").ge.1024 30$ s_case = false 31$! Check for MMK/MMS 32$! 33$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" 34$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" 35$! 36$! 37$ gosub find_version 38$! 39$ gosub check_opts 40$! 41$! Look for the compiler used 42$! 43$ gosub check_compiler 44$ if its_decc 45$ then 46$ ccopt = "/prefix=all" + ccopt 47$ if f$trnlnm("SYS") .eqs. "" 48$ then 49$ if axp 50$ then 51$ define sys sys$library: 52$ else 53$ ccopt = "/decc" + ccopt 54$ define sys decc$library_include: 55$ endif 56$ endif 57$ endif 58$ if its_vaxc .or. its_gnuc 59$ then 60$ if f$trnlnm("SYS").eqs."" then define sys sys$library: 61$ endif 62$! 63$! Build the thing plain or with mms 64$! 65$ write sys$output "Compiling Zlib sources ..." 66$ if make.eqs."" 67$ then 68$ dele example.obj;*,minigzip.obj;* 69$ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - 70 adler32.c zlib.h zconf.h 71$ CALL MAKE compress.OBJ "CC ''CCOPT' compress" - 72 compress.c zlib.h zconf.h 73$ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - 74 crc32.c zlib.h zconf.h 75$ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - 76 deflate.c deflate.h zutil.h zlib.h zconf.h 77$ CALL MAKE gzio.OBJ "CC ''CCOPT' gzio" - 78 gzio.c zutil.h zlib.h zconf.h 79$ CALL MAKE infback.OBJ "CC ''CCOPT' infback" - 80 infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h 81$ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - 82 inffast.c zutil.h zlib.h zconf.h inffast.h 83$ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" - 84 inflate.c zutil.h zlib.h zconf.h infblock.h 85$ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" - 86 inftrees.c zutil.h zlib.h zconf.h inftrees.h 87$ CALL MAKE trees.OBJ "CC ''CCOPT' trees" - 88 trees.c deflate.h zutil.h zlib.h zconf.h 89$ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" - 90 uncompr.c zlib.h zconf.h 91$ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" - 92 zutil.c zutil.h zlib.h zconf.h 93$ write sys$output "Building Zlib ..." 94$ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ 95$ write sys$output "Building example..." 96$ CALL MAKE example.OBJ "CC ''CCOPT' example" - 97 example.c zlib.h zconf.h 98$ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb 99$ if f$search("x11vms:xvmsutils.olb") .nes. "" 100$ then 101$ write sys$output "Building minigzip..." 102$ CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" - 103 minigzip.c zlib.h zconf.h 104$ call make minigzip.exe - 105 "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" - 106 minigzip.obj libz.olb 107$ endif 108$ else 109$ gosub crea_mms 110$ SAY "Make ''name' ''version' with ''Make' " 111$ 'make' 112$ endif 113$! 114$! Alpha gets a shareable image 115$! 116$ If axp 117$ Then 118$ gosub crea_olist 119$ write sys$output "Creating libzshr.exe" 120$ call anal_obj_axp modules.opt _link.opt 121$ if s_case 122$ then 123$ open/append optf modules.opt 124$ write optf "case_sensitive=YES" 125$ close optf 126$ endif 127$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,_link.opt/opt 128$ endif 129$ write sys$output "Zlib build completed" 130$ exit 131$CC_ERR: 132$ write sys$output "C compiler required to build ''name'" 133$ goto err_exit 134$ERR_EXIT: 135$ set message/facil/ident/sever/text 136$ write sys$output "Exiting..." 137$ exit 2 138$! 139$! 140$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES 141$ V = 'F$Verify(0) 142$! P1 = What we are trying to make 143$! P2 = Command to make it 144$! P3 - P8 What it depends on 145$ 146$ If F$Search(P1) .Eqs. "" Then Goto Makeit 147$ Time = F$CvTime(F$File(P1,"RDT")) 148$arg=3 149$Loop: 150$ Argument = P'arg 151$ If Argument .Eqs. "" Then Goto Exit 152$ El=0 153$Loop2: 154$ File = F$Element(El," ",Argument) 155$ If File .Eqs. " " Then Goto Endl 156$ AFile = "" 157$Loop3: 158$ OFile = AFile 159$ AFile = F$Search(File) 160$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl 161$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit 162$ Goto Loop3 163$NextEL: 164$ El = El + 1 165$ Goto Loop2 166$EndL: 167$ arg=arg+1 168$ If arg .Le. 8 Then Goto Loop 169$ Goto Exit 170$ 171$Makeit: 172$ VV=F$VERIFY(0) 173$ write sys$output P2 174$ 'P2 175$ VV='F$Verify(VV) 176$Exit: 177$ If V Then Set Verify 178$ENDSUBROUTINE 179$!------------------------------------------------------------------------------ 180$! 181$! Check command line options and set symbols accordingly 182$! 183$ CHECK_OPTS: 184$ i = 1 185$ OPT_LOOP: 186$ if i .lt. 9 187$ then 188$ cparm = f$edit(p'i',"upcase") 189$ if cparm .eqs. "DEBUG" 190$ then 191$ ccopt = ccopt + "/noopt/deb" 192$ lopts = lopts + "/deb" 193$ endif 194$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) 195$ then 196$ start = f$locate("=",cparm) + 1 197$ len = f$length(cparm) - start 198$ ccopt = ccopt + f$extract(start,len,cparm) 199$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - 200 then s_case = true 201$ endif 202$ if cparm .eqs. "LINK" then linkonly = true 203$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) 204$ then 205$ start = f$locate("=",cparm) + 1 206$ len = f$length(cparm) - start 207$ lopts = lopts + f$extract(start,len,cparm) 208$ endif 209$ if f$locate("CC=",cparm) .lt. f$length(cparm) 210$ then 211$ start = f$locate("=",cparm) + 1 212$ len = f$length(cparm) - start 213$ cc_com = f$extract(start,len,cparm) 214 if (cc_com .nes. "DECC") .and. - 215 (cc_com .nes. "VAXC") .and. - 216 (cc_com .nes. "GNUC") 217$ then 218$ write sys$output "Unsupported compiler choice ''cc_com' ignored" 219$ write sys$output "Use DECC, VAXC, or GNUC instead" 220$ else 221$ if cc_com .eqs. "DECC" then its_decc = true 222$ if cc_com .eqs. "VAXC" then its_vaxc = true 223$ if cc_com .eqs. "GNUC" then its_gnuc = true 224$ endif 225$ endif 226$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) 227$ then 228$ start = f$locate("=",cparm) + 1 229$ len = f$length(cparm) - start 230$ mmks = f$extract(start,len,cparm) 231$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") 232$ then 233$ make = mmks 234$ else 235$ write sys$output "Unsupported make choice ''mmks' ignored" 236$ write sys$output "Use MMK or MMS instead" 237$ endif 238$ endif 239$ i = i + 1 240$ goto opt_loop 241$ endif 242$ return 243$!------------------------------------------------------------------------------ 244$! 245$! Look for the compiler used 246$! 247$CHECK_COMPILER: 248$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) 249$ then 250$ its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") 251$ its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "") 252$ its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "") 253$ endif 254$! 255$! Exit if no compiler available 256$! 257$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) 258$ then goto CC_ERR 259$ else 260$ if its_decc then write sys$output "CC compiler check ... Compaq C" 261$ if its_vaxc then write sys$output "CC compiler check ... VAX C" 262$ if its_gnuc then write sys$output "CC compiler check ... GNU C" 263$ endif 264$ return 265$!------------------------------------------------------------------------------ 266$! 267$! If MMS/MMK are available dump out the descrip.mms if required 268$! 269$CREA_MMS: 270$ write sys$output "Creating descrip.mms..." 271$ create descrip.mms 272$ open/append out descrip.mms 273$ copy sys$input: out 274$ deck 275# descrip.mms: MMS description file for building zlib on VMS 276# written by Martin P.J. Zinser 277# <zinser@zinser.no-ip.info or zinser@sysdev.deutsche-boerse.com> 278 279OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj, infback.obj\ 280 deflate.obj, trees.obj, zutil.obj, inflate.obj, \ 281 inftrees.obj, inffast.obj 282 283$ eod 284$ write out "CFLAGS=", ccopt 285$ write out "LOPTS=", lopts 286$ copy sys$input: out 287$ deck 288 289all : example.exe minigzip.exe libz.olb 290 @ write sys$output " Example applications available" 291 292libz.olb : libz.olb($(OBJS)) 293 @ write sys$output " libz available" 294 295example.exe : example.obj libz.olb 296 link $(LOPTS) example,libz.olb/lib 297 298minigzip.exe : minigzip.obj libz.olb 299 link $(LOPTS) minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib 300 301clean : 302 delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* 303 304 305# Other dependencies. 306adler32.obj : adler32.c zutil.h zlib.h zconf.h 307compress.obj : compress.c zlib.h zconf.h 308crc32.obj : crc32.c zutil.h zlib.h zconf.h 309deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h 310example.obj : example.c zlib.h zconf.h 311gzio.obj : gzio.c zutil.h zlib.h zconf.h 312inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h 313inflate.obj : inflate.c zutil.h zlib.h zconf.h 314inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h 315minigzip.obj : minigzip.c zlib.h zconf.h 316trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h 317uncompr.obj : uncompr.c zlib.h zconf.h 318zutil.obj : zutil.c zutil.h zlib.h zconf.h 319infback.obj : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h 320$ eod 321$ close out 322$ return 323$!------------------------------------------------------------------------------ 324$! 325$! Read list of core library sources from makefile.in and create options 326$! needed to build shareable image 327$! 328$CREA_OLIST: 329$ open/read min makefile.in 330$ open/write mod modules.opt 331$ src_check = "OBJS =" 332$MRLOOP: 333$ read/end=mrdone min rec 334$ if (f$extract(0,6,rec) .nes. src_check) then goto mrloop 335$ rec = rec - src_check 336$ gosub extra_filnam 337$ if (f$element(1,"\",rec) .eqs. "\") then goto mrdone 338$MRSLOOP: 339$ read/end=mrdone min rec 340$ gosub extra_filnam 341$ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop 342$MRDONE: 343$ close min 344$ close mod 345$ return 346$!------------------------------------------------------------------------------ 347$! 348$! Take record extracted in crea_olist and split it into single filenames 349$! 350$EXTRA_FILNAM: 351$ myrec = f$edit(rec - "\", "trim,compress") 352$ i = 0 353$FELOOP: 354$ srcfil = f$element(i," ", myrec) 355$ if (srcfil .nes. " ") 356$ then 357$ write mod f$parse(srcfil,,,"NAME"), ".obj" 358$ i = i + 1 359$ goto feloop 360$ endif 361$ return 362$!------------------------------------------------------------------------------ 363$! 364$! Find current Zlib version number 365$! 366$FIND_VERSION: 367$ open/read h_in 'v_file' 368$hloop: 369$ read/end=hdone h_in rec 370$ rec = f$edit(rec,"TRIM") 371$ if (f$extract(0,1,rec) .nes. "#") then goto hloop 372$ rec = f$edit(rec - "#", "TRIM") 373$ if f$element(0," ",rec) .nes. "define" then goto hloop 374$ if f$element(1," ",rec) .eqs. v_string 375$ then 376$ version = 'f$element(2," ",rec)' 377$ goto hdone 378$ endif 379$ goto hloop 380$hdone: 381$ close h_in 382$ return 383$!------------------------------------------------------------------------------ 384$! 385$! Analyze Object files for OpenVMS AXP to extract Procedure and Data 386$! information to build a symbol vector for a shareable image 387$! All the "brains" of this logic was suggested by Hartmut Becker 388$! (Hartmut.Becker@compaq.com). All the bugs were introduced by me 389$! (zinser@decus.de), so if you do have problem reports please do not 390$! bother Hartmut/HP, but get in touch with me 391$! 392$ ANAL_OBJ_AXP: Subroutine 393$ V = 'F$Verify(0) 394$ SAY := "WRITE_ SYS$OUTPUT" 395$ 396$ IF F$SEARCH("''P1'") .EQS. "" 397$ THEN 398$ SAY "ANAL_OBJ_AXP-E-NOSUCHFILE: Error, inputfile ''p1' not available" 399$ goto exit_aa 400$ ENDIF 401$ IF "''P2'" .EQS. "" 402$ THEN 403$ SAY "ANAL_OBJ_AXP: Error, no output file provided" 404$ goto exit_aa 405$ ENDIF 406$ 407$ open/read in 'p1 408$ create a.tmp 409$ open/append atmp a.tmp 410$ loop: 411$ read/end=end_loop in line 412$ f= f$search(line) 413$ if f .eqs. "" 414$ then 415$ write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" 416$ goto loop 417$ endif 418$ define/user sys$output nl: 419$ define/user sys$error nl: 420$ anal/obj/gsd 'f /out=x.tmp 421$ open/read xtmp x.tmp 422$ XLOOP: 423$ read/end=end_xloop xtmp xline 424$ xline = f$edit(xline,"compress") 425$ write atmp xline 426$ goto xloop 427$ END_XLOOP: 428$ close xtmp 429$ goto loop 430$ end_loop: 431$ close in 432$ close atmp 433$ if f$search("a.tmp") .eqs. "" - 434 then $ exit 435$ ! all global definitions 436$ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp 437$ ! all procedures 438$ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp 439$ search c.tmp "symbol:"/out=d.tmp 440$ define/user sys$output nl: 441$ edito/edt/command=sys$input d.tmp 442sub/symbol: "/symbol_vector=(/whole 443sub/"/=PROCEDURE)/whole 444exit 445$ ! all data 446$ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp 447$ search e.tmp "symbol:"/out=f.tmp 448$ define/user sys$output nl: 449$ edito/edt/command=sys$input f.tmp 450sub/symbol: "/symbol_vector=(/whole 451sub/"/=DATA)/whole 452exit 453$ sort/nodupl d.tmp,f.tmp 'p2' 454$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;* 455$ if f$search("x.tmp") .nes. "" - 456 then $ delete x.tmp;* 457$! 458$ EXIT_AA: 459$ if V then set verify 460$ endsubroutine 461$!------------------------------------------------------------------------------ 462