This is the mail archive of the
java@gcc.gnu.org
mailing list for the Java project.
Re: Announcement: micro-libgcj
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/