2 $ ! Set up to compile GCC on VAX/VMS
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")'
8 $set symbol/scope=(nolocal,noglobal)
10 $ echo = "write sys$output"
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'.
16 $ if f$search("tconfig.h") .nes. "" then delete tconfig.h.*
19 /* tconfig.h == config.h :: target and host configurations are the same */
22 $ echo "Created `tconfig.h'.
24 $ if f$search("hconfig.h") .nes. "" then delete hconfig.h.*
27 /* hconfig.h == config.h :: host and target configurations are the same */
30 $ echo "Created `hconfig.h'.
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
38 ! Copy file, changing lines of the form
41 ! #include "[.config.vax]*"
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));
47 incl := SEARCH_QUIETLY(targ, FORWARD, EXACT, rang);
49 POSITION(BEGINNING_OF(incl));
51 COPY_TEXT('#include "[.config.vax]');
52 rang := CREATE_RANGE(END_OF(incl), END_OF(file));
54 WRITE_FILE(file, GET_INFO(COMMAND_LINE, "output_file"));
57 $ echo "Generated `tm.h' from `[.config.vax]vms.h'.
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'.
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'.
69 $! Create the file version.opt, which helps identify the executable.
71 $search version.c version_string,"="/match=and/output=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)
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
96 $open ifile$ version.opt/write
97 $write ifile$ "ident="+""""+elm+""""
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.
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
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);
119 ! Now fix up a few things in the output buffer
121 pat_replace (".o ",",");
122 pat_replace (".o",""); !appear at end of lines.
124 ! Remove trailing commas, if present.
126 position (beginning_of (newbuffer));
128 range1 := search_quietly("," & ((SPAN(" ") & LINE_END) | LINE_END),
131 position (beginning_of (range1));
135 ! get rid of leading spaces on lines.
136 position (beginning_of (current_buffer)) ;
138 range1 := search_quietly ( LINE_BEGIN & " ", FORWARD, EXACT) ;
140 position (end_of (range1));
144 ! Now write the output file.
146 SET(OUTPUT_FILE, newbuffer, outfile);
147 write_file (newbuffer);
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.
155 PROCEDURE recursive_fetch_tag (TAG_N);
158 ! substitute any makefile symbols $(...)
160 position (beginning_of (current_buffer)) ;
162 range1 := search_quietly ("$(" &
163 SPAN("abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ#~0123456789")
164 & ")", FORWARD, EXACT) ;
166 position (beginning_of (range1));
168 mark_1 := MARK (NONE);
169 position (end_of (range1));
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);
176 fetch_tag (LINE_BEGIN & tag_string & ((SPAN(" ") & "=") | "="));
177 position (beginning_of (current_buffer)) ;
182 ! Looks up the translation of a tag, and inserts it at the current location
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) ;
194 position (end_of (range2)) ;
196 mark1 := MARK(NONE) ;
197 position (beginning_of (range2)) ;
201 EXITIF CURRENT_CHARACTER <> "\" ;
208 mark2 := MARK(NONE) ;
209 range2 := CREATE_RANGE(mark1, mark2, NONE) ;
211 if (length(range2) = 0) then return; endif;
215 PROCEDURE pat_replace (
219 position (beginning_of (current_buffer)) ;
221 range2 := search_quietly (oldstring, FORWARD, EXACT) ;
223 position (beginning_of (range2)) ;
225 copy_text (newstring) ;
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");
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.
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 <> " ";
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)) ;
253 position (end_of (compiler_list));
255 LOOP ! kill trailing spaces.
256 exitif current_character <> " ";
260 position (beginning_of (compiler_list));
262 range1 := search_quietly (" ", FORWARD, EXACT) ;
264 position (beginning_of (range1)) ;
269 ! We now have a list of supported compilers. Now write it, and use it.
271 SET(OUTPUT_FILE, compiler_list, "compilers.list");
272 write_file (compiler_list);
273 generate_option_file(LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="),
275 generate_option_file(LINE_BEGIN & "LIB2FUNCS" & ((SPAN(" ") & "=") | "="),
278 ! Now change OBJS in the Makefile, so each language specific options file
279 ! does not pick up all of the language independent files.
281 position (beginning_of (mainbuffer));
282 range1 := search_quietly (LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="),
284 position (end_of (range1));
286 position (beginning_of (compiler_list));
289 exitif cmark = end_of(compiler_list);
290 message(current_line);
291 generate_option_file(LINE_BEGIN & Current_line & ((SPAN(" ") & ":") | ":"),
292 current_line+"-objs.opt");
299 $! Remove excessive versions of the option files...
302 $ purge compilers.list,libgcc2.list
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."