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@