home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / gcc / vmsconfig.com < prev    next >
Text File  |  1995-12-29  |  16KB  |  475 lines

  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. $if f$trnlnm("IFILE$").nes."" then close/noLog ifile$
  10. $ !
  11. $ echo = "write sys$output"
  12. $ !
  13. $ if f$search("config.h") .nes. "" then delete config.h.*
  14. $ copy [.config.vax]xm-vms.h []config.h
  15. $ echo "Linked `config.h' to `[.config.vax]xm-vms.h'.
  16. $ !
  17. $ if f$search("tconfig.h") .nes. "" then delete tconfig.h.*
  18. $ create []tconfig.h
  19. $DECK
  20. /* tconfig.h == config.h :: target and host configurations are the same */
  21. #include "config.h"
  22. $EOD
  23. $ echo "Created `tconfig.h'.
  24. $ !
  25. $ if f$search("hconfig.h") .nes. "" then delete hconfig.h.*
  26. $ create []hconfig.h
  27. $DECK
  28. /* hconfig.h == config.h :: host and target configurations are the same */
  29. #include "config.h"
  30. $EOD
  31. $ echo "Created `hconfig.h'.
  32. $ !
  33. $ if f$search("tm.h") .nes. "" then delete tm.h.*
  34. $!! copy [.config.vax]vms.h []tm.h
  35. $ edit/tpu/nojournal/nosection/nodisplay/command=sys$input -
  36.         [.config.vax]vms.h /output=[]tm.h
  37. $DECK
  38. !
  39. !  Copy file, changing lines of the form
  40. !    #include "vax/*"
  41. !  into
  42. !    #include "config-*"
  43. !
  44.    file := CREATE_BUFFER("file", GET_INFO(COMMAND_LINE, "file_name"));
  45.    targ := LINE_BEGIN & '#include' & SPAN(ASCII(32)+ASCII(9)) & '"vax/';
  46.    rang := CREATE_RANGE(BEGINNING_OF(file), END_OF(file));
  47.    LOOP
  48.       incl := SEARCH_QUIETLY(targ, FORWARD, EXACT, rang);
  49.       EXITIF incl = 0;
  50.       POSITION(BEGINNING_OF(incl));
  51.       ERASE(incl);
  52.       COPY_TEXT('#include "config-');
  53.       rang := CREATE_RANGE(END_OF(incl), END_OF(file));
  54.    ENDLOOP;
  55.    WRITE_FILE(file, GET_INFO(COMMAND_LINE, "output_file"));
  56.    QUIT
  57. $EOD
  58. $ echo "Generated `tm.h' from `[.config.vax]vms.h'.
  59. $ !
  60. $    !crude hack to allow compiling from [.cp] subdirectory
  61. $ if f$search("config-vax.h") .nes. "" then delete config-vax.h;*
  62. $ copy [.config.vax]vax.h []config-vax.h
  63. $ echo "Linked `config-vax.h' to `[.config.vax]vax.h' for `tm.h'."
  64. $ !
  65. $ call make_lang_incl "options.h"
  66. $ !
  67. $ call make_lang_incl "specs.h"
  68. $ !
  69. $ if f$search("vax.md") .nes. "" then delete vax.md;*
  70. $ copy [.config.vax]vax.md []vax.md
  71. $ echo "Copied `vax.md' from `[.config.vax]vax.md'."
  72. $ !
  73. $ if f$search("aux-output.c") .nes. "" then delete aux-output.c.*
  74. $ copy [.config.vax]vax.c []aux-output.c
  75. $ echo "Linked `aux-output.c' to `[.config.vax]vax.c'.
  76. $ !
  77. $!
  78. $!
  79. $! Create the file version.opt, which helps identify the executable.
  80. $!
  81. $search version.c version_string,"="/match=and/output=t.tmp
  82. $open ifile$ t.tmp
  83. $read ifile$ line
  84. $close ifile$
  85. $delete t.tmp;
  86. $ijk=f$locate("""",line)+1
  87. $line=f$extract(ijk,f$length(line)-ijk,line)
  88. $ijk=f$locate("""",line)
  89. $line=f$extract(0,ijk,line)
  90. $ijk=f$locate("\n",line)
  91. $line=f$extract(0,ijk,line)
  92. $!
  93. $i=0
  94. $loop:
  95. $elm=f$element(i," ",line)
  96. $if elm.eqs."" then goto no_ident
  97. $if (elm.les."9").and.(elm.ges."0") then goto write_ident
  98. $i=i+1
  99. $goto loop
  100. $!
  101. $no_ident:
  102. $elm="?.??"
  103. $!
  104. $!
  105. $write_ident:
  106. $open ifile$ version.opt/write
  107. $write ifile$ "ident="+""""+elm+""""
  108. $close ifile$
  109. $purge version.opt
  110. $!
  111. $!
  112. $! create linker options files that lists all of the components for all
  113. $! possible compilers.  We do this by editing the file Makefile.in, and 
  114. $! generating the relevant files from it.
  115. $!
  116. $!
  117. $! Make a copy of the makefile if the sources are on a disk that is NFS 
  118. $!    mounted on a unix machine.
  119. $if f$search("Makefile.in").eqs."" .and. f$search("$M$akefile.in").nes."" -
  120.     then copy $M$akefile.in Makefile.in
  121. $! This should be automated across all front-end subdirectories.
  122. $!    For now, it's hardcoded.
  123. $if f$search("[.cp]Makefile.in").eqs."" .and. f$search("[.cp]$M$akefile.in").nes."" -
  124.     then copy [.cp]$M$akefile.in [.cp]Makefile.in
  125. $!
  126. $!
  127. $echo "Now processing Makefile.in to generate linker option files."
  128. $edit/TPU/noJournal/noSection/noDisplay/Command=sys$input: Makefile.in
  129. !!
  130. VARIABLE makefile_buf, opt_file_buf, complist_buf, extra_compilers; ! Globals.
  131.  
  132. !!
  133. PROCEDURE process_makefile( )
  134.   !
  135.   ! Interpret Makefile.in and subsidiary Make-lang.in templates.
  136.   !
  137.   LOCAL range1, cmark, makefilename;
  138.  
  139.   makefilename      := GET_INFO (COMMAND_LINE, 'FILE_NAME'); ! "Makefile.in"
  140.   makefile_buf      := CREATE_BUFFER ("makefile", makefilename);
  141.   opt_file_buf      := CREATE_BUFFER ("opt_file");
  142.   complist_buf      := CREATE_BUFFER ("complist");
  143.   extra_compilers := CREATE_ARRAY;
  144.   !
  145.   SET (NO_WRITE, makefile_buf, ON);    ! Used as workspace; don't save it.
  146.   SET (OUTPUT_FILE, complist_buf, "compilers.list");
  147.   !
  148.   ! Make some textual substitutions.
  149.   !
  150.   configure_makefile ();
  151.   !
  152.   ! Collect a list of supported compilers (``COMPILERS=xxx'' macro).
  153.   !
  154.   identify_compilers ();
  155.   !
  156.   ! Plus other known compilers described by Make-lang.in makefile fragments.
  157.   ! Add new entries as needed; args are (target name, subdirectory name).
  158.   !
  159.   additional_compiler ("cc1plus", "cp");
  160.   !
  161.   WRITE_FILE (complist_buf);        ! Now save "compilers.list".
  162.   !
  163.   ! Add to this list, as required.  The file "Makefile.in" is searched for
  164.   ! a tag that looks like "LINE_BEGIN + 'tag + (optional space) + "="".
  165.   ! The contents are assumed to be a list of object files, and from this
  166.   ! list a VMS linker options file is generated.
  167.   !
  168.   generate_option_file ("OBJS",      "=", "independent.opt");
  169.   generate_option_file ("LIB2FUNCS", "=", "libgcc2.list");
  170.   generate_option_file ("BC_ALL",    "=", "bc_all.list");
  171.   generate_option_file ("BI_OBJ",    "=", "bi_all.opt");
  172.   !
  173.   ! Now change OBJS in the Makefile, so each language specific options file
  174.   ! does not pick up all of the language independent files.
  175.   !
  176.   POSITION (BEGINNING_OF (makefile_buf));
  177.   COPY_TEXT ("OBJS=");    ! New copy with empty value, seen before real OBJS.
  178.   SPLIT_LINE;
  179.   !
  180.   ! Lastly, process each compiler-specific object dependency list.
  181.   !
  182.   POSITION (BEGINNING_OF (complist_buf));
  183.   LOOP
  184.     cmark := MARK (NONE);
  185.     EXITIF (cmark = END_OF (complist_buf));
  186.     ! The current line contains the name of a compiler target, such as "cc1".
  187.     MESSAGE (CURRENT_LINE);    ! Give some interactive feedback.
  188.     generate_option_file (CURRENT_LINE, ":", CURRENT_LINE + "-objs.opt");
  189.     POSITION (cmark);
  190.     MOVE_VERTICAL (1);        ! Go to the next line.
  191.   ENDLOOP;
  192. ENDPROCEDURE; !process_makefile
  193. !!
  194.  
  195. PROCEDURE process_objc_lib( )
  196.   !
  197.   ! Interpret objc/Makefile, after finishing the top makefile.
  198.   !
  199.   ON_ERROR
  200.     [TPU$_OPENIN]:
  201.       MESSAGE ("Cannot load objc/Makefile for ""ObjClib""; skipping it.");
  202.       RETURN;
  203.   ENDON_ERROR;
  204.  
  205.   ERASE (makefile_buf);            !discard top Makefile
  206.   POSITION (END_OF (makefile_buf));
  207.   READ_FILE ("[.objc]Makefile");    !load objc one
  208.   MESSAGE ("objclib");
  209.   pat_replace (ASCII(9), " ");        !change any <tab> to <space>
  210.   generate_option_file ("OBJC_O", "=", "objc-objs.opt");
  211.   POSITION (BEGINNING_OF (makefile_buf));
  212.   ! Join any continuation lines; we want the header list to be one line.
  213.   pat_replace ("\" & LINE_END, );
  214.   generate_option_file ("OBJC_H", "=", "objc-hdrs.list");
  215. ENDPROCEDURE; !process_objc_lib
  216. !!
  217.  
  218. PROCEDURE configure_makefile( )
  219.   !
  220.   ! Plug in some values normally handled by `configure'.  Rather than
  221.   ! replacing the dummy entries, insert the real entries before them.
  222.   !
  223.   POSITION (BEGINNING_OF (makefile_buf));
  224.   COPY_TEXT ("target=vax-vms");            SPLIT_LINE;
  225.   COPY_TEXT ("out_file=aux-output.c");        SPLIT_LINE;    ! vax/vax.c
  226.   COPY_TEXT ("out_object_file=aux-output.o");    SPLIT_LINE;    ! aux-output.obj
  227.   COPY_TEXT ("md_file=vax.md");            SPLIT_LINE;    ! vax/vax.md
  228.   COPY_TEXT ("tm_file=tm.h");            SPLIT_LINE;    ! vax/tm-vms.h
  229. ENDPROCEDURE; !configure_makefile
  230. !!
  231.  
  232. PROCEDURE identify_compilers( )
  233.   !
  234.   ! Retrieve the list of supported compilers from Makefile.in, and put them
  235.   ! into file "compilers.list", one per line, for subsequent access from DCL.
  236.   !
  237.   LOCAL range1;
  238.  
  239.   ! Strip most comments from the makefile, to speed up subsequent processing.
  240.   POSITION (BEGINNING_OF (makefile_buf));
  241.   pat_replace (LINE_BEGIN & "#" & REMAIN & LINE_END, );
  242. !#  ! Convert directory references to VMS syntax (actually, just strip it).
  243. !#  pat_replace (" $(srcdir)/", " ");
  244.   ! Look up the ``COMPILERS=cc1 xyzzy'' Makefile macro and put
  245.   ! its ``cc1 xyzzy'' value into the compilers buffer.
  246.   POSITION (BEGINNING_OF (complist_buf));
  247. !#--at some point we may want to add this--
  248. !#  recursive_fetch_tag ("CCCP", "=");      ! Include the preprocessor.
  249. !#  POSITION (END_OF (complist_buf));
  250.   recursive_fetch_tag ("COMPILERS", "=");
  251.   ! Convert all spaces into newlines, then remove any blank lines.
  252.   pat_replace (SPAN(" "), LINE_END);
  253.   pat_replace (LINE_BEGIN & LINE_END, );
  254. ENDPROCEDURE; !identify_compilers
  255. !!
  256.  
  257. PROCEDURE additional_compiler( cname, subdir )
  258.   !
  259.   ! Load Make-lang.in for compiler CNAME from SUBDIR and append it to the
  260.   ! end of Makefile.in's buffer.  Add CNAME to the "compilers.list" buffer.
  261.   !
  262.   ON_ERROR
  263.     ! Don't abort if user removes the supporting subdirectory for a
  264.     ! language she's not interested in.
  265.     [TPU$_OPENIN]:
  266.       MESSAGE ("Cannot load " + subdir + "/Make-lang.in for "
  267.            + '"' + cname + '"' + "; skipping it.");
  268.       RETURN;
  269.   ENDON_ERROR;
  270.  
  271.   POSITION (END_OF (makefile_buf));
  272.   SPLIT_LINE;    ! Separate with a blank line.
  273.   READ_FILE ("[." + subdir + "]Make-lang.in");    ! Load Makefile fragment.
  274.   ! Make sure that $(xxx_OTH_SRCS) expands to empty string by renaming $(it)
  275.   pat_replace ("_OTH_SRCS)", "_OTH_SRCS_dummy_)");
  276.   ! Convert subdirectory references into VMS syntax.
  277.   pat_replace ("$(srcdir)/" + subdir + "/", "[." + subdir + "]");
  278.   ! Add this name to compilers.list.
  279.   POSITION (END_OF (complist_buf));
  280.   COPY_TEXT (cname);
  281.   ! Make array entry indexed by compiler's file name; its value is arbitrary.
  282.   extra_compilers{cname} := subdir;
  283. ENDPROCEDURE; !additional_compiler
  284. !!
  285.  
  286. PROCEDURE generate_option_file( tag_name, punct, outfile_name )
  287.   !
  288.   ! Produce a file listing the names of particular object files, for use
  289.   ! as input to the linker and also for use in finding source names by
  290.   ! make-cc1.com.  Generally, any name suffix will be suppressed.
  291.   !
  292.   LOCAL range1, range2;
  293.  
  294.   POSITION (BEGINNING_OF (opt_file_buf));
  295.   recursive_fetch_tag (tag_name, punct);
  296.   ! First fix up for subdirectory/Make-lang.in.
  297.   IF (pat_replace ("stamp-objlist" & (SPAN(" ")|LINE_END), " ") > 0) THEN
  298.     recursive_fetch_tag ("stamp-objlist", ":");
  299.   ENDIF;
  300.   ! Now fix up a few things in the output buffer.
  301.   pat_replace (("bytecode"|"Makefile") & (SPAN(" ")|LINE_END), " ");
  302. !#  FILL (CURRENT_BUFFER, " ", 1, 80, 0);    ! Condense things a bit.
  303.   pat_replace ("." & ("o"|"c"|"y") & ((SPAN(" ")&LINE_END)|LINE_END), LINE_END);
  304.   pat_replace ("." & ("o"|"c"|"y") & SPAN(" "), ",");
  305.   pat_replace (".h" & (SPAN(" ")|LINE_END), ".h,");
  306.   ! Remove trailing commas, if present.
  307.   pat_replace ("," & ((SPAN(" ")&LINE_END)|LINE_END), LINE_END);
  308.   ! Get rid of spaces and blank lines.
  309.   pat_replace (SPAN(" "), LINE_END);
  310.   pat_replace (LINE_BEGIN & LINE_END, );
  311.   ! Second fix up for subdirectory/Make-lang.in;
  312.   ! avoid "sticky defaults" when linker processes the resulting options file.
  313.   IF (extra_compilers{outfile_name - "-objs.opt"} <> TPU$K_UNSPECIFIED) THEN
  314.     POSITION (BEGINNING_OF (opt_file_buf));
  315.     range1 := CREATE_RANGE (MARK (NONE), END_OF (CURRENT_BUFFER), NONE);
  316.     LOOP
  317.       range2 := SEARCH_QUIETLY (LINE_BEGIN | ",", FORWARD, EXACT, range1);
  318.       EXITIF (range2 = 0);
  319.       POSITION (BEGINNING_OF (range2));
  320.       IF (CURRENT_CHARACTER = ",") THEN  MOVE_HORIZONTAL (1); ENDIF;
  321.       ! If it's not already "[.subdir]name", explicitly make it "[]name".
  322.       IF (CURRENT_CHARACTER <> "[") THEN  COPY_TEXT ("[]"); ENDIF;
  323.       MOVE_HORIZONTAL (1);
  324.       MODIFY_RANGE (range1, MARK (NONE), END_OF (range1));
  325.     ENDLOOP;
  326.   ENDIF;
  327.   ! Now write the output file.
  328.   SET (OUTPUT_FILE, opt_file_buf, outfile_name);
  329.   WRITE_FILE (opt_file_buf);
  330.   ERASE (opt_file_buf);        ! Clear buffer out for next opt_file pass.
  331. ENDPROCEDURE; !generate_option_file
  332. !!
  333.  
  334. PROCEDURE recursive_fetch_tag( tag_n, punct )
  335.   !
  336.   ! Look up TAG_N, copy it to OPT_FILE_BUF, and then translate any $(...)
  337.   ! definitions that appear.  The translation is put at the current point.
  338.   !
  339.   LOCAL mark1, mark2, range1, tag_range, tag_string;
  340.  
  341.   fetch_tag (tag_n, punct);
  342.   ! Substitute any makefile symbols $(...).
  343.   POSITION (BEGINNING_OF (CURRENT_BUFFER));
  344.   LOOP
  345.     range1 := SEARCH_QUIETLY ("$(" &
  346.       SPAN("abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ#~0123456789")
  347.                    & ")", FORWARD, EXACT);
  348.     EXITIF (range1 = 0);
  349.     POSITION (BEGINNING_OF (range1));
  350.     MOVE_HORIZONTAL (2);    ! Past opening "$(".
  351.     mark1 := MARK (NONE);
  352.     POSITION (END_OF (range1));
  353.     MOVE_HORIZONTAL (-1);    ! In front of closing ")".
  354.     mark2 := MARK (NONE);
  355.     tag_range := CREATE_RANGE (mark1, mark2, NONE);
  356.     POSITION (END_OF (range1));
  357.     tag_string := STR (tag_range);
  358.     ERASE (range1);
  359.     fetch_tag (tag_string, "=");
  360.     POSITION (BEGINNING_OF (CURRENT_BUFFER));
  361.   ENDLOOP;
  362. ENDPROCEDURE; !recursive_fetch_tag
  363. !!
  364.  
  365. PROCEDURE fetch_tag( tag_n, punct )
  366.   !
  367.   ! Looks up the translation of a tag, and inserts it at the current location
  368.   ! in the buffer.
  369.   !
  370.   LOCAL mark0, mark1, mark2, range2;
  371.  
  372.   mark0 := MARK (NONE);     ! Remember where we started; restore before return.
  373.   POSITION (BEGINNING_OF (makefile_buf));
  374.   ! The tag definition always starts in the first column, and might have
  375.   ! optional space(es) before "=" or ":" punctuation.
  376.   range2 := SEARCH_QUIETLY (LINE_BEGIN & tag_n & ((SPAN(" ") & punct) | punct),
  377.                 FORWARD, EXACT);
  378.   IF (range2 = 0) THEN
  379.     POSITION (mark0);
  380.     RETURN;
  381.   ENDIF;
  382.   POSITION (END_OF (range2));
  383.   MOVE_HORIZONTAL (1);        ! Move beyond "TAG=".
  384.   mark1 := MARK (NONE);
  385.   POSITION (BEGINNING_OF (range2));
  386.   LOOP
  387.     MOVE_VERTICAL (1);
  388.     MOVE_HORIZONTAL (-2);
  389.     EXITIF (CURRENT_CHARACTER <> "\");
  390.     ERASE_CHARACTER (1);
  391.     MOVE_HORIZONTAL (1);
  392.   ENDLOOP;
  393.   MOVE_HORIZONTAL (1);
  394.   mark2 := MARK (NONE);
  395.   range2 := CREATE_RANGE (mark1, mark2, NONE);
  396.   POSITION (mark0);
  397.   IF (LENGTH (range2) <> 0) THEN
  398.     COPY_TEXT (range2);
  399.   ENDIF;
  400. ENDPROCEDURE; !fetch_tag
  401. !!
  402.  
  403. PROCEDURE pat_replace( oldstring, newstring )
  404.   !
  405.   ! Replace all occurrences of a pattern.
  406.   !
  407.   LOCAL range1, range2, kill_it, count;
  408.  
  409.   count := 0;
  410.   kill_it := (GET_INFO (newstring, 'TYPE') = UNSPECIFIED);    ! Omitted arg.
  411.   range1 := CREATE_RANGE (BEGINNING_OF (CURRENT_BUFFER),
  412.               END_OF (CURRENT_BUFFER), NONE);
  413.   LOOP
  414.     range2 := SEARCH_QUIETLY (oldstring, FORWARD, EXACT, range1);
  415.     EXITIF (range2 = 0);
  416.     count := count + 1;
  417.     POSITION (BEGINNING_OF (range2));
  418.     ERASE (range2);
  419.     IF (newstring = LINE_END) THEN
  420.       SPLIT_LINE;
  421.     ELSE IF (NOT kill_it) THEN
  422.       COPY_TEXT (newstring);
  423.     ENDIF; ENDIF;
  424.     MODIFY_RANGE (range1, MARK (NONE), END_OF (range1));
  425.   ENDLOOP;
  426.   RETURN count;
  427. ENDPROCEDURE; !pat_replace
  428. !!
  429.  
  430. !
  431. ! This is the main routine.
  432. !
  433. process_makefile ();
  434. process_objc_lib ();    !this uses a different makefile
  435. QUIT;    ! All done; don't write any modified buffers.
  436. !!
  437. $ echo ""
  438. $!
  439. $! Remove excessive versions of the option files...
  440. $!
  441. $ purge *.opt,*.list
  442. $!
  443. $!
  444. $!
  445. $ if f$search("config.status") .nes. "" then delete config.status.*
  446. $ create config.status
  447. Links are now set up for use with a vax running VMS.
  448. $ type config.status
  449. $ echo ""
  450. $!
  451. $ exit
  452. $
  453. $!
  454. $! Construct a header file based on subdirectory contents
  455. $!
  456. $make_lang_incl: subroutine
  457. $  if f$search(p1).nes."" then delete 'p1';*
  458. $  create 'p1'    !empty file with ordinary text-file attributes
  459. $  open/Append ifile$ 'p1'
  460. $  write ifile$ "/* ''p1' */"
  461. $  hfile = f$search("[]''p1'")
  462. $  topdir = f$parse(hfile,,,"DIRECTORY") - "]"
  463. $lang_incl_loop:
  464. $  hfile = f$search("[.*]lang-''p1'")
  465. $  if hfile.eqs."" then goto lang_incl_done
  466. $  dir = f$parse(hfile,,,"DIRECTORY") - "]"
  467. $! convert absolute path to relative one, yielding "[.subdir]"
  468. $  dir = "[" + f$edit(dir - topdir,"LOWERCASE") + "]"
  469. $  write ifile$ "#include ""''dir'lang-''p1'"""
  470. $  goto lang_incl_loop
  471. $lang_incl_done:
  472. $  close ifile$
  473. $  echo "Created `''p1''."
  474. $ endsubroutine !make_lang_incl
  475.