|
|
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.*
13: $ copy [.config.vax]xm-vms.h []config.h
14: $ echo "Linked `config.h' to `[.config.vax]xm-vms.h'.
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
27: /* hconfig.h == config.h :: host and target configurations are the same */
28: #include "config.h"
29: $EOD
30: $ echo "Created `hconfig.h'.
31: $ !
32: $ if f$search("tm.h") .nes. "" then delete tm.h.*
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
41: ! #include "[.config.vax]*"
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);
51: COPY_TEXT('#include "[.config.vax]');
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'.
58: $ !
59: $ if f$search("md.") .nes. "" then delete md..*
60: $ copy [.config.vax]vax.md []md.
61: $ echo "Linked `md' to `[.config.vax]vax.md'.
62: $ !
63: $ if f$search("aux-output.c") .nes. "" then delete aux-output.c.*
64: $ copy [.config.vax]vax.c []aux-output.c
65: $ echo "Linked `aux-output.c' to `[.config.vax]vax.c'.
66: $ !
67: $!
68: $!
69: $! Create the file version.opt, which helps identify the executable.
70: $!
71: $search version.c version_string,"="/match=and/output=t.tmp
72: $open ifile$ t.tmp
73: $read ifile$ line
74: $close ifile$
75: $delete t.tmp;
76: $ijk=f$locate("""",line)+1
77: $line=f$extract(ijk,f$length(line)-ijk,line)
78: $ijk=f$locate("""",line)
79: $line=f$extract(0,ijk,line)
80: $ijk=f$locate("\n",line)
81: $line=f$extract(0,ijk,line)
82: $!
83: $i=0
84: $loop:
85: $elm=f$element(i," ",line)
86: $if elm.eqs."" then goto no_ident
87: $if (elm.les."9").and.(elm.ges."0") then goto write_ident
88: $i=i+1
89: $goto loop
90: $!
91: $no_ident:
92: $elm="?.??"
93: $!
94: $!
95: $write_ident:
96: $open ifile$ version.opt/write
97: $write ifile$ "ident="+""""+elm+""""
98: $close ifile$
99: $purge version.opt
100: $!
101: $!
102: $! create linker options files that lists all of the components for all
103: $! possible compilers. We do this by editing the file Makefile.in, and
104: $! generating the relevant files from it.
105: $!
106: $!
107: $! Make a copy of the makefile if the sources are on a disk that is NFS
108: $! mounted on a unix machine.
109: $if f$search("Makefile.in").eqs."" .and. f$search("$M$akefile.in").nes."" -
110: then copy $M$akefile.in Makefile.in
111: $!
112: $!
113: $echo "Now processing Makefile.in to generate linker option files."
114: $edit/tpu/nojournal/nosection/nodisplay/command=sys$input
115: PROCEDURE generate_option_file (TAG_NAME, outfile)
116: position (beginning_of (newbuffer));
117: recursive_fetch_tag (TAG_NAME);
118: !
119: ! Now fix up a few things in the output buffer
120: !
121: pat_replace ("bytecode "," ");
122: pat_replace (".o ",",");
123: pat_replace (".o",""); !appear at end of lines.
124: !
125: ! Remove trailing commas, if present.
126: !
127: position (beginning_of (newbuffer));
128: LOOP
129: range1 := search_quietly("," & ((SPAN(" ") & LINE_END) | LINE_END),
130: FORWARD, EXACT);
131: exitif range1 = 0;
132: position (beginning_of (range1));
133: erase(range1);
134: split_line;
135: ENDLOOP;
136: ! get rid of leading spaces on lines.
137: position (beginning_of (current_buffer)) ;
138: LOOP
139: range1 := search_quietly ( LINE_BEGIN & " ", FORWARD, EXACT) ;
140: EXITIF range1 = 0;
141: position (end_of (range1));
142: erase_character(1);
143: ENDLOOP;
144: !
145: ! Now write the output file.
146: !
147: SET(OUTPUT_FILE, newbuffer, outfile);
148: write_file (newbuffer);
149: erase (newbuffer);
150: ENDPROCEDURE;
151:
152: !
153: ! Looks up a tag, copies it to newbuffer, and then translates any $(...)
154: ! definitions that appear. The translation is put at the current point.
155: !
156: PROCEDURE recursive_fetch_tag (TAG_N);
157: fetch_tag (TAG_N);
158: !
159: ! substitute any makefile symbols $(...)
160: !
161: position (beginning_of (current_buffer)) ;
162: LOOP
163: range1 := search_quietly ("$(" &
164: SPAN("abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ#~0123456789")
165: & ")", FORWARD, EXACT) ;
166: EXITIF range1 = 0;
167: position (beginning_of (range1));
168: move_horizontal(2);
169: mark_1 := MARK (NONE);
170: position (end_of (range1));
171: move_horizontal(-1);
172: mark_2 := MARK (NONE);
173: tag_range := CREATE_RANGE(MARK_1, MARK_2, NONE);
174: position (end_of (range1));
175: tag_string := STR (tag_range);
176: erase (range1);
177: fetch_tag (LINE_BEGIN & tag_string & ((SPAN(" ") & "=") | "="));
178: position (beginning_of (current_buffer)) ;
179: ENDLOOP;
180: ENDPROCEDURE;
181:
182: !
183: ! Looks up the translation of a tag, and inserts it at the current location
184: ! in the buffer
185: !
186: PROCEDURE fetch_tag (TAG_N);
187: LOCAL mark1, mark2, mark3, range2;
188: mark3 := MARK(NONE) ;
189: position (beginning_of (mainbuffer)) ;
190: range2 := search_quietly (TAG_N, FORWARD, EXACT) ;
191: IF (range2 = 0) then
192: position (mark3);
193: return;
194: endif;
195: position (end_of (range2)) ;
196: MOVE_HORIZONTAL(1);
197: mark1 := MARK(NONE) ;
198: position (beginning_of (range2)) ;
199: MOVE_VERTICAL(1);
200: MOVE_HORIZONTAL(-2);
201: LOOP
202: EXITIF CURRENT_CHARACTER <> "\" ;
203: ERASE_CHARACTER(1);
204: MOVE_HORIZONTAL(1);
205: MOVE_VERTICAL(1);
206: MOVE_HORIZONTAL(-2);
207: ENDLOOP;
208: MOVE_HORIZONTAL(1);
209: mark2 := MARK(NONE) ;
210: range2 := CREATE_RANGE(mark1, mark2, NONE) ;
211: position (mark3);
212: if (length(range2) = 0) then return; endif;
213: copy_text(range2);
214: ENDPROCEDURE;
215:
216: PROCEDURE pat_replace (
217: oldstring, !
218: newstring) !
219: LOCAL range2;
220: position (beginning_of (current_buffer)) ;
221: LOOP
222: range2 := search_quietly (oldstring, FORWARD, EXACT) ;
223: EXITIF range2 = 0 ;
224: position (beginning_of (range2)) ;
225: erase (range2) ;
226: copy_text (newstring) ;
227: ENDLOOP ;
228: ENDPROCEDURE ;
229:
230: ! this is the start of the main procedure
231: filename := GET_INFO (COMMAND_LINE, 'file_name') ;
232: mainbuffer := CREATE_BUFFER ("Makefile.in", "Makefile.in") ;
233: newbuffer := CREATE_BUFFER("outfile");
234: compiler_list := CREATE_BUFFER("compilers");
235: !
236: ! Add to this list, as required. The file "Makefile.in" is searched for a
237: ! tag that looks like "LINE_BEGIN + 'tag + (optional space) + "="". The
238: ! contents are assumed to be a list of object files, and from this list a
239: ! VMS linker options file is generated.
240: !
241: position (beginning_of (compiler_list));
242: recursive_fetch_tag(LINE_BEGIN & "COMPILERS" & ((SPAN(" ") & "=") | "="));
243: position (beginning_of (compiler_list));
244: LOOP ! kill leading spaces.
245: exitif current_character <> " ";
246: erase_character(1);
247: ENDLOOP;
248: position (beginning_of (compiler_list));
249: LOOP ! remove any double spaces.
250: range1 := search_quietly (" ", FORWARD, EXACT) ; EXITIF range1 = 0 ;
251: position (beginning_of (range1)) ;
252: erase_character(1);
253: ENDLOOP ;
254: position (end_of (compiler_list));
255: move_horizontal(-1);
256: LOOP ! kill trailing spaces.
257: exitif current_character <> " ";
258: erase_character(1);
259: move_horizontal(-1);
260: ENDLOOP;
261: position (beginning_of (compiler_list));
262: LOOP
263: range1 := search_quietly (" ", FORWARD, EXACT) ;
264: EXITIF range1 = 0 ;
265: position (beginning_of (range1)) ;
266: erase (range1) ;
267: split_line;
268: ENDLOOP ;
269: !
270: ! We now have a list of supported compilers. Now write it, and use it.
271: !
272: SET(OUTPUT_FILE, compiler_list, "compilers.list");
273: write_file (compiler_list);
274: generate_option_file(LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="),
275: "independent.opt");
276: generate_option_file(LINE_BEGIN & "LIB2FUNCS" & ((SPAN(" ") & "=") | "="),
277: "libgcc2.list");
278: generate_option_file(LINE_BEGIN & "BC_ALL" & ((SPAN(" ") & "=") | "="),
279: "bc_all.opt");
280: generate_option_file(LINE_BEGIN & "BI_OBJ" & ((SPAN(" ") & "=") | "="),
281: "bi_all.opt");
282: !
283: ! Now change OBJS in the Makefile, so each language specific options file
284: ! does not pick up all of the language independent files.
285: !
286: position (beginning_of (mainbuffer));
287: range1 := search_quietly (LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="),
288: FORWARD, EXACT) ;
289: position (end_of (range1));
290: split_line;
291: position (beginning_of (compiler_list));
292: LOOP
293: cmark := mark(NONE);
294: exitif cmark = end_of(compiler_list);
295: message(current_line);
296: generate_option_file(LINE_BEGIN & Current_line & ((SPAN(" ") & ":") | ":"),
297: current_line+"-objs.opt");
298: position (cmark);
299: move_vertical(1);
300: ENDLOOP ;
301: quit ;
302: $ echo ""
303: $!
304: $! Remove excessive versions of the option files...
305: $!
306: $ purge *.opt
307: $ purge compilers.list,libgcc2.list
308: $!
309: $!
310: $!
311: $ if f$search("config.status") .nes. "" then delete config.status.*
312: $ open/write file config.status
313: $ write file "Links are now set up for use with a vax running VMS."
314: $ close file
315: $ type config.status
316: $ echo ""
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.