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@

Reply via email to