1$!
2$!  MAKEAPPS.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$!             Zoltan Arpadffy <zoli@polarhome.com>   
10$!
11$!  This command files compiles and creates all the various different
12$!  "application" programs for the different types of encryption for OpenSSL.
13$!  The EXE's are placed in the directory [.xxx.EXE.APPS] where "xxx" denotes
14$!  ALPHA, IA64 or VAX, depending on your machine architecture.
15$!
16$!  It was written so it would try to determine what "C" compiler to
17$!  use or you can specify which "C" compiler to use.
18$!
19$!  Specify DEBUG or NODEBUG as P1 to compile with or without debugger
20$!  information.
21$!
22$!  Specify which compiler at P2 to try to compile under.
23$!
24$!	   VAXC	 For VAX C.
25$!	   DECC	 For DEC C.
26$!	   GNUC	 For GNU C.
27$!
28$!  If you don't specify a compiler, it will try to determine which
29$!  "C" compiler to use.
30$!
31$!  P3, if defined, sets a TCP/IP library to use, through one of the following
32$!  keywords:
33$!
34$!	UCX		for UCX
35$!	SOCKETSHR	for SOCKETSHR+NETLIB
36$!	TCPIP		for TCPIP (post UCX)
37$!
38$!  P4, if defined, sets a compiler thread NOT needed on OpenVMS 7.1 (and up)
39$!
40$!  P5, if defined, sets a choice of programs to compile.
41$!
42$!  For 64 bit architectures (Alpha and IA64), specify the pointer size as P6.
43$!  For 32 bit architectures (VAX), P6 is ignored.
44$!  Currently supported values are:
45$!
46$!	32	To ge a library compiled with /POINTER_SIZE=32
47$!	64	To ge a library compiled with /POINTER_SIZE=64
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 What Architecture We Are Using.
56$!
57$ IF (F$GETSYI("CPU").LT.128)
58$ THEN
59$!
60$!  The Architecture Is VAX.
61$!
62$   ARCH = "VAX"
63$!
64$! Else...
65$!
66$ ELSE
67$!
68$!  The Architecture Is Alpha, IA64 or whatever comes in the future.
69$!
70$   ARCH = F$EDIT( F$GETSYI( "ARCH_NAME"), "UPCASE")
71$   IF (ARCH .EQS. "") THEN ARCH = "UNK"
72$!
73$! End The Architecture Check.
74$!
75$ ENDIF
76$!
77$! Define what programs should be compiled
78$!
79$ PROGRAMS := OPENSSL
80$!
81$! Define The CRYPTO Library.
82$!
83$ CRYPTO_LIB := SYS$DISK:[-.'ARCH'.EXE.CRYPTO]LIBCRYPTO'LIB32'.OLB
84$!
85$! Define The SSL Library.
86$!
87$ SSL_LIB := SYS$DISK:[-.'ARCH'.EXE.SSL]LIBSSL'LIB32'.OLB
88$!
89$! Define The OBJ Directory.
90$!
91$ OBJ_DIR := SYS$DISK:[-.'ARCH'.OBJ.APPS]
92$!
93$! Define The EXE Directory.
94$!
95$ EXE_DIR := SYS$DISK:[-.'ARCH'.EXE.APPS]
96$!
97$! Check To Make Sure We Have Valid Command Line Parameters.
98$!
99$ GOSUB CHECK_OPTIONS
100$!
101$! Initialise logical names and such
102$!
103$ GOSUB INITIALISE
104$!
105$! Tell The User What Kind of Machine We Run On.
106$!
107$ WRITE SYS$OUTPUT "Compiling On A ",ARCH," Machine."
108$!
109$! Check To See If The OBJ Directory Exists.
110$!
111$ IF (F$PARSE(OBJ_DIR).EQS."")
112$ THEN
113$!
114$!  It Dosen't Exist, So Create It.
115$!
116$   CREATE/DIRECTORY 'OBJ_DIR'
117$!
118$! End The OBJ Directory Check.
119$!
120$ ENDIF
121$!
122$! Check To See If The EXE Directory Exists.
123$!
124$ IF (F$PARSE(EXE_DIR).EQS."")
125$ THEN
126$!
127$!  It Dosen't Exist, So Create It.
128$!
129$   CREATE/DIRECTORY 'EXE_DIR'
130$!
131$! End The EXE Directory Check.
132$!
133$ ENDIF
134$!
135$! Check To See If We Have The Proper Libraries.
136$!
137$ GOSUB LIB_CHECK
138$!
139$! Check To See If We Have A Linker Option File.
140$!
141$ GOSUB CHECK_OPT_FILE
142$!
143$! Define The Application Files.
144$! NOTE: Some might think this list ugly.  However, it's made this way to
145$! reflect the E_OBJ variable in Makefile as closely as possible, thereby
146$! making it fairly easy to verify that the lists are the same.
147$!
148$ LIB_OPENSSL = "VERIFY,ASN1PARS,REQ,DGST,DH,DHPARAM,ENC,PASSWD,GENDH,ERRSTR,"+-
149	     	"CA,PKCS7,CRL2P7,CRL,"+-
150	      	"RSA,RSAUTL,DSA,DSAPARAM,EC,ECPARAM,"+-
151	      	"X509,GENRSA,GENDSA,GENPKEY,S_SERVER,S_CLIENT,SPEED,"+-
152	      	"S_TIME,APPS,S_CB,S_SOCKET,APP_RAND,VERSION,SESS_ID,"+-
153	      	"CIPHERS,NSEQ,PKCS12,PKCS8,PKEY,PKEYPARAM,PKEYUTL,"+ -
154	      	"SPKAC,SMIME,CMS,RAND,ENGINE,OCSP,PRIME,TS"
155$ TCPIP_PROGRAMS = ",,"
156$ IF COMPILER .EQS. "VAXC" THEN -
157     TCPIP_PROGRAMS = ",OPENSSL,"
158$!
159$! Setup exceptional compilations
160$!
161$ COMPILEWITH_CC2 = ",S_SOCKET,S_SERVER,S_CLIENT,"
162$!
163$ PHASE := LIB
164$!
165$ RESTART: 
166$!
167$!  Define An App Counter And Set It To "0".
168$!
169$ APP_COUNTER = 0
170$!
171$!  Top Of The App Loop.
172$!
173$ NEXT_APP:
174$!
175$!  Make The Application File Name
176$!
177$ CURRENT_APP = F$EDIT(F$ELEMENT(APP_COUNTER,",",PROGRAMS),"TRIM")
178$!
179$!  Create The Executable File Name.
180$!
181$   EXE_FILE = EXE_DIR + CURRENT_APP + ".EXE"
182$!
183$!  Check To See If We Are At The End Of The File List.
184$!
185$ IF (CURRENT_APP.EQS.",")
186$ THEN
187$   IF (PHASE.EQS."LIB")
188$   THEN
189$     PHASE := APP
190$     GOTO RESTART
191$   ELSE
192$     GOTO APP_DONE
193$   ENDIF
194$ ENDIF
195$!
196$!  Increment The Counter.
197$!
198$ APP_COUNTER = APP_COUNTER + 1
199$!
200$!  Decide if we're building the object files or not.
201$!
202$ IF (PHASE.EQS."LIB")
203$ THEN
204$!
205$!  Define A Library File Counter And Set It To "-1".
206$!  -1 Means The Application File Name Is To Be Used.
207$!
208$   LIB_COUNTER = -1
209$!
210$!  Create a .OPT file for the object files
211$!
212$   OPEN/WRITE OBJECTS 'EXE_DIR''CURRENT_APP'.OPT
213$!
214$!  Top Of The File Loop.
215$!
216$  NEXT_LIB:
217$!
218$!  O.K, Extract The File Name From The File List.
219$!
220$   IF LIB_COUNTER .GE. 0
221$   THEN
222$     FILE_NAME = F$EDIT(F$ELEMENT(LIB_COUNTER,",",LIB_'CURRENT_APP'),"TRIM")
223$   ELSE
224$     FILE_NAME = CURRENT_APP
225$   ENDIF
226$!
227$!  Check To See If We Are At The End Of The File List.
228$!
229$   IF (FILE_NAME.EQS.",")
230$   THEN
231$     CLOSE OBJECTS
232$     GOTO NEXT_APP
233$   ENDIF
234$!
235$!  Increment The Counter.
236$!
237$   LIB_COUNTER = LIB_COUNTER + 1
238$!
239$!  Create The Source File Name.
240$!
241$   SOURCE_FILE = "SYS$DISK:[]" + FILE_NAME + ".C"
242$!
243$!  Create The Object File Name.
244$!
245$   OBJECT_FILE = OBJ_DIR + FILE_NAME + ".OBJ"
246$   ON WARNING THEN GOTO NEXT_LIB
247$!
248$!  Check To See If The File We Want To Compile Actually Exists.
249$!
250$   IF (F$SEARCH(SOURCE_FILE).EQS."")
251$   THEN
252$!
253$!    Tell The User That The File Dosen't Exist.
254$!
255$     WRITE SYS$OUTPUT ""
256$     WRITE SYS$OUTPUT "The File ",SOURCE_FILE," Dosen't Exist."
257$     WRITE SYS$OUTPUT ""
258$!
259$!    Exit The Build.
260$!
261$     GOTO EXIT
262$!
263$!  End The File Exist Check.
264$!
265$   ENDIF
266$!
267$!  Tell The User What We Are Building.
268$!
269$   IF (PHASE.EQS."LIB")
270$   THEN
271$     WRITE SYS$OUTPUT "Compiling The ",FILE_NAME,".C File."
272$   ELSE
273$     WRITE SYS$OUTPUT "Building The ",FILE_NAME," Application Program."
274$   ENDIF
275$!
276$!  Compile The File.
277$!
278$   ON ERROR THEN GOTO NEXT_LIB
279$   IF COMPILEWITH_CC2 - FILE_NAME .NES. COMPILEWITH_CC2
280$   THEN
281$     CC2/OBJECT='OBJECT_FILE' 'SOURCE_FILE'
282$   ELSE
283$     CC/OBJECT='OBJECT_FILE' 'SOURCE_FILE'
284$   ENDIF
285$   WRITE OBJECTS OBJECT_FILE
286$!
287$   GOTO NEXT_LIB
288$ ENDIF
289$!
290$!  Check if this program works well without a TCPIP library
291$!
292$ IF TCPIP_LIB .EQS. "" .AND. TCPIP_PROGRAMS - CURRENT_APP .NES. TCPIP_PROGRAMS
293$ THEN
294$   WRITE SYS$OUTPUT CURRENT_APP," needs a TCP/IP library.  Can't link.  Skipping..."
295$   GOTO NEXT_APP
296$ ENDIF
297$!
298$! Link The Program.
299$! Check To See If We Are To Link With A Specific TCP/IP Library.
300$!
301$ ON WARNING THEN GOTO NEXT_APP
302$!
303$ IF (TCPIP_LIB.NES."")
304$ THEN
305$!
306$! Don't Link With The RSAREF Routines And TCP/IP Library.
307$!
308$   LINK/'DEBUGGER'/'TRACEBACK' /EXE='EXE_FILE' -
309	'EXE_DIR''CURRENT_APP'.OPT/OPTION, -
310        'SSL_LIB'/LIBRARY,'CRYPTO_LIB'/LIBRARY, -
311        'TCPIP_LIB','OPT_FILE'/OPTION
312$!
313$! Else...
314$!
315$ ELSE
316$!
317$! Don't Link With The RSAREF Routines And Link With A TCP/IP Library.
318$!
319$   LINK/'DEBUGGER'/'TRACEBACK' /EXE='EXE_FILE' -
320	'EXE_DIR''CURRENT_APP'.OPT/OPTION, -
321        'SSL_LIB'/LIBRARY,'CRYPTO_LIB'/LIBRARY, -
322        'OPT_FILE'/OPTION
323$!
324$! End The TCP/IP Library Check.
325$!
326$ ENDIF
327$!
328$! Go Back And Do It Again.
329$!
330$ GOTO NEXT_APP
331$!
332$! All Done With This File.
333$!
334$ APP_DONE:
335$ EXIT:
336$!
337$! All Done, Time To Clean Up And Exit.
338$!
339$ GOSUB CLEANUP
340$ EXIT
341$!
342$! Check For The Link Option FIle.
343$!
344$ CHECK_OPT_FILE:
345$!
346$! Check To See If We Need To Make A VAX C Option File.
347$!
348$ IF (COMPILER.EQS."VAXC")
349$ THEN
350$!
351$!  Check To See If We Already Have A VAX C Linker Option File.
352$!
353$   IF (F$SEARCH(OPT_FILE).EQS."")
354$   THEN
355$!
356$!    We Need A VAX C Linker Option File.
357$!
358$     CREATE 'OPT_FILE'
359$DECK
360!
361! Default System Options File To Link Agianst 
362! The Sharable VAX C Runtime Library.
363!
364SYS$SHARE:VAXCRTL.EXE/SHARE
365$EOD
366$!
367$!  End The Option File Check.
368$!
369$   ENDIF
370$!
371$! End The VAXC Check.
372$!
373$ ENDIF
374$!
375$! Check To See If We Need A GNU C Option File.
376$!
377$ IF (COMPILER.EQS."GNUC")
378$ THEN
379$!
380$!  Check To See If We Already Have A GNU C Linker Option File.
381$!
382$   IF (F$SEARCH(OPT_FILE).EQS."")
383$   THEN
384$!
385$!    We Need A GNU C Linker Option File.
386$!
387$     CREATE 'OPT_FILE'
388$DECK
389!
390! Default System Options File To Link Agianst 
391! The Sharable C Runtime Library.
392!
393GNU_CC:[000000]GCCLIB/LIBRARY
394SYS$SHARE:VAXCRTL/SHARE
395$EOD
396$!
397$!  End The Option File Check.
398$!
399$   ENDIF
400$!
401$! End The GNU C Check.
402$!
403$ ENDIF
404$!
405$! Check To See If We Need A DEC C Option File.
406$!
407$ IF (COMPILER.EQS."DECC")
408$ THEN
409$!
410$!  Check To See If We Already Have A DEC C Linker Option File.
411$!
412$   IF (F$SEARCH(OPT_FILE).EQS."")
413$   THEN
414$!
415$!    Figure Out If We Need An AXP Or A VAX Linker Option File.
416$!
417$     IF ARCH.EQS."VAX"
418$     THEN
419$!
420$!      We Need A DEC C Linker Option File For VAX.
421$!
422$       CREATE 'OPT_FILE'
423$DECK
424!
425! Default System Options File To Link Agianst 
426! The Sharable DEC C Runtime Library.
427!
428SYS$SHARE:DECC$SHR.EXE/SHARE
429$EOD
430$!
431$!    Else...
432$!
433$     ELSE
434$!
435$!      Create The non-VAX Linker Option File.
436$!
437$       CREATE 'OPT_FILE'
438$DECK
439!
440! Default System Options File For non-VAX To Link Agianst 
441! The Sharable C Runtime Library.
442!
443SYS$SHARE:CMA$OPEN_LIB_SHR/SHARE
444SYS$SHARE:CMA$OPEN_RTL/SHARE
445$EOD
446$!
447$!    End The DEC C Option File Check.
448$!
449$     ENDIF
450$!
451$!  End The Option File Search.
452$!
453$   ENDIF
454$!
455$! End The DEC C Check.
456$!
457$ ENDIF
458$!
459$!  Tell The User What Linker Option File We Are Using.
460$!
461$ WRITE SYS$OUTPUT "Using Linker Option File ",OPT_FILE,"."	
462$!
463$! Time To RETURN.
464$!
465$ RETURN
466$!
467$! Check To See If We Have The Appropiate Libraries.
468$!
469$ LIB_CHECK:
470$!
471$! Look For The Library LIBCRYPTO.OLB.
472$!
473$ IF (F$SEARCH(CRYPTO_LIB).EQS."")
474$ THEN
475$!
476$!  Tell The User We Can't Find The LIBCRYPTO.OLB Library.
477$!
478$   WRITE SYS$OUTPUT ""
479$   WRITE SYS$OUTPUT "Can't Find The Library ",CRYPTO_LIB,"."
480$   WRITE SYS$OUTPUT "We Can't Link Without It."
481$   WRITE SYS$OUTPUT ""
482$!
483$!  Since We Can't Link Without It, Exit.
484$!
485$   EXIT
486$!
487$! End The Crypto Library Check.
488$!
489$ ENDIF
490$!
491$! Look For The Library LIBSSL.OLB.
492$!
493$ IF (F$SEARCH(SSL_LIB).EQS."")
494$ THEN
495$!
496$!  Tell The User We Can't Find The LIBSSL.OLB Library.
497$!
498$   WRITE SYS$OUTPUT ""
499$   WRITE SYS$OUTPUT "Can't Find The Library ",SSL_LIB,"."
500$   WRITE SYS$OUTPUT "Some Of The Test Programs Need To Link To It."
501$   WRITE SYS$OUTPUT ""
502$!
503$!  Since We Can't Link Without It, Exit.
504$!
505$   EXIT
506$!
507$! End The SSL Library Check.
508$!
509$ ENDIF
510$!
511$! Time To Return.
512$!
513$ RETURN
514$!
515$! Check The User's Options.
516$!
517$ CHECK_OPTIONS:
518$!
519$! Check To See If P1 Is Blank.
520$!
521$ IF (P1.EQS."NODEBUG")
522$ THEN
523$!
524$!   P1 Is NODEBUG, So Compile Without Debugger Information.
525$!
526$    DEBUGGER  = "NODEBUG"
527$    TRACEBACK = "NOTRACEBACK" 
528$    GCC_OPTIMIZE = "OPTIMIZE"
529$    CC_OPTIMIZE = "OPTIMIZE"
530$    WRITE SYS$OUTPUT "No Debugger Information Will Be Produced During Compile."
531$    WRITE SYS$OUTPUT "Compiling With Compiler Optimization."
532$!
533$! Else...
534$!
535$ ELSE
536$!
537$!  Check To See If We Are To Compile With Debugger Information.
538$!
539$   IF (P1.EQS."DEBUG")
540$   THEN
541$!
542$!    Compile With Debugger Information.
543$!
544$     DEBUGGER  = "DEBUG"
545$     TRACEBACK = "TRACEBACK"
546$     GCC_OPTIMIZE = "NOOPTIMIZE"
547$     CC_OPTIMIZE = "NOOPTIMIZE"
548$     WRITE SYS$OUTPUT "Debugger Information Will Be Produced During Compile."
549$     WRITE SYS$OUTPUT "Compiling Without Compiler Optimization."
550$   ELSE
551$!
552$!    Tell The User Entered An Invalid Option..
553$!
554$     WRITE SYS$OUTPUT ""
555$     WRITE SYS$OUTPUT "The Option ",P1," Is Invalid.  The Valid Options Are:"
556$     WRITE SYS$OUTPUT ""
557$     WRITE SYS$OUTPUT "    DEBUG    :  Compile With The Debugger Information."
558$     WRITE SYS$OUTPUT "    NODEBUG  :  Compile Without The Debugger Information."
559$     WRITE SYS$OUTPUT ""
560$!
561$!    Time To EXIT.
562$!
563$     EXIT
564$!
565$!  End The Valid Argument Check.
566$!
567$   ENDIF
568$!
569$! End The P1 Check.
570$!
571$ ENDIF
572$!
573$! Check To See If P6 Is Blank.
574$!
575$ IF (P6.EQS."")
576$ THEN
577$   POINTER_SIZE = ""
578$ ELSE
579$!
580$!  Check is P6 Is Valid
581$!
582$   IF (P6.EQS."32")
583$   THEN
584$     POINTER_SIZE = "/POINTER_SIZE=32"
585$     IF ARCH .EQS. "VAX"
586$     THEN
587$       LIB32 = ""
588$     ELSE
589$       LIB32 = "32"
590$     ENDIF
591$   ELSE
592$     IF (P6.EQS."64")
593$     THEN
594$       LIB32 = ""
595$       IF ARCH .EQS. "VAX"
596$       THEN
597$         POINTER_SIZE = "/POINTER_SIZE=32"
598$       ELSE
599$         POINTER_SIZE = "/POINTER_SIZE=64"
600$       ENDIF
601$     ELSE
602$!
603$!      Tell The User Entered An Invalid Option..
604$!
605$       WRITE SYS$OUTPUT ""
606$       WRITE SYS$OUTPUT "The Option ",P6," Is Invalid.  The Valid Options Are:"
607$       WRITE SYS$OUTPUT ""
608$       WRITE SYS$OUTPUT "    32  :  Compile with 32 bit pointer size"
609$       WRITE SYS$OUTPUT "    64  :  Compile with 64 bit pointer size"
610$       WRITE SYS$OUTPUT ""
611$!
612$!      Time To EXIT.
613$!
614$       GOTO TIDY
615$!
616$!      End The Valid Arguement Check.
617$!
618$     ENDIF
619$   ENDIF
620$!
621$! End The P6 Check.
622$!
623$ ENDIF
624$!
625$! Check To See If P2 Is Blank.
626$!
627$ IF (P2.EQS."")
628$ THEN
629$!
630$!  O.K., The User Didn't Specify A Compiler, Let's Try To
631$!  Find Out Which One To Use.
632$!
633$!  Check To See If We Have GNU C.
634$!
635$   IF (F$TRNLNM("GNU_CC").NES."")
636$   THEN
637$!
638$!    Looks Like GNUC, Set To Use GNUC.
639$!
640$     P2 = "GNUC"
641$!
642$!  Else...
643$!
644$   ELSE
645$!
646$!  Check To See If We Have VAXC Or DECC.
647$!
648$     IF (ARCH.NES."VAX").OR.(F$TRNLNM("DECC$CC_DEFAULT").NES."")
649$     THEN 
650$!
651$!      Looks Like DECC, Set To Use DECC.
652$!
653$       P2 = "DECC"
654$!
655$!    Else...
656$!
657$     ELSE
658$!
659$!      Looks Like VAXC, Set To Use VAXC.
660$!
661$       P2 = "VAXC"
662$!
663$!    End The VAXC Compiler Check.
664$!
665$     ENDIF
666$!
667$!  End The DECC & VAXC Compiler Check.
668$!
669$   ENDIF
670$!
671$!  End The Compiler Check.
672$!
673$ ENDIF
674$!
675$! Check To See If We Have A Option For P3.
676$!
677$ IF (P3.EQS."")
678$ THEN
679$!
680$!  Find out what socket library we have available
681$!
682$   IF F$PARSE("SOCKETSHR:") .NES. ""
683$   THEN
684$!
685$!    We have SOCKETSHR, and it is my opinion that it's the best to use.
686$!
687$     P3 = "SOCKETSHR"
688$!
689$!    Tell the user
690$!
691$     WRITE SYS$OUTPUT "Using SOCKETSHR for TCP/IP"
692$!
693$!    Else, let's look for something else
694$!
695$   ELSE
696$!
697$!    Like UCX (the reason to do this before Multinet is that the UCX
698$!    emulation is easier to use...)
699$!
700$     IF F$TRNLNM("UCX$IPC_SHR") .NES. "" -
701	 .OR. F$PARSE("SYS$SHARE:UCX$IPC_SHR.EXE") .NES. "" -
702	 .OR. F$PARSE("SYS$LIBRARY:UCX$IPC.OLB") .NES. ""
703$     THEN
704$!
705$!	Last resort: a UCX or UCX-compatible library
706$!
707$	P3 = "UCX"
708$!
709$!      Tell the user
710$!
711$       WRITE SYS$OUTPUT "Using UCX or an emulation thereof for TCP/IP"
712$!
713$!	That was all...
714$!
715$     ENDIF
716$   ENDIF
717$ ENDIF
718$!
719$! Set Up Initial CC Definitions, Possibly With User Ones
720$!
721$ CCDEFS = "MONOLITH"
722$ IF F$TYPE(USER_CCDEFS) .NES. "" THEN CCDEFS = CCDEFS + "," + USER_CCDEFS
723$ CCEXTRAFLAGS = ""
724$ IF F$TYPE(USER_CCFLAGS) .NES. "" THEN CCEXTRAFLAGS = USER_CCFLAGS
725$ CCDISABLEWARNINGS = "LONGLONGTYPE,LONGLONGSUFX,FOUNDCR"
726$ IF F$TYPE(USER_CCDISABLEWARNINGS) .NES. "" THEN -
727	CCDISABLEWARNINGS = CCDISABLEWARNINGS + "," + USER_CCDISABLEWARNINGS
728$!
729$!  Check To See If The User Entered A Valid Paramter.
730$!
731$ IF (P2.EQS."VAXC").OR.(P2.EQS."DECC").OR.(P2.EQS."GNUC")
732$ THEN
733$!
734$!  Check To See If The User Wanted DECC.
735$!
736$   IF (P2.EQS."DECC")
737$   THEN
738$!
739$!    Looks Like DECC, Set To Use DECC.
740$!
741$     COMPILER = "DECC"
742$!
743$!    Tell The User We Are Using DECC.
744$!
745$     WRITE SYS$OUTPUT "Using DECC 'C' Compiler."
746$!
747$!    Use DECC...
748$!
749$     CC = "CC"
750$     IF ARCH.EQS."VAX" .AND. F$TRNLNM("DECC$CC_DEFAULT").NES."/DECC" -
751	 THEN CC = "CC/DECC"
752$     CC = CC + "/''CC_OPTIMIZE'/''DEBUGGER'/STANDARD=ANSI89''POINTER_SIZE'" + -
753           "/NOLIST/PREFIX=ALL" + -
754	   "/INCLUDE=(SYS$DISK:[-],SYS$DISK:[-.CRYPTO])" + CCEXTRAFLAGS
755$!
756$!    Define The Linker Options File Name.
757$!
758$     OPT_FILE = "''EXE_DIR'VAX_DECC_OPTIONS.OPT"
759$!
760$!  End DECC Check.
761$!
762$   ENDIF
763$!
764$!  Check To See If We Are To Use VAXC.
765$!
766$   IF (P2.EQS."VAXC")
767$   THEN
768$!
769$!    Looks Like VAXC, Set To Use VAXC.
770$!
771$     COMPILER = "VAXC"
772$!
773$!    Tell The User We Are Using VAX C.
774$     WRITE SYS$OUTPUT "Using VAXC 'C' Compiler."
775$!
776$!    Compile Using VAXC.
777$!
778$     CC = "CC"
779$     IF ARCH.NES."VAX"
780$     THEN
781$	WRITE SYS$OUTPUT "There is no VAX C on ''ARCH'!"
782$	EXIT
783$     ENDIF
784$     IF F$TRNLNM("DECC$CC_DEFAULT").EQS."/DECC" THEN CC = "CC/VAXC"
785$     CC = CC + "/''CC_OPTIMIZE'/''DEBUGGER'/NOLIST" + -
786	   "/INCLUDE=(SYS$DISK:[-],SYS$DISK:[-.CRYPTO])" + CCEXTRAFLAGS
787$     CCDEFS = CCDEFS + ",""VAXC"""
788$!
789$!    Define <sys> As SYS$COMMON:[SYSLIB]
790$!
791$     DEFINE/NOLOG SYS SYS$COMMON:[SYSLIB]
792$!
793$!    Define The Linker Options File Name.
794$!
795$     OPT_FILE = "''EXE_DIR'VAX_VAXC_OPTIONS.OPT"
796$!
797$!  End VAXC Check
798$!
799$   ENDIF
800$!
801$!  Check To See If We Are To Use GNU C.
802$!
803$   IF (P2.EQS."GNUC")
804$   THEN
805$!
806$!    Looks Like GNUC, Set To Use GNUC.
807$!
808$     COMPILER = "GNUC"
809$!
810$!    Tell The User We Are Using GNUC.
811$!
812$     WRITE SYS$OUTPUT "Using GNU 'C' Compiler."
813$!
814$!    Use GNU C...
815$!
816$     IF F$TYPE(GCC) .EQS. "" THEN GCC := GCC
817$     CC = GCC+"/NOCASE_HACK/''GCC_OPTIMIZE'/''DEBUGGER'/NOLIST" + -
818	   "/INCLUDE=(SYS$DISK:[-],SYS$DISK:[-.CRYPTO])" + CCEXTRAFLAGS
819$!
820$!    Define The Linker Options File Name.
821$!
822$     OPT_FILE = "''EXE_DIR'VAX_GNUC_OPTIONS.OPT"
823$!
824$!  End The GNU C Check.
825$!
826$   ENDIF
827$!
828$!  Set up default defines
829$!
830$   CCDEFS = """FLAT_INC=1""," + CCDEFS
831$!
832$!  Else The User Entered An Invalid Argument.
833$!
834$ ELSE
835$!
836$!  Tell The User We Don't Know What They Want.
837$!
838$   WRITE SYS$OUTPUT ""
839$   WRITE SYS$OUTPUT "The Option ",P2," Is Invalid.  The Valid Options Are:"
840$   WRITE SYS$OUTPUT ""
841$   WRITE SYS$OUTPUT "    VAXC  :  To Compile With VAX C."
842$   WRITE SYS$OUTPUT "    DECC  :  To Compile With DEC C."
843$   WRITE SYS$OUTPUT "    GNUC  :  To Compile With GNU C."
844$   WRITE SYS$OUTPUT ""
845$!
846$!  Time To EXIT.
847$!
848$   EXIT
849$ ENDIF
850$!
851$! Time to check the contents, and to make sure we get the correct library.
852$!
853$ IF P3.EQS."SOCKETSHR" .OR. P3.EQS."MULTINET" .OR. P3.EQS."UCX" -
854     .OR. P3.EQS."TCPIP" .OR. P3.EQS."NONE"
855$ THEN
856$!
857$!  Check to see if SOCKETSHR was chosen
858$!
859$   IF P3.EQS."SOCKETSHR"
860$   THEN
861$!
862$!    Set the library to use SOCKETSHR
863$!
864$     TCPIP_LIB = "SYS$DISK:[-.VMS]SOCKETSHR_SHR.OPT/OPT"
865$!
866$!    Done with SOCKETSHR
867$!
868$   ENDIF
869$!
870$!  Check to see if MULTINET was chosen
871$!
872$   IF P3.EQS."MULTINET"
873$   THEN
874$!
875$!    Set the library to use UCX emulation.
876$!
877$     P3 = "UCX"
878$!
879$!    Done with MULTINET
880$!
881$   ENDIF
882$!
883$!  Check to see if UCX was chosen
884$!
885$   IF P3.EQS."UCX"
886$   THEN
887$!
888$!    Set the library to use UCX.
889$!
890$     TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_DECC.OPT/OPT"
891$     IF F$TRNLNM("UCX$IPC_SHR") .NES. ""
892$     THEN
893$       TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_DECC_LOG.OPT/OPT"
894$     ELSE
895$       IF COMPILER .NES. "DECC" .AND. ARCH .EQS. "VAX" THEN -
896	  TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_VAXC.OPT/OPT"
897$     ENDIF
898$!
899$!    Done with UCX
900$!
901$   ENDIF
902$!
903$!  Check to see if TCPIP (post UCX) was chosen
904$!
905$   IF P3.EQS."TCPIP"
906$   THEN
907$!
908$!    Set the library to use TCPIP.
909$!
910$     TCPIP_LIB = "SYS$DISK:[-.VMS]TCPIP_SHR_DECC.OPT/OPT"
911$!
912$!    Done with TCPIP
913$!
914$   ENDIF
915$!
916$!  Check to see if NONE was chosen
917$!
918$   IF P3.EQS."NONE"
919$   THEN
920$!
921$!    Do not use TCPIP.
922$!
923$     TCPIP_LIB = ""
924$!
925$!    Done with TCPIP
926$!
927$   ENDIF
928$!
929$!  Add TCP/IP type to CC definitions.
930$!
931$   CCDEFS = CCDEFS + ",TCPIP_TYPE_''P3'"
932$!
933$!  Print info
934$!
935$   WRITE SYS$OUTPUT "TCP/IP library spec: ", TCPIP_LIB
936$!
937$!  Else The User Entered An Invalid Argument.
938$!
939$ ELSE
940$!
941$!  Tell The User We Don't Know What They Want.
942$!
943$   WRITE SYS$OUTPUT ""
944$   WRITE SYS$OUTPUT "The Option ",P3," Is Invalid.  The Valid Options Are:"
945$   WRITE SYS$OUTPUT ""
946$   WRITE SYS$OUTPUT "    SOCKETSHR  :  To link with SOCKETSHR TCP/IP library."
947$   WRITE SYS$OUTPUT "    UCX        :  To link with UCX TCP/IP library."
948$   WRITE SYS$OUTPUT "    TCPIP      :  To link with TCPIP (post UCX) TCP/IP library."
949$   WRITE SYS$OUTPUT ""
950$!
951$!  Time To EXIT.
952$!
953$   EXIT
954$!
955$!  Done with TCP/IP libraries
956$!
957$ ENDIF
958$!
959$! Finish up the definition of CC.
960$!
961$ IF COMPILER .EQS. "DECC"
962$ THEN
963$   IF CCDISABLEWARNINGS .NES. ""
964$   THEN
965$     CCDISABLEWARNINGS = "/WARNING=(DISABLE=(" + CCDISABLEWARNINGS + "))"
966$   ENDIF
967$ ELSE
968$   CCDISABLEWARNINGS = ""
969$ ENDIF
970$ CC2 = CC + "/DEFINE=(" + CCDEFS + ",_POSIX_C_SOURCE)" + CCDISABLEWARNINGS
971$ CC = CC + "/DEFINE=(" + CCDEFS + ")" + CCDISABLEWARNINGS
972$!
973$! Show user the result
974$!
975$ WRITE/SYMBOL SYS$OUTPUT "Main Compiling Command: ",CC
976$!
977$! Special Threads For OpenVMS v7.1 Or Later
978$!
979$! Written By:  Richard Levitte
980$!              richard@levitte.org
981$!
982$!
983$! Check To See If We Have A Option For P4.
984$!
985$ IF (P4.EQS."")
986$ THEN
987$!
988$!  Get The Version Of VMS We Are Using.
989$!
990$   ISSEVEN :=
991$   TMP = F$ELEMENT(0,"-",F$EXTRACT(1,4,F$GETSYI("VERSION")))
992$   TMP = F$INTEGER(F$ELEMENT(0,".",TMP)+F$ELEMENT(1,".",TMP))
993$!
994$!  Check To See If The VMS Version Is v7.1 Or Later.
995$!
996$   IF (TMP.GE.71)
997$   THEN
998$!
999$!    We Have OpenVMS v7.1 Or Later, So Use The Special Threads.
1000$!
1001$     ISSEVEN := ,PTHREAD_USE_D4
1002$!
1003$!  End The VMS Version Check.
1004$!
1005$   ENDIF
1006$!
1007$! End The P4 Check.
1008$!
1009$ ENDIF
1010$!
1011$! Check if the user wanted to compile just a subset of all the programs.
1012$!
1013$ IF P5 .NES. ""
1014$ THEN
1015$   PROGRAMS = P5
1016$ ENDIF
1017$!
1018$!  Time To RETURN...
1019$!
1020$ RETURN
1021$!
1022$ INITIALISE:
1023$!
1024$! Save old value of the logical name OPENSSL
1025$!
1026$ __SAVE_OPENSSL = F$TRNLNM("OPENSSL","LNM$PROCESS_TABLE")
1027$!
1028$! Save directory information
1029$!
1030$ __HERE = F$PARSE(F$PARSE("A.;",F$ENVIRONMENT("PROCEDURE"))-"A.;","[]A.;") - "A.;"
1031$ __HERE = F$EDIT(__HERE,"UPCASE")
1032$ __TOP = __HERE - "APPS]"
1033$ __INCLUDE = __TOP + "INCLUDE.OPENSSL]"
1034$!
1035$! Set up the logical name OPENSSL to point at the include directory
1036$!
1037$ DEFINE OPENSSL/NOLOG '__INCLUDE'
1038$!
1039$! Done
1040$!
1041$ RETURN
1042$!
1043$ CLEANUP:
1044$!
1045$! Restore the logical name OPENSSL if it had a value
1046$!
1047$ IF __SAVE_OPENSSL .EQS. ""
1048$ THEN
1049$   DEASSIGN OPENSSL
1050$ ELSE
1051$   DEFINE/NOLOG OPENSSL '__SAVE_OPENSSL'
1052$ ENDIF
1053$!
1054$! Done
1055$!
1056$ RETURN
1057