$ ! $ ! Set up to compile GCC on VAX/VMS $ ! $! Set the def dir to proper place for use in batch. Works for interactive too. $flnm = f$enviroment("PROCEDURE") ! get current procedure name $set default 'f$parse(flnm,,,"DEVICE")''f$parse(flnm,,,"DIRECTORY")' $ ! $set symbol/scope=(nolocal,noglobal) $ ! $ echo = "write sys$output" $ ! $ if f$search("config.h") .nes. "" then delete config.h.* $ copy [.config]xm-vax-vms.h []config.h $ echo "Linked `config.h' to `[.config]xm-vax-vms.h'. $ ! $ if f$search("tconfig.h") .nes. "" then delete tconfig.h.* $ create []tconfig.h $DECK /* tconfig.h == config.h :: target and host configurations are the same */ #include "config.h" $EOD $ echo "Created `tconfig.h'. $ ! $ if f$search("hconfig.h") .nes. "" then delete hconfig.h.* $ create []hconfig.h $DECK /* hconfig.h == config.h :: target and host configurations are the same */ #include "config.h" $EOD $ echo "Created `hconfig.h'. $ ! $ if f$search("tm.h") .nes. "" then delete tm.h.* $ copy [.config]vax-vms.h []tm.h $ echo "Linked `tm.h' to `[.config]vax-vms.h'. $ ! $ if f$search("md.") .nes. "" then delete md..* $ copy [.config]vax.md []md. $ echo "Linked `md' to `[.config]vax.md'. $ ! $ if f$search("aux-output.c") .nes. "" then delete aux-output.c.* $ copy [.config]vax.c []aux-output.c $ echo "Linked `aux-output.c' to `[.config]vax.c'. $ ! $! $! $! Create the file version.opt, which helps identify the executable. $! $search version.c version_string,"="/match=and/output=t.tmp $open ifile$ t.tmp $read ifile$ line $close ifile$ $delete t.tmp; $ijk=f$locate("""",line)+1 $line=f$extract(ijk,f$length(line)-ijk,line) $ijk=f$locate("""",line) $line=f$extract(0,ijk,line) $ijk=f$locate("\n",line) $line=f$extract(0,ijk,line) $! $i=0 $loop: $elm=f$element(i," ",line) $if elm.eqs."" then goto no_ident $if (elm.les."9").and.(elm.ges."0") then goto write_ident $i=i+1 $goto loop $! $no_ident: $elm="?.??" $! $! $write_ident: $open ifile$ version.opt/write $write ifile$ "ident="+""""+elm+"""" $close ifile$ $purge version.opt $! $! $! create linker options files that lists all of the components for all $! possible compilers. We do this by editing the file Makefile.in, and $! generating the relevant files from it. $! $! $! Make a copy of the makefile if the sources are on a disk that is NFS $! mounted on a unix machine. $if f$search("Makefile.in").eqs."" .and. f$search("$M$akefile.in").nes."" - then copy $M$akefile.in Makefile.in $! $! $echo "Now processing Makefile.in to generate linker option files." $edit/tpu/nojournal/nosection/nodisplay/command=sys$input PROCEDURE generate_option_file (TAG_NAME, outfile) position (beginning_of (newbuffer)); recursive_fetch_tag (TAG_NAME); ! ! Now fix up a few things in the output buffer ! pat_replace (".o ",","); pat_replace (".o",""); !appear at end of lines. ! ! Remove trailing commas, if present. ! position (beginning_of (newbuffer)); LOOP range1 := search_quietly("," & ((SPAN(" ") & LINE_END) | LINE_END), FORWARD, EXACT); exitif range1 = 0; position (beginning_of (range1)); erase(range1); split_line; ENDLOOP; ! get rid of leading spaces on lines. position (beginning_of (current_buffer)) ; LOOP range1 := search_quietly ( LINE_BEGIN & " ", FORWARD, EXACT) ; EXITIF range1 = 0; position (end_of (range1)); erase_character(1); ENDLOOP; ! ! Now write the output file. ! SET(OUTPUT_FILE, newbuffer, outfile); write_file (newbuffer); erase (newbuffer); ENDPROCEDURE; ! ! Looks up a tag, copies it to newbuffer, and then translates any $(...) ! definitions that appear. The translation is put at the current point. ! PROCEDURE recursive_fetch_tag (TAG_N); fetch_tag (TAG_N); ! ! substitute any makefile symbols $(...) ! position (beginning_of (current_buffer)) ; LOOP range1 := search_quietly ("$(" & SPAN("abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ#~0123456789") & ")", FORWARD, EXACT) ; EXITIF range1 = 0; position (beginning_of (range1)); move_horizontal(2); mark_1 := MARK (NONE); position (end_of (range1)); move_horizontal(-1); mark_2 := MARK (NONE); tag_range := CREATE_RANGE(MARK_1, MARK_2, NONE); position (end_of (range1)); tag_string := STR (tag_range); erase (range1); fetch_tag (LINE_BEGIN & tag_string & ((SPAN(" ") & "=") | "=")); position (beginning_of (current_buffer)) ; ENDLOOP; ENDPROCEDURE; ! ! Looks up the translation of a tag, and inserts it at the current location ! in the buffer ! PROCEDURE fetch_tag (TAG_N); LOCAL mark1, mark2, mark3, range2; mark3 := MARK(NONE) ; position (beginning_of (mainbuffer)) ; range2 := search_quietly (TAG_N, FORWARD, EXACT) ; IF (range2 = 0) then position (mark3); return; endif; position (end_of (range2)) ; MOVE_HORIZONTAL(1); mark1 := MARK(NONE) ; position (beginning_of (range2)) ; MOVE_VERTICAL(1); MOVE_HORIZONTAL(-2); LOOP EXITIF CURRENT_CHARACTER <> "\" ; ERASE_CHARACTER(1); MOVE_HORIZONTAL(1); MOVE_VERTICAL(1); MOVE_HORIZONTAL(-2); ENDLOOP; MOVE_HORIZONTAL(1); mark2 := MARK(NONE) ; range2 := CREATE_RANGE(mark1, mark2, NONE) ; position (mark3); if (length(range2) = 0) then return; endif; copy_text(range2); ENDPROCEDURE; PROCEDURE pat_replace ( oldstring, ! newstring) ! LOCAL range2; position (beginning_of (current_buffer)) ; LOOP range2 := search_quietly (oldstring, FORWARD, EXACT) ; EXITIF range2 = 0 ; position (beginning_of (range2)) ; erase (range2) ; copy_text (newstring) ; ENDLOOP ; ENDPROCEDURE ; ! this is the start of the main procedure filename := GET_INFO (COMMAND_LINE, 'file_name') ; mainbuffer := CREATE_BUFFER ("Makefile.in", "Makefile.in") ; newbuffer := CREATE_BUFFER("outfile"); compiler_list := CREATE_BUFFER("compilers"); ! ! Add to this list, as required. The file "Makefile.in" is searched for a ! tag that looks like "LINE_BEGIN + 'tag + (optional space) + "="". The ! contents are assumed to be a list of object files, and from this list a ! VMS linker options file is generated. ! position (beginning_of (compiler_list)); recursive_fetch_tag(LINE_BEGIN & "COMPILERS" & ((SPAN(" ") & "=") | "=")); position (beginning_of (compiler_list)); LOOP ! kill leading spaces. exitif current_character <> " "; erase_character(1); ENDLOOP; position (beginning_of (compiler_list)); LOOP ! remove any double spaces. range1 := search_quietly (" ", FORWARD, EXACT) ; EXITIF range1 = 0 ; position (beginning_of (range1)) ; erase_character(1); ENDLOOP ; position (end_of (compiler_list)); move_horizontal(-1); LOOP ! kill trailing spaces. exitif current_character <> " "; erase_character(1); move_horizontal(-1); ENDLOOP; position (beginning_of (compiler_list)); LOOP range1 := search_quietly (" ", FORWARD, EXACT) ; EXITIF range1 = 0 ; position (beginning_of (range1)) ; erase (range1) ; split_line; ENDLOOP ; ! ! We now have a list of supported compilers. Now write it, and use it. ! SET(OUTPUT_FILE, compiler_list, "compilers.list"); write_file (compiler_list); generate_option_file(LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="), "independent.opt"); generate_option_file(LINE_BEGIN & "LIB2FUNCS" & ((SPAN(" ") & "=") | "="), "libgcc2.list"); ! ! Now change OBJS in the Makefile, so each language specific options file ! does not pick up all of the language independent files. ! position (beginning_of (mainbuffer)); range1 := search_quietly (LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="), FORWARD, EXACT) ; position (end_of (range1)); split_line; position (beginning_of (compiler_list)); LOOP cmark := mark(NONE); exitif cmark = end_of(compiler_list); message(current_line); generate_option_file(LINE_BEGIN & Current_line & ((SPAN(" ") & ":") | ":"), current_line+"-objs.opt"); position (cmark); move_vertical(1); ENDLOOP ; quit ; $ echo "" $! $! Remove excessive versions of the option files... $! $ purge *.opt $ purge compilers.list,libgcc2.list $! $! $! $ if f$search("config.status") .nes. "" then delete config.status.* $ open/write file config.status $ write file "Links are now set up for use with a vax running VMS." $ close file $ type config.status $ echo ""