1$! 2$! FIPS-LIB.COM 3$! Written By: Robert Byer 4$! Vice-President 5$! A-Com Computing, Inc. 6$! byer@mail.all-net.net 7$! 8$! Changes by Richard Levitte <richard@levitte.org> 9$! 10$! This command files compiles and creates the FIPS parts of the 11$! "[.xxx.EXE.CRYPTO]LIBCRYPTO.OLB" library for OpenSSL. The "xxx" 12$! denotes the machine architecture of AXP or VAX. 13$! 14$! It was re-written so it would try to determine what "C" compiler to use 15$! or you can specify which "C" compiler to use. 16$! 17$! Specify the following as P1 to build just that part or ALL to just 18$! build everything. 19$! 20$! LIBRARY To just compile the [.xxx.EXE.CRYPTO]LIBCRYPTO.OLB Library. 21$! APPS To just compile the [.xxx.EXE.CRYPTO]*.EXE 22$! ALL To do both LIBRARY and APPS 23$! 24$! Specify DEBUG or NODEBUG as P2 to compile with or without debugger 25$! information. 26$! 27$! Specify which compiler at P3 to try to compile under. 28$! 29$! VAXC For VAX C. 30$! DECC For DEC C. 31$! GNUC For GNU C. 32$! 33$! If you don't speficy a compiler, it will try to determine which 34$! "C" compiler to use. 35$! 36$! P4, if defined, sets a TCP/IP library to use, through one of the following 37$! keywords: 38$! 39$! UCX for UCX 40$! TCPIP for TCPIP (post UCX) 41$! SOCKETSHR for SOCKETSHR+NETLIB 42$! 43$! P5, if defined, sets a compiler thread NOT needed on OpenVMS 7.1 (and up) 44$! 45$! P6, if defined, sets a choice of crypto methods to compile. 46$! WARNING: this should only be done to recompile some part of an already 47$! fully compiled library. 48$! 49$! 50$! Define A TCP/IP Library That We Will Need To Link To. 51$! (That Is, If We Need To Link To One.) 52$! 53$ TCPIP_LIB = "" 54$! 55$! Check Which Architecture We Are Using. 56$! 57$ IF (F$GETSYI("CPU").GE.128) 58$ THEN 59$! 60$! The Architecture Is AXP 61$! 62$ ARCH := AXP 63$! 64$! Else... 65$! 66$ ELSE 67$! 68$! The Architecture Is VAX. 69$! 70$ ARCH := VAX 71$! 72$! End The Architecture Check. 73$! 74$ ENDIF 75$! 76$! Define The Different Encryption Types. 77$! 78$ ENCRYPT_TYPES = "Basic,SHA1,RAND,DES,AES,DSA,RSA,DH" 79$! 80$! Check To Make Sure We Have Valid Command Line Parameters. 81$! 82$ GOSUB CHECK_OPTIONS 83$! 84$! Initialise logical names and such 85$! 86$ GOSUB INITIALISE 87$! 88$! Tell The User What Kind of Machine We Run On. 89$! 90$ WRITE SYS$OUTPUT "Compiling On A ",ARCH," Machine." 91$! 92$! Define The OBJ Directory. 93$! 94$ OBJ_DIR := SYS$DISK:[-.'ARCH'.OBJ.CRYPTO] 95$! 96$! Check To See If The Architecture Specific OBJ Directory Exists. 97$! 98$ IF (F$PARSE(OBJ_DIR).EQS."") 99$ THEN 100$! 101$! It Dosen't Exist, So Create It. 102$! 103$ CREATE/DIR 'OBJ_DIR' 104$! 105$! End The Architecture Specific OBJ Directory Check. 106$! 107$ ENDIF 108$! 109$! Define The EXE Directory. 110$! 111$ EXE_DIR := SYS$DISK:[-.'ARCH'.EXE.CRYPTO] 112$! 113$! Check To See If The Architecture Specific Directory Exists. 114$! 115$ IF (F$PARSE(EXE_DIR).EQS."") 116$ THEN 117$! 118$! It Dosen't Exist, So Create It. 119$! 120$ CREATE/DIRECTORY 'EXE_DIR' 121$! 122$! End The Architecture Specific Directory Check. 123$! 124$ ENDIF 125$! 126$! Define The Library Name. 127$! 128$ LIB_NAME := 'EXE_DIR'LIBCRYPTO.OLB 129$! 130$! Define The CRYPTO-LIB We Are To Use. 131$! 132$ CRYPTO_LIB := 'EXE_DIR'LIBCRYPTO.OLB 133$! 134$! Check To See If We Already Have A "[.xxx.EXE.CRYPTO]LIBCRYPTO.OLB" Library... 135$! 136$ IF (F$SEARCH(LIB_NAME).EQS."") 137$ THEN 138$! 139$! Guess Not, Create The Library. 140$! 141$ LIBRARY/CREATE/OBJECT 'LIB_NAME' 142$! 143$! End The Library Check. 144$! 145$ ENDIF 146$! 147$! Build our options file for the application 148$! 149$ GOSUB CHECK_OPT_FILE 150$! 151$! Define The Different Encryption "library" Strings. 152$! 153$ LIB_ = "fips,fips_err_wrapper" 154$ LIB_SHA1 = "fips_sha1dgst,fips_sha1_selftest" 155$ LIB_RAND = "fips_rand" 156$ LIB_DES = "fips_des_enc,fips_des_selftest,fips_set_key" 157$ LIB_AES = "fips_aes_core,fips_aes_selftest" 158$ LIB_DSA = "fips_dsa_ossl,fips_dsa_gen,fips_dsa_selftest" 159$ LIB_RSA = "fips_rsa_eay,fips_rsa_gen,fips_rsa_selftest" 160$ LIB_DH = "fips_dh_check,fips_dh_gen,fips_dh_key" 161$! 162$! Setup exceptional compilations 163$! 164$ COMPILEWITH_CC3 = ",bss_rtcp," 165$ COMPILEWITH_CC4 = ",a_utctm,bss_log,o_time," 166$ COMPILEWITH_CC5 = ",md2_dgst,md4_dgst,md5_dgst,mdc2dgst," + - 167 "sha_dgst,sha1dgst,rmd_dgst,bf_enc," 168$! 169$! Figure Out What Other Modules We Are To Build. 170$! 171$ BUILD_SET: 172$! 173$! Define A Module Counter. 174$! 175$ MODULE_COUNTER = 0 176$! 177$! Top Of The Loop. 178$! 179$ MODULE_NEXT: 180$! 181$! Extract The Module Name From The Encryption List. 182$! 183$ MODULE_NAME = F$ELEMENT(MODULE_COUNTER,",",ENCRYPT_TYPES) 184$ IF MODULE_NAME.EQS."Basic" THEN MODULE_NAME = "" 185$ MODULE_NAME1 = MODULE_NAME 186$! 187$! Check To See If We Are At The End Of The Module List. 188$! 189$ IF (MODULE_NAME.EQS.",") 190$ THEN 191$! 192$! We Are At The End Of The Module List, Go To MODULE_DONE. 193$! 194$ GOTO MODULE_DONE 195$! 196$! End The Module List Check. 197$! 198$ ENDIF 199$! 200$! Increment The Moudle Counter. 201$! 202$ MODULE_COUNTER = MODULE_COUNTER + 1 203$! 204$! Create The Library and Apps Module Names. 205$! 206$ LIB_MODULE = "LIB_" + MODULE_NAME 207$ APPS_MODULE = "APPS_" + MODULE_NAME 208$ IF (MODULE_NAME.EQS."ASN1_2") 209$ THEN 210$ MODULE_NAME = "ASN1" 211$ ENDIF 212$ IF (MODULE_NAME.EQS."EVP_2") 213$ THEN 214$ MODULE_NAME = "EVP" 215$ ENDIF 216$! 217$! Set state (can be LIB and APPS) 218$! 219$ STATE = "LIB" 220$ IF BUILDALL .EQS. "APPS" THEN STATE = "APPS" 221$! 222$! Check if the library module name actually is defined 223$! 224$ IF F$TYPE('LIB_MODULE') .EQS. "" 225$ THEN 226$ WRITE SYS$ERROR "" 227$ WRITE SYS$ERROR "The module ",MODULE_NAME," does not exist. Continuing..." 228$ WRITE SYS$ERROR "" 229$ GOTO MODULE_NEXT 230$ ENDIF 231$! 232$! Top Of The Module Loop. 233$! 234$ MODULE_AGAIN: 235$! 236$! Tell The User What Module We Are Building. 237$! 238$ IF (MODULE_NAME1.NES."") 239$ THEN 240$ IF STATE .EQS. "LIB" 241$ THEN 242$ WRITE SYS$OUTPUT "Compiling The ",MODULE_NAME1," Library Files. (",BUILDALL,",",STATE,")" 243$ ELSE IF F$TYPE('APPS_MODULE') .NES. "" 244$ THEN 245$ WRITE SYS$OUTPUT "Compiling The ",MODULE_NAME1," Applications. (",BUILDALL,",",STATE,")" 246$ ENDIF 247$ ENDIF 248$ ENDIF 249$! 250$! Define A File Counter And Set It To "0". 251$! 252$ FILE_COUNTER = 0 253$ APPLICATION = "" 254$ APPLICATION_COUNTER = 0 255$! 256$! Top Of The File Loop. 257$! 258$ NEXT_FILE: 259$! 260$! Look in the LIB_MODULE is we're in state LIB 261$! 262$ IF STATE .EQS. "LIB" 263$ THEN 264$! 265$! O.K, Extract The File Name From The File List. 266$! 267$ FILE_NAME = F$ELEMENT(FILE_COUNTER,",",'LIB_MODULE') 268$! 269$! else 270$! 271$ ELSE 272$ FILE_NAME = "," 273$! 274$ IF F$TYPE('APPS_MODULE') .NES. "" 275$ THEN 276$! 277$! Extract The File Name From The File List. 278$! This part is a bit more complicated. 279$! 280$ IF APPLICATION .EQS. "" 281$ THEN 282$ APPLICATION = F$ELEMENT(APPLICATION_COUNTER,";",'APPS_MODULE') 283$ APPLICATION_COUNTER = APPLICATION_COUNTER + 1 284$ APPLICATION_OBJECTS = F$ELEMENT(1,"/",APPLICATION) 285$ APPLICATION = F$ELEMENT(0,"/",APPLICATION) 286$ FILE_COUNTER = 0 287$ ENDIF 288$ 289$! WRITE SYS$OUTPUT "DEBUG: SHOW SYMBOL APPLICATION*" 290$! SHOW SYMBOL APPLICATION* 291$! 292$ IF APPLICATION .NES. ";" 293$ THEN 294$ FILE_NAME = F$ELEMENT(FILE_COUNTER,",",APPLICATION_OBJECTS) 295$ IF FILE_NAME .EQS. "," 296$ THEN 297$ APPLICATION = "" 298$ GOTO NEXT_FILE 299$ ENDIF 300$ ENDIF 301$ ENDIF 302$ ENDIF 303$! 304$! Check To See If We Are At The End Of The File List. 305$! 306$ IF (FILE_NAME.EQS.",") 307$ THEN 308$! 309$! We Are At The End Of The File List, Change State Or Goto FILE_DONE. 310$! 311$ IF STATE .EQS. "LIB" .AND. BUILDALL .NES. "LIBRARY" 312$ THEN 313$ STATE = "APPS" 314$ GOTO MODULE_AGAIN 315$ ELSE 316$ GOTO FILE_DONE 317$ ENDIF 318$! 319$! End The File List Check. 320$! 321$ ENDIF 322$! 323$! Increment The Counter. 324$! 325$ FILE_COUNTER = FILE_COUNTER + 1 326$! 327$! Create The Source File Name. 328$! 329$ TMP_FILE_NAME = F$ELEMENT(1,"]",FILE_NAME) 330$ IF TMP_FILE_NAME .EQS. "]" THEN TMP_FILE_NAME = FILE_NAME 331$ IF F$ELEMENT(0,".",TMP_FILE_NAME) .EQS. TMP_FILE_NAME THEN - 332 FILE_NAME = FILE_NAME + ".c" 333$ IF (MODULE_NAME.NES."") 334$ THEN 335$ SOURCE_FILE = "SYS$DISK:[." + MODULE_NAME+ "]" + FILE_NAME 336$ ELSE 337$ SOURCE_FILE = "SYS$DISK:[]" + FILE_NAME 338$ ENDIF 339$ SOURCE_FILE = SOURCE_FILE - "][" 340$! 341$! Create The Object File Name. 342$! 343$ OBJECT_FILE = OBJ_DIR + F$PARSE(FILE_NAME,,,"NAME","SYNTAX_ONLY") + ".OBJ" 344$ ON WARNING THEN GOTO NEXT_FILE 345$! 346$! Check To See If The File We Want To Compile Is Actually There. 347$! 348$ IF (F$SEARCH(SOURCE_FILE).EQS."") 349$ THEN 350$! 351$! Tell The User That The File Doesn't Exist. 352$! 353$ WRITE SYS$OUTPUT "" 354$ WRITE SYS$OUTPUT "The File ",SOURCE_FILE," Doesn't Exist." 355$ WRITE SYS$OUTPUT "" 356$! 357$! Exit The Build. 358$! 359$ GOTO EXIT 360$! 361$! End The File Exist Check. 362$! 363$ ENDIF 364$! 365$! Tell The User We Are Compiling The File. 366$! 367$ IF (MODULE_NAME.EQS."") 368$ THEN 369$ WRITE SYS$OUTPUT "Compiling The ",FILE_NAME," File. (",BUILDALL,",",STATE,")" 370$ ENDIF 371$ IF (MODULE_NAME.NES."") 372$ THEN 373$ WRITE SYS$OUTPUT " ",FILE_NAME,"" 374$ ENDIF 375$! 376$! Compile The File. 377$! 378$ ON ERROR THEN GOTO NEXT_FILE 379$ FILE_NAME0 = F$ELEMENT(0,".",FILE_NAME) 380$ IF FILE_NAME - ".mar" .NES. FILE_NAME 381$ THEN 382$ MACRO/OBJECT='OBJECT_FILE' 'SOURCE_FILE' 383$ ELSE 384$ IF COMPILEWITH_CC3 - FILE_NAME0 .NES. COMPILEWITH_CC3 385$ THEN 386$ CC3/OBJECT='OBJECT_FILE' 'SOURCE_FILE' 387$ ELSE 388$ IF COMPILEWITH_CC4 - FILE_NAME0 .NES. COMPILEWITH_CC4 389$ THEN 390$ CC4/OBJECT='OBJECT_FILE' 'SOURCE_FILE' 391$ ELSE 392$ IF COMPILEWITH_CC5 - FILE_NAME0 .NES. COMPILEWITH_CC5 393$ THEN 394$ CC5/OBJECT='OBJECT_FILE' 'SOURCE_FILE' 395$ ELSE 396$ CC/OBJECT='OBJECT_FILE' 'SOURCE_FILE' 397$ ENDIF 398$ ENDIF 399$ ENDIF 400$ ENDIF 401$ IF STATE .EQS. "LIB" 402$ THEN 403$! 404$! Add It To The Library. 405$! 406$ LIBRARY/REPLACE 'LIB_NAME' 'OBJECT_FILE' 407$! 408$! Time To Clean Up The Object File. 409$! 410$ DELETE 'OBJECT_FILE';* 411$ ENDIF 412$! 413$! Go Back And Do It Again. 414$! 415$ GOTO NEXT_FILE 416$! 417$! All Done With This Library Part. 418$! 419$ FILE_DONE: 420$! 421$! Time To Build Some Applications 422$! 423$ IF F$TYPE('APPS_MODULE') .NES. "" .AND. BUILDALL .NES. "LIBRARY" 424$ THEN 425$ APPLICATION_COUNTER = 0 426$ NEXT_APPLICATION: 427$ APPLICATION = F$ELEMENT(APPLICATION_COUNTER,";",'APPS_MODULE') 428$ IF APPLICATION .EQS. ";" THEN GOTO APPLICATION_DONE 429$ 430$ APPLICATION_COUNTER = APPLICATION_COUNTER + 1 431$ APPLICATION_OBJECTS = F$ELEMENT(1,"/",APPLICATION) 432$ APPLICATION = F$ELEMENT(0,"/",APPLICATION) 433$ 434$! WRITE SYS$OUTPUT "DEBUG: SHOW SYMBOL APPLICATION*" 435$! SHOW SYMBOL APPLICATION* 436$! 437$! Tell the user what happens 438$! 439$ WRITE SYS$OUTPUT " ",APPLICATION,".exe" 440$! 441$! Link The Program. 442$! 443$ ON ERROR THEN GOTO NEXT_APPLICATION 444$! 445$! Check To See If We Are To Link With A Specific TCP/IP Library. 446$! 447$ IF (TCPIP_LIB.NES."") 448$ THEN 449$! 450$! Link With A TCP/IP Library. 451$! 452$ LINK/'DEBUGGER'/'TRACEBACK'/EXE='EXE_DIR''APPLICATION'.EXE - 453 'OBJ_DIR''APPLICATION_OBJECTS', - 454 'CRYPTO_LIB'/LIBRARY, - 455 'TCPIP_LIB','OPT_FILE'/OPTION 456$! 457$! Else... 458$! 459$ ELSE 460$! 461$! Don't Link With A TCP/IP Library. 462$! 463$ LINK/'DEBUGGER'/'TRACEBACK'/EXE='EXE_DIR''APPLICATION'.EXE - 464 'OBJ_DIR''APPLICATION_OBJECTS',- 465 'CRYPTO_LIB'/LIBRARY, - 466 'OPT_FILE'/OPTION 467$! 468$! End The TCP/IP Library Check. 469$! 470$ ENDIF 471$ GOTO NEXT_APPLICATION 472$ APPLICATION_DONE: 473$ ENDIF 474$! 475$! Go Back And Get The Next Module. 476$! 477$ GOTO MODULE_NEXT 478$! 479$! All Done With This Module. 480$! 481$ MODULE_DONE: 482$! 483$! Tell The User That We Are All Done. 484$! 485$ WRITE SYS$OUTPUT "All Done..." 486$ EXIT: 487$ GOSUB CLEANUP 488$ EXIT 489$! 490$! Check For The Link Option FIle. 491$! 492$ CHECK_OPT_FILE: 493$! 494$! Check To See If We Need To Make A VAX C Option File. 495$! 496$ IF (COMPILER.EQS."VAXC") 497$ THEN 498$! 499$! Check To See If We Already Have A VAX C Linker Option File. 500$! 501$ IF (F$SEARCH(OPT_FILE).EQS."") 502$ THEN 503$! 504$! We Need A VAX C Linker Option File. 505$! 506$ CREATE 'OPT_FILE' 507$DECK 508! 509! Default System Options File To Link Agianst 510! The Sharable VAX C Runtime Library. 511! 512SYS$SHARE:VAXCRTL.EXE/SHARE 513$EOD 514$! 515$! End The Option File Check. 516$! 517$ ENDIF 518$! 519$! End The VAXC Check. 520$! 521$ ENDIF 522$! 523$! Check To See If We Need A GNU C Option File. 524$! 525$ IF (COMPILER.EQS."GNUC") 526$ THEN 527$! 528$! Check To See If We Already Have A GNU C Linker Option File. 529$! 530$ IF (F$SEARCH(OPT_FILE).EQS."") 531$ THEN 532$! 533$! We Need A GNU C Linker Option File. 534$! 535$ CREATE 'OPT_FILE' 536$DECK 537! 538! Default System Options File To Link Agianst 539! The Sharable C Runtime Library. 540! 541GNU_CC:[000000]GCCLIB/LIBRARY 542SYS$SHARE:VAXCRTL/SHARE 543$EOD 544$! 545$! End The Option File Check. 546$! 547$ ENDIF 548$! 549$! End The GNU C Check. 550$! 551$ ENDIF 552$! 553$! Check To See If We Need A DEC C Option File. 554$! 555$ IF (COMPILER.EQS."DECC") 556$ THEN 557$! 558$! Check To See If We Already Have A DEC C Linker Option File. 559$! 560$ IF (F$SEARCH(OPT_FILE).EQS."") 561$ THEN 562$! 563$! Figure Out If We Need An AXP Or A VAX Linker Option File. 564$! 565$ IF ARCH .EQS. "VAX" 566$ THEN 567$! 568$! We Need A DEC C Linker Option File For VAX. 569$! 570$ CREATE 'OPT_FILE' 571$DECK 572! 573! Default System Options File To Link Agianst 574! The Sharable DEC C Runtime Library. 575! 576SYS$SHARE:DECC$SHR.EXE/SHARE 577$EOD 578$! 579$! Else... 580$! 581$ ELSE 582$! 583$! Create The AXP Linker Option File. 584$! 585$ CREATE 'OPT_FILE' 586$DECK 587! 588! Default System Options File For AXP To Link Agianst 589! The Sharable C Runtime Library. 590! 591SYS$SHARE:CMA$OPEN_LIB_SHR/SHARE 592SYS$SHARE:CMA$OPEN_RTL/SHARE 593$EOD 594$! 595$! End The VAX/AXP DEC C Option File Check. 596$! 597$ ENDIF 598$! 599$! End The Option File Search. 600$! 601$ ENDIF 602$! 603$! End The DEC C Check. 604$! 605$ ENDIF 606$! 607$! Tell The User What Linker Option File We Are Using. 608$! 609$ WRITE SYS$OUTPUT "Using Linker Option File ",OPT_FILE,"." 610$! 611$! Time To RETURN. 612$! 613$ RETURN 614$! 615$! Check The User's Options. 616$! 617$ CHECK_OPTIONS: 618$! 619$! Check To See If P1 Is Blank. 620$! 621$ IF (P1.EQS."ALL") 622$ THEN 623$! 624$! P1 Is Blank, So Build Everything. 625$! 626$ BUILDALL = "TRUE" 627$! 628$! Else... 629$! 630$ ELSE 631$! 632$! Else, Check To See If P1 Has A Valid Arguement. 633$! 634$ IF (P1.EQS."LIBRARY").OR.(P1.EQS."APPS") 635$ THEN 636$! 637$! A Valid Arguement. 638$! 639$ BUILDALL = P1 640$! 641$! Else... 642$! 643$ ELSE 644$! 645$! Tell The User We Don't Know What They Want. 646$! 647$ WRITE SYS$OUTPUT "" 648$ WRITE SYS$OUTPUT "The Option ",P1," Is Invalid. The Valid Options Are:" 649$ WRITE SYS$OUTPUT "" 650$ WRITE SYS$OUTPUT " ALL : Just Build Everything." 651$ WRITE SYS$OUTPUT " LIBRARY : To Compile Just The [.xxx.EXE.CRYPTO]LIBCRYPTO.OLB Library." 652$ WRITE SYS$OUTPUT " APPS : To Compile Just The [.xxx.EXE.CRYPTO]*.EXE Programs." 653$ WRITE SYS$OUTPUT "" 654$ WRITE SYS$OUTPUT " Where 'xxx' Stands For:" 655$ WRITE SYS$OUTPUT "" 656$ WRITE SYS$OUTPUT " AXP : Alpha Architecture." 657$ WRITE SYS$OUTPUT " VAX : VAX Architecture." 658$ WRITE SYS$OUTPUT "" 659$! 660$! Time To EXIT. 661$! 662$ EXIT 663$! 664$! End The Valid Arguement Check. 665$! 666$ ENDIF 667$! 668$! End The P1 Check. 669$! 670$ ENDIF 671$! 672$! Check To See If P2 Is Blank. 673$! 674$ IF (P2.EQS."NODEBUG") 675$ THEN 676$! 677$! P2 Is NODEBUG, So Compile Without The Debugger Information. 678$! 679$ DEBUGGER = "NODEBUG" 680$ TRACEBACK = "NOTRACEBACK" 681$ GCC_OPTIMIZE = "OPTIMIZE" 682$ CC_OPTIMIZE = "OPTIMIZE" 683$ MACRO_OPTIMIZE = "OPTIMIZE" 684$ WRITE SYS$OUTPUT "No Debugger Information Will Be Produced During Compile." 685$ WRITE SYS$OUTPUT "Compiling With Compiler Optimization." 686$ ELSE 687$! 688$! Check To See If We Are To Compile With Debugger Information. 689$! 690$ IF (P2.EQS."DEBUG") 691$ THEN 692$! 693$! Compile With Debugger Information. 694$! 695$ DEBUGGER = "DEBUG" 696$ TRACEBACK = "TRACEBACK" 697$ GCC_OPTIMIZE = "NOOPTIMIZE" 698$ CC_OPTIMIZE = "NOOPTIMIZE" 699$ MACRO_OPTIMIZE = "NOOPTIMIZE" 700$ WRITE SYS$OUTPUT "Debugger Information Will Be Produced During Compile." 701$ WRITE SYS$OUTPUT "Compiling Without Compiler Optimization." 702$ ELSE 703$! 704$! They Entered An Invalid Option.. 705$! 706$ WRITE SYS$OUTPUT "" 707$ WRITE SYS$OUTPUT "The Option ",P2," Is Invalid. The Valid Options Are:" 708$ WRITE SYS$OUTPUT "" 709$ WRITE SYS$OUTPUT " DEBUG : Compile With The Debugger Information." 710$ WRITE SYS$OUTPUT " NODEBUG : Compile Without The Debugger Information." 711$ WRITE SYS$OUTPUT "" 712$! 713$! Time To EXIT. 714$! 715$ EXIT 716$! 717$! End The Valid Arguement Check. 718$! 719$ ENDIF 720$! 721$! End The P2 Check. 722$! 723$ ENDIF 724$! 725$! Special Threads For OpenVMS v7.1 Or Later 726$! 727$! Written By: Richard Levitte 728$! richard@levitte.org 729$! 730$! 731$! Check To See If We Have A Option For P5. 732$! 733$ IF (P5.EQS."") 734$ THEN 735$! 736$! Get The Version Of VMS We Are Using. 737$! 738$ ISSEVEN := 739$ TMP = F$ELEMENT(0,"-",F$EXTRACT(1,4,F$GETSYI("VERSION"))) 740$ TMP = F$INTEGER(F$ELEMENT(0,".",TMP)+F$ELEMENT(1,".",TMP)) 741$! 742$! Check To See If The VMS Version Is v7.1 Or Later. 743$! 744$ IF (TMP.GE.71) 745$ THEN 746$! 747$! We Have OpenVMS v7.1 Or Later, So Use The Special Threads. 748$! 749$ ISSEVEN := ,PTHREAD_USE_D4 750$! 751$! End The VMS Version Check. 752$! 753$ ENDIF 754$! 755$! End The P5 Check. 756$! 757$ ENDIF 758$! 759$! Check To See If P3 Is Blank. 760$! 761$ IF (P3.EQS."") 762$ THEN 763$! 764$! O.K., The User Didn't Specify A Compiler, Let's Try To 765$! Find Out Which One To Use. 766$! 767$! Check To See If We Have GNU C. 768$! 769$ IF (F$TRNLNM("GNU_CC").NES."") 770$ THEN 771$! 772$! Looks Like GNUC, Set To Use GNUC. 773$! 774$ P3 = "GNUC" 775$! 776$! Else... 777$! 778$ ELSE 779$! 780$! Check To See If We Have VAXC Or DECC. 781$! 782$ IF (ARCH.EQS."AXP").OR.(F$TRNLNM("DECC$CC_DEFAULT").NES."") 783$ THEN 784$! 785$! Looks Like DECC, Set To Use DECC. 786$! 787$ P3 = "DECC" 788$! 789$! Else... 790$! 791$ ELSE 792$! 793$! Looks Like VAXC, Set To Use VAXC. 794$! 795$ P3 = "VAXC" 796$! 797$! End The VAXC Compiler Check. 798$! 799$ ENDIF 800$! 801$! End The DECC & VAXC Compiler Check. 802$! 803$ ENDIF 804$! 805$! End The Compiler Check. 806$! 807$ ENDIF 808$! 809$! Check To See If We Have A Option For P4. 810$! 811$ IF (P4.EQS."") 812$ THEN 813$! 814$! Find out what socket library we have available 815$! 816$ IF F$PARSE("SOCKETSHR:") .NES. "" 817$ THEN 818$! 819$! We have SOCKETSHR, and it is my opinion that it's the best to use. 820$! 821$ P4 = "SOCKETSHR" 822$! 823$! Tell the user 824$! 825$ WRITE SYS$OUTPUT "Using SOCKETSHR for TCP/IP" 826$! 827$! Else, let's look for something else 828$! 829$ ELSE 830$! 831$! Like UCX (the reason to do this before Multinet is that the UCX 832$! emulation is easier to use...) 833$! 834$ IF F$TRNLNM("UCX$IPC_SHR") .NES. "" - 835 .OR. F$PARSE("SYS$SHARE:UCX$IPC_SHR.EXE") .NES. "" - 836 .OR. F$PARSE("SYS$LIBRARY:UCX$IPC.OLB") .NES. "" 837$ THEN 838$! 839$! Last resort: a UCX or UCX-compatible library 840$! 841$ P4 = "UCX" 842$! 843$! Tell the user 844$! 845$ WRITE SYS$OUTPUT "Using UCX or an emulation thereof for TCP/IP" 846$! 847$! That was all... 848$! 849$ ENDIF 850$ ENDIF 851$ ENDIF 852$! 853$! Set Up Initial CC Definitions, Possibly With User Ones 854$! 855$ CCDEFS = "TCPIP_TYPE_''P4',DSO_VMS" 856$ IF F$TYPE(USER_CCDEFS) .NES. "" THEN CCDEFS = CCDEFS + "," + USER_CCDEFS 857$ CCEXTRAFLAGS = "" 858$ IF F$TYPE(USER_CCFLAGS) .NES. "" THEN CCEXTRAFLAGS = USER_CCFLAGS 859$ CCDISABLEWARNINGS = "LONGLONGTYPE,LONGLONGSUFX" 860$ IF F$TYPE(USER_CCDISABLEWARNINGS) .NES. "" THEN - 861 CCDISABLEWARNINGS = CCDISABLEWARNINGS + "," + USER_CCDISABLEWARNINGS 862$! 863$! Check To See If The User Entered A Valid Paramter. 864$! 865$ IF (P3.EQS."VAXC").OR.(P3.EQS."DECC").OR.(P3.EQS."GNUC") 866$ THEN 867$! 868$! Check To See If The User Wanted DECC. 869$! 870$ IF (P3.EQS."DECC") 871$ THEN 872$! 873$! Looks Like DECC, Set To Use DECC. 874$! 875$ COMPILER = "DECC" 876$! 877$! Tell The User We Are Using DECC. 878$! 879$ WRITE SYS$OUTPUT "Using DECC 'C' Compiler." 880$! 881$! Use DECC... 882$! 883$ CC = "CC" 884$ IF ARCH.EQS."VAX" .AND. F$TRNLNM("DECC$CC_DEFAULT").NES."/DECC" - 885 THEN CC = "CC/DECC" 886$ CC = CC + "/''CC_OPTIMIZE'/''DEBUGGER'/STANDARD=ANSI89" + - 887 "/NOLIST/PREFIX=ALL" + - 888 "/INCLUDE=(SYS$DISK:[],SYS$DISK:[-],SYS$DISK:[-.CRYPTO])" + - 889 CCEXTRAFLAGS 890$! 891$! Define The Linker Options File Name. 892$! 893$ OPT_FILE = "SYS$DISK:[]VAX_DECC_OPTIONS.OPT" 894$! 895$! End DECC Check. 896$! 897$ ENDIF 898$! 899$! Check To See If We Are To Use VAXC. 900$! 901$ IF (P3.EQS."VAXC") 902$ THEN 903$! 904$! Looks Like VAXC, Set To Use VAXC. 905$! 906$ COMPILER = "VAXC" 907$! 908$! Tell The User We Are Using VAX C. 909$! 910$ WRITE SYS$OUTPUT "Using VAXC 'C' Compiler." 911$! 912$! Compile Using VAXC. 913$! 914$ CC = "CC" 915$ IF ARCH.EQS."AXP" 916$ THEN 917$ WRITE SYS$OUTPUT "There is no VAX C on Alpha!" 918$ EXIT 919$ ENDIF 920$ IF F$TRNLNM("DECC$CC_DEFAULT").EQS."/DECC" THEN CC = "CC/VAXC" 921$ CC = CC + "/''CC_OPTIMIZE'/''DEBUGGER'/NOLIST" + - 922 "/INCLUDE=(SYS$DISK:[],SYS$DISK:[-],SYS$DISK:[-.CRYPTO])" + - 923 CCEXTRAFLAGS 924$ CCDEFS = """VAXC""," + CCDEFS 925$! 926$! Define <sys> As SYS$COMMON:[SYSLIB] 927$! 928$ DEFINE/NOLOG SYS SYS$COMMON:[SYSLIB] 929$! 930$! Define The Linker Options File Name. 931$! 932$ OPT_FILE = "SYS$DISK:[]VAX_VAXC_OPTIONS.OPT" 933$! 934$! End VAXC Check 935$! 936$ ENDIF 937$! 938$! Check To See If We Are To Use GNU C. 939$! 940$ IF (P3.EQS."GNUC") 941$ THEN 942$! 943$! Looks Like GNUC, Set To Use GNUC. 944$! 945$ COMPILER = "GNUC" 946$! 947$! Tell The User We Are Using GNUC. 948$! 949$ WRITE SYS$OUTPUT "Using GNU 'C' Compiler." 950$! 951$! Use GNU C... 952$! 953$ CC = "GCC/NOCASE_HACK/''GCC_OPTIMIZE'/''DEBUGGER'/NOLIST" + - 954 "/INCLUDE=(SYS$DISK:[],SYS$DISK:[-],SYS$DISK:[-.CRYPTO])" + - 955 CCEXTRAFLAGS 956$! 957$! Define The Linker Options File Name. 958$! 959$ OPT_FILE = "SYS$DISK:[]VAX_GNUC_OPTIONS.OPT" 960$! 961$! End The GNU C Check. 962$! 963$ ENDIF 964$! 965$! Set up default defines 966$! 967$ CCDEFS = """FLAT_INC=1""," + CCDEFS 968$! 969$! Finish up the definition of CC. 970$! 971$ IF COMPILER .EQS. "DECC" 972$ THEN 973$ IF CCDISABLEWARNINGS .EQS. "" 974$ THEN 975$ CC4DISABLEWARNINGS = "DOLLARID" 976$ ELSE 977$ CC4DISABLEWARNINGS = CCDISABLEWARNINGS + ",DOLLARID" 978$ CCDISABLEWARNINGS = "/WARNING=(DISABLE=(" + CCDISABLEWARNINGS + "))" 979$ ENDIF 980$ CC4DISABLEWARNINGS = "/WARNING=(DISABLE=(" + CC4DISABLEWARNINGS + "))" 981$ ELSE 982$ CCDISABLEWARNINGS = "" 983$ CC4DISABLEWARNINGS = "" 984$ ENDIF 985$ CC3 = CC + "/DEFINE=(" + CCDEFS + ISSEVEN + ")" + CCDISABLEWARNINGS 986$ CC = CC + "/DEFINE=(" + CCDEFS + ")" + CCDISABLEWARNINGS 987$ IF ARCH .EQS. "VAX" .AND. COMPILER .EQS. "DECC" .AND. P2 .NES. "DEBUG" 988$ THEN 989$ CC5 = CC + "/OPTIMIZE=NODISJOINT" 990$ ELSE 991$ CC5 = CC + "/NOOPTIMIZE" 992$ ENDIF 993$ CC4 = CC - CCDISABLEWARNINGS + CC4DISABLEWARNINGS 994$! 995$! Show user the result 996$! 997$ WRITE/SYMBOL SYS$OUTPUT "Main C Compiling Command: ",CC 998$! 999$! Else The User Entered An Invalid Arguement. 1000$! 1001$ ELSE 1002$! 1003$! Tell The User We Don't Know What They Want. 1004$! 1005$ WRITE SYS$OUTPUT "" 1006$ WRITE SYS$OUTPUT "The Option ",P3," Is Invalid. The Valid Options Are:" 1007$ WRITE SYS$OUTPUT "" 1008$ WRITE SYS$OUTPUT " VAXC : To Compile With VAX C." 1009$ WRITE SYS$OUTPUT " DECC : To Compile With DEC C." 1010$ WRITE SYS$OUTPUT " GNUC : To Compile With GNU C." 1011$ WRITE SYS$OUTPUT "" 1012$! 1013$! Time To EXIT. 1014$! 1015$ EXIT 1016$! 1017$! End The Valid Arguement Check. 1018$! 1019$ ENDIF 1020$! 1021$! Build a MACRO command for the architecture at hand 1022$! 1023$ IF ARCH .EQS. "VAX" THEN MACRO = "MACRO/''DEBUGGER'" 1024$ IF ARCH .EQS. "AXP" THEN MACRO = "MACRO/MIGRATION/''DEBUGGER'/''MACRO_OPTIMIZE'" 1025$! 1026$! Show user the result 1027$! 1028$ WRITE/SYMBOL SYS$OUTPUT "Main MACRO Compiling Command: ",MACRO 1029$! 1030$! Time to check the contents, and to make sure we get the correct library. 1031$! 1032$ IF P4.EQS."SOCKETSHR" .OR. P4.EQS."MULTINET" .OR. P4.EQS."UCX" - 1033 .OR. P4.EQS."TCPIP" .OR. P4.EQS."NONE" 1034$ THEN 1035$! 1036$! Check to see if SOCKETSHR was chosen 1037$! 1038$ IF P4.EQS."SOCKETSHR" 1039$ THEN 1040$! 1041$! Set the library to use SOCKETSHR 1042$! 1043$ TCPIP_LIB = "SYS$DISK:[-.VMS]SOCKETSHR_SHR.OPT/OPT" 1044$! 1045$! Done with SOCKETSHR 1046$! 1047$ ENDIF 1048$! 1049$! Check to see if MULTINET was chosen 1050$! 1051$ IF P4.EQS."MULTINET" 1052$ THEN 1053$! 1054$! Set the library to use UCX emulation. 1055$! 1056$ P4 = "UCX" 1057$! 1058$! Done with MULTINET 1059$! 1060$ ENDIF 1061$! 1062$! Check to see if UCX was chosen 1063$! 1064$ IF P4.EQS."UCX" 1065$ THEN 1066$! 1067$! Set the library to use UCX. 1068$! 1069$ TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_DECC.OPT/OPT" 1070$ IF F$TRNLNM("UCX$IPC_SHR") .NES. "" 1071$ THEN 1072$ TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_DECC_LOG.OPT/OPT" 1073$ ELSE 1074$ IF COMPILER .NES. "DECC" .AND. ARCH .EQS. "VAX" THEN - 1075 TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_VAXC.OPT/OPT" 1076$ ENDIF 1077$! 1078$! Done with UCX 1079$! 1080$ ENDIF 1081$! 1082$! Check to see if TCPIP was chosen 1083$! 1084$ IF P4.EQS."TCPIP" 1085$ THEN 1086$! 1087$! Set the library to use TCPIP (post UCX). 1088$! 1089$ TCPIP_LIB = "SYS$DISK:[-.VMS]TCPIP_SHR_DECC.OPT/OPT" 1090$! 1091$! Done with TCPIP 1092$! 1093$ ENDIF 1094$! 1095$! Check to see if NONE was chosen 1096$! 1097$ IF P4.EQS."NONE" 1098$ THEN 1099$! 1100$! Do not use a TCPIP library. 1101$! 1102$ TCPIP_LIB = "" 1103$! 1104$! Done with TCPIP 1105$! 1106$ ENDIF 1107$! 1108$! Print info 1109$! 1110$ WRITE SYS$OUTPUT "TCP/IP library spec: ", TCPIP_LIB 1111$! 1112$! Else The User Entered An Invalid Arguement. 1113$! 1114$ ELSE 1115$! 1116$! Tell The User We Don't Know What They Want. 1117$! 1118$ WRITE SYS$OUTPUT "" 1119$ WRITE SYS$OUTPUT "The Option ",P4," Is Invalid. The Valid Options Are:" 1120$ WRITE SYS$OUTPUT "" 1121$ WRITE SYS$OUTPUT " SOCKETSHR : To link with SOCKETSHR TCP/IP library." 1122$ WRITE SYS$OUTPUT " UCX : To link with UCX TCP/IP library." 1123$ WRITE SYS$OUTPUT " TCPIP : To link with TCPIP (post UCX) TCP/IP library." 1124$ WRITE SYS$OUTPUT "" 1125$! 1126$! Time To EXIT. 1127$! 1128$ EXIT 1129$! 1130$! Done with TCP/IP libraries 1131$! 1132$ ENDIF 1133$! 1134$! Check if the user wanted to compile just a subset of all the encryption 1135$! methods. 1136$! 1137$ IF P6 .NES. "" 1138$ THEN 1139$ ENCRYPT_TYPES = P6 1140$ ENDIF 1141$! 1142$! Time To RETURN... 1143$! 1144$ RETURN 1145$! 1146$ INITIALISE: 1147$! 1148$! Save old value of the logical name OPENSSL 1149$! 1150$ __SAVE_OPENSSL = F$TRNLNM("OPENSSL","LNM$PROCESS_TABLE") 1151$! 1152$! Save directory information 1153$! 1154$ __HERE = F$PARSE(F$PARSE("A.;",F$ENVIRONMENT("PROCEDURE"))-"A.;","[]A.;") - "A.;" 1155$ __HERE = F$EDIT(__HERE,"UPCASE") 1156$ __TOP = __HERE - "FIPS]" 1157$ __INCLUDE = __TOP + "INCLUDE.OPENSSL]" 1158$! 1159$! Set up the logical name OPENSSL to point at the include directory 1160$! 1161$ DEFINE OPENSSL/NOLOG '__INCLUDE' 1162$! 1163$! Done 1164$! 1165$ RETURN 1166$! 1167$ CLEANUP: 1168$! 1169$! Restore the logical name OPENSSL if it had a value 1170$! 1171$ IF __SAVE_OPENSSL .EQS. "" 1172$ THEN 1173$ DEASSIGN OPENSSL 1174$ ELSE 1175$ DEFINE/NOLOG OPENSSL '__SAVE_OPENSSL' 1176$ ENDIF 1177$! 1178$! Done 1179$! 1180$ RETURN 1181