| $! |
| $! |
| $ 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])" |
| $ 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)" |
| $ 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)" |
| $ 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 |
| $! |
| $!--------------------------------------------------------------------- |
| $! |