1$!
2$!  MAKETESTS.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 all the various different
11$!  "test" programs for the different types of encryption for OpenSSL.
12$!  It was written so it would try to determine what "C" compiler to
13$!  use or you can specify which "C" compiler to use.
14$!
15$!  The test "executables" will be placed in a directory called
16$!  [.xxx.EXE.TEST] where "xxx" denotes ALPHA, IA64, or VAX, depending
17$!  on your machine architecture.
18$!
19$!  Specify DEBUG or NODEBUG 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$!
37$!  P4, if defined, sets a compiler thread NOT needed on OpenVMS 7.1 (and up)
38$!
39$!
40$!  P5, if defined, specifies the C pointer size.  Ignored on VAX.
41$!      ("64=ARGV" gives more efficient code with HP C V7.3 or newer.)
42$!      Supported values are:
43$!
44$!      ""       Compile with default (/NOPOINTER_SIZE)
45$!      32       Compile with /POINTER_SIZE=32 (SHORT)
46$!      64       Compile with /POINTER_SIZE=64[=ARGV] (LONG[=ARGV])
47$!               (Automatically select ARGV if compiler supports it.)
48$!      64=      Compile with /POINTER_SIZE=64 (LONG).
49$!      64=ARGV  Compile with /POINTER_SIZE=64=ARGV (LONG=ARGV).
50$!
51$!  P6, if defined, specifies a directory where ZLIB files (zlib.h,
52$!  libz.olb) may be found.  Optionally, a non-default object library
53$!  name may be included ("dev:[dir]libz_64.olb", for example).
54$!
55$!
56$! Announce/identify.
57$!
58$ proc = f$environment( "procedure")
59$ write sys$output "@@@ "+ -
60   f$parse( proc, , , "name")+ f$parse( proc, , , "type")
61$!
62$! Define A TCP/IP Library That We Will Need To Link To.
63$! (That is, If We Need To Link To One.)
64$!
65$ TCPIP_LIB = ""
66$ ZLIB_LIB = ""
67$!
68$! Check Which Architecture We Are Using.
69$!
70$ if (f$getsyi( "cpu") .lt. 128)
71$ then
72$    ARCH = "VAX"
73$ else
74$    ARCH = f$edit( f$getsyi( "ARCH_NAME"), "UPCASE")
75$    if (ARCH .eqs. "") then ARCH = "UNK"
76$ endif
77$!
78$ ARCHD = ARCH
79$ LIB32 = "32"
80$ OPT_FILE = ""
81$ POINTER_SIZE = ""
82$!
83$! Check To Make Sure We Have Valid Command Line Parameters.
84$!
85$ GOSUB CHECK_OPTIONS
86$!
87$! Define The OBJ and EXE Directories.
88$!
89$ OBJ_DIR := SYS$DISK:[-.'ARCHD'.OBJ.TEST]
90$ EXE_DIR := SYS$DISK:[-.'ARCHD'.EXE.TEST]
91$!
92$! Specify the destination directory in any /MAP option.
93$!
94$ if (LINKMAP .eqs. "MAP")
95$ then
96$   LINKMAP = LINKMAP+ "=''EXE_DIR'"
97$ endif
98$!
99$! Add the location prefix to the linker options file name.
100$!
101$ if (OPT_FILE .nes. "")
102$ then
103$   OPT_FILE = EXE_DIR+ OPT_FILE
104$ endif
105$!
106$! Initialise logical names and such
107$!
108$ GOSUB INITIALISE
109$!
110$! Tell The User What Kind of Machine We Run On.
111$!
112$ WRITE SYS$OUTPUT "Host system architecture: ''ARCHD'"
113$!
114$! Define The CRYPTO-LIB We Are To Use.
115$!
116$ CRYPTO_LIB := SYS$DISK:[-.'ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO'LIB32'.OLB
117$!
118$! Define The SSL We Are To Use.
119$!
120$ SSL_LIB := SYS$DISK:[-.'ARCHD'.EXE.SSL]SSL_LIBSSL'LIB32'.OLB
121$!
122$! Create the OBJ and EXE Directories, if needed.
123$!
124$ IF (F$PARSE(OBJ_DIR).EQS."") THEN -
125   CREATE /DIRECTORY 'OBJ_DIR'
126$ IF (F$PARSE(EXE_DIR).EQS."") THEN -
127   CREATE /DIRECTORY 'EXE_DIR'
128$!
129$! Check To See If We Have The Proper Libraries.
130$!
131$ GOSUB LIB_CHECK
132$!
133$! Check To See If We Have A Linker Option File.
134$!
135$ GOSUB CHECK_OPT_FILE
136$!
137$! Define The TEST Files.
138$! NOTE: Some might think this list ugly.  However, it's made this way to
139$! reflect the EXE variable in Makefile as closely as possible,
140$! thereby making it fairly easy to verify that the lists are the same.
141$!
142$ TEST_FILES = "BNTEST,ECTEST,ECDSATEST,ECDHTEST,IDEATEST,"+ -
143	       "MD2TEST,MD4TEST,MD5TEST,HMACTEST,WP_TEST,"+ -
144	       "RC2TEST,RC4TEST,RC5TEST,"+ -
145	       "DESTEST,SHATEST,SHA1TEST,SHA256T,SHA512T,"+ -
146	       "MDC2TEST,RMDTEST,"+ -
147	       "RANDTEST,DHTEST,ENGINETEST,"+ -
148	       "BFTEST,CASTTEST,SSLTEST,EXPTEST,DSATEST,RSA_TEST,"+ -
149	       "EVP_TEST,IGETEST,JPAKETEST,"+ -
150	       "ASN1TEST,CONSTANT_TIME_TEST"
151$! Should we add MTTEST,PQ_TEST,LH_TEST,DIVTEST,TABTEST as well?
152$!
153$! Additional directory information.
154$ T_D_BNTEST     := [-.crypto.bn]
155$ T_D_ECTEST     := [-.crypto.ec]
156$ T_D_ECDSATEST  := [-.crypto.ecdsa]
157$ T_D_ECDHTEST   := [-.crypto.ecdh]
158$ T_D_IDEATEST   := [-.crypto.idea]
159$ T_D_MD2TEST    := [-.crypto.md2]
160$ T_D_MD4TEST    := [-.crypto.md4]
161$ T_D_MD5TEST    := [-.crypto.md5]
162$ T_D_HMACTEST   := [-.crypto.hmac]
163$ T_D_WP_TEST    := [-.crypto.whrlpool]
164$ T_D_RC2TEST    := [-.crypto.rc2]
165$ T_D_RC4TEST    := [-.crypto.rc4]
166$ T_D_RC5TEST    := [-.crypto.rc5]
167$ T_D_DESTEST    := [-.crypto.des]
168$ T_D_SHATEST    := [-.crypto.sha]
169$ T_D_SHA1TEST   := [-.crypto.sha]
170$ T_D_SHA256T    := [-.crypto.sha]
171$ T_D_SHA512T    := [-.crypto.sha]
172$ T_D_MDC2TEST   := [-.crypto.mdc2]
173$ T_D_RMDTEST    := [-.crypto.ripemd]
174$ T_D_RANDTEST   := [-.crypto.rand]
175$ T_D_DHTEST     := [-.crypto.dh]
176$ T_D_ENGINETEST := [-.crypto.engine]
177$ T_D_BFTEST     := [-.crypto.bf]
178$ T_D_CASTTEST   := [-.crypto.cast]
179$ T_D_SSLTEST    := [-.ssl]
180$ T_D_EXPTEST    := [-.crypto.bn]
181$ T_D_DSATEST    := [-.crypto.dsa]
182$ T_D_RSA_TEST   := [-.crypto.rsa]
183$ T_D_EVP_TEST   := [-.crypto.evp]
184$ T_D_IGETEST    := [-.test]
185$ T_D_JPAKETEST  := [-.crypto.jpake]
186$ T_D_ASN1TEST   := [-.test]
187$ T_D_CONSTANT_TIME_TEST := [-.crypto]
188$!
189$ TCPIP_PROGRAMS = ",,"
190$ IF COMPILER .EQS. "VAXC" THEN -
191     TCPIP_PROGRAMS = ",SSLTEST,"
192$!
193$! Define A File Counter And Set It To "0".
194$!
195$ FILE_COUNTER = 0
196$!
197$! Top Of The File Loop.
198$!
199$ NEXT_FILE:
200$!
201$! O.K, Extract The File Name From The File List.
202$!
203$ FILE_NAME = F$ELEMENT(FILE_COUNTER,",",TEST_FILES)
204$!
205$! Check To See If We Are At The End Of The File List.
206$!
207$ IF (FILE_NAME.EQS.",") THEN GOTO FILE_DONE
208$!
209$! Increment The Counter.
210$!
211$ FILE_COUNTER = FILE_COUNTER + 1
212$!
213$! Create The Source File Name.
214$!
215$ SOURCE_FILE = "SYS$DISK:" + T_D_'FILE_NAME' + FILE_NAME + ".C"
216$!
217$! Create The Object File Name.
218$!
219$ OBJECT_FILE = OBJ_DIR + FILE_NAME + ".OBJ"
220$!
221$! Create The Executable File Name.
222$!
223$ EXE_FILE = EXE_DIR + FILE_NAME + ".EXE"
224$ ON WARNING THEN GOTO NEXT_FILE
225$!
226$! Check To See If The File We Want To Compile Actually Exists.
227$!
228$ IF (F$SEARCH(SOURCE_FILE).EQS."")
229$ THEN
230$!
231$!  Tell The User That The File Dosen't Exist.
232$!
233$   WRITE SYS$OUTPUT ""
234$   WRITE SYS$OUTPUT "The File ",SOURCE_FILE," Dosen't Exist."
235$   WRITE SYS$OUTPUT ""
236$!
237$!  Exit The Build.
238$!
239$   GOTO EXIT
240$ ENDIF
241$!
242$! Tell The User What We Are Building.
243$!
244$ WRITE SYS$OUTPUT "Building The ",FILE_NAME," Test Program."
245$!
246$! Compile The File.
247$!
248$ ON ERROR THEN GOTO NEXT_FILE
249$ CC /OBJECT='OBJECT_FILE' 'SOURCE_FILE'
250$ ON WARNING THEN GOTO NEXT_FILE
251$!
252$! Check If What We Are About To Compile Works Without A TCP/IP Library.
253$!
254$ IF ((TCPIP_LIB.EQS."").AND.((TCPIP_PROGRAMS-FILE_NAME).NES.TCPIP_PROGRAMS))
255$ THEN
256$!
257$!  Inform The User That A TCP/IP Library Is Needed To Compile This Program.
258$!
259$   WRITE SYS$OUTPUT -
260	  FILE_NAME," Needs A TCP/IP Library.  Can't Link.  Skipping..."
261$   GOTO NEXT_FILE
262$!
263$! End The TCP/IP Library Check.
264$!
265$ ENDIF
266$!
267$! Link The Program, Check To See If We Need To Link With RSAREF Or Not.
268$! Check To See If We Are To Link With A Specific TCP/IP Library.
269$!
270$!  Don't Link With The RSAREF Routines And TCP/IP Library.
271$!
272$ LINK /'DEBUGGER' /'LINKMAP' /'TRACEBACK' /EXECTABLE = 'EXE_FILE' -
273   'OBJECT_FILE', -
274   'SSL_LIB' /LIBRARY, -
275   'CRYPTO_LIB' /LIBRARY -
276   'TCPIP_LIB' -
277   'ZLIB_LIB' -
278   ,'OPT_FILE' /OPTIONS
279$!
280$! Go Back And Do It Again.
281$!
282$ GOTO NEXT_FILE
283$!
284$! All Done With This Library Part.
285$!
286$ FILE_DONE:
287$!
288$! All Done, Time To Exit.
289$!
290$ EXIT:
291$ GOSUB CLEANUP
292$ EXIT
293$!
294$! Check For The Link Option FIle.
295$!
296$ CHECK_OPT_FILE:
297$!
298$! Check To See If We Need To Make A VAX C Option File.
299$!
300$ IF (COMPILER.EQS."VAXC")
301$ THEN
302$!
303$!  Check To See If We Already Have A VAX C Linker Option File.
304$!
305$   IF (F$SEARCH(OPT_FILE).EQS."")
306$   THEN
307$!
308$!    We Need A VAX C Linker Option File.
309$!
310$     CREATE 'OPT_FILE'
311$DECK
312!
313! Default System Options File To Link Against 
314! The Sharable VAX C Runtime Library.
315!
316SYS$SHARE:VAXCRTL.EXE /SHAREABLE
317$EOD
318$!
319$!  End The Option File Check.
320$!
321$   ENDIF
322$!
323$! End The VAXC Check.
324$!
325$ ENDIF
326$!
327$! Check To See If We Need A GNU C Option File.
328$!
329$ IF (COMPILER.EQS."GNUC")
330$ THEN
331$!
332$!  Check To See If We Already Have A GNU C Linker Option File.
333$!
334$   IF (F$SEARCH(OPT_FILE).EQS."")
335$   THEN
336$!
337$!    We Need A GNU C Linker Option File.
338$!
339$     CREATE 'OPT_FILE'
340$DECK
341!
342! Default System Options File To Link Against 
343! The Sharable C Runtime Library.
344!
345GNU_CC:[000000]GCCLIB.OLB /LIBRARY
346SYS$SHARE:VAXCRTL.EXE /SHAREABLE
347$EOD
348$!
349$!  End The Option File Check.
350$!
351$   ENDIF
352$!
353$! End The GNU C Check.
354$!
355$ ENDIF
356$!
357$! Check To See If We Need A DEC C Option File.
358$!
359$ IF (COMPILER.EQS."DECC")
360$ THEN
361$!
362$!  Check To See If We Already Have A DEC C Linker Option File.
363$!
364$   IF (F$SEARCH(OPT_FILE).EQS."")
365$   THEN
366$!
367$!    Figure Out If We Need A non-VAX Or A VAX Linker Option File.
368$!
369$     IF (ARCH.EQS."VAX")
370$     THEN
371$!
372$!      We Need A DEC C Linker Option File For VAX.
373$!
374$       CREATE 'OPT_FILE'
375$DECK
376!
377! Default System Options File To Link Against 
378! The Sharable DEC C Runtime Library.
379!
380SYS$SHARE:DECC$SHR.EXE /SHAREABLE
381$EOD
382$!
383$!    Else...
384$!
385$     ELSE
386$!
387$!      Create The non-VAX Linker Option File.
388$!
389$       CREATE 'OPT_FILE'
390$DECK
391!
392! Default System Options File For non-VAX To Link Against 
393! The Sharable C Runtime Library.
394!
395SYS$SHARE:CMA$OPEN_LIB_SHR.EXE /SHAREABLE
396SYS$SHARE:CMA$OPEN_RTL.EXE /SHAREABLE
397$EOD
398$!
399$!    End The DEC C Option File Check.
400$!
401$     ENDIF
402$!
403$!  End The Option File Search.
404$!
405$   ENDIF
406$!
407$! End The DEC C Check.
408$!
409$ ENDIF
410$!
411$!  Tell The User What Linker Option File We Are Using.
412$!
413$ WRITE SYS$OUTPUT "Using Linker Option File ",OPT_FILE,"."	
414$!
415$! Time To RETURN.
416$!
417$ RETURN
418$!
419$! Check To See If We Have The Appropiate Libraries.
420$!
421$ LIB_CHECK:
422$!
423$! Look For The Library LIBCRYPTO.OLB.
424$!
425$ IF (F$SEARCH(CRYPTO_LIB).EQS."")
426$ THEN
427$!
428$!  Tell The User We Can't Find The LIBCRYPTO.OLB Library.
429$!
430$   WRITE SYS$OUTPUT ""
431$   WRITE SYS$OUTPUT "Can't Find The Library ",CRYPTO_LIB,"."
432$   WRITE SYS$OUTPUT "We Can't Link Without It."
433$   WRITE SYS$OUTPUT ""
434$!
435$!  Since We Can't Link Without It, Exit.
436$!
437$   EXIT
438$!
439$! End The Crypto Library Check.
440$!
441$ ENDIF
442$!
443$! Look For The Library LIBSSL.OLB.
444$!
445$ IF (F$SEARCH(SSL_LIB).EQS."")
446$ THEN
447$!
448$!  Tell The User We Can't Find The LIBSSL.OLB Library.
449$!
450$   WRITE SYS$OUTPUT ""
451$   WRITE SYS$OUTPUT "Can't Find The Library ",SSL_LIB,"."
452$   WRITE SYS$OUTPUT "Some Of The Test Programs Need To Link To It."
453$   WRITE SYS$OUTPUT ""
454$!
455$!  Since We Can't Link Without It, Exit.
456$!
457$   EXIT
458$!
459$! End The SSL Library Check.
460$!
461$ ENDIF
462$!
463$! Time To Return.
464$!
465$ RETURN
466$!
467$! Check The User's Options.
468$!
469$ CHECK_OPTIONS:
470$!
471$! Set basic C compiler /INCLUDE directories.
472$!
473$ CC_INCLUDES = "SYS$DISK:[-],SYS$DISK:[-.CRYPTO]"
474$!
475$! Check To See If P1 Is Blank.
476$!
477$ IF (P1.EQS."NODEBUG")
478$ THEN
479$!
480$!  P1 Is NODEBUG, So Compile Without Debugger Information.
481$!
482$   DEBUGGER  = "NODEBUG"
483$   LINKMAP = "NOMAP"
484$   TRACEBACK = "NOTRACEBACK" 
485$   GCC_OPTIMIZE = "OPTIMIZE"
486$   CC_OPTIMIZE = "OPTIMIZE"
487$   WRITE SYS$OUTPUT "No Debugger Information Will Be Produced During Compile."
488$   WRITE SYS$OUTPUT "Compiling With Compiler Optimization."
489$!
490$! Else...
491$!
492$ ELSE
493$!
494$!  Check To See If We Are To Compile With Debugger Information.
495$!
496$   IF (P1.EQS."DEBUG")
497$   THEN
498$!
499$!    Compile With Debugger Information.
500$!
501$     DEBUGGER  = "DEBUG"
502$     LINKMAP = "MAP"
503$     TRACEBACK = "TRACEBACK"
504$     GCC_OPTIMIZE = "NOOPTIMIZE"
505$     CC_OPTIMIZE = "NOOPTIMIZE"
506$     WRITE SYS$OUTPUT "Debugger Information Will Be Produced During Compile."
507$     WRITE SYS$OUTPUT "Compiling Without Compiler Optimization."
508$!
509$!  Else...
510$!
511$   ELSE
512$!
513$!    Tell The User Entered An Invalid Option.
514$!
515$     WRITE SYS$OUTPUT ""
516$     WRITE SYS$OUTPUT "The Option ",P1," Is Invalid.  The Valid Options Are:"
517$     WRITE SYS$OUTPUT ""
518$     WRITE SYS$OUTPUT "    DEBUG    :  Compile With The Debugger Information."
519$     WRITE SYS$OUTPUT "    NODEBUG  :  Compile Without The Debugger Information."
520$     WRITE SYS$OUTPUT ""
521$!
522$!    Time To EXIT.
523$!
524$     EXIT
525$!
526$!  End The Valid Argument Check.
527$!
528$   ENDIF
529$!
530$! End The P1 Check.
531$!
532$ ENDIF
533$!
534$! Check P5 (POINTER_SIZE).
535$!
536$ IF (P5 .NES. "") .AND. (ARCH .NES. "VAX")
537$ THEN
538$!
539$   IF (P5 .EQS. "32")
540$   THEN
541$     POINTER_SIZE = " /POINTER_SIZE=32"
542$   ELSE
543$     POINTER_SIZE = F$EDIT( P5, "COLLAPSE, UPCASE")
544$     IF ((POINTER_SIZE .EQS. "64") .OR. -
545       (POINTER_SIZE .EQS. "64=") .OR. -
546       (POINTER_SIZE .EQS. "64=ARGV"))
547$     THEN
548$       ARCHD = ARCH+ "_64"
549$       LIB32 = ""
550$       IF (F$EXTRACT( 2, 1, POINTER_SIZE) .EQS. "=")
551$       THEN
552$!        Explicit user choice: "64" or "64=ARGV".
553$         IF (POINTER_SIZE .EQS. "64=") THEN POINTER_SIZE = "64"
554$       ELSE
555$         SET NOON
556$         DEFINE /USER_MODE SYS$OUTPUT NL:
557$         DEFINE /USER_MODE SYS$ERROR NL:
558$         CC /NOLIST /NOOBJECT /POINTER_SIZE=64=ARGV NL:
559$         IF ($STATUS .AND. %X0FFF0000) .EQ. %X00030000
560$         THEN
561$           ! If we got here, it means DCL complained like this:
562$           ! %DCL-W-NOVALU, value not allowed - remove value specification
563$           !  \64=\
564$           !
565$           ! If the compiler was run, logicals defined in /USER would
566$           ! have been deassigned automatically.  However, when DCL
567$           ! complains, they aren't, so we do it here (it might be
568$           ! unnecessary, but just in case there will be another error
569$           ! message further on that we don't want to miss)
570$           DEASSIGN /USER_MODE SYS$ERROR
571$           DEASSIGN /USER_MODE SYS$OUTPUT
572$         ELSE
573$           POINTER_SIZE = POINTER_SIZE + "=ARGV"
574$         ENDIF
575$         SET ON
576$       ENDIF
577$       POINTER_SIZE = " /POINTER_SIZE=''POINTER_SIZE'"
578$     ELSE
579$!
580$!      Tell The User Entered An Invalid Option.
581$!
582$       WRITE SYS$OUTPUT ""
583$       WRITE SYS$OUTPUT "The Option ", P5, -
584         " Is Invalid.  The Valid Options Are:"
585$       WRITE SYS$OUTPUT ""
586$       WRITE SYS$OUTPUT -
587         "    """"  :  Compile with default (short) pointers."
588$       WRITE SYS$OUTPUT -
589         "    32  :  Compile with 32-bit (short) pointers."
590$       WRITE SYS$OUTPUT -
591         "    64       :  Compile with 64-bit (long) pointers (auto ARGV)."
592$       WRITE SYS$OUTPUT -
593         "    64=      :  Compile with 64-bit (long) pointers (no ARGV)."
594$       WRITE SYS$OUTPUT -
595         "    64=ARGV  :  Compile with 64-bit (long) pointers (ARGV)."
596$       WRITE SYS$OUTPUT ""
597$! 
598$!      Time To EXIT.
599$!
600$       EXIT
601$!
602$     ENDIF
603$!
604$   ENDIF
605$!
606$! End The P5 (POINTER_SIZE) Check.
607$!
608$ ENDIF
609$!
610$! Check To See If P2 Is Blank.
611$!
612$ IF (P2.EQS."")
613$ THEN
614$!
615$!  O.K., The User Didn't Specify A Compiler, Let's Try To
616$!  Find Out Which One To Use.
617$!
618$!  Check To See If We Have GNU C.
619$!
620$   IF (F$TRNLNM("GNU_CC").NES."")
621$   THEN
622$!
623$!    Looks Like GNUC, Set To Use GNUC.
624$!
625$     P2 = "GNUC"
626$!
627$!  End The GNU C Compiler Check.
628$!
629$   ELSE
630$!
631$!  Check To See If We Have VAXC Or DECC.
632$!
633$     IF (ARCH.NES."VAX").OR.(F$TRNLNM("DECC$CC_DEFAULT").NES."")
634$     THEN 
635$!
636$!      Looks Like DECC, Set To Use DECC.
637$!
638$       P2 = "DECC"
639$!
640$!      Else...
641$!
642$     ELSE
643$!
644$!      Looks Like VAXC, Set To Use VAXC.
645$!
646$       P2 = "VAXC"
647$!
648$!    End The VAXC Compiler Check.
649$!
650$     ENDIF
651$!
652$!  End The DECC & VAXC Compiler Check.
653$!
654$   ENDIF
655$!
656$!  End The Compiler Check.
657$!
658$ ENDIF
659$!
660$! Check To See If We Have A Option For P3.
661$!
662$ IF (P3.EQS."")
663$ THEN
664$!
665$!  Find out what socket library we have available
666$!
667$   IF F$PARSE("SOCKETSHR:") .NES. ""
668$   THEN
669$!
670$!    We have SOCKETSHR, and it is my opinion that it's the best to use.
671$!
672$     P3 = "SOCKETSHR"
673$!
674$!    Tell the user
675$!
676$     WRITE SYS$OUTPUT "Using SOCKETSHR for TCP/IP"
677$!
678$!    Else, let's look for something else
679$!
680$   ELSE
681$!
682$!    Like UCX (the reason to do this before Multinet is that the UCX
683$!    emulation is easier to use...)
684$!
685$     IF F$TRNLNM("UCX$IPC_SHR") .NES. "" -
686	 .OR. F$PARSE("SYS$SHARE:UCX$IPC_SHR.EXE") .NES. "" -
687	 .OR. F$PARSE("SYS$LIBRARY:UCX$IPC.OLB") .NES. ""
688$     THEN
689$!
690$!	Last resort: a UCX or UCX-compatible library
691$!
692$	P3 = "UCX"
693$!
694$!      Tell the user
695$!
696$       WRITE SYS$OUTPUT "Using UCX or an emulation thereof for TCP/IP"
697$!
698$!	That was all...
699$!
700$     ENDIF
701$   ENDIF
702$ ENDIF
703$!
704$! Set Up Initial CC Definitions, Possibly With User Ones
705$!
706$ CCDEFS = "TCPIP_TYPE_''P3'"
707$ IF F$TYPE(USER_CCDEFS) .NES. "" THEN CCDEFS = CCDEFS + "," + USER_CCDEFS
708$ CCEXTRAFLAGS = ""
709$ IF F$TYPE(USER_CCFLAGS) .NES. "" THEN CCEXTRAFLAGS = USER_CCFLAGS
710$ CCDISABLEWARNINGS = "" !!! "LONGLONGTYPE,LONGLONGSUFX,FOUNDCR"
711$ IF F$TYPE(USER_CCDISABLEWARNINGS) .NES. "" THEN -
712	CCDISABLEWARNINGS = CCDISABLEWARNINGS + "," + USER_CCDISABLEWARNINGS
713$!
714$! Check To See If We Have A ZLIB Option.
715$!
716$ ZLIB = P6
717$ IF (ZLIB .NES. "")
718$ THEN
719$!
720$!  Check for expected ZLIB files.
721$!
722$   err = 0
723$   file1 = f$parse( "zlib.h", ZLIB, , , "SYNTAX_ONLY")
724$   if (f$search( file1) .eqs. "")
725$   then
726$     WRITE SYS$OUTPUT ""
727$     WRITE SYS$OUTPUT "The Option ", ZLIB, " Is Invalid."
728$     WRITE SYS$OUTPUT "    Can't find header: ''file1'"
729$     err = 1
730$   endif
731$   file1 = f$parse( "A.;", ZLIB)- "A.;"
732$!
733$   file2 = f$parse( ZLIB, "libz.olb", , , "SYNTAX_ONLY")
734$   if (f$search( file2) .eqs. "")
735$   then
736$     if (err .eq. 0)
737$     then
738$       WRITE SYS$OUTPUT ""
739$       WRITE SYS$OUTPUT "The Option ", ZLIB, " Is Invalid."
740$     endif
741$     WRITE SYS$OUTPUT "    Can't find library: ''file2'"
742$     WRITE SYS$OUTPUT ""
743$     err = err+ 2
744$   endif
745$   if (err .eq. 1)
746$   then
747$     WRITE SYS$OUTPUT ""
748$   endif
749$!
750$   if (err .ne. 0)
751$   then
752$     GOTO EXIT
753$   endif
754$!
755$   CCDEFS = """ZLIB=1"", "+ CCDEFS
756$   CC_INCLUDES = CC_INCLUDES+ ", "+ file1
757$   ZLIB_LIB = ", ''file2' /library"
758$!
759$!  Print info
760$!
761$   WRITE SYS$OUTPUT "ZLIB library spec: ", file2
762$!
763$! End The P8 Check.
764$!
765$ ENDIF
766$!
767$!  Check To See If The User Entered A Valid Parameter.
768$!
769$ IF (P2.EQS."VAXC").OR.(P2.EQS."DECC").OR.(P2.EQS."GNUC")
770$ THEN
771$!
772$!  Check To See If The User Wanted DECC.
773$!
774$   IF (P2.EQS."DECC")
775$   THEN
776$!
777$!    Looks Like DECC, Set To Use DECC.
778$!
779$     COMPILER = "DECC"
780$!
781$!    Tell The User We Are Using DECC.
782$!
783$     WRITE SYS$OUTPUT "Using DECC 'C' Compiler."
784$!
785$!    Use DECC...
786$!
787$     CC = "CC"
788$     IF ARCH.EQS."VAX" .AND. F$TRNLNM("DECC$CC_DEFAULT").NES."/DECC" -
789	 THEN CC = "CC /DECC"
790$     CC = CC + " /''CC_OPTIMIZE' /''DEBUGGER' /STANDARD=RELAXED"+ -
791       "''POINTER_SIZE' /NOLIST /PREFIX=ALL" + -
792       " /INCLUDE=(''CC_INCLUDES') " + CCEXTRAFLAGS
793$!
794$!    Define The Linker Options File Name.
795$!
796$     OPT_FILE = "VAX_DECC_OPTIONS.OPT"
797$!
798$!  End DECC Check.
799$!
800$   ENDIF
801$!
802$!  Check To See If We Are To Use VAXC.
803$!
804$   IF (P2.EQS."VAXC")
805$   THEN
806$!
807$!    Looks Like VAXC, Set To Use VAXC.
808$!
809$     COMPILER = "VAXC"
810$!
811$!    Tell The User We Are Using VAX C.
812$!
813$     WRITE SYS$OUTPUT "Using VAXC 'C' Compiler."
814$!
815$!    Compile Using VAXC.
816$!
817$     CC = "CC"
818$     IF ARCH.NES."VAX"
819$     THEN
820$	WRITE SYS$OUTPUT "There is no VAX C on ''ARCH'!"
821$	EXIT
822$     ENDIF
823$     IF F$TRNLNM("DECC$CC_DEFAULT").EQS."/DECC" THEN CC = "CC /VAXC"
824$     CC = CC + "/''CC_OPTIMIZE' /''DEBUGGER' /NOLIST" + -
825	   "/INCLUDE=(''CC_INCLUDES')" + CCEXTRAFLAGS
826$     CCDEFS = CCDEFS + ",""VAXC"""
827$!
828$!    Define <sys> As SYS$COMMON:[SYSLIB]
829$!
830$     DEFINE /NOLOG SYS SYS$COMMON:[SYSLIB]
831$!
832$!    Define The Linker Options File Name.
833$!
834$     OPT_FILE = "VAX_VAXC_OPTIONS.OPT"
835$!
836$!  End VAXC Check
837$!
838$   ENDIF
839$!
840$!  Check To See If We Are To Use GNU C.
841$!
842$   IF (P2.EQS."GNUC")
843$   THEN
844$!
845$!    Looks Like GNUC, Set To Use GNUC.
846$!
847$     COMPILER = "GNUC"
848$!
849$!    Tell The User We Are Using GNUC.
850$!
851$     WRITE SYS$OUTPUT "Using GNU 'C' Compiler."
852$!
853$!    Use GNU C...
854$!
855$     CC = "GCC /NOCASE_HACK /''GCC_OPTIMIZE' /''DEBUGGER' /NOLIST" + -
856	   "/INCLUDE=(''CC_INCLUDES')" + CCEXTRAFLAGS
857$!
858$!    Define The Linker Options File Name.
859$!
860$     OPT_FILE = "VAX_GNUC_OPTIONS.OPT"
861$!
862$!  End The GNU C Check.
863$!
864$   ENDIF
865$!
866$!  Set up default defines
867$!
868$   CCDEFS = """FLAT_INC=1""," + CCDEFS
869$!
870$!  Finish up the definition of CC.
871$!
872$   IF COMPILER .EQS. "DECC"
873$   THEN
874$     IF CCDISABLEWARNINGS .EQS. ""
875$     THEN
876$       CC4DISABLEWARNINGS = "DOLLARID"
877$     ELSE
878$       CC4DISABLEWARNINGS = CCDISABLEWARNINGS + ",DOLLARID"
879$       CCDISABLEWARNINGS = " /WARNING=(DISABLE=(" + CCDISABLEWARNINGS + "))"
880$     ENDIF
881$     CC4DISABLEWARNINGS = " /WARNING=(DISABLE=(" + CC4DISABLEWARNINGS + "))"
882$   ELSE
883$     CCDISABLEWARNINGS = ""
884$     CC4DISABLEWARNINGS = ""
885$   ENDIF
886$   CC = CC + " /DEFINE=(" + CCDEFS + ")" + CCDISABLEWARNINGS
887$!
888$!  Show user the result
889$!
890$   WRITE /SYMBOL SYS$OUTPUT "Main Compiling Command: ", CC
891$!
892$!  Else The User Entered An Invalid Argument.
893$!
894$ ELSE
895$!
896$!  Tell The User We Don't Know What They Want.
897$!
898$   WRITE SYS$OUTPUT ""
899$   WRITE SYS$OUTPUT "The Option ",P2," Is Invalid.  The Valid Options Are:"
900$   WRITE SYS$OUTPUT ""
901$   WRITE SYS$OUTPUT "    VAXC  :  To Compile With VAX C."
902$   WRITE SYS$OUTPUT "    DECC  :  To Compile With DEC C."
903$   WRITE SYS$OUTPUT "    GNUC  :  To Compile With GNU C."
904$   WRITE SYS$OUTPUT ""
905$!
906$!  Time To EXIT.
907$!
908$   EXIT
909$ ENDIF
910$!
911$! Time to check the contents, and to make sure we get the correct library.
912$!
913$ IF P3.EQS."SOCKETSHR" .OR. P3.EQS."MULTINET" .OR. P3.EQS."UCX" -
914     .OR. P3.EQS."TCPIP" .OR. P3.EQS."NONE"
915$ THEN
916$!
917$!  Check to see if SOCKETSHR was chosen
918$!
919$   IF P3.EQS."SOCKETSHR"
920$   THEN
921$!
922$!    Set the library to use SOCKETSHR
923$!
924$     TCPIP_LIB = ",SYS$DISK:[-.VMS]SOCKETSHR_SHR.OPT /OPTIONS"
925$!
926$!    Done with SOCKETSHR
927$!
928$   ENDIF
929$!
930$!  Check to see if MULTINET was chosen
931$!
932$   IF P3.EQS."MULTINET"
933$   THEN
934$!
935$!    Set the library to use UCX emulation.
936$!
937$     P3 = "UCX"
938$!
939$!    Done with MULTINET
940$!
941$   ENDIF
942$!
943$!  Check to see if UCX was chosen
944$!
945$   IF P3.EQS."UCX"
946$   THEN
947$!
948$!    Set the library to use UCX.
949$!
950$     TCPIP_LIB = ",SYS$DISK:[-.VMS]UCX_SHR_DECC.OPT /OPTIONS"
951$     IF F$TRNLNM("UCX$IPC_SHR") .NES. ""
952$     THEN
953$       TCPIP_LIB = ",SYS$DISK:[-.VMS]UCX_SHR_DECC_LOG.OPT /OPTIONS"
954$     ELSE
955$       IF COMPILER .NES. "DECC" .AND. ARCH .EQS. "VAX" THEN -
956	  TCPIP_LIB = ",SYS$DISK:[-.VMS]UCX_SHR_VAXC.OPT /OPTIONS"
957$     ENDIF
958$!
959$!    Done with UCX
960$!
961$   ENDIF
962$!
963$!  Check to see if TCPIP was chosen
964$!
965$   IF P3.EQS."TCPIP"
966$   THEN
967$!
968$!    Set the library to use TCPIP (post UCX).
969$!
970$     TCPIP_LIB = ",SYS$DISK:[-.VMS]TCPIP_SHR_DECC.OPT /OPTIONS"
971$!
972$!    Done with TCPIP
973$!
974$   ENDIF
975$!
976$!  Check to see if NONE was chosen
977$!
978$   IF P3.EQS."NONE"
979$   THEN
980$!
981$!    Do not use a TCPIP library.
982$!
983$     TCPIP_LIB = ""
984$!
985$!    Done with NONE
986$!
987$   ENDIF
988$!
989$!  Print info
990$!
991$   WRITE SYS$OUTPUT "TCP/IP library spec: ", TCPIP_LIB- ","
992$!
993$!  Else The User Entered An Invalid Argument.
994$!
995$ ELSE
996$!
997$!  Tell The User We Don't Know What They Want.
998$!
999$   WRITE SYS$OUTPUT ""
1000$   WRITE SYS$OUTPUT "The Option ",P3," Is Invalid.  The Valid Options Are:"
1001$   WRITE SYS$OUTPUT ""
1002$   WRITE SYS$OUTPUT "    SOCKETSHR  :  To link with SOCKETSHR TCP/IP library."
1003$   WRITE SYS$OUTPUT "    UCX        :  To link with UCX TCP/IP library."
1004$   WRITE SYS$OUTPUT "    TCPIP      :  To link with TCPIP (post UCX) TCP/IP library."
1005$   WRITE SYS$OUTPUT ""
1006$!
1007$!  Time To EXIT.
1008$!
1009$   EXIT
1010$!
1011$!  Done with TCP/IP libraries
1012$!
1013$ ENDIF
1014$!
1015$! Special Threads For OpenVMS v7.1 Or Later
1016$!
1017$! Written By:  Richard Levitte
1018$!              richard@levitte.org
1019$!
1020$!
1021$! Check To See If We Have A Option For P4.
1022$!
1023$ IF (P4.EQS."")
1024$ THEN
1025$!
1026$!  Get The Version Of VMS We Are Using.
1027$!
1028$   ISSEVEN :=
1029$   TMP = F$ELEMENT(0,"-",F$EXTRACT(1,4,F$GETSYI("VERSION")))
1030$   TMP = F$INTEGER(F$ELEMENT(0,".",TMP)+F$ELEMENT(1,".",TMP))
1031$!
1032$!  Check To See If The VMS Version Is v7.1 Or Later.
1033$!
1034$   IF (TMP.GE.71)
1035$   THEN
1036$!
1037$!    We Have OpenVMS v7.1 Or Later, So Use The Special Threads.
1038$!
1039$     ISSEVEN := ,PTHREAD_USE_D4
1040$!
1041$!  End The VMS Version Check.
1042$!
1043$   ENDIF
1044$!
1045$! End The P4 Check.
1046$!
1047$ ENDIF
1048$!
1049$!  Time To RETURN...
1050$!
1051$ RETURN
1052$!
1053$ INITIALISE:
1054$!
1055$! Save old value of the logical name OPENSSL
1056$!
1057$ __SAVE_OPENSSL = F$TRNLNM("OPENSSL","LNM$PROCESS_TABLE")
1058$!
1059$! Save directory information
1060$!
1061$ __HERE = F$PARSE(F$PARSE("A.;",F$ENVIRONMENT("PROCEDURE"))-"A.;","[]A.;") - "A.;"
1062$ __HERE = F$EDIT(__HERE,"UPCASE")
1063$ __TOP = __HERE - "TEST]"
1064$ __INCLUDE = __TOP + "INCLUDE.OPENSSL]"
1065$!
1066$! Set up the logical name OPENSSL to point at the include directory
1067$!
1068$ DEFINE OPENSSL /NOLOG '__INCLUDE'
1069$!
1070$! Done
1071$!
1072$ RETURN
1073$!
1074$ CLEANUP:
1075$!
1076$! Restore the logical name OPENSSL if it had a value
1077$!
1078$ IF __SAVE_OPENSSL .EQS. ""
1079$ THEN
1080$   DEASSIGN OPENSSL
1081$ ELSE
1082$   DEFINE /NOLOG OPENSSL '__SAVE_OPENSSL'
1083$ ENDIF
1084$!
1085$! Done
1086$!
1087$ RETURN
1088