| 1 | $! libiberty/vmsbuild.com -- build liberty.olb for VMS host, VMS target |
| 2 | $! |
| 3 | $ CC = "gcc /noVerbose/Debug/Incl=([],[-.include])" |
| 4 | $ LIBR = "library /Obj" |
| 5 | $ LINK = "link" |
| 6 | $ DELETE= "delete /noConfirm" |
| 7 | $ SEARCH= "search /Exact" |
| 8 | $ ECHO = "write sys$output" |
| 9 | $ ABORT = "exit %x002C" |
| 10 | $! |
| 11 | $ LIB_NAME = "liberty.olb" !this is what we're going to construct |
| 12 | $ WORK_LIB = "new-lib.olb" !used to guard against an incomplete build |
| 13 | $ |
| 14 | $! manually copied from Makefile.in |
| 15 | $ REQUIRED_OFILES = "argv.o basename.o choose-temp.o concat.o cplus-dem.o "- |
| 16 | + "fdmatch.o fnmatch.o getopt.o getopt1.o getruntime.o hex.o "- |
| 17 | + "floatformat.o objalloc.o obstack.o spaces.o strerror.o strsignal.o "- |
| 18 | + "xatexit.o xexit.o xmalloc.o xmemdup.o xstrdup.o xstrerror.o" |
| 19 | $! anything not caught by link+search of dummy.* should be added here |
| 20 | $ EXTRA_OFILES = "" |
| 21 | $! |
| 22 | $! move to the directory which contains this command procedure |
| 23 | $ old_dir = f$environ("DEFAULT") |
| 24 | $ new_dir = f$parse("_._;",f$environ("PROCEDURE")) - "_._;" |
| 25 | $ set default 'new_dir' |
| 26 | $ |
| 27 | $ ECHO "Starting libiberty build..." |
| 28 | $ create config.h |
| 29 | /* libiberty config.h for VMS */ |
| 30 | #define NEED_sys_siglist |
| 31 | #define NEED_strsignal |
| 32 | #define NEED_psignal |
| 33 | #define NEED_basename |
| 34 | $ LIBR 'WORK_LIB' /Create |
| 35 | $ |
| 36 | $! first pass: compile "required" modules |
| 37 | $ ofiles = REQUIRED_OFILES + " " + EXTRA_OFILES |
| 38 | $ pass = 1 |
| 39 | $ gosub do_ofiles |
| 40 | $ |
| 41 | $! second pass: process dummy.c, using the first pass' results |
| 42 | $ ECHO " now checking run-time library for missing functionality" |
| 43 | $ if f$search("dummy.obj").nes."" then DELETE dummy.obj;* |
| 44 | $ define/noLog sys$error _NL: !can't use /User_Mode here due to gcc |
| 45 | $ define/noLog sys$output _NL: ! driver's use of multiple image activation |
| 46 | $ on error then continue |
| 47 | $ 'CC' dummy.c |
| 48 | $ deassign sys$error !restore, more or less |
| 49 | $ deassign sys$output |
| 50 | $ if f$search("dummy.obj").eqs."" then goto pass2_failure1 |
| 51 | $! link dummy.obj, capturing full linker feedback in dummy.map |
| 52 | $ oldmsg = f$environ("MESSAGE") |
| 53 | $ set message /Facility/Severity/Identification/Text |
| 54 | $ define/User sys$output _NL: |
| 55 | $ define/User sys$error _NL: |
| 56 | $ LINK/Map=dummy.map/noExe dummy.obj,'WORK_LIB'/Libr,- |
| 57 | gnu_cc:[000000]gcclib.olb/Libr,sys$library:vaxcrtl.olb/Libr |
| 58 | $ set message 'oldmsg' |
| 59 | $ if f$search("dummy.map").eqs."" then goto pass2_failure2 |
| 60 | $ DELETE dummy.obj;* |
| 61 | $ SEARCH dummy.map "%LINK-I-UDFSYM" /Output=dummy.list |
| 62 | $ DELETE dummy.map;* |
| 63 | $ ECHO " check completed" |
| 64 | $! we now have a file with one entry per line of unresolvable symbols |
| 65 | $ ofiles = "" |
| 66 | $ if f$trnlnm("IFILE$").nes."" then close/noLog ifile$ |
| 67 | $ open/Read ifile$ dummy.list |
| 68 | $iloop: read/End=idone ifile$ iline |
| 69 | $ iline = f$edit(iline,"COMPRESS,TRIM,LOWERCASE") |
| 70 | $ ofiles = ofiles + " " + f$element(1," ",iline) + ".o" |
| 71 | $ goto iloop |
| 72 | $idone: close ifile$ |
| 73 | $ DELETE dummy.list;* |
| 74 | $ on error then ABORT |
| 75 | $ |
| 76 | $! third pass: compile "missing" modules collected in pass 2 |
| 77 | $ pass = 3 |
| 78 | $ gosub do_ofiles |
| 79 | $ |
| 80 | $! finish up |
| 81 | $ LIBR 'WORK_LIB' /Compress /Output='LIB_NAME' !new-lib.olb -> liberty.olb |
| 82 | $ DELETE 'WORK_LIB';* |
| 83 | $ |
| 84 | $! all done |
| 85 | $ ECHO "Completed libiberty build." |
| 86 | $ type sys$input: |
| 87 | |
| 88 | You many wish to do |
| 89 | $ COPY LIBERTY.OLB GNU_CC:[000000] |
| 90 | so that this run-time library resides in the same location as gcc's |
| 91 | support library. When building gas, be sure to leave the original |
| 92 | copy of liberty.olb here so that gas's build procedure can find it. |
| 93 | |
| 94 | $ set default 'old_dir' |
| 95 | $ exit |
| 96 | $ |
| 97 | $! |
| 98 | $! compile each element of the space-delimited list 'ofiles' |
| 99 | $! |
| 100 | $do_ofiles: |
| 101 | $ ofiles = f$edit(ofiles,"COMPRESS,TRIM") |
| 102 | $ i = 0 |
| 103 | $oloop: |
| 104 | $ f = f$element(i," ",ofiles) |
| 105 | $ if f.eqs." " then goto odone |
| 106 | $ f = f - ".o" !strip dummy suffix |
| 107 | $ ECHO " ''f'" |
| 108 | $ skip_f = 0 |
| 109 | $ if pass.eq.3 .and. f$search("''f'.c").eqs."" then gosub chk_deffunc |
| 110 | $ if .not.skip_f |
| 111 | $ then |
| 112 | $ 'CC' 'f'.c |
| 113 | $ LIBR 'WORK_LIB' 'f'.obj /Insert |
| 114 | $ DELETE 'f'.obj;* |
| 115 | $ endif |
| 116 | $ i = i + 1 |
| 117 | $ goto oloop |
| 118 | $odone: |
| 119 | $ return |
| 120 | $ |
| 121 | $! |
| 122 | $! check functions.def for a DEFFUNC() entry corresponding to missing file 'f'.c |
| 123 | $! |
| 124 | $chk_deffunc: |
| 125 | $ define/User sys$output _NL: |
| 126 | $ define/User sys$error _NL: |
| 127 | $ SEARCH functions.def "DEFFUNC","''f'" /Match=AND |
| 128 | $ if (($status.and.%x7FFFFFFF) .eq. 1) |
| 129 | $ then |
| 130 | $ skip_f = 1 |
| 131 | $ open/Append config_h config.h |
| 132 | $ write config_h "#define NEED_''f'" |
| 133 | $ close config_h |
| 134 | $ endif |
| 135 | $ return |
| 136 | $ |
| 137 | $! |
| 138 | $pass2_failure1: |
| 139 | $! if we reach here, dummy.c failed to compile and we're really stuck |
| 140 | $ type sys$input: |
| 141 | |
| 142 | Cannot compile the library contents checker (dummy.c + functions.def), |
| 143 | so cannot continue! |
| 144 | |
| 145 | $! attempt the compile again, without suppressing diagnostic messages this time |
| 146 | $ on error then ABORT +0*f$verify(v) |
| 147 | $ v = f$verify(1) |
| 148 | $ 'CC' dummy.c |
| 149 | $ ABORT +0*f$verify(v) !'f$verify(0)' |
| 150 | $! |
| 151 | $pass2_failure2: |
| 152 | $! should never reach here.. |
| 153 | $ type sys$input: |
| 154 | |
| 155 | Cannot link the library contents checker (dummy.obj), so cannot continue! |
| 156 | |
| 157 | $! attempt the link again, without suppressing diagnostic messages this time |
| 158 | $ on error then ABORT +0*f$verify(v) |
| 159 | $ v = f$verify(1) |
| 160 | $ LINK/Map=dummy.map/noExe dummy.obj,'WORK_LIB'/Libr,- |
| 161 | gnu_cc:[000000]gcclib.olb/Libr,sys$library:vaxcrtl.olb/Libr |
| 162 | $ ABORT +0*f$verify(v) !'f$verify(0)' |
| 163 | $ |
| 164 | $! not reached |
| 165 | $ exit |