Announcement: micro-libgcj

Per Bothner per@bothner.com
Fri Jan 6 22:39:00 GMT 2006


Andrew Haley wrote:
> That would suit me well, but there may be some quasi-religious
> objections to preprocessing.  As in "How can you do this?  Java
> doesn't have a preprocessor!"  :-)
> 
> In all seriousness, we only have two routes: either preprocess or keep
> micro-libgcj on a separate branch and repeatedly merge.  I don't like
> either objection, but it seems to me the second is worse.

Kawa takes an approach to pre-proprocessing that may be suitable.
Both the input and output to the pre-processor is a regular Java
file, but with differenent sections commented out.

The default CVS-checked in Java file assume JDK 1.4 functionality.
For example:

   /* #ifdef use:java.net.URI */
   static URI URLtoURI (URL url)
     throws java.net.URISyntaxException
   {
     /* #ifdef JAVA5 */
     // return url.toURI();
     /* #else */
     return new URI(url.toString());
     /* #endif */
   }
   /* #else */
   // static String URLtoURI (URL url)
   // {
   //   return url.toString();
   // }
   /* #endif */

If you run gnu.kawa.util.PreProcess +JAVA5 +use:java.net.URI you get:

   /* #ifdef use:java.net.URI */
   static URI URLtoURI (URL url)
     throws java.net.URISyntaxException
   {
     /* #ifdef JAVA5 */
     return url.toURI();
     /* #else */
     // return new URI(url.toString());
     /* #endif */
   }
   /* #else */
   // static String URLtoURI (URL url)
   // {
   //   return url.toString();
   // }
   /* #endif */

If you run gnu.kawa.util.PreProcess -JAVA5 -use:java.net.URI you get:

   /* #ifdef use:java.net.URI */
   // static URI URLtoURI (URL url)
   //   throws java.net.URISyntaxException
   // {
   //   /* #ifdef JAVA5 */
   //   return url.toURI();
   //   /* #else */
   //   return new URI(url.toString());
   //   /* #endif */
   // }
   /* #else */
   static String URLtoURI (URL url)
   {
     return url.toString();
   }
   /* #endif */

The PreProcess class modifies each source file in place, but it can
easily be modified to write the output to a new file.

So how does this solve the current problem?  Basically, you can use
various directives to control which features should be skipped for
(various configurations of) micro-libgcj.  The default checked-in
code has all the standard features.  To generate a micro-libgcj
configuration, you preprocess the relavant files, creating a
separate tree of modified files.  You can use apropriate CLASSPATH
options to make sure the modified versions are found before the
standard versions.

http://sources.redhat.com/cgi-bin/cvsweb.cgi/kawa/gnu/kawa/util/PreProcess.java?rev=1.5&content-type=text/x-cvsweb-markup&cvsroot=kawa
-- 
	--Per Bothner
per@bothner.com   http://per.bothner.com/



More information about the Java mailing list