$! $! $ olddir = f$environment("default") $ on control_y then goto YExit $! $ gosub Init $ if .not. init_status then goto YExit $! $ call CompileAll $ call BuildTransferVectors $ call LinkShared $! $ call Cleanup $! $YExit: $ set noon $! $ deassign srcdir $ if f$search("objdir:*.*;*") .nes. "" then delete objdir:*.*;* $ deassign objdir $ delete library_objects.dir;* $! $ set default 'olddir' $exit $! $!--------------------------------------------------------------------- $! $Init: $! $! $ init_status = 1 $ thisid = f$integer( %x'f$getjpi(0,"pid")') $ mdir = f$environment("procedure") $ mdir = mdir - f$parse(mdir,,,"name") - f$parse(mdir,,,"type") - f$parse(mdir,,,"version") $ set default 'mdir' $! $ objdir = "[.library_objects]" $ srcdir = "[-.src]" $! $ objdirfile = objdir - "[." - "]" + ".dir" $ if f$search( objdirfile ) .eqs. "" $ then $ create/directory 'objdir' $ endif $! $ define objdir 'objdir' $ define srcdir 'srcdir' $! $ cc_include = "/include=([],[-.include],""/gnv$zlib_include"")" $ cc_define = "/DEFINE=(_USE_STD_STAT=1)" $ link_opts = "objdir:libssh2_''thisid'.opt" $! $ pipe search [-.include]libssh2.h libssh2_version_major/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; - define/job majorv &l ) $ pipe search [-.include]libssh2.h libssh2_version_minor/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; - define/job minorv &l ) $ pipe search [-.include]libssh2.h libssh2_version_patch/nohead | (read sys$input l ; l = f$element(2," ",f$edit(l,"trim,compress")) ; - define/job patchv &l ) $! $ majorv = f$trnlnm("majorv") $ minorv = f$integer(f$trnlnm("minorv")) $ patchv = f$integer( f$trnlnm("patchv")) $! $ OLBONLY = "FALSE" $ if p1 .eqs. "OLBONLY" $ then $ OLBONLY = "TRUE" $ endif $! $ deassign/job majorv $ deassign/job minorv $ deassign/job patchv $! $return $! $!--------------------------------------------------------------------- $! $Cleanup: subroutine $! $ set noon $ purge *.opt $ purge *.olb $ purge *.exe $! $exit 1 $endsubroutine $! $!--------------------------------------------------------------------- $! $LinkShared: subroutine $! $! $! $ cversion = f$fao("!3ZL",minorv) + f$fao("!3ZL",patchv) $! $! General linking options in link_libssh2_version...opt $! Vectors in link_libssh2_vectors...opt $! $ open/write uitv link_libssh2_version_'majorv'_'minorv'_'patchv'.opt $ write uitv "GSMATCH=LEQUAL,''majorv',''cversion'" $ write uitv "IDENTIFICATION=""LIBSSH2 ''majorv'.''minorv'.''patchv'""" $ write uitv "sys$share:ssl$libcrypto_shr32.exe/share" $ write uitv "sys$share:ssl$libssl_shr32.exe/share" $ write uitv "gnv$libzshr/share" $ close uitv $! $ link/shared/exe=libssh2_'majorv'_'minorv'_'patchv'.exe - libssh2.olb/lib, - link_libssh2_version_'majorv'_'minorv'_'patchv'.opt/opt, - link_libssh2_vectors_'majorv'_'minorv'_'patchv'.opt/opt $! $exit $endsubroutine $! $!--------------------------------------------------------------------- $! $CompileAll: subroutine $! $ set noon $! $ if f$search("objdir:*.obj;*") .nes "" $ then $ delete objdir:*.obj;* $ endif $ if f$search("[.cxx_repository]cxx$demangler_db.;") .nes "" $ then $ delete [.cxx_repository]cxx$demangler_db.;* $ endif $! $! Compile all .c files in [-.src], first as_is $! and then as default all uppercase names $! and add the resulting object to object libraries $! libssh2_up.olb and libssh2_as_is.olb. $! $ case = 0 $ if OLBONLY then case = 1 $CaseLoop: $! $ if case .eq. 0 $ then!camel case names $ cc_flags = "/names=(shortened,as_is)''cc_define'" $ objlib = "libssh2_asis.olb" $ endif $! $ if case .eq. 1 $ then!uppercase names $ if f$search("[.cxx_repository]cxx$demangler_db.;") .nes "" $ then $ rename [.cxx_repository]cxx$demangler_db.; *.lowercase $ purge [.cxx_repository]cxx$demangler_db.lowercase $ endif $! $ cc_flags = "/names=(shortened)''cc_define'" $ objlib = "libssh2_up.olb" $ endif $! $ if f$search("''objlib';*") .nes. "" then delete 'objlib';* $ library/create 'objlib' $! $Loop: $ this = f$search("srcdir:*.c;0") $ if this .eqs. "" then goto EndLoop $! $ what = f$parse( this,,,"name") $! $ call CompileAndAdd $! $ goto Loop $EndLoop: $ case = case + 1 $ delete objdir:*.obj;* $ if case .lt 2 then goto CaseLoop $! $ rename libssh2_up.olb libssh2.olb $ if f$search("[.cxx_repository]cxx$demangler_db.;") .nes "" $ then $ rename [.cxx_repository]cxx$demangler_db.; *.uppercase $ purge [.cxx_repository]cxx$demangler_db.uppercase $ endif $! $ if OLBONLY then exit 4 $! $! For each function that is too long, create a global symbol $! low$'shortened-uppercase-name' with as value lowercase shortened $! name in it, so we can add the proper lower or mixed case $! shortened name later when building the transfer vectors $! for the shared image. $! This is to prevent two very long similar function names $! that are shortened getting mixed up when sorted alphabetically. $! $ inputfile = "[.cxx_repository]cxx$demangler_db.lowercase" $ gosub GetShortened $! $ inputfile = "[.cxx_repository]cxx$demangler_db.uppercase" $ gosub GetShortened $! $exit $! $GetShortened: $! $ open/read s 'inputfile' $ namecount = 0 $ReadLoop: $! $ read/end=endreadloop s regel $! $ shortname = f$element(0,"$",regel) + "$" $ longname = f$element(1,"$",regel) $! $ symvalue = "" $! $ if shortname .eqs. f$edit(shortname,"upcase") $ then $! this is an uppercase shortname, add it $ symname = "u$''longname'" $ symvalue = "''shortname'" $ low$'shortname' == l$'longname' $! $ delete/symbol l$'longname' $! $ else $! this is an lowercase shortname $ symname = "l$''longname'" $ symvalue = "''shortname'" $ 'symname' = "''symvalue'" $ endif $! $ namecount = namecount + 1 $! $ goto ReadLoop $EndReadLoop: $! $close s $return $! $endsubroutine $! $!--------------------------------------------------------------------- $! $CompileAndAdd: subroutine $! $ on error then goto End $! $ cc /warn=disable=longextern/lis=objdir:/show=all 'cc_include' 'cc_flags'/object=objdir:'what'.obj srcdir:'what'.c $ library/insert 'objlib' objdir:'what'.obj $! $End: $exit $endsubroutine $! $!--------------------------------------------------------------------- $! $BuildTransferVectors: subroutine $! $! Do a balanced read of the uppercase library names $! and the mixed case library names, and build the $! transfer vectors with uppercase entry points $! with an alternative in mixed case. $! For shortened names, use the low$* symbols $! to avoid being fooled by the sort. $! $ thislib = "libssh2.olb" $ library/lis=libu.'thisid'/names libssh2.olb $ library/lis=lib_asisu.'thisid'/names libssh2_asis.olb $! $! case blind sort of all modules in both the uppercase $! as the case sensitive object library. $! $ sort libu.'thisid' lib.'thisid'/spec=sys$input /COLLATING_SEQUENCE=(SEQUENCE= ("A" - "Z","0"-"9","_"), FOLD) $ sort lib_asisu.'thisid' lib_asis.'thisid'/spec=sys$input /COLLATING_SEQUENCE=(SEQUENCE= ("A" - "Z","0"-"9","_"), FOLD) $! $ open/read in lib.'thisid' $ open/read inasis lib_asis.'thisid' $ open/write uit link_libssh2_vectors_'majorv'_'minorv'_'patchv'.opt $! $ write uit "CASE_SENSITIVE=YES" $ write uit "SYMBOL_VECTOR= ( -" $! $ mode = 0 $ uitregel = "" $! $ReadLoop: $! $ read/end=ReadAsis in regel $ReadAsis: $ read/end=EndReadLoop inasis asisregel $! $ regel = f$edit( regel, "trim,compress" ) $ asisregel = f$edit( asisregel, "trim,compress" ) $! $ if f$element(0," ",regel) .eqs. "Module" .or. - f$extract(0,1,regel) .eqs. "_" .or. - f$element(1," ",regel) .nes. " " .or. - regel .eqs. "" $ then $ goto ReadLoop $ endif $! $ if uitregel .nes. "" .and. mode .eq. 1 $ then $ write uit "''uitregel'=PROCEDURE, -" $ write uit "''uitasis'/''uitregel'=PROCEDURE, -" $! $ uitregel = "" $ uitasis = "" $ endif $! $ uitregel = regel $ if f$type( low$'uitregel' ) .nes. "" $ then $ uitasis = low$'uitregel' $ delete/symbol/global low$'uitregel' $ else $ uitasis = asisregel $ endif $! $ mode = 1 $! $ goto ReadLoop $EndreadLoop: $! $! To get the closing brace after the last procedure $! keyword. $! $ if uitregel .nes. "" $ then $ write uit "''uitregel'=PROCEDURE, -" $ write uit "''uitasis'/''uitregel'=PROCEDURE)" $ endif $! $ write uit "CASE_SENSITIVE=NO" $! $ close in $ close inasis $ close uit $! $ delete lib*.'thisid';* $! $exit $endsubroutine $! $!--------------------------------------------------------------------- $!