OSDN Git Service

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