1$!
2$! MAKEVMS.COM
3$! Original Author:  UNKNOWN
4$! Rewritten By:  Robert Byer
5$!                Vice-President
6$!                A-Com Computing, Inc.
7$!                byer@mail.all-net.net
8$!
9$! Changes by Richard Levitte <richard@levitte.org>
10$!	      Zoltan Arpadffy <zoli@polarhome.com>
11$!
12$! This procedure creates the SSL libraries of "[.xxx.EXE.CRYPTO]LIBCRYPTO.OLB"
13$! "[.xxx.EXE.SSL]LIBSSL.OLB"
14$! The "xxx" denotes the machine architecture of ALPHA, IA64 or VAX.
15$!
16$! This procedures accepts two command line options listed below.
17$!
18$! P1 specifies one of the following build options:
19$!
20$!      ALL       Just build "everything".
21$!      CONFIG    Just build the "[.CRYPTO._xxx]OPENSSLCONF.H" file.
22$!      BUILDINF  Just build the "[.CRYPTO._xxx]BUILDINF.H" file.
23$!      SOFTLINKS Just fix the Unix soft links.
24$!      BUILDALL  Same as ALL, except CONFIG, BUILDINF and SOFTILNKS aren't done.
25$!      CRYPTO    Just build the "[.xxx.EXE.CRYPTO]LIBCRYPTO.OLB" library.
26$!      CRYPTO/x  Just build the x part of the
27$!                "[.xxx.EXE.CRYPTO]LIBCRYPTO.OLB" library.
28$!      SSL       Just build the "[.xxx.EXE.SSL]LIBSSL.OLB" library.
29$!      SSL_TASK  Just build the "[.xxx.EXE.SSL]SSL_TASK.EXE" program.
30$!      TEST      Just build the "[.xxx.EXE.TEST]" test programs for OpenSSL.
31$!      APPS      Just build the "[.xxx.EXE.APPS]" application programs for OpenSSL.
32$!      ENGINES   Just build the "[.xxx.EXE.ENGINES]" application programs for OpenSSL.
33$!
34$! P2, if defined, specifies the C pointer size.  Ignored on VAX.
35$!      ("64=ARGV" gives more efficient code with HP C V7.3 or newer.)
36$!      Supported values are:
37$!
38$!      ""       Compile with default (/NOPOINTER_SIZE).
39$!      32       Compile with /POINTER_SIZE=32 (SHORT).
40$!      64       Compile with /POINTER_SIZE=64[=ARGV] (LONG[=ARGV]).
41$!               (Automatically select ARGV if compiler supports it.)
42$!      64=      Compile with /POINTER_SIZE=64 (LONG).
43$!      64=ARGV  Compile with /POINTER_SIZE=64=ARGV (LONG=ARGV).
44$!
45$! P3 specifies DEBUG or NODEBUG, to compile with or without debugging
46$!    information.
47$!
48$! P4 specifies which compiler to try to compile under.
49$!
50$!	  VAXC	 For VAX C.
51$!	  DECC	 For DEC C.
52$!	  GNUC	 For GNU C.
53$!	  LINK   To only link the programs from existing object files.
54$!               (not yet implemented)
55$!
56$! If you don't specify a compiler, it will try to determine which
57$! "C" compiler to use.
58$!
59$! P5, if defined, sets a TCP/IP library to use, through one of the following
60$! keywords:
61$!
62$!	UCX		for UCX or UCX emulation
63$!	TCPIP		for TCP/IP Services or TCP/IP Services emulation
64$!			(this is prefered over UCX)
65$!	SOCKETSHR	for SOCKETSHR+NETLIB
66$!	NONE		to avoid specifying which TCP/IP implementation to
67$!			use at build time (this works with DEC C).  This is
68$!			the default.
69$!
70$! P6, if defined, sets a compiler thread NOT needed on OpenVMS 7.1 (and up).
71$!
72$! P7, if defined, specifies a directory where ZLIB files (zlib.h,
73$! libz.olb) may be found.  Optionally, a non-default object library
74$! name may be included ("dev:[dir]libz_64.olb", for example).
75$!
76$!
77$! Announce/identify.
78$!
79$ proc = f$environment( "procedure")
80$ write sys$output "@@@ "+ -
81   f$parse( proc, , , "name")+ f$parse( proc, , , "type")
82$!
83$ DEF_ORIG = F$ENVIRONMENT( "DEFAULT")
84$ ON ERROR THEN GOTO TIDY
85$ ON CONTROL_C THEN GOTO TIDY
86$!
87$! Check if we're in a batch job, and make sure we get to
88$! the directory this script is in
89$!
90$ IF F$MODE() .EQS. "BATCH"
91$ THEN
92$   COMNAME=F$ENVIRONMENT("PROCEDURE")
93$   COMPATH=F$PARSE("A.;",COMNAME) - "A.;"
94$   SET DEF 'COMPATH'
95$ ENDIF
96$!
97$! Check What Architecture We Are Using.
98$!
99$ IF (F$GETSYI("CPU").LT.128)
100$ THEN
101$!
102$!  The Architecture Is VAX.
103$!
104$   ARCH = "VAX"
105$!
106$! Else...
107$!
108$ ELSE
109$!
110$!  The Architecture Is Alpha, IA64 or whatever comes in the future.
111$!
112$   ARCH = F$EDIT( F$GETSYI( "ARCH_NAME"), "UPCASE")
113$   IF (ARCH .EQS. "") THEN ARCH = "UNK"
114$!
115$! End The Architecture Check.
116$!
117$ ENDIF
118$!
119$ ARCHD = ARCH
120$ LIB32 = "32"
121$ POINTER_SIZE = ""
122$!
123$! Get VMS version.
124$!
125$ VMS_VERSION = f$edit( f$getsyi( "VERSION"), "TRIM")
126$!
127$! Check To Make Sure We Have Valid Command Line Parameters.
128$!
129$ GOSUB CHECK_OPTIONS
130$!
131$! Check To See What We Are To Do.
132$!
133$ IF (BUILDCOMMAND.EQS."ALL")
134$ THEN
135$!
136$!  Start with building the OpenSSL configuration file.
137$!
138$   GOSUB CONFIG
139$!
140$!  Create The "BUILDINF.H" Include File.
141$!
142$   GOSUB BUILDINF
143$!
144$!  Fix The Unix Softlinks.
145$!
146$   GOSUB SOFTLINKS
147$!
148$ ENDIF
149$!
150$ IF (BUILDCOMMAND.EQS."ALL".OR.BUILDCOMMAND.EQS."BUILDALL")
151$ THEN
152$!
153$!  Build The [.xxx.EXE.CRYPTO]LIBCRYPTO.OLB Library.
154$!
155$   GOSUB CRYPTO
156$!
157$!  Build The [.xxx.EXE.SSL]LIBSSL.OLB Library.
158$!
159$   GOSUB SSL
160$!
161$!  Build The [.xxx.EXE.SSL]SSL_TASK.EXE DECNet SSL Engine.
162$!
163$   GOSUB SSL_TASK
164$!
165$!  Build The [.xxx.EXE.TEST] OpenSSL Test Utilities.
166$!
167$   GOSUB TEST
168$!
169$!  Build The [.xxx.EXE.APPS] OpenSSL Application Utilities.
170$!
171$   GOSUB APPS
172$!
173$!  Build The [.xxx.EXE.ENGINES] OpenSSL Shareable Engines.
174$!
175$   GOSUB ENGINES
176$!
177$! Else...
178$!
179$ ELSE
180$!
181$!    Build Just What The User Wants Us To Build.
182$!
183$     GOSUB 'BUILDCOMMAND'
184$!
185$ ENDIF
186$!
187$! Time To EXIT.
188$!
189$ GOTO TIDY
190$!
191$! Rebuild The [.CRYPTO._xxx]OPENSSLCONF.H" file.
192$!
193$ CONFIG:
194$!
195$! Tell The User We Are Creating The [.CRYPTO._xxx]OPENSSLCONF.H File.
196$!
197$ WRITE SYS$OUTPUT "Creating [.CRYPTO.''ARCHD']OPENSSLCONF.H Include File."
198$!
199$! First, make sure the directory exists.
200$!
201$ IF F$PARSE("SYS$DISK:[.CRYPTO.''ARCHD']") .EQS. "" THEN -
202     CREATE/DIRECTORY SYS$DISK:[.CRYPTO.'ARCHD']
203$!
204$! Different tar/UnZip versions/option may have named the file differently
205$ IF F$SEARCH("[.crypto]opensslconf.h_in") .NES. ""
206$ THEN
207$   OPENSSLCONF_H_IN = "[.crypto]opensslconf.h_in"
208$ ELSE
209$   IF F$SEARCH( "[.crypto]opensslconf_h.in") .NES. ""
210$   THEN
211$     OPENSSLCONF_H_IN = "[.crypto]opensslconf_h.in"
212$   ELSE
213$     ! For ODS-5
214$     IF F$SEARCH( "[.crypto]opensslconf.h.in") .NES. ""
215$     THEN
216$       OPENSSLCONF_H_IN = "[.crypto]opensslconf.h.in"
217$     ELSE
218$       WRITE SYS$ERROR "Couldn't find a [.crypto]opensslconf.h.in.  Exiting!"
219$       $STATUS = %X00018294 ! "%RMS-F-FNF, file not found".
220$       GOTO TIDY
221$     ENDIF
222$   ENDIF
223$ ENDIF
224$!
225$! Create The [.CRYPTO._xxx]OPENSSLCONF.H File.
226$! Make sure it has the right format.
227$!
228$ OSCH_NAME = "SYS$DISK:[.CRYPTO.''ARCHD']OPENSSLCONF.H"
229$ CREATE /FDL=SYS$INPUT: 'OSCH_NAME'
230RECORD
231        FORMAT stream_lf
232$ OPEN /APPEND H_FILE 'OSCH_NAME'
233$!
234$! Write The [.CRYPTO._xxx]OPENSSLCONF.H File.
235$!
236$ WRITE H_FILE "/* This file was automatically built using makevms.com */"
237$ WRITE H_FILE "/* and ''OPENSSLCONF_H_IN' */"
238$!
239$! Write a few macros that indicate how this system was built.
240$!
241$ WRITE H_FILE ""
242$ WRITE H_FILE "#ifndef OPENSSL_SYS_VMS"
243$ WRITE H_FILE "# define OPENSSL_SYS_VMS"
244$ WRITE H_FILE "#endif"
245$
246$! One of the best way to figure out what the list should be is to do
247$! the following on a Unix system:
248$!   grep OPENSSL_NO_ crypto/*/*.h ssl/*.h engines/*.h engines/*/*.h|grep ':# *if'|sed -e 's/^.*def //'|sort|uniq
249$! For that reason, the list will also always end up in alphabetical order
250$ CONFIG_LOGICALS := AES,-
251		     ASM,INLINE_ASM,-
252		     BF,-
253		     BIO,-
254		     BUFFER,-
255		     BUF_FREELISTS,-
256		     CAMELLIA,-
257		     CAST,-
258		     CMS,-
259		     COMP,-
260		     DEPRECATED,-
261		     DES,-
262		     DGRAM,-
263		     DH,-
264		     DSA,-
265		     EC,-
266		     EC2M,-
267		     ECDH,-
268		     ECDSA,-
269		     EC_NISTP_64_GCC_128,-
270		     ENGINE,-
271		     ERR,-
272		     EVP,-
273		     FP_API,-
274		     GMP,-
275		     GOST,-
276		     HASH_COMP,-
277		     HMAC,-
278		     IDEA,-
279		     JPAKE,-
280		     KRB5,-
281		     LHASH,-
282		     MD2,-
283		     MD4,-
284		     MD5,-
285		     MDC2,-
286		     OCSP,-
287		     PSK,-
288		     RC2,-
289		     RC4,-
290		     RC5,-
291		     RFC3779,-
292		     RIPEMD,-
293		     RSA,-
294		     SEED,-
295		     SHA,-
296		     SHA0,-
297		     SHA1,-
298		     SHA256,-
299		     SHA512,-
300		     SOCK,-
301		     SRP,-
302		     SSL2,-
303		     SSL_INTERN,-
304		     STACK,-
305		     STATIC_ENGINE,-
306		     STDIO,-
307		     STORE,-
308		     TLSEXT,-
309		     WHIRLPOOL,-
310		     X509
311$! Add a few that we know about
312$ CONFIG_LOGICALS := 'CONFIG_LOGICALS',-
313		     THREADS
314$! The following rules, which dictate how some algorithm choices affect
315$! others, are picked from Configure.
316$! Quick syntax:
317$!  list = item[ ; list]
318$!  item = algos / dependents
319$!  algos = algo [, algos]
320$!  dependents = dependent [, dependents]
321$! When a list of algos is specified in one item, it means that they must
322$! all be disabled for the rule to apply.
323$! When a list of dependents is specified in one item, it means that they
324$! will all be disabled if the rule applies.
325$! Rules are checked sequentially.  If a rule disables an algorithm, it will
326$! affect all following rules that depend on that algorithm being disabled.
327$! To force something to be enabled or disabled, have no algorithms in the
328$! algos part.
329$ CONFIG_DISABLE_RULES := RIJNDAEL/AES;-
330			  DES/MDC2;-
331			  EC/ECDSA,ECDH;-
332			  MD5/SSL2,SSL3,TLS1;-
333			  SHA/SSL3,TLS1;-
334			  RSA/SSL2;-
335			  RSA,DSA/SSL2;-
336			  DH/SSL3,TLS1;-
337			  TLS1/TLSEXT;-
338			  EC/GOST;-
339			  DSA/GOST;-
340			  DH/GOST;-
341			  /STATIC_ENGINE;-
342			  /KRB5;-
343			  /EC_NISTP_64_GCC_128
344$ CONFIG_ENABLE_RULES := ZLIB_DYNAMIC/ZLIB;-
345			 /THREADS
346$
347$! Architecture specific rule addtions
348$ IF ARCH .EQS. "VAX"
349$ THEN
350$   ! Disable algorithms that require 64-bit integers in C
351$   CONFIG_DISABLE_RULES = CONFIG_DISABLE_RULES + -
352			   ";/GOST" + -
353			   ";/WHIRLPOOL"
354$ ENDIF
355$
356$ CONFIG_LOG_I = 0
357$ CONFIG_LOG_LOOP1:
358$   CONFIG_LOG_E = F$EDIT(F$ELEMENT(CONFIG_LOG_I,",",CONFIG_LOGICALS),"TRIM")
359$   CONFIG_LOG_I = CONFIG_LOG_I + 1
360$   IF CONFIG_LOG_E .EQS. "" THEN GOTO CONFIG_LOG_LOOP1
361$   IF CONFIG_LOG_E .EQS. "," THEN GOTO CONFIG_LOG_LOOP1_END
362$   IF F$TRNLNM("OPENSSL_NO_"+CONFIG_LOG_E)
363$   THEN
364$       CONFIG_DISABLED_'CONFIG_LOG_E' := YES
365$       CONFIG_ENABLED_'CONFIG_LOG_E' := NO
366$	CONFIG_CHANGED_'CONFIG_LOG_E' := YES
367$   ELSE
368$       CONFIG_DISABLED_'CONFIG_LOG_E' := NO
369$       CONFIG_ENABLED_'CONFIG_LOG_E' := YES
370$	! Because all algorithms are assumed enabled by default
371$	CONFIG_CHANGED_'CONFIG_LOG_E' := NO
372$   ENDIF
373$   GOTO CONFIG_LOG_LOOP1
374$ CONFIG_LOG_LOOP1_END:
375$
376$! Apply cascading disable rules
377$ CONFIG_DISABLE_I = 0
378$ CONFIG_DISABLE_LOOP0:
379$   CONFIG_DISABLE_E = F$EDIT(F$ELEMENT(CONFIG_DISABLE_I,";", -
380     CONFIG_DISABLE_RULES),"TRIM")
381$   CONFIG_DISABLE_I = CONFIG_DISABLE_I + 1
382$   IF CONFIG_DISABLE_E .EQS. "" THEN GOTO CONFIG_DISABLE_LOOP0
383$   IF CONFIG_DISABLE_E .EQS. ";" THEN GOTO CONFIG_DISABLE_LOOP0_END
384$
385$   CONFIG_DISABLE_ALGOS = F$EDIT(F$ELEMENT(0,"/",CONFIG_DISABLE_E),"TRIM")
386$   CONFIG_DISABLE_DEPENDENTS = F$EDIT(F$ELEMENT(1,"/",CONFIG_DISABLE_E),"TRIM")
387$   TO_DISABLE := YES
388$   CONFIG_ALGO_I = 0
389$   CONFIG_DISABLE_LOOP1:
390$     CONFIG_ALGO_E = F$EDIT(F$ELEMENT(CONFIG_ALGO_I,",", -
391       CONFIG_DISABLE_ALGOS),"TRIM")
392$     CONFIG_ALGO_I = CONFIG_ALGO_I + 1
393$     IF CONFIG_ALGO_E .EQS. "" THEN GOTO CONFIG_DISABLE_LOOP1
394$     IF CONFIG_ALGO_E .EQS. "," THEN GOTO CONFIG_DISABLE_LOOP1_END
395$     IF F$TYPE(CONFIG_DISABLED_'CONFIG_ALGO_E') .EQS. ""
396$     THEN
397$	TO_DISABLE := NO
398$     ELSE
399$	IF .NOT. CONFIG_DISABLED_'CONFIG_ALGO_E' THEN TO_DISABLE := NO
400$     ENDIF
401$     GOTO CONFIG_DISABLE_LOOP1
402$   CONFIG_DISABLE_LOOP1_END:
403$
404$   IF TO_DISABLE
405$   THEN
406$     CONFIG_DEPENDENT_I = 0
407$     CONFIG_DISABLE_LOOP2:
408$	CONFIG_DEPENDENT_E = F$EDIT(F$ELEMENT(CONFIG_DEPENDENT_I,",", -
409         CONFIG_DISABLE_DEPENDENTS),"TRIM")
410$	CONFIG_DEPENDENT_I = CONFIG_DEPENDENT_I + 1
411$	IF CONFIG_DEPENDENT_E .EQS. "" THEN GOTO CONFIG_DISABLE_LOOP2
412$	IF CONFIG_DEPENDENT_E .EQS. "," THEN GOTO CONFIG_DISABLE_LOOP2_END
413$       CONFIG_DISABLED_'CONFIG_DEPENDENT_E' := YES
414$       CONFIG_ENABLED_'CONFIG_DEPENDENT_E' := NO
415$	! Better not to assume defaults at this point...
416$	CONFIG_CHANGED_'CONFIG_DEPENDENT_E' := YES
417$	WRITE SYS$ERROR -
418         "''CONFIG_DEPENDENT_E' disabled by rule ''CONFIG_DISABLE_E'"
419$	GOTO CONFIG_DISABLE_LOOP2
420$     CONFIG_DISABLE_LOOP2_END:
421$   ENDIF
422$   GOTO CONFIG_DISABLE_LOOP0
423$ CONFIG_DISABLE_LOOP0_END:
424$
425$! Apply cascading enable rules
426$ CONFIG_ENABLE_I = 0
427$ CONFIG_ENABLE_LOOP0:
428$   CONFIG_ENABLE_E = F$EDIT(F$ELEMENT(CONFIG_ENABLE_I,";", -
429     CONFIG_ENABLE_RULES),"TRIM")
430$   CONFIG_ENABLE_I = CONFIG_ENABLE_I + 1
431$   IF CONFIG_ENABLE_E .EQS. "" THEN GOTO CONFIG_ENABLE_LOOP0
432$   IF CONFIG_ENABLE_E .EQS. ";" THEN GOTO CONFIG_ENABLE_LOOP0_END
433$
434$   CONFIG_ENABLE_ALGOS = F$EDIT(F$ELEMENT(0,"/",CONFIG_ENABLE_E),"TRIM")
435$   CONFIG_ENABLE_DEPENDENTS = F$EDIT(F$ELEMENT(1,"/",CONFIG_ENABLE_E),"TRIM")
436$   TO_ENABLE := YES
437$   CONFIG_ALGO_I = 0
438$   CONFIG_ENABLE_LOOP1:
439$     CONFIG_ALGO_E = F$EDIT(F$ELEMENT(CONFIG_ALGO_I,",", -
440       CONFIG_ENABLE_ALGOS),"TRIM")
441$     CONFIG_ALGO_I = CONFIG_ALGO_I + 1
442$     IF CONFIG_ALGO_E .EQS. "" THEN GOTO CONFIG_ENABLE_LOOP1
443$     IF CONFIG_ALGO_E .EQS. "," THEN GOTO CONFIG_ENABLE_LOOP1_END
444$     IF F$TYPE(CONFIG_ENABLED_'CONFIG_ALGO_E') .EQS. ""
445$     THEN
446$	TO_ENABLE := NO
447$     ELSE
448$	IF .NOT. CONFIG_ENABLED_'CONFIG_ALGO_E' THEN TO_ENABLE := NO
449$     ENDIF
450$     GOTO CONFIG_ENABLE_LOOP1
451$   CONFIG_ENABLE_LOOP1_END:
452$
453$   IF TO_ENABLE
454$   THEN
455$     CONFIG_DEPENDENT_I = 0
456$     CONFIG_ENABLE_LOOP2:
457$	CONFIG_DEPENDENT_E = F$EDIT(F$ELEMENT(CONFIG_DEPENDENT_I,",", -
458         CONFIG_ENABLE_DEPENDENTS),"TRIM")
459$	CONFIG_DEPENDENT_I = CONFIG_DEPENDENT_I + 1
460$	IF CONFIG_DEPENDENT_E .EQS. "" THEN GOTO CONFIG_ENABLE_LOOP2
461$	IF CONFIG_DEPENDENT_E .EQS. "," THEN GOTO CONFIG_ENABLE_LOOP2_END
462$       CONFIG_DISABLED_'CONFIG_DEPENDENT_E' := NO
463$       CONFIG_ENABLED_'CONFIG_DEPENDENT_E' := YES
464$	! Better not to assume defaults at this point...
465$	CONFIG_CHANGED_'CONFIG_DEPENDENT_E' := YES
466$	WRITE SYS$ERROR -
467         "''CONFIG_DEPENDENT_E' enabled by rule ''CONFIG_ENABLE_E'"
468$	GOTO CONFIG_ENABLE_LOOP2
469$     CONFIG_ENABLE_LOOP2_END:
470$   ENDIF
471$   GOTO CONFIG_ENABLE_LOOP0
472$ CONFIG_ENABLE_LOOP0_END:
473$
474$! Write to the configuration
475$ CONFIG_LOG_I = 0
476$ CONFIG_LOG_LOOP2:
477$   CONFIG_LOG_E = F$EDIT(F$ELEMENT(CONFIG_LOG_I,",",CONFIG_LOGICALS),"TRIM")
478$   CONFIG_LOG_I = CONFIG_LOG_I + 1
479$   IF CONFIG_LOG_E .EQS. "" THEN GOTO CONFIG_LOG_LOOP2
480$   IF CONFIG_LOG_E .EQS. "," THEN GOTO CONFIG_LOG_LOOP2_END
481$   IF CONFIG_CHANGED_'CONFIG_LOG_E'
482$   THEN
483$     IF CONFIG_DISABLED_'CONFIG_LOG_E'
484$     THEN
485$	WRITE H_FILE "#ifndef OPENSSL_NO_",CONFIG_LOG_E
486$	WRITE H_FILE "# define OPENSSL_NO_",CONFIG_LOG_E
487$	WRITE H_FILE "#endif"
488$     ELSE
489$	WRITE H_FILE "#ifndef OPENSSL_",CONFIG_LOG_E
490$	WRITE H_FILE "# define OPENSSL_",CONFIG_LOG_E
491$	WRITE H_FILE "#endif"
492$     ENDIF
493$   ENDIF
494$   GOTO CONFIG_LOG_LOOP2
495$ CONFIG_LOG_LOOP2_END:
496$!
497$ WRITE H_FILE ""
498$ WRITE H_FILE "/* 2011-02-23 SMS."
499$ WRITE H_FILE " * On VMS (V8.3), setvbuf() doesn't support a 64-bit"
500$ WRITE H_FILE " * ""in"" pointer, and the help says:"
501$ WRITE H_FILE " *       Please note that the previously documented"
502$ WRITE H_FILE " *       value _IONBF is not supported."
503$ WRITE H_FILE " * So, skip it on VMS."
504$ WRITE H_FILE " */"
505$ WRITE H_FILE "#define OPENSSL_NO_SETVBUF_IONBF"
506$ WRITE H_FILE "/* STCP support comes with TCPIP 5.7 ECO 2 "
507$ WRITE H_FILE " * enable on newer systems / 2012-02-24 arpadffy */"
508$ WRITE H_FILE "#define OPENSSL_NO_SCTP"
509$ WRITE H_FILE ""
510$!
511$! Add in the common "crypto/opensslconf.h.in".
512$!
513$ TYPE 'OPENSSLCONF_H_IN' /OUTPUT=H_FILE:
514$!
515$ IF ARCH .NES. "VAX"
516$ THEN
517$!
518$!  Write the non-VAX specific data
519$!
520$   WRITE H_FILE "#if defined(HEADER_RC4_H)"
521$   WRITE H_FILE "#undef RC4_INT"
522$   WRITE H_FILE "#define RC4_INT unsigned int"
523$   WRITE H_FILE "#undef RC4_CHUNK"
524$   WRITE H_FILE "#define RC4_CHUNK unsigned long long"
525$   WRITE H_FILE "#endif"
526$!
527$   WRITE H_FILE "#if defined(HEADER_DES_LOCL_H)"
528$   WRITE H_FILE "#undef DES_LONG"
529$   WRITE H_FILE "#define DES_LONG unsigned int"
530$   WRITE H_FILE "#undef DES_PTR"
531$   WRITE H_FILE "#define DES_PTR"
532$   WRITE H_FILE "#undef DES_RISC1"
533$   WRITE H_FILE "#undef DES_RISC2"
534$   WRITE H_FILE "#define DES_RISC1"
535$   WRITE H_FILE "#undef DES_UNROLL"
536$   WRITE H_FILE "#define DES_UNROLL"
537$   WRITE H_FILE "#endif"
538$!
539$   WRITE H_FILE "#if defined(HEADER_BN_H)"
540$   WRITE H_FILE "#undef BN_LLONG"	! Never define with SIXTY_FOUR_BIT
541$   WRITE H_FILE "#undef SIXTY_FOUR_BIT_LONG"
542$   WRITE H_FILE "#undef SIXTY_FOUR_BIT"
543$   WRITE H_FILE "#define SIXTY_FOUR_BIT"
544$   WRITE H_FILE "#undef THIRTY_TWO_BIT"
545$   WRITE H_FILE "#undef SIXTEEN_BIT"
546$   WRITE H_FILE "#undef EIGHT_BIT"
547$   WRITE H_FILE "#endif"
548$
549$   WRITE H_FILE "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION"
550$!
551$!  Else...
552$!
553$ ELSE
554$!
555$!  Write the VAX specific data
556$!
557$   WRITE H_FILE "#if defined(HEADER_RC4_H)"
558$   WRITE H_FILE "#undef RC4_INT"
559$   WRITE H_FILE "#define RC4_INT unsigned char"
560$   WRITE H_FILE "#undef RC4_CHUNK"
561$   WRITE H_FILE "#define RC4_CHUNK unsigned long"
562$   WRITE H_FILE "#endif"
563$!
564$   WRITE H_FILE "#if defined(HEADER_DES_LOCL_H)"
565$   WRITE H_FILE "#undef DES_LONG"
566$   WRITE H_FILE "#define DES_LONG unsigned long"
567$   WRITE H_FILE "#undef DES_PTR"
568$   WRITE H_FILE "#define DES_PTR"
569$   WRITE H_FILE "#undef DES_RISC1"
570$   WRITE H_FILE "#undef DES_RISC2"
571$   WRITE H_FILE "#undef DES_UNROLL"
572$   WRITE H_FILE "#endif"
573$!
574$   WRITE H_FILE "#if defined(HEADER_BN_H)"
575$   WRITE H_FILE "#undef BN_LLONG"	! VAX C/DEC C doesn't have long long
576$   WRITE H_FILE "#undef SIXTY_FOUR_BIT_LONG"
577$   WRITE H_FILE "#undef SIXTY_FOUR_BIT"
578$   WRITE H_FILE "#undef THIRTY_TWO_BIT"
579$   WRITE H_FILE "#define THIRTY_TWO_BIT"
580$   WRITE H_FILE "#undef SIXTEEN_BIT"
581$   WRITE H_FILE "#undef EIGHT_BIT"
582$   WRITE H_FILE "#endif"
583$!
584$! Oddly enough, the following symbol is tested in crypto/sha/sha512.c
585$! before sha.h gets included (and HEADER_SHA_H defined), so we will not
586$! protect this one...
587$   WRITE H_FILE "#undef OPENSSL_NO_SHA512"
588$   WRITE H_FILE "#define OPENSSL_NO_SHA512"
589$!
590$   WRITE H_FILE "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION"
591$   WRITE H_FILE "#define OPENSSL_EXPORT_VAR_AS_FUNCTION"
592$!
593$!  End
594$!
595$ ENDIF
596$!
597$! Close the [.CRYPTO._xxx]OPENSSLCONF.H file
598$!
599$ CLOSE H_FILE
600$!
601$! Purge The [.CRYPTO._xxx]OPENSSLCONF.H file
602$!
603$ PURGE SYS$DISK:[.CRYPTO.'ARCHD']OPENSSLCONF.H
604$!
605$! That's All, Time To RETURN.
606$!
607$ RETURN
608$!
609$! Rebuild The "[.CRYPTO._xxx]BUILDINF.H" file.
610$!
611$ BUILDINF:
612$!
613$! Tell The User We Are Creating The [.CRYPTO._xxx]BUILDINF.H File.
614$!
615$ WRITE SYS$OUTPUT "Creating [.CRYPTO.''ARCHD']BUILDINF.H Include File."
616$!
617$! Create The [.CRYPTO._xxx]BUILDINF.H File.
618$!
619$ BIH_NAME = "SYS$DISK:[.CRYPTO.''ARCHD']BUILDINF.H"
620$ CREATE /FDL=SYS$INPUT: 'BIH_NAME'
621RECORD
622        FORMAT stream_lf
623$!
624$ OPEN /APPEND H_FILE 'bih_name'
625$!
626$! Get The Current Date & Time.
627$!
628$ TIME = F$TIME()
629$!
630$! Write The [.CRYPTO._xxx]BUILDINF.H File.
631$!
632$ CFLAGS = ""
633$ if (POINTER_SIZE .nes. "")
634$ then
635$   CFLAGS = CFLAGS+ "/POINTER_SIZE=''POINTER_SIZE'"
636$ endif
637$ if (ZLIB .nes. "")
638$ then
639$   if (CFLAGS .nes. "") then CFLAGS = CFLAGS+ " "
640$   CFLAGS = CFLAGS+ "/DEFINE=ZLIB"
641$ endif
642$!
643$ WRITE H_FILE "#define CFLAGS ""''CFLAGS'"""
644$ WRITE H_FILE "#define PLATFORM ""VMS ''ARCHD' ''VMS_VERSION'"""
645$ WRITE H_FILE "#define DATE ""''TIME'"" "
646$!
647$! Close The [.CRYPTO._xxx]BUILDINF.H File.
648$!
649$ CLOSE H_FILE
650$!
651$! Purge The [.CRYPTO._xxx]BUILDINF.H File.
652$!
653$ PURGE SYS$DISK:[.CRYPTO.'ARCHD']BUILDINF.H
654$!
655$! Delete [.CRYPTO]BUILDINF.H File, as there might be some residue from Unix.
656$!
657$ IF F$SEARCH("[.CRYPTO]BUILDINF.H") .NES. "" THEN -
658     DELETE SYS$DISK:[.CRYPTO]BUILDINF.H;*
659$!
660$! That's All, Time To RETURN.
661$!
662$ RETURN
663$!
664$! Copy a lot of files around.
665$!
666$ SOFTLINKS:
667$!
668$!!!! Tell The User We Are Partly Rebuilding The [.APPS] Directory.
669$!!!!
670$!!! WRITE SYS$OUTPUT "Rebuilding The '[.APPS]MD4.C' File."
671$!!!!
672$!!! DELETE SYS$DISK:[.APPS]MD4.C;*
673$!!!!
674$!!!! Copy MD4.C from [.CRYPTO.MD4] into [.APPS]
675$!!!!
676$!!! COPY SYS$DISK:[.CRYPTO.MD4]MD4.C SYS$DISK:[.APPS]
677$!
678$! Ensure that the [.include.openssl] directory contains a full set of
679$! real header files.  The distribution kit may have left real or fake
680$! symlinks there.  Rather than think about what's there, simply delete
681$! the destination files (fake or real symlinks) before copying the real
682$! header files in.  (Copying a real header file onto a real symlink
683$! merely duplicates the real header file at its source.)
684$!
685$! Tell The User We Are Rebuilding The [.include.openssl] Directory.
686$!
687$ WRITE SYS$OUTPUT "Rebuilding The '[.include.openssl]' Directory."
688$!
689$! First, make sure the directory exists.  If it did exist, delete all
690$! the existing header files (or fake or real symlinks).
691$!
692$ if f$parse( "sys$disk:[.include.openssl]") .eqs. ""
693$ then
694$   create /directory sys$disk:[.include.openssl]
695$ else
696$   delete sys$disk:[.include.openssl]*.h;*
697$ endif
698$!
699$! Copy All The ".H" Files From The Main Directory.
700$!
701$ EXHEADER := e_os2.h
702$ copy 'exheader' sys$disk:[.include.openssl]
703$!
704$! Copy All The ".H" Files From The [.CRYPTO] Directory Tree.
705$!
706$ SDIRS := , -
707   'ARCHD', -
708   OBJECTS, -
709   MD2, MD4, MD5, SHA, MDC2, HMAC, RIPEMD, WHRLPOOL, -
710   DES, AES, RC2, RC4, RC5, IDEA, BF, CAST, CAMELLIA, SEED, MODES, -
711   BN, EC, RSA, DSA, ECDSA, DH, ECDH, DSO, ENGINE, -
712   BUFFER, BIO, STACK, LHASH, RAND, ERR, -
713   EVP, ASN1, PEM, X509, X509V3, CONF, TXT_DB, PKCS7, PKCS12, -
714   COMP, OCSP, UI, KRB5, -
715   CMS, PQUEUE, TS, JPAKE, SRP, STORE, CMAC
716$!
717$ EXHEADER_ := crypto.h, opensslv.h, ebcdic.h, symhacks.h, ossl_typ.h
718$ EXHEADER_'ARCHD' := opensslconf.h
719$ EXHEADER_OBJECTS := objects.h, obj_mac.h
720$ EXHEADER_MD2 := md2.h
721$ EXHEADER_MD4 := md4.h
722$ EXHEADER_MD5 := md5.h
723$ EXHEADER_SHA := sha.h
724$ EXHEADER_MDC2 := mdc2.h
725$ EXHEADER_HMAC := hmac.h
726$ EXHEADER_RIPEMD := ripemd.h
727$ EXHEADER_WHRLPOOL := whrlpool.h
728$ EXHEADER_DES := des.h, des_old.h
729$ EXHEADER_AES := aes.h
730$ EXHEADER_RC2 := rc2.h
731$ EXHEADER_RC4 := rc4.h
732$ EXHEADER_RC5 := rc5.h
733$ EXHEADER_IDEA := idea.h
734$ EXHEADER_BF := blowfish.h
735$ EXHEADER_CAST := cast.h
736$ EXHEADER_CAMELLIA := camellia.h
737$ EXHEADER_SEED := seed.h
738$ EXHEADER_MODES := modes.h
739$ EXHEADER_BN := bn.h
740$ EXHEADER_EC := ec.h
741$ EXHEADER_RSA := rsa.h
742$ EXHEADER_DSA := dsa.h
743$ EXHEADER_ECDSA := ecdsa.h
744$ EXHEADER_DH := dh.h
745$ EXHEADER_ECDH := ecdh.h
746$ EXHEADER_DSO := dso.h
747$ EXHEADER_ENGINE := engine.h
748$ EXHEADER_BUFFER := buffer.h
749$ EXHEADER_BIO := bio.h
750$ EXHEADER_STACK := stack.h, safestack.h
751$ EXHEADER_LHASH := lhash.h
752$ EXHEADER_RAND := rand.h
753$ EXHEADER_ERR := err.h
754$ EXHEADER_EVP := evp.h
755$ EXHEADER_ASN1 := asn1.h, asn1_mac.h, asn1t.h
756$ EXHEADER_PEM := pem.h, pem2.h
757$ EXHEADER_X509 := x509.h, x509_vfy.h
758$ EXHEADER_X509V3 := x509v3.h
759$ EXHEADER_CONF := conf.h, conf_api.h
760$ EXHEADER_TXT_DB := txt_db.h
761$ EXHEADER_PKCS7 := pkcs7.h
762$ EXHEADER_PKCS12 := pkcs12.h
763$ EXHEADER_COMP := comp.h
764$ EXHEADER_OCSP := ocsp.h
765$ EXHEADER_UI := ui.h, ui_compat.h
766$ EXHEADER_KRB5 := krb5_asn.h
767$ EXHEADER_CMS := cms.h
768$ EXHEADER_PQUEUE := pqueue.h
769$ EXHEADER_TS := ts.h
770$ EXHEADER_JPAKE := jpake.h
771$ EXHEADER_SRP := srp.h
772$!!! EXHEADER_STORE := store.h, str_compat.h
773$ EXHEADER_STORE := store.h
774$ EXHEADER_CMAC := cmac.h
775$!
776$ i = 0
777$ loop_sdirs:
778$   sdir = f$edit( f$element( i, ",", sdirs), "trim")
779$   i = i + 1
780$   if (sdir .eqs. ",") then goto loop_sdirs_end
781$   hdr_list = exheader_'sdir'
782$   if (sdir .nes. "") then sdir = "."+ sdir
783$   copy [.crypto'sdir']'hdr_list' sys$disk:[.include.openssl]
784$ goto loop_sdirs
785$ loop_sdirs_end:
786$!
787$! Copy All The ".H" Files From The [.SSL] Directory.
788$!
789$! (keep these in the same order as ssl/Makefile)
790$ EXHEADER := ssl.h, ssl2.h, ssl3.h, ssl23.h, tls1.h, dtls1.h, kssl.h, srtp.h
791$ copy sys$disk:[.ssl]'exheader' sys$disk:[.include.openssl]
792$!
793$! Purge the [.include.openssl] header files.
794$!
795$ purge sys$disk:[.include.openssl]*.h
796$!
797$! That's All, Time To RETURN.
798$!
799$ RETURN
800$!
801$! Build The "[.xxx.EXE.CRYPTO]SSL_LIBCRYPTO''LIB32'.OLB" Library.
802$!
803$ CRYPTO:
804$!
805$! Tell The User What We Are Doing.
806$!
807$ WRITE SYS$OUTPUT ""
808$ WRITE SYS$OUTPUT -
809   "Building The [.",ARCHD,".EXE.CRYPTO]SSL_LIBCRYPTO''LIB32'.OLB Library."
810$!
811$! Go To The [.CRYPTO] Directory.
812$!
813$ SET DEFAULT SYS$DISK:[.CRYPTO]
814$!
815$! Build The [.xxx.EXE.CRYPTO]LIBCRYPTO.OLB Library.
816$!
817$ @CRYPTO-LIB LIBRARY 'DEBUGGER' "''COMPILER'" "''TCPIP_TYPE'" -
818   "''ISSEVEN'" "''BUILDPART'" "''POINTER_SIZE'" "''ZLIB'"
819$!
820$! Build The [.xxx.EXE.CRYPTO]*.EXE Test Applications.
821$!
822$ @CRYPTO-LIB APPS 'DEBUGGER' "''COMPILER'" "''TCPIP_TYPE'" -
823   "''ISSEVEN'" "''BUILDPART'" "''POINTER_SIZE'" "''ZLIB'"
824$!
825$! Go Back To The Main Directory.
826$!
827$ SET DEFAULT [-]
828$!
829$! Time To RETURN.
830$!
831$ RETURN
832$!
833$! Build The "[.xxx.EXE.SSL]SSL_LIBSSL''LIB32'.OLB" Library.
834$!
835$ SSL:
836$!
837$! Tell The User What We Are Doing.
838$!
839$ WRITE SYS$OUTPUT ""
840$ WRITE SYS$OUTPUT -
841   "Building The [.",ARCHD,".EXE.SSL]SSL_LIBSSL''LIB32'.OLB Library."
842$!
843$! Go To The [.SSL] Directory.
844$!
845$ SET DEFAULT SYS$DISK:[.SSL]
846$!
847$! Build The [.xxx.EXE.SSL]LIBSSL.OLB Library.
848$!
849$ @SSL-LIB LIBRARY 'DEBUGGER' "''COMPILER'" "''TCPIP_TYPE'" -
850   "''ISSEVEN'" "''POINTER_SIZE'" "''ZLIB'"
851$!
852$! Go Back To The Main Directory.
853$!
854$ SET DEFAULT [-]
855$!
856$! Time To Return.
857$!
858$ RETURN
859$!
860$! Build The "[.xxx.EXE.SSL]SSL_TASK.EXE" Program.
861$!
862$ SSL_TASK:
863$!
864$! Tell The User What We Are Doing.
865$!
866$ WRITE SYS$OUTPUT ""
867$ WRITE SYS$OUTPUT -
868   "Building DECNet Based SSL Engine, [.",ARCHD,".EXE.SSL]SSL_TASK.EXE"
869$!
870$! Go To The [.SSL] Directory.
871$!
872$ SET DEFAULT SYS$DISK:[.SSL]
873$!
874$! Build The [.xxx.EXE.SSL]SSL_TASK.EXE
875$!
876$ @SSL-LIB SSL_TASK 'DEBUGGER' "''COMPILER'" "''TCPIP_TYPE'" -
877   "''ISSEVEN'" "''POINTER_SIZE'" "''ZLIB'"
878$!
879$! Go Back To The Main Directory.
880$!
881$ SET DEFAULT [-]
882$!
883$! That's All, Time To RETURN.
884$!
885$ RETURN
886$!
887$! Build The OpenSSL Test Programs.
888$!
889$ TEST:
890$!
891$! Tell The User What We Are Doing.
892$!
893$ WRITE SYS$OUTPUT ""
894$ WRITE SYS$OUTPUT "Building The OpenSSL [.",ARCHD,".EXE.TEST] Test Utilities."
895$!
896$! Go To The [.TEST] Directory.
897$!
898$ SET DEFAULT SYS$DISK:[.TEST]
899$!
900$! Build The Test Programs.
901$!
902$ @MAKETESTS 'DEBUGGER' "''COMPILER'" "''TCPIP_TYPE'" "''ISSEVEN'" -
903   "''POINTER_SIZE'" "''ZLIB'"
904$!
905$! Go Back To The Main Directory.
906$!
907$ SET DEFAULT [-]
908$!
909$! That's All, Time To RETURN.
910$!
911$ RETURN
912$!
913$! Build The OpenSSL Application Programs.
914$!
915$ APPS:
916$!
917$! Tell The User What We Are Doing.
918$!
919$ WRITE SYS$OUTPUT ""
920$ WRITE SYS$OUTPUT "Building OpenSSL [.",ARCHD,".EXE.APPS] Applications."
921$!
922$! Go To The [.APPS] Directory.
923$!
924$ SET DEFAULT SYS$DISK:[.APPS]
925$!
926$! Build The Application Programs.
927$!
928$ @MAKEAPPS 'DEBUGGER' "''COMPILER'" "''TCPIP_TYPE'" "''ISSEVEN'" -
929   "" "''POINTER_SIZE'" "''ZLIB'"
930$!
931$! Go Back To The Main Directory.
932$!
933$ SET DEFAULT [-]
934$!
935$! That's All, Time To RETURN.
936$!
937$ RETURN
938$!
939$! Build The OpenSSL Application Programs.
940$!
941$ ENGINES:
942$!
943$! Tell The User What We Are Doing.
944$!
945$ WRITE SYS$OUTPUT ""
946$ WRITE SYS$OUTPUT "Building OpenSSL [.",ARCHD,".EXE.ENGINES] Engines."
947$!
948$! Go To The [.ENGINES] Directory.
949$!
950$ SET DEFAULT SYS$DISK:[.ENGINES]
951$!
952$! Build The Application Programs.
953$!
954$ @MAKEENGINES ENGINES 'DEBUGGER' "''COMPILER'" "''TCPIP_TYPE'" -
955   "''ISSEVEN'" "''BUILDPART'" "''POINTER_SIZE'" "''ZLIB'"
956$!
957$! Go Back To The Main Directory.
958$!
959$ SET DEFAULT [-]
960$!
961$! That's All, Time To RETURN.
962$!
963$ RETURN
964$!
965$! Check The User's Options.
966$!
967$ CHECK_OPTIONS:
968$!
969$! Check if there's a "part", and separate it out
970$!
971$ BUILDPART = F$ELEMENT(1,"/",P1)
972$ IF BUILDPART .EQS. "/"
973$ THEN
974$   BUILDPART = ""
975$ ELSE
976$   P1 = F$EXTRACT(0,F$LENGTH(P1) - F$LENGTH(BUILDPART) - 1, P1)
977$ ENDIF
978$!
979$! Check To See If P1 Is Blank.
980$!
981$ IF (P1.EQS."ALL")
982$ THEN
983$!
984$!   P1 Is ALL, So Build Everything.
985$!
986$    BUILDCOMMAND = "ALL"
987$!
988$! Else...
989$!
990$ ELSE
991$!
992$!  Else, Check To See If P1 Has A Valid Argument.
993$!
994$   IF (P1.EQS."CONFIG").OR.(P1.EQS."BUILDINF").OR.(P1.EQS."SOFTLINKS") -
995       .OR.(P1.EQS."BUILDALL") -
996       .OR.(P1.EQS."CRYPTO").OR.(P1.EQS."SSL") -
997       .OR.(P1.EQS."SSL_TASK").OR.(P1.EQS."TEST").OR.(P1.EQS."APPS") -
998       .OR.(P1.EQS."ENGINES")
999$   THEN
1000$!
1001$!    A Valid Argument.
1002$!
1003$     BUILDCOMMAND = P1
1004$!
1005$!  Else...
1006$!
1007$   ELSE
1008$!
1009$!    Tell The User We Don't Know What They Want.
1010$!
1011$     WRITE SYS$OUTPUT ""
1012$     WRITE SYS$OUTPUT "USAGE:   @MAKEVMS.COM [Target] [Pointer size] [Debug option] <Compiler>"
1013$     WRITE SYS$OUTPUT ""
1014$     WRITE SYS$OUTPUT "Example: @MAKEVMS.COM ALL """" NODEBUG "
1015$     WRITE SYS$OUTPUT ""
1016$     WRITE SYS$OUTPUT "The Target ",P1," Is Invalid.  The Valid Target Options Are:"
1017$     WRITE SYS$OUTPUT ""
1018$     WRITE SYS$OUTPUT "    ALL      :  Just Build Everything."
1019$     WRITE SYS$OUTPUT "    CONFIG   :  Just build the [.CRYPTO._xxx]OPENSSLCONF.H file."
1020$     WRITE SYS$OUTPUT "    BUILDINF :  Just build the [.CRYPTO._xxx]BUILDINF.H file."
1021$     WRITE SYS$OUTPUT "    SOFTLINKS:  Just Fix The Unix soft links."
1022$     WRITE SYS$OUTPUT "    BUILDALL :  Same as ALL, except CONFIG, BUILDINF and SOFTILNKS aren't done."
1023$     WRITE SYS$OUTPUT "    CRYPTO   :  To Build Just The [.xxx.EXE.CRYPTO]LIBCRYPTO.OLB Library."
1024$     WRITE SYS$OUTPUT "    CRYPTO/x :  To Build Just The x Part Of The"
1025$     WRITE SYS$OUTPUT "                [.xxx.EXE.CRYPTO]LIBCRYPTO.OLB Library."
1026$     WRITE SYS$OUTPUT "    SSL      :  To Build Just The [.xxx.EXE.SSL]LIBSSL.OLB Library."
1027$     WRITE SYS$OUTPUT "    SSL_TASK :  To Build Just The [.xxx.EXE.SSL]SSL_TASK.EXE Program."
1028$     WRITE SYS$OUTPUT "    TEST     :  To Build Just The OpenSSL Test Programs."
1029$     WRITE SYS$OUTPUT "    APPS     :  To Build Just The OpenSSL Application Programs."
1030$     WRITE SYS$OUTPUT "    ENGINES  :  To Build Just The ENGINES"
1031$     WRITE SYS$OUTPUT ""
1032$     WRITE SYS$OUTPUT " Where 'xxx' Stands For:"
1033$     WRITE SYS$OUTPUT ""
1034$     WRITE SYS$OUTPUT "    ALPHA[64]:  Alpha Architecture."
1035$     WRITE SYS$OUTPUT "    IA64[64] :  IA64 Architecture."
1036$     WRITE SYS$OUTPUT "    VAX      :  VAX Architecture."
1037$     WRITE SYS$OUTPUT ""
1038$!
1039$!    Time To EXIT.
1040$!
1041$     GOTO TIDY
1042$!
1043$!  End The Valid Argument Check.
1044$!
1045$   ENDIF
1046$!
1047$! End The P1 Check.
1048$!
1049$ ENDIF
1050$!
1051$! Check P2 (POINTER_SIZE).
1052$!
1053$ IF (P2 .NES. "") .AND. (ARCH .NES. "VAX")
1054$ THEN
1055$!
1056$   IF (P2 .EQS. "32")
1057$   THEN
1058$     POINTER_SIZE = "32"
1059$   ELSE
1060$     POINTER_SIZE = F$EDIT( P2, "COLLAPSE, UPCASE")
1061$     IF ((POINTER_SIZE .EQS. "64") .OR. -
1062       (POINTER_SIZE .EQS. "64=") .OR. -
1063       (POINTER_SIZE .EQS. "64=ARGV"))
1064$     THEN
1065$       ARCHD = ARCH+ "_64"
1066$       LIB32 = ""
1067$     ELSE
1068$!
1069$!      Tell The User Entered An Invalid Option.
1070$!
1071$       WRITE SYS$OUTPUT ""
1072$       WRITE SYS$OUTPUT "The Option ", P2, -
1073         " Is Invalid.  The Valid Options Are:"
1074$       WRITE SYS$OUTPUT ""
1075$       WRITE SYS$OUTPUT -
1076         "    """"       :  Compile with default (short) pointers."
1077$       WRITE SYS$OUTPUT -
1078         "    32       :  Compile with 32-bit (short) pointers."
1079$       WRITE SYS$OUTPUT -
1080         "    64       :  Compile with 64-bit (long) pointers (auto ARGV)."
1081$       WRITE SYS$OUTPUT -
1082         "    64=      :  Compile with 64-bit (long) pointers (no ARGV)."
1083$       WRITE SYS$OUTPUT -
1084         "    64=ARGV  :  Compile with 64-bit (long) pointers (ARGV)."
1085$       WRITE SYS$OUTPUT ""
1086$!
1087$!      Time To EXIT.
1088$!
1089$       GOTO TIDY
1090$!
1091$     ENDIF
1092$!
1093$   ENDIF
1094$!
1095$! End The P2 (POINTER_SIZE) Check.
1096$!
1097$ ENDIF
1098$!
1099$! Check To See If P3 Is Blank.
1100$!
1101$ IF (P3.EQS."NODEBUG")
1102$ THEN
1103$!
1104$!   P3 Is NODEBUG, So Compile Without Debugger Information.
1105$!
1106$    DEBUGGER = "NODEBUG"
1107$!
1108$! Else...
1109$!
1110$ ELSE
1111$!
1112$!  Check To See If We Are To Compile With Debugger Information.
1113$!
1114$   IF (P3.EQS."DEBUG")
1115$   THEN
1116$!
1117$!    Compile With Debugger Information.
1118$!
1119$     DEBUGGER = "DEBUG"
1120$!
1121$!  Else...
1122$!
1123$   ELSE
1124$!
1125$!    Tell The User Entered An Invalid Option.
1126$!
1127$     WRITE SYS$OUTPUT ""
1128$     WRITE SYS$OUTPUT "The Option ",P3," Is Invalid.  The Valid Options Are:"
1129$     WRITE SYS$OUTPUT ""
1130$     WRITE SYS$OUTPUT "    DEBUG    :  Compile With The Debugger Information."
1131$     WRITE SYS$OUTPUT "    NODEBUG  :  Compile Without The Debugger Information."
1132$     WRITE SYS$OUTPUT ""
1133$!
1134$!    Time To EXIT.
1135$!
1136$     GOTO TIDY
1137$!
1138$!  End The Valid Argument Check.
1139$!
1140$   ENDIF
1141$!
1142$! End The P3 Check.
1143$!
1144$ ENDIF
1145$!
1146$! Check To See If P4 Is Blank.
1147$!
1148$ IF (P4.EQS."")
1149$ THEN
1150$!
1151$!  O.K., The User Didn't Specify A Compiler, Let's Try To
1152$!  Find Out Which One To Use.
1153$!
1154$!  Check To See If We Have GNU C.
1155$!
1156$   IF (F$TRNLNM("GNU_CC").NES."")
1157$   THEN
1158$!
1159$!    Looks Like GNUC, Set To Use GNUC.
1160$!
1161$     COMPILER = "GNUC"
1162$!
1163$!    Tell The User We Are Using GNUC.
1164$!
1165$     WRITE SYS$OUTPUT "Using GNU 'C' Compiler."
1166$!
1167$!  End The GNU C Compiler Check.
1168$!
1169$   ENDIF
1170$!
1171$!  Check To See If We Have VAXC Or DECC.
1172$!
1173$   IF (F$GETSYI("CPU").GE.128).OR.(F$TRNLNM("DECC$CC_DEFAULT").EQS."/DECC")
1174$   THEN
1175$!
1176$!    Looks Like DECC, Set To Use DECC.
1177$!
1178$     COMPILER = "DECC"
1179$!
1180$!    Tell The User We Are Using DECC.
1181$!
1182$     WRITE SYS$OUTPUT "Using DECC 'C' Compiler."
1183$!
1184$!  Else...
1185$!
1186$   ELSE
1187$!
1188$!    Looks Like VAXC, Set To Use VAXC.
1189$!
1190$     COMPILER = "VAXC"
1191$!
1192$!    Tell The User We Are Using VAX C.
1193$!
1194$     WRITE SYS$OUTPUT "Using VAXC 'C' Compiler."
1195$!
1196$!  End The DECC & VAXC Compiler Check.
1197$!
1198$   ENDIF
1199$!
1200$! Else...
1201$!
1202$ ELSE
1203$!
1204$!  Check To See If The User Entered A Valid Parameter.
1205$!
1206$   IF (P4.EQS."VAXC").OR.(P4.EQS."DECC").OR.(P4.EQS."GNUC")!.OR.(P4.EQS."LINK")
1207$   THEN
1208$!
1209$!    Check To See If The User Wanted To Just LINK.
1210$!
1211$     IF (P4.EQS."LINK")
1212$     THEN
1213$!
1214$!      Looks Like LINK-only
1215$!
1216$       COMPILER = "LINK"
1217$!
1218$!      Tell The User We Are Only Linking.
1219$!
1220$       WRITE SYS$OUTPUT "LINK Only.  This actually NOT YET SUPPORTED!"
1221$!
1222$!    End LINK Check.
1223$!
1224$     ENDIF
1225$!
1226$!    Check To See If The User Wanted DECC.
1227$!
1228$     IF (P4.EQS."DECC")
1229$     THEN
1230$!
1231$!      Looks Like DECC, Set To Use DECC.
1232$!
1233$       COMPILER = "DECC"
1234$!
1235$!      Tell The User We Are Using DECC.
1236$!
1237$       WRITE SYS$OUTPUT "Using DECC 'C' Compiler."
1238$!
1239$!    End DECC Check.
1240$!
1241$     ENDIF
1242$!
1243$!    Check To See If We Are To Use VAXC.
1244$!
1245$     IF (P4.EQS."VAXC")
1246$     THEN
1247$!
1248$!      Looks Like VAXC, Set To Use VAXC.
1249$!
1250$       COMPILER = "VAXC"
1251$!
1252$!      Tell The User We Are Using VAX C.
1253$!
1254$       WRITE SYS$OUTPUT "Using VAXC 'C' Compiler."
1255$!
1256$!    End VAXC Check
1257$!
1258$     ENDIF
1259$!
1260$!    Check To See If We Are To Use GNU C.
1261$!
1262$     IF (P4.EQS."GNUC")
1263$     THEN
1264$!
1265$!      Looks Like GNUC, Set To Use GNUC.
1266$!
1267$       COMPILER = "GNUC"
1268$!
1269$!      Tell The User We Are Using GNUC.
1270$!
1271$       WRITE SYS$OUTPUT "Using GNU 'C' Compiler."
1272$!
1273$!    End The GNU C Check.
1274$!
1275$     ENDIF
1276$!
1277$!  Else The User Entered An Invalid Argument.
1278$!
1279$   ELSE
1280$!
1281$!    Tell The User We Don't Know What They Want.
1282$!
1283$     WRITE SYS$OUTPUT ""
1284$     WRITE SYS$OUTPUT "The Option ",P4," Is Invalid.  The Valid Options Are:"
1285$     WRITE SYS$OUTPUT ""
1286$     WRITE SYS$OUTPUT "    VAXC  :  To Compile With VAX C."
1287$     WRITE SYS$OUTPUT "    DECC  :  To Compile With DEC C."
1288$     WRITE SYS$OUTPUT "    GNUC  :  To Compile With GNU C."
1289$     WRITE SYS$OUTPUT ""
1290$!
1291$!    Time To EXIT.
1292$!
1293$     GOTO TIDY
1294$!
1295$!  End The Valid Argument Check.
1296$!
1297$   ENDIF
1298$!
1299$! End The P4 Check.
1300$!
1301$ ENDIF
1302$!
1303$! Time to check the contents of P5, and to make sure we get the correct
1304$! library.
1305$!
1306$ IF P5.EQS."SOCKETSHR" .OR. P5.EQS."MULTINET" .OR. P5.EQS."UCX" -
1307     .OR. P5.EQS."TCPIP" .OR. P5.EQS."NONE"
1308$ THEN
1309$!
1310$!  Check to see if SOCKETSHR was chosen
1311$!
1312$   IF P5.EQS."SOCKETSHR"
1313$   THEN
1314$!
1315$!    Set the library to use SOCKETSHR
1316$!
1317$     TCPIP_LIB = "SYS$DISK:[-.VMS]SOCKETSHR_SHR.OPT /OPTIONS"
1318$!
1319$!    Tell the user
1320$!
1321$     WRITE SYS$OUTPUT "Using SOCKETSHR for TCP/IP"
1322$!
1323$!    Done with SOCKETSHR
1324$!
1325$   ENDIF
1326$!
1327$!  Check to see if MULTINET was chosen
1328$!
1329$   IF P5.EQS."MULTINET"
1330$   THEN
1331$!
1332$!    Set the library to use UCX emulation.
1333$!
1334$     P5 = "UCX"
1335$!
1336$!    Tell the user
1337$!
1338$     WRITE SYS$OUTPUT "Using MultiNet via UCX emulation for TCP/IP"
1339$!
1340$!    Done with MULTINET
1341$!
1342$   ENDIF
1343$!
1344$!  Check to see if UCX was chosen
1345$!
1346$   IF P5.EQS."UCX"
1347$   THEN
1348$!
1349$!    Set the library to use UCX.
1350$!
1351$     TCPIP_LIB = "SYS$DISK:[-.VMS]UCX_SHR_DECC.OPT /OPTIONS"
1352$!
1353$!    Tell the user
1354$!
1355$     WRITE SYS$OUTPUT "Using UCX or an emulation thereof for TCP/IP"
1356$!
1357$!    Done with UCX
1358$!
1359$   ENDIF
1360$!
1361$!  Check to see if TCPIP was chosen
1362$!
1363$   IF P5.EQS."TCPIP"
1364$   THEN
1365$!
1366$!    Set the library to use TCPIP (post UCX).
1367$!
1368$     TCPIP_LIB = "SYS$DISK:[-.VMS]TCPIP_SHR_DECC.OPT /OPTIONS"
1369$!
1370$!    Tell the user
1371$!
1372$     WRITE SYS$OUTPUT "Using TCPIP (post UCX) for TCP/IP"
1373$!
1374$!    Done with TCPIP
1375$!
1376$   ENDIF
1377$!
1378$!  Check to see if NONE was chosen
1379$!
1380$   IF P5.EQS."NONE"
1381$   THEN
1382$!
1383$!    Do not use a TCPIP library.
1384$!
1385$     TCPIP_LIB = ""
1386$!
1387$!    Tell the user
1388$!
1389$     WRITE SYS$OUTPUT "A specific TCPIP library will not be used."
1390$!
1391$!    Done with NONE.
1392$!
1393$   ENDIF
1394$!
1395$!  Set the TCPIP_TYPE symbol
1396$!
1397$   TCPIP_TYPE = P5
1398$!
1399$!  Print info
1400$!
1401$   WRITE SYS$OUTPUT "TCP/IP library spec: ", TCPIP_LIB
1402$!
1403$!  Else The User Entered An Invalid Argument.
1404$!
1405$ ELSE
1406$   IF P5 .NES. ""
1407$   THEN
1408$!
1409$!    Tell The User We Don't Know What They Want.
1410$!
1411$     WRITE SYS$OUTPUT ""
1412$     WRITE SYS$OUTPUT "The Option ",P5," Is Invalid.  The Valid Options Are:"
1413$     WRITE SYS$OUTPUT ""
1414$     WRITE SYS$OUTPUT "    SOCKETSHR  :  To link with SOCKETSHR TCP/IP library."
1415$     WRITE SYS$OUTPUT "    UCX        :  To link with UCX TCP/IP library."
1416$     WRITE SYS$OUTPUT "    TCPIP      :  To link with TCPIP TCP/IP (post UCX) library."
1417$     WRITE SYS$OUTPUT "    NONE       :  To not link with a specific TCP/IP library."
1418$     WRITE SYS$OUTPUT ""
1419$!
1420$!    Time To EXIT.
1421$!
1422$     GOTO TIDY
1423$   ELSE
1424$!
1425$! If TCPIP is not defined, then hardcode it to make
1426$! it clear that no TCPIP is desired.
1427$!
1428$     IF P5 .EQS. ""
1429$     THEN
1430$       TCPIP_LIB = ""
1431$       TCPIP_TYPE = "NONE"
1432$     ELSE
1433$!
1434$!    Set the TCPIP_TYPE symbol
1435$!
1436$       TCPIP_TYPE = P5
1437$     ENDIF
1438$   ENDIF
1439$!
1440$!  Done with TCP/IP libraries
1441$!
1442$ ENDIF
1443$!
1444$! Special Threads For OpenVMS v7.1 Or Later
1445$!
1446$! Written By:  Richard Levitte
1447$!              richard@levitte.org
1448$!
1449$!
1450$! Check To See If We Have A Option For P6.
1451$!
1452$ IF (P6.EQS."")
1453$ THEN
1454$!
1455$!  Get The Version Of VMS We Are Using.
1456$!
1457$   ISSEVEN :=
1458$   TMP = F$ELEMENT(0,"-",F$EXTRACT(1,4,VMS_VERSION))
1459$   TMP = F$INTEGER(F$ELEMENT(0,".",TMP)+F$ELEMENT(1,".",TMP))
1460$!
1461$!  Check To See If The VMS Version Is v7.1 Or Later.
1462$!
1463$   IF (TMP.GE.71)
1464$   THEN
1465$!
1466$!    We Have OpenVMS v7.1 Or Later, So Use The Special Threads.
1467$!
1468$     ISSEVEN := ,PTHREAD_USE_D4
1469$!
1470$!  End The VMS Version Check.
1471$!
1472$   ENDIF
1473$!
1474$! End The P6 Check.
1475$!
1476$ ENDIF
1477$!
1478$!
1479$! Check To See If We Have A ZLIB Option.
1480$!
1481$ ZLIB = P7
1482$ IF (ZLIB .NES. "")
1483$ THEN
1484$!
1485$!  Check for expected ZLIB files.
1486$!
1487$   err = 0
1488$   file1 = f$parse( "zlib.h", ZLIB, , , "SYNTAX_ONLY")
1489$   if (f$search( file1) .eqs. "")
1490$   then
1491$     WRITE SYS$OUTPUT ""
1492$     WRITE SYS$OUTPUT "The Option ", ZLIB, " Is Invalid."
1493$     WRITE SYS$OUTPUT "    Can't find header: ''file1'"
1494$     err = 1
1495$   endif
1496$!
1497$   file2 = f$parse( ZLIB, "libz.olb", , , "SYNTAX_ONLY")
1498$   if (f$search( file2) .eqs. "")
1499$   then
1500$     if (err .eq. 0)
1501$     then
1502$       WRITE SYS$OUTPUT ""
1503$       WRITE SYS$OUTPUT "The Option ", ZLIB, " Is Invalid."
1504$     endif
1505$     WRITE SYS$OUTPUT "    Can't find library: ''file2'"
1506$     WRITE SYS$OUTPUT ""
1507$     err = err+ 2
1508$   endif
1509$   if (err .eq. 1)
1510$   then
1511$     WRITE SYS$OUTPUT ""
1512$   endif
1513$!
1514$   if (err .ne. 0)
1515$   then
1516$     GOTO TIDY
1517$   endif
1518$!
1519$!  Print info
1520$!
1521$   WRITE SYS$OUTPUT "ZLIB library spec: ", file2
1522$!
1523$! End The ZLIB Check.
1524$!
1525$ ENDIF
1526$!
1527$!  Time To RETURN...
1528$!
1529$ RETURN
1530$!
1531$ TIDY:
1532$!
1533$! Close any open files.
1534$!
1535$ if (f$trnlnm( "h_file", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
1536   close h_file
1537$!
1538$! Restore the original default device:[directory].
1539$!
1540$ SET DEFAULT 'DEF_ORIG'
1541$!
1542$ EXIT
1543$!
1544