|
|
1.1 root 1: $ !
2: $ ! Set up to compile GCC on VAX/VMS
3: $ !
4: $! Set the def dir to proper place for use in batch. Works for interactive too.
5: $flnm = f$enviroment("PROCEDURE") ! get current procedure name
6: $set default 'f$parse(flnm,,,"DEVICE")''f$parse(flnm,,,"DIRECTORY")'
7: $ !
8: $set symbol/scope=(nolocal,noglobal)
9: $ !
10: $ echo = "write sys$output"
11: $ !
12: $ if f$search("config.h") .nes. "" then delete config.h.*
1.1.1.2 root 13: $ copy [.config.vax]xm-vms.h []config.h
14: $ echo "Linked `config.h' to `[.config.vax]xm-vms.h'.
1.1 root 15: $ !
16: $ if f$search("tconfig.h") .nes. "" then delete tconfig.h.*
17: $ create []tconfig.h
18: $DECK
19: /* tconfig.h == config.h :: target and host configurations are the same */
20: #include "config.h"
21: $EOD
22: $ echo "Created `tconfig.h'.
23: $ !
24: $ if f$search("hconfig.h") .nes. "" then delete hconfig.h.*
25: $ create []hconfig.h
26: $DECK
1.1.1.2 root 27: /* hconfig.h == config.h :: host and target configurations are the same */
1.1 root 28: #include "config.h"
29: $EOD
30: $ echo "Created `hconfig.h'.
31: $ !
32: $ if f$search("tm.h") .nes. "" then delete tm.h.*
1.1.1.2 root 33: $!! copy [.config.vax]vms.h []tm.h
34: $ edit/tpu/nojournal/nosection/nodisplay/command=sys$input -
35: [.config.vax]vms.h /output=[]tm.h
36: $DECK
37: !
38: ! Copy file, changing lines of the form
39: ! #include "vax/*"
40: ! into
1.1.1.4 ! root 41: ! #include "config-*"
1.1.1.2 root 42: !
43: file := CREATE_BUFFER("file", GET_INFO(COMMAND_LINE, "file_name"));
44: targ := LINE_BEGIN & '#include' & SPAN(ASCII(32)+ASCII(9)) & '"vax/';
45: rang := CREATE_RANGE(BEGINNING_OF(file), END_OF(file));
46: LOOP
47: incl := SEARCH_QUIETLY(targ, FORWARD, EXACT, rang);
48: EXITIF incl = 0;
49: POSITION(BEGINNING_OF(incl));
50: ERASE(incl);
1.1.1.4 ! root 51: COPY_TEXT('#include "config-');
1.1.1.2 root 52: rang := CREATE_RANGE(END_OF(incl), END_OF(file));
53: ENDLOOP;
54: WRITE_FILE(file, GET_INFO(COMMAND_LINE, "output_file"));
55: QUIT
56: $EOD
57: $ echo "Generated `tm.h' from `[.config.vax]vms.h'.
1.1 root 58: $ !
1.1.1.4 ! root 59: $ !crude hack to allow compiling from [.cp] subdirectory
! 60: $ if f$search("config-vax.h") .nes. "" then delete config-vax.h;*
! 61: $ copy [.config.vax]vax.h []config-vax.h
! 62: $ echo "Linked `config-vax.h' to `[.config.vax]vax.h' for `tm.h'."
! 63: $ !
1.1 root 64: $ if f$search("md.") .nes. "" then delete md..*
1.1.1.2 root 65: $ copy [.config.vax]vax.md []md.
66: $ echo "Linked `md' to `[.config.vax]vax.md'.
1.1 root 67: $ !
68: $ if f$search("aux-output.c") .nes. "" then delete aux-output.c.*
1.1.1.2 root 69: $ copy [.config.vax]vax.c []aux-output.c
70: $ echo "Linked `aux-output.c' to `[.config.vax]vax.c'.
1.1 root 71: $ !
72: $!
73: $!
74: $! Create the file version.opt, which helps identify the executable.
75: $!
76: $search version.c version_string,"="/match=and/output=t.tmp
77: $open ifile$ t.tmp
78: $read ifile$ line
79: $close ifile$
80: $delete t.tmp;
81: $ijk=f$locate("""",line)+1
82: $line=f$extract(ijk,f$length(line)-ijk,line)
83: $ijk=f$locate("""",line)
84: $line=f$extract(0,ijk,line)
85: $ijk=f$locate("\n",line)
86: $line=f$extract(0,ijk,line)
87: $!
88: $i=0
89: $loop:
90: $elm=f$element(i," ",line)
91: $if elm.eqs."" then goto no_ident
92: $if (elm.les."9").and.(elm.ges."0") then goto write_ident
93: $i=i+1
94: $goto loop
95: $!
96: $no_ident:
97: $elm="?.??"
98: $!
99: $!
100: $write_ident:
101: $open ifile$ version.opt/write
102: $write ifile$ "ident="+""""+elm+""""
103: $close ifile$
104: $purge version.opt
105: $!
106: $!
107: $! create linker options files that lists all of the components for all
108: $! possible compilers. We do this by editing the file Makefile.in, and
109: $! generating the relevant files from it.
110: $!
111: $!
112: $! Make a copy of the makefile if the sources are on a disk that is NFS
113: $! mounted on a unix machine.
114: $if f$search("Makefile.in").eqs."" .and. f$search("$M$akefile.in").nes."" -
115: then copy $M$akefile.in Makefile.in
1.1.1.4 ! root 116: $! This should be automated across all front-end subdirectories.
! 117: $! For now, it's hardcoded.
! 118: $if f$search("[.cp]Makefile.in").eqs."" .and. f$search("[.cp]$M$akefile.in").nes."" -
! 119: then copy [.cp]$M$akefile.in [.cp]Makefile.in
1.1 root 120: $!
121: $!
122: $echo "Now processing Makefile.in to generate linker option files."
123: $edit/tpu/nojournal/nosection/nodisplay/command=sys$input
124: PROCEDURE generate_option_file (TAG_NAME, outfile)
125: position (beginning_of (newbuffer));
126: recursive_fetch_tag (TAG_NAME);
127: !
128: ! Now fix up a few things in the output buffer
129: !
1.1.1.3 root 130: pat_replace ("bytecode "," ");
1.1 root 131: pat_replace (".o ",",");
132: pat_replace (".o",""); !appear at end of lines.
133: !
134: ! Remove trailing commas, if present.
135: !
136: position (beginning_of (newbuffer));
137: LOOP
138: range1 := search_quietly("," & ((SPAN(" ") & LINE_END) | LINE_END),
139: FORWARD, EXACT);
140: exitif range1 = 0;
141: position (beginning_of (range1));
142: erase(range1);
143: split_line;
144: ENDLOOP;
145: ! get rid of leading spaces on lines.
146: position (beginning_of (current_buffer)) ;
147: LOOP
148: range1 := search_quietly ( LINE_BEGIN & " ", FORWARD, EXACT) ;
149: EXITIF range1 = 0;
150: position (end_of (range1));
151: erase_character(1);
152: ENDLOOP;
153: !
154: ! Now write the output file.
155: !
156: SET(OUTPUT_FILE, newbuffer, outfile);
157: write_file (newbuffer);
158: erase (newbuffer);
159: ENDPROCEDURE;
160:
161: !
162: ! Looks up a tag, copies it to newbuffer, and then translates any $(...)
163: ! definitions that appear. The translation is put at the current point.
164: !
165: PROCEDURE recursive_fetch_tag (TAG_N);
166: fetch_tag (TAG_N);
167: !
168: ! substitute any makefile symbols $(...)
169: !
170: position (beginning_of (current_buffer)) ;
171: LOOP
172: range1 := search_quietly ("$(" &
173: SPAN("abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ#~0123456789")
174: & ")", FORWARD, EXACT) ;
175: EXITIF range1 = 0;
176: position (beginning_of (range1));
177: move_horizontal(2);
178: mark_1 := MARK (NONE);
179: position (end_of (range1));
180: move_horizontal(-1);
181: mark_2 := MARK (NONE);
182: tag_range := CREATE_RANGE(MARK_1, MARK_2, NONE);
183: position (end_of (range1));
184: tag_string := STR (tag_range);
185: erase (range1);
186: fetch_tag (LINE_BEGIN & tag_string & ((SPAN(" ") & "=") | "="));
187: position (beginning_of (current_buffer)) ;
188: ENDLOOP;
189: ENDPROCEDURE;
190:
191: !
192: ! Looks up the translation of a tag, and inserts it at the current location
193: ! in the buffer
194: !
195: PROCEDURE fetch_tag (TAG_N);
196: LOCAL mark1, mark2, mark3, range2;
197: mark3 := MARK(NONE) ;
198: position (beginning_of (mainbuffer)) ;
199: range2 := search_quietly (TAG_N, FORWARD, EXACT) ;
200: IF (range2 = 0) then
201: position (mark3);
202: return;
203: endif;
204: position (end_of (range2)) ;
205: MOVE_HORIZONTAL(1);
206: mark1 := MARK(NONE) ;
207: position (beginning_of (range2)) ;
208: MOVE_VERTICAL(1);
209: MOVE_HORIZONTAL(-2);
210: LOOP
211: EXITIF CURRENT_CHARACTER <> "\" ;
212: ERASE_CHARACTER(1);
213: MOVE_HORIZONTAL(1);
214: MOVE_VERTICAL(1);
215: MOVE_HORIZONTAL(-2);
216: ENDLOOP;
217: MOVE_HORIZONTAL(1);
218: mark2 := MARK(NONE) ;
219: range2 := CREATE_RANGE(mark1, mark2, NONE) ;
220: position (mark3);
221: if (length(range2) = 0) then return; endif;
222: copy_text(range2);
223: ENDPROCEDURE;
224:
225: PROCEDURE pat_replace (
226: oldstring, !
227: newstring) !
228: LOCAL range2;
229: position (beginning_of (current_buffer)) ;
230: LOOP
231: range2 := search_quietly (oldstring, FORWARD, EXACT) ;
232: EXITIF range2 = 0 ;
233: position (beginning_of (range2)) ;
234: erase (range2) ;
235: copy_text (newstring) ;
236: ENDLOOP ;
237: ENDPROCEDURE ;
238:
1.1.1.4 ! root 239: ! !
! 240: ! ...fix this... !
! 241: ! !
! 242: procedure temporary_cplusplus_hack()
! 243: position(end_of(compiler_list));
! 244: copy_text("cc1plus");
! 245: position(end_of(mainbuffer));
! 246: copy_text("cc1plus: [.cp]call,[.cp]decl,[.cp]errfn,[.cp]expr,[.cp]pt,[.cp]sig\"); split_line;
! 247: copy_text(" [.cp]typeck2,[.cp]class,[.cp]decl2,[.cp]error,[.cp]gc,[.cp]lex\"); split_line;
! 248: copy_text(" [.cp]parse,[.cp]ptree,[.cp]spew,[.cp]typeck,[.cp]cvt,[.cp]edsel\"); split_line;
! 249: copy_text(" [.cp]except,[.cp]init,[.cp]method,[.cp]search,[.cp]tree,[.cp]xref\"); split_line;
! 250: copy_text(" []c-common\"); split_line;
! 251: copy_text(" bc-emit,bc-optab\"); split_line;
! 252: copy_text(" obstack"); split_line;
! 253: endprocedure;
! 254:
! 255:
! 256: !
1.1 root 257: ! this is the start of the main procedure
258: filename := GET_INFO (COMMAND_LINE, 'file_name') ;
259: mainbuffer := CREATE_BUFFER ("Makefile.in", "Makefile.in") ;
260: newbuffer := CREATE_BUFFER("outfile");
261: compiler_list := CREATE_BUFFER("compilers");
262: !
263: ! Add to this list, as required. The file "Makefile.in" is searched for a
264: ! tag that looks like "LINE_BEGIN + 'tag + (optional space) + "="". The
265: ! contents are assumed to be a list of object files, and from this list a
266: ! VMS linker options file is generated.
267: !
268: position (beginning_of (compiler_list));
269: recursive_fetch_tag(LINE_BEGIN & "COMPILERS" & ((SPAN(" ") & "=") | "="));
270: position (beginning_of (compiler_list));
271: LOOP ! kill leading spaces.
272: exitif current_character <> " ";
273: erase_character(1);
274: ENDLOOP;
275: position (beginning_of (compiler_list));
276: LOOP ! remove any double spaces.
277: range1 := search_quietly (" ", FORWARD, EXACT) ; EXITIF range1 = 0 ;
278: position (beginning_of (range1)) ;
279: erase_character(1);
280: ENDLOOP ;
281: position (end_of (compiler_list));
282: move_horizontal(-1);
283: LOOP ! kill trailing spaces.
284: exitif current_character <> " ";
285: erase_character(1);
286: move_horizontal(-1);
287: ENDLOOP;
288: position (beginning_of (compiler_list));
289: LOOP
290: range1 := search_quietly (" ", FORWARD, EXACT) ;
291: EXITIF range1 = 0 ;
292: position (beginning_of (range1)) ;
293: erase (range1) ;
294: split_line;
295: ENDLOOP ;
1.1.1.4 ! root 296: ! !
! 297: ! This needs to be fixed. !
! 298: ! !
! 299: temporary_cplusplus_hack();
1.1 root 300: !
301: ! We now have a list of supported compilers. Now write it, and use it.
302: !
303: SET(OUTPUT_FILE, compiler_list, "compilers.list");
304: write_file (compiler_list);
305: generate_option_file(LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="),
306: "independent.opt");
307: generate_option_file(LINE_BEGIN & "LIB2FUNCS" & ((SPAN(" ") & "=") | "="),
308: "libgcc2.list");
1.1.1.3 root 309: generate_option_file(LINE_BEGIN & "BC_ALL" & ((SPAN(" ") & "=") | "="),
310: "bc_all.opt");
311: generate_option_file(LINE_BEGIN & "BI_OBJ" & ((SPAN(" ") & "=") | "="),
312: "bi_all.opt");
1.1 root 313: !
314: ! Now change OBJS in the Makefile, so each language specific options file
315: ! does not pick up all of the language independent files.
316: !
317: position (beginning_of (mainbuffer));
318: range1 := search_quietly (LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="),
319: FORWARD, EXACT) ;
320: position (end_of (range1));
321: split_line;
322: position (beginning_of (compiler_list));
323: LOOP
324: cmark := mark(NONE);
325: exitif cmark = end_of(compiler_list);
326: message(current_line);
1.1.1.4 ! root 327: generate_option_file(LINE_BEGIN & current_line & ((SPAN(" ") & ":") | ":"),
1.1 root 328: current_line+"-objs.opt");
329: position (cmark);
330: move_vertical(1);
331: ENDLOOP ;
332: quit ;
333: $ echo ""
334: $!
335: $! Remove excessive versions of the option files...
336: $!
337: $ purge *.opt
338: $ purge compilers.list,libgcc2.list
339: $!
340: $!
341: $!
342: $ if f$search("config.status") .nes. "" then delete config.status.*
343: $ open/write file config.status
344: $ write file "Links are now set up for use with a vax running VMS."
345: $ close file
346: $ type config.status
347: $ echo ""
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.