1$!
2$!
3$ olddir = f$environment("default")
4$ on control_y then goto YExit
5$!
6$ gosub Init
7$ if .not. init_status then goto YExit
8$!
9$ call CompileAll
10$ call BuildTransferVectors
11$ call LinkShared
12$!
13$ call Cleanup
14$!
15$YExit:
16$ set noon
17$!
18$ deassign srcdir
19$ if f$search("objdir:*.*;*") .nes. "" then delete objdir:*.*;*
20$ deassign objdir
21$ delete library_objects.dir;*
22$!
23$ set default 'olddir'
24$exit
25$!
26$!---------------------------------------------------------------------
27$!
28$Init:
29$!
30$!
31$ init_status = 1
32$ thisid = f$integer( %x'f$getjpi(0,"pid")')
33$ mdir   = f$environment("procedure")
34$ mdir   = mdir - f$parse(mdir,,,"name") - f$parse(mdir,,,"type") - f$parse(mdir,,,"version")
35$ set default 'mdir'
36$!
37$ objdir = "[.library_objects]"
38$ srcdir = "[-.src]"
39$!
40$ objdirfile = objdir - "[." - "]" + ".dir"
41$ if f$search( objdirfile ) .eqs. ""
42$ then
43$   create/directory 'objdir'
44$ endif
45$!
46$ define objdir 'objdir'
47$ define srcdir 'srcdir'
48$!
49$ cc_include = "/include=([],[-.include],""/gnv$zlib_include"")"
50$ cc_define = "/DEFINE=(_USE_STD_STAT=1)"
51$ link_opts  = "objdir:libssh2_''thisid'.opt"
52$!
53$ pipe search [-.include]libssh2.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; -
54       define/job majorv &l )
55$ pipe search [-.include]libssh2.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; -
56       define/job minorv &l )
57$ pipe search [-.include]libssh2.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; -
58       define/job patchv &l )
59$!
60$ majorv   = f$trnlnm("majorv")
61$ minorv   = f$integer(f$trnlnm("minorv"))
62$ patchv   = f$integer( f$trnlnm("patchv"))
63$!
64$ OLBONLY = "FALSE"
65$ if p1 .eqs. "OLBONLY"
66$ then
67$   OLBONLY = "TRUE"
68$ endif
69$!
70$ deassign/job majorv
71$ deassign/job minorv
72$ deassign/job patchv
73$!
74$return
75$!
76$!---------------------------------------------------------------------
77$!
78$Cleanup: subroutine
79$!
80$ set noon
81$ purge *.opt
82$ purge *.olb
83$ purge *.exe
84$!
85$exit 1
86$endsubroutine
87$!
88$!---------------------------------------------------------------------
89$!
90$LinkShared: subroutine
91$!
92$!
93$!
94$ cversion = f$fao("!3ZL",minorv)  + f$fao("!3ZL",patchv)
95$!
96$! General linking options in link_libssh2_version...opt
97$! Vectors in link_libssh2_vectors...opt
98$!
99$ open/write uitv link_libssh2_version_'majorv'_'minorv'_'patchv'.opt
100$ write uitv "GSMATCH=LEQUAL,''majorv',''cversion'"
101$ write uitv "IDENTIFICATION=""LIBSSH2 ''majorv'.''minorv'.''patchv'"""
102$ write uitv "sys$share:ssl$libcrypto_shr32.exe/share"
103$ write uitv "sys$share:ssl$libssl_shr32.exe/share"
104$ write uitv "gnv$libzshr/share"
105$ close uitv
106$!
107$ link/shared/exe=libssh2_'majorv'_'minorv'_'patchv'.exe -
108    libssh2.olb/lib, -
109    link_libssh2_version_'majorv'_'minorv'_'patchv'.opt/opt, -
110    link_libssh2_vectors_'majorv'_'minorv'_'patchv'.opt/opt
111$!
112$exit
113$endsubroutine
114$!
115$!---------------------------------------------------------------------
116$!
117$CompileAll: subroutine
118$!
119$ set noon
120$!
121$ if f$search("objdir:*.obj;*") .nes ""
122$ then
123$   delete objdir:*.obj;*
124$ endif
125$ if f$search("[.cxx_repository]cxx$demangler_db.;") .nes ""
126$ then
127$   delete [.cxx_repository]cxx$demangler_db.;*
128$ endif
129$!
130$! Compile all .c files in [-.src], first as_is
131$! and then as default all uppercase names
132$! and add the resulting object to object libraries
133$! libssh2_up.olb and libssh2_as_is.olb.
134$!
135$ case = 0
136$ if OLBONLY then case = 1
137$CaseLoop:
138$!
139$ if case .eq. 0
140$ then!camel case names
141$   cc_flags = "/names=(shortened,as_is)''cc_define'"
142$   objlib = "libssh2_asis.olb"
143$ endif
144$!
145$ if case .eq. 1
146$ then!uppercase names
147$   if f$search("[.cxx_repository]cxx$demangler_db.;") .nes ""
148$   then
149$      rename [.cxx_repository]cxx$demangler_db.; *.lowercase
150$      purge  [.cxx_repository]cxx$demangler_db.lowercase
151$   endif
152$!
153$   cc_flags = "/names=(shortened)''cc_define'"
154$   objlib = "libssh2_up.olb"
155$ endif
156$!
157$ if f$search("''objlib';*") .nes. "" then delete 'objlib';*
158$ library/create 'objlib'
159$!
160$Loop:
161$ this = f$search("srcdir:*.c;0")
162$ if this .eqs. "" then goto EndLoop
163$!
164$ what = f$parse( this,,,"name")
165$!
166$ call CompileAndAdd
167$!
168$ goto Loop
169$EndLoop:
170$ case = case + 1
171$ delete objdir:*.obj;*
172$ if case .lt 2 then goto CaseLoop
173$!
174$ rename libssh2_up.olb libssh2.olb
175$ if f$search("[.cxx_repository]cxx$demangler_db.;") .nes ""
176$ then
177$    rename [.cxx_repository]cxx$demangler_db.; *.uppercase
178$    purge  [.cxx_repository]cxx$demangler_db.uppercase
179$ endif
180$!
181$ if OLBONLY then exit 4
182$!
183$! For each function that is too long, create a global symbol
184$! low$'shortened-uppercase-name' with as value lowercase shortened
185$! name in it, so we can add the proper lower or mixed case
186$! shortened name later when building the transfer vectors
187$! for the shared image.
188$! This is to prevent two very long similar function names
189$! that are shortened getting mixed up when sorted alphabetically.
190$!
191$ inputfile = "[.cxx_repository]cxx$demangler_db.lowercase"
192$ gosub GetShortened
193$!
194$ inputfile =  "[.cxx_repository]cxx$demangler_db.uppercase"
195$ gosub GetShortened
196$!
197$exit
198$!
199$GetShortened:
200$!
201$ open/read s 'inputfile'
202$ namecount = 0
203$ReadLoop:
204$!
205$ read/end=endreadloop s regel
206$!
207$ shortname = f$element(0,"$",regel) + "$"
208$ longname  = f$element(1,"$",regel)
209$!
210$ symvalue = ""
211$!
212$ if shortname .eqs. f$edit(shortname,"upcase")
213$ then
214$!  this is an uppercase shortname, add it
215$   symname  = "u$''longname'"
216$   symvalue = "''shortname'"
217$   low$'shortname' == l$'longname'
218$!
219$   delete/symbol l$'longname'
220$!
221$ else
222$!  this is an lowercase shortname
223$   symname  = "l$''longname'"
224$   symvalue = "''shortname'"
225$   'symname' = "''symvalue'"
226$ endif
227$!
228$ namecount = namecount + 1
229$!
230$ goto ReadLoop
231$EndReadLoop:
232$!
233$close s
234$return
235$!
236$endsubroutine
237$!
238$!---------------------------------------------------------------------
239$!
240$CompileAndAdd: subroutine
241$!
242$ on error then goto End
243$!
244$ cc /warn=disable=longextern/lis=objdir:/show=all 'cc_include' 'cc_flags'/object=objdir:'what'.obj srcdir:'what'.c
245$ library/insert 'objlib' objdir:'what'.obj
246$!
247$End:
248$exit
249$endsubroutine
250$!
251$!---------------------------------------------------------------------
252$!
253$BuildTransferVectors: subroutine
254$!
255$! Do a balanced read of the uppercase library names
256$! and the mixed case library names, and build the
257$! transfer vectors with uppercase entry points
258$! with an alternative in mixed case.
259$! For shortened names, use the low$* symbols
260$! to avoid being fooled by the sort.
261$!
262$ thislib = "libssh2.olb"
263$ library/lis=libu.'thisid'/names libssh2.olb
264$ library/lis=lib_asisu.'thisid'/names libssh2_asis.olb
265$!
266$! case blind sort of all modules in both the uppercase
267$! as the case sensitive object library.
268$!
269$ sort libu.'thisid' lib.'thisid'/spec=sys$input
270/COLLATING_SEQUENCE=(SEQUENCE= ("A" - "Z","0"-"9","_"), FOLD)
271$ sort lib_asisu.'thisid' lib_asis.'thisid'/spec=sys$input
272/COLLATING_SEQUENCE=(SEQUENCE= ("A" - "Z","0"-"9","_"), FOLD)
273$!
274$ open/read  in  lib.'thisid'
275$ open/read  inasis  lib_asis.'thisid'
276$ open/write uit link_libssh2_vectors_'majorv'_'minorv'_'patchv'.opt
277$!
278$ write uit "CASE_SENSITIVE=YES"
279$ write uit "SYMBOL_VECTOR= ( -"
280$!
281$ mode = 0
282$ uitregel = ""
283$!
284$ReadLoop:
285$!
286$ read/end=ReadAsis in regel
287$ReadAsis:
288$ read/end=EndReadLoop inasis asisregel
289$!
290$ regel     = f$edit( regel, "trim,compress" )
291$ asisregel = f$edit( asisregel, "trim,compress" )
292$!
293$ if f$element(0," ",regel) .eqs. "Module" .or. -
294     f$extract(0,1,regel)   .eqs. "_" .or. -
295     f$element(1," ",regel) .nes. " " .or. -
296     regel .eqs. ""
297$ then
298$   goto ReadLoop
299$ endif
300$!
301$ if uitregel .nes. "" .and. mode .eq. 1
302$ then
303$   write uit "''uitregel'=PROCEDURE, -"
304$   write uit "''uitasis'/''uitregel'=PROCEDURE, -"
305$!
306$   uitregel = ""
307$   uitasis  = ""
308$ endif
309$!
310$ uitregel = regel
311$ if f$type( low$'uitregel' ) .nes. ""
312$ then
313$   uitasis = low$'uitregel'
314$   delete/symbol/global low$'uitregel'
315$ else
316$   uitasis  = asisregel
317$ endif
318$!
319$ mode = 1
320$!
321$ goto ReadLoop
322$EndreadLoop:
323$!
324$! To get the closing brace after the last procedure
325$! keyword.
326$!
327$ if uitregel .nes. ""
328$ then
329$   write uit "''uitregel'=PROCEDURE, -"
330$   write uit "''uitasis'/''uitregel'=PROCEDURE)"
331$ endif
332$!
333$ write uit "CASE_SENSITIVE=NO"
334$!
335$ close in
336$ close inasis
337$ close uit
338$!
339$ delete lib*.'thisid';*
340$!
341$exit
342$endsubroutine
343$!
344$!---------------------------------------------------------------------
345$!
346