On Fri, 2 Jun 2000 [EMAIL PROTECTED] wrote:
> I am a new user of Jacl and would like to write an extension. Is there some
> documentation to explain how to define and add a package to the source
> distribution, so that I can build my own .jar files. along with Jacl. Thanks.
> This would help me greatly.
>
> Kevin Gray
There is a tcljavaConfig.sh file in version 1.3 that makes
building an extension on top of Jacl or Tcl Blend really easy. I
have also attached a configure.in and Makefile.in that will
show you how it can be done. The example is from Swank, the
Tk interface extension build on top of Swing.
Mo Dejong
Red Hat Inc.
dnl This file is an input file used by the GNU "autoconf" program to
dnl generate the file "configure", which is run to configure the
dnl Makefile in this directory.
AC_INIT(swankgen/swkgen.tcl)
# RCS: @(#) $Id: configure.in,v 1.28 2000/02/23 22:15:16 mo Exp $
#--------------------------------------------------------------------
# Version identification info
#--------------------------------------------------------------------
SWANK_VERSION=0.1
SWANK_NODOT_VERSION=`echo $SWANK_VERSION | sed -e 's/\.//g'`
# Convert into full path name
srcdir=`cd $srcdir ; pwd`
MSG="srcdir is $srcdir"
echo $MSG >&5
echo $MSG
BUILDDIR=`pwd`
AC_SUBST(BUILDDIR)
# Make a directory called "build" in the build directory,
# this will be the CLASSPATH root for swank .class files
SWANK_CLASSPATH_ROOT=${BUILDDIR}/build
AC_SUBST(SWANK_CLASSPATH_ROOT)
if test ! -d ${SWANK_CLASSPATH_ROOT} ; then
mkdir ${SWANK_CLASSPATH_ROOT}
fi
#--------------------------------------------------------------------
# See if there was a command-line option for where tcljava is.
#--------------------------------------------------------------------
AC_ARG_WITH(tcljava, [ --with-tcljava=DIR use tcljava build directory from
DIR],
TCLJAVA_DIR=$withval, TCLJAVA_DIR=NONE)
if test "$TCLJAVA_DIR" = "NONE"; then
AC_MSG_ERROR([You must give the tcljava build directory using --with-tcljava])
fi
if test ! -f $TCLJAVA_DIR/tcljavaConfig.sh; then
AC_MSG_ERROR([Could not find $TCLJAVA_DIR/tcljavaConfig.sh,
Try --with-tcljava=DIR where DIR is the directory where you built tcljava])
fi
#--------------------------------------------------------------------
# Read in configuration information generated by tcljava
#--------------------------------------------------------------------
file=$TCLJAVA_DIR/tcljavaConfig.sh
. $file
AC_SUBST(TCLJAVA_PREFIX)
AC_SUBST(TCLJAVA_EXEC_PREFIX)
AC_SUBST(TCLJAVA)
AC_SUBST(TCLJAVA_VERSION)
AC_SUBST(TCLJAVA_NODOT_VERSION)
AC_SUBST(TCLJAVA_BUILD_DIR)
AC_SUBST(JAVA)
AC_SUBST(JAVA_G)
AC_SUBST(JAVAC)
AC_SUBST(JAVAH)
AC_SUBST(JAR)
AC_SUBST(JDB)
AC_SUBST(JAVA_FLAGS)
AC_SUBST(JAVA_G_FLAGS)
AC_SUBST(JAVAC_FLAGS)
AC_SUBST(JAVAC_D_FLAG)
AC_SUBST(JAVA_CLASSPATH)
AC_SUBST(JAR_EXTRACT_FLAGS)
AC_SUBST(JAR_COMPRESS_FLAGS)
AC_SUBST(JAR_NOCOMPRESS_FLAGS)
#
# Define the classpath swank will use
#
SWANK_CLASSPATH=${SWANK_CLASSPATH_ROOT}
#
# Get the tcljava build CLASSPATH, this path could be different
# depending on if you configured with Jacl or Tcl Blend
#
CP_PAIR=`cd $TCLJAVA_DIR ; make classpath | grep CLASSPATH`
# Set TCLJAVA_CLASSPATH to the second element in the space
# separated list, it is kind of a shell hack but oh well.
for i in $CP_PAIR;
do
TCLJAVA_CLASSPATH=$i ;
done;
SWANK_CLASSPATH=${SWANK_CLASSPATH}:${TCLJAVA_CLASSPATH}
AC_SUBST(SWANK_CLASSPATH)
#
# See if the compiler accepts -J-mx(num)M. This is needed to
# avoid "out of memory errors" with the JDK compiler
#
JAVAC_EXTRA_MEM=-J-mx35M
echo "public class testme {}" > testme.java
echo "" >& 5
echo "Testing the ${JAVAC_EXTRA_MEM} option to the java compiler" >& 5
echo "CLASSPATH=${JAVA_CLASSPATH}" >& 5
echo "${JAVAC} ${JAVAC_FLAGS} ${JAVAC_EXTRA_MEM} testme.java" >& 5
CLASSPATH=${JAVA_CLASSPATH} \
${JAVAC} ${JAVAC_FLAGS} ${JAVAC_EXTRA_MEM} testme.java 2>& 5
if test ! -f testme.class; then
echo "Java compiler did not accept ${JAVAC_EXTRA_MEM}" >& 5
else
echo "Java compiler accepted ${JAVAC_EXTRA_MEM}" >& 5
JAVAC_FLAGS="${JAVAC_FLAGS} ${JAVAC_EXTRA_MEM}"
fi
rm -f testme.*
#----------------------------------------------------------------------
# See if there was a command-line option for where a swing jar is.
#----------------------------------------------------------------------
AC_ARG_WITH(swingjar, [ --with-swingjar=FILE use this swing JAR file],
SWINGJAR=$withval, SWINGJAR=NONE)
if test "$SWINGJAR" = "NONE"; then
SWINGJAR=
fi
echo "import javax.swing.*;
public class swingme {}" > swingme.java
echo "" >& 5
echo "Testing for javax.swing package" >& 5
echo "CLASSPATH=${JAVA_CLASSPATH}:${SWINGJAR}" >& 5
echo "${JAVAC} ${JAVAC_FLAGS} swingme.java" >& 5
CLASSPATH=${JAVA_CLASSPATH}:${SWINGJAR} \
${JAVAC} ${JAVAC_FLAGS} swingme.java 2>& 5
if test ! -f swingme.class; then
AC_MSG_ERROR([Could not compile class that depends on the javax.swing package,
did you use the --with-swingjar for a JDK 1.1 compliant JVM?])
fi
rm -f swingme.*
if test "${SWINGJAR}" != ""; then
SWANK_CLASSPATH=${SWANK_CLASSPATH}:${SWINGJAR}
fi
#
# See if the JVM supports the java.awt.print.Printable interface.
# This interface is part of the JDK 1.2 API
#
echo "import java.awt.print.*;
public class printme {}" > printme.java
echo "" >& 5
echo "Testing for java.awt.print package" >& 5
echo "CLASSPATH=${JAVA_CLASSPATH}:${SWINGJAR}" >& 5
echo "${JAVAC} ${JAVAC_FLAGS} printme.java" >& 5
CLASSPATH=${JAVA_CLASSPATH}:${SWINGJAR} \
${JAVAC} ${JAVAC_FLAGS} printme.java 2>& 5
if test ! -f printme.class; then
# We need to "fake" the Printable interface, this requires two
# things, we must define a dummy interface called Printable
# so that swank classes can safely implement it. This requires
# "dummy" classes needed by the Printable interface.
# Create an empty java.awt.print.* package to fool the
# java compiler into compiling classes that import it.
echo "Creating printcompat.jar" >& 5
mkdir -p ${SWANK_CLASSPATH_ROOT}/java/awt/print
cd ${SWANK_CLASSPATH_ROOT}
${JAR} ${JAR_NOCOMPRESS_FLAGS} print_compat.jar java >& 5
mv printcompat.jar ${BUILDDIR}
cd ${BUILDDIR}
rm -rf ${SWANK_CLASSPATH_ROOT}/java
SWANK_CLASSPATH=${SWANK_CLASSPATH}:${BUILDDIR}/print_compat.jar
# Use the "fake" Printable interface
echo "Using dummy Printable types" >& 5
#
# Get a list of the swank_printable_compat/swank/*.java source files
#
for i in `cd $srcdir/swank_printable_compat/swank ; ls *.java` ;
do
SWANK_PRINTABLE_COMPAT_SOURCES="$SWANK_PRINTABLE_COMPAT_SOURCES
\$(srcdir)/swank_printable_compat/swank/$i" ;
done;
AC_SUBST(SWANK_PRINTABLE_COMPAT_SOURCES)
# Add the conditional "compat" rule for the Printable interface
SWANK_COMPAT_COND_TARGETS="${SWANK_COMPAT_COND_TARGETS} swank_printable_compat"
AC_SUBST(SWANK_COMPAT_COND_TARGETS)
fi
rm -f printme.*
#
# Get a list of the swank/*.java source files
#
for i in `cd $srcdir/swank ; ls *.java` ;
do
SWANK_SOURCES="$SWANK_SOURCES \$(srcdir)/swank/$i" ;
done;
#
# Check to see if Java-2D is supported by this JVM (JDK 1.2)
#
echo "import java.awt.geom.*;
public class java2dme {}" > java2dme.java
echo "" >& 5
echo "Testing for java.awt.print package" >& 5
echo "CLASSPATH=${JAVA_CLASSPATH}" >& 5
echo "${JAVAC} ${JAVAC_FLAGS} java2dme.java" >& 5
CLASSPATH=${JAVA_CLASSPATH} \
${JAVAC} ${JAVAC_FLAGS} java2dme.java 2>& 5
if test -f java2dme.class; then
for i in `cd $srcdir/swank/canvas ; ls *.java` ;
do
SWANK_SOURCES="$SWANK_SOURCES \$(srcdir)/swank/canvas/$i" ;
done;
fi
rm -f java2dme.*
AC_SUBST(SWANK_SOURCES)
AC_OUTPUT([Makefile])
srcdir = @srcdir@
BUILDDIR = @BUILDDIR@
TCLJAVA_BUILD_DIR = @TCLJAVA_BUILD_DIR@
# Fully qualified paths for programs used in build process
JAVA = @JAVA@
JAVA_G = @JAVA_G@
JAVAC = @JAVAC@
JAR = @JAR@
JDB = @JDB@
DDD = @DDD@
JAVA_FLAGS = @JAVA_FLAGS@
JAVA_G_FLAGS = @JAVA_G_FLAGS@
JAVAC_FLAGS = @JAVAC_FLAGS@
JAVAC_D_FLAG = @JAVAC_D_FLAG@
JAR_EXTRACT_FLAGS = @JAR_EXTRACT_FLAGS@
JAR_COMPRESS_FLAGS = @JAR_COMPRESS_FLAGS@
JAR_NOCOMPRESS_FLAGS = @JAR_NOCOMPRESS_FLAGS@
JDB_FLAGS =
DDD_FLAGS =
SWANK_CLASSPATH = @SWANK_CLASSPATH@
SWANK_CLASSPATH_ROOT = @SWANK_CLASSPATH_ROOT@
all: clean_classpath_root @SWANK_COMPAT_COND_TARGETS@ swank.jar
clean_classpath_root:
rm -rf $(SWANK_CLASSPATH_ROOT)
mkdir $(SWANK_CLASSPATH_ROOT)
swank_printable_compat: $(SWANK_PRINTABLE_COMPAT_SOURCES)
CLASSPATH=$(SWANK_CLASSPATH) \
$(JAVAC) $(JAVAC_FLAGS) $(JAVAC_D_FLAG) $(SWANK_CLASSPATH_ROOT)
$(SWANK_PRINTABLE_COMPAT_SOURCES)
swank.jar: $(SWANK_SOURCES)
CLASSPATH=$(SWANK_CLASSPATH) \
$(JAVAC) $(JAVAC_FLAGS) $(JAVAC_D_FLAG) $(SWANK_CLASSPATH_ROOT)
$(SWANK_SOURCES)
cd build ; \
$(JAR) $(JAR_NOCOMPRESS_FLAGS) ../swank.jar swank
shell:
cd ${TCLJAVA_BUILD_DIR} ; \
make TEST_CLASSPATH=$(SWANK_CLASSPATH) shell
clean: clean_classpath_root
rm -f swank.jar
distclean: clean
rm -rf Makefile config.* $(SWANK_CLASSPATH_ROOT)
Makefile: $(srcdir)/Makefile.in
./config.status
SWANK_PRINTABLE_COMPAT_SOURCES = @SWANK_PRINTABLE_COMPAT_SOURCES@
SWANK_SOURCES = @SWANK_SOURCES@