]>
Commit | Line | Data |
---|---|---|
01fa70ee | 1 | $ ! |
4491de59 | 2 | $ ! Set up to compile GCC on VAX/VMS |
01fa70ee | 3 | $ ! |
7f211789 RS |
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 | $ ! | |
01fa70ee MT |
10 | $ echo = "write sys$output" |
11 | $ ! | |
12 | $ if f$search("config.h") .nes. "" then delete config.h.* | |
bcc81b85 RK |
13 | $ copy [.config.vax]xm-vms.h []config.h |
14 | $ echo "Linked `config.h' to `[.config.vax]xm-vms.h'. | |
4491de59 RS |
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'. | |
01fa70ee | 23 | $ ! |
ae54cf6d RS |
24 | $ if f$search("hconfig.h") .nes. "" then delete hconfig.h.* |
25 | $ create []hconfig.h | |
26 | $DECK | |
bcc81b85 | 27 | /* hconfig.h == config.h :: host and target configurations are the same */ |
ae54cf6d RS |
28 | #include "config.h" |
29 | $EOD | |
30 | $ echo "Created `hconfig.h'. | |
31 | $ ! | |
01fa70ee | 32 | $ if f$search("tm.h") .nes. "" then delete tm.h.* |
5cb10f0e RS |
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'. | |
01fa70ee MT |
58 | $ ! |
59 | $ if f$search("md.") .nes. "" then delete md..* | |
bcc81b85 RK |
60 | $ copy [.config.vax]vax.md []md. |
61 | $ echo "Linked `md' to `[.config.vax]vax.md'. | |
01fa70ee MT |
62 | $ ! |
63 | $ if f$search("aux-output.c") .nes. "" then delete aux-output.c.* | |
bcc81b85 RK |
64 | $ copy [.config.vax]vax.c []aux-output.c |
65 | $ echo "Linked `aux-output.c' to `[.config.vax]vax.c'. | |
01fa70ee MT |
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$ | |
4491de59 | 75 | $delete t.tmp; |
01fa70ee MT |
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$ | |
4491de59 | 99 | $purge version.opt |
01fa70ee MT |
100 | $! |
101 | $! | |
7f211789 RS |
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 | $! | |
2f77c933 CH |
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 | $! | |
7f211789 RS |
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 (".o ",","); | |
122 | pat_replace (".o",""); !appear at end of lines. | |
123 | ! | |
124 | ! Remove trailing commas, if present. | |
125 | ! | |
126 | position (beginning_of (newbuffer)); | |
127 | LOOP | |
4491de59 RS |
128 | range1 := search_quietly("," & ((SPAN(" ") & LINE_END) | LINE_END), |
129 | FORWARD, EXACT); | |
7f211789 RS |
130 | exitif range1 = 0; |
131 | position (beginning_of (range1)); | |
132 | erase(range1); | |
133 | split_line; | |
134 | ENDLOOP; | |
135 | ! get rid of leading spaces on lines. | |
136 | position (beginning_of (current_buffer)) ; | |
137 | LOOP | |
138 | range1 := search_quietly ( LINE_BEGIN & " ", FORWARD, EXACT) ; | |
139 | EXITIF range1 = 0; | |
140 | position (end_of (range1)); | |
141 | erase_character(1); | |
142 | ENDLOOP; | |
143 | ! | |
144 | ! Now write the output file. | |
145 | ! | |
146 | SET(OUTPUT_FILE, newbuffer, outfile); | |
147 | write_file (newbuffer); | |
148 | erase (newbuffer); | |
149 | ENDPROCEDURE; | |
150 | ||
151 | ! | |
152 | ! Looks up a tag, copies it to newbuffer, and then translates any $(...) | |
153 | ! definitions that appear. The translation is put at the current point. | |
154 | ! | |
155 | PROCEDURE recursive_fetch_tag (TAG_N); | |
156 | fetch_tag (TAG_N); | |
157 | ! | |
158 | ! substitute any makefile symbols $(...) | |
159 | ! | |
160 | position (beginning_of (current_buffer)) ; | |
161 | LOOP | |
4491de59 RS |
162 | range1 := search_quietly ("$(" & |
163 | SPAN("abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ#~0123456789") | |
164 | & ")", FORWARD, EXACT) ; | |
7f211789 RS |
165 | EXITIF range1 = 0; |
166 | position (beginning_of (range1)); | |
167 | move_horizontal(2); | |
168 | mark_1 := MARK (NONE); | |
169 | position (end_of (range1)); | |
170 | move_horizontal(-1); | |
171 | mark_2 := MARK (NONE); | |
172 | tag_range := CREATE_RANGE(MARK_1, MARK_2, NONE); | |
173 | position (end_of (range1)); | |
174 | tag_string := STR (tag_range); | |
175 | erase (range1); | |
176 | fetch_tag (LINE_BEGIN & tag_string & ((SPAN(" ") & "=") | "=")); | |
177 | position (beginning_of (current_buffer)) ; | |
178 | ENDLOOP; | |
179 | ENDPROCEDURE; | |
180 | ||
181 | ! | |
182 | ! Looks up the translation of a tag, and inserts it at the current location | |
183 | ! in the buffer | |
184 | ! | |
185 | PROCEDURE fetch_tag (TAG_N); | |
186 | LOCAL mark1, mark2, mark3, range2; | |
187 | mark3 := MARK(NONE) ; | |
188 | position (beginning_of (mainbuffer)) ; | |
189 | range2 := search_quietly (TAG_N, FORWARD, EXACT) ; | |
190 | IF (range2 = 0) then | |
191 | position (mark3); | |
192 | return; | |
193 | endif; | |
194 | position (end_of (range2)) ; | |
195 | MOVE_HORIZONTAL(1); | |
196 | mark1 := MARK(NONE) ; | |
197 | position (beginning_of (range2)) ; | |
198 | MOVE_VERTICAL(1); | |
199 | MOVE_HORIZONTAL(-2); | |
200 | LOOP | |
201 | EXITIF CURRENT_CHARACTER <> "\" ; | |
202 | ERASE_CHARACTER(1); | |
203 | MOVE_HORIZONTAL(1); | |
204 | MOVE_VERTICAL(1); | |
205 | MOVE_HORIZONTAL(-2); | |
206 | ENDLOOP; | |
207 | MOVE_HORIZONTAL(1); | |
208 | mark2 := MARK(NONE) ; | |
209 | range2 := CREATE_RANGE(mark1, mark2, NONE) ; | |
210 | position (mark3); | |
211 | if (length(range2) = 0) then return; endif; | |
212 | copy_text(range2); | |
213 | ENDPROCEDURE; | |
214 | ||
215 | PROCEDURE pat_replace ( | |
216 | oldstring, ! | |
217 | newstring) ! | |
218 | LOCAL range2; | |
219 | position (beginning_of (current_buffer)) ; | |
220 | LOOP | |
221 | range2 := search_quietly (oldstring, FORWARD, EXACT) ; | |
222 | EXITIF range2 = 0 ; | |
223 | position (beginning_of (range2)) ; | |
224 | erase (range2) ; | |
225 | copy_text (newstring) ; | |
226 | ENDLOOP ; | |
227 | ENDPROCEDURE ; | |
228 | ||
229 | ! this is the start of the main procedure | |
230 | filename := GET_INFO (COMMAND_LINE, 'file_name') ; | |
231 | mainbuffer := CREATE_BUFFER ("Makefile.in", "Makefile.in") ; | |
232 | newbuffer := CREATE_BUFFER("outfile"); | |
233 | compiler_list := CREATE_BUFFER("compilers"); | |
234 | ! | |
235 | ! Add to this list, as required. The file "Makefile.in" is searched for a | |
236 | ! tag that looks like "LINE_BEGIN + 'tag + (optional space) + "="". The | |
237 | ! contents are assumed to be a list of object files, and from this list a | |
238 | ! VMS linker options file is generated. | |
239 | ! | |
240 | position (beginning_of (compiler_list)); | |
241 | recursive_fetch_tag(LINE_BEGIN & "COMPILERS" & ((SPAN(" ") & "=") | "=")); | |
242 | position (beginning_of (compiler_list)); | |
243 | LOOP ! kill leading spaces. | |
244 | exitif current_character <> " "; | |
245 | erase_character(1); | |
246 | ENDLOOP; | |
247 | position (beginning_of (compiler_list)); | |
248 | LOOP ! remove any double spaces. | |
249 | range1 := search_quietly (" ", FORWARD, EXACT) ; EXITIF range1 = 0 ; | |
250 | position (beginning_of (range1)) ; | |
251 | erase_character(1); | |
252 | ENDLOOP ; | |
253 | position (end_of (compiler_list)); | |
254 | move_horizontal(-1); | |
255 | LOOP ! kill trailing spaces. | |
256 | exitif current_character <> " "; | |
257 | erase_character(1); | |
258 | move_horizontal(-1); | |
259 | ENDLOOP; | |
260 | position (beginning_of (compiler_list)); | |
261 | LOOP | |
262 | range1 := search_quietly (" ", FORWARD, EXACT) ; | |
263 | EXITIF range1 = 0 ; | |
264 | position (beginning_of (range1)) ; | |
265 | erase (range1) ; | |
266 | split_line; | |
267 | ENDLOOP ; | |
268 | ! | |
269 | ! We now have a list of supported compilers. Now write it, and use it. | |
270 | ! | |
271 | SET(OUTPUT_FILE, compiler_list, "compilers.list"); | |
272 | write_file (compiler_list); | |
4491de59 RS |
273 | generate_option_file(LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="), |
274 | "independent.opt"); | |
275 | generate_option_file(LINE_BEGIN & "LIB2FUNCS" & ((SPAN(" ") & "=") | "="), | |
276 | "libgcc2.list"); | |
7f211789 RS |
277 | ! |
278 | ! Now change OBJS in the Makefile, so each language specific options file | |
279 | ! does not pick up all of the language independent files. | |
280 | ! | |
281 | position (beginning_of (mainbuffer)); | |
4491de59 RS |
282 | range1 := search_quietly (LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="), |
283 | FORWARD, EXACT) ; | |
7f211789 RS |
284 | position (end_of (range1)); |
285 | split_line; | |
286 | position (beginning_of (compiler_list)); | |
287 | LOOP | |
288 | cmark := mark(NONE); | |
289 | exitif cmark = end_of(compiler_list); | |
290 | message(current_line); | |
291 | generate_option_file(LINE_BEGIN & Current_line & ((SPAN(" ") & ":") | ":"), | |
4491de59 | 292 | current_line+"-objs.opt"); |
7f211789 RS |
293 | position (cmark); |
294 | move_vertical(1); | |
295 | ENDLOOP ; | |
296 | quit ; | |
297 | $ echo "" | |
298 | $! | |
4491de59 | 299 | $! Remove excessive versions of the option files... |
7f211789 | 300 | $! |
4491de59 RS |
301 | $ purge *.opt |
302 | $ purge compilers.list,libgcc2.list | |
7f211789 RS |
303 | $! |
304 | $! | |
305 | $! | |
01fa70ee MT |
306 | $ if f$search("config.status") .nes. "" then delete config.status.* |
307 | $ open/write file config.status | |
308 | $ write file "Links are now set up for use with a vax running VMS." | |
309 | $ close file | |
310 | $ type config.status | |
7f211789 | 311 | $ echo "" |