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