#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#    
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.

JAVAROOT = $(top_builddir)/modules/java
libdir = $(prefix)/lib

if WANT_JAVA

noinst_PROGRAMS = java-test java-shell client-test

lib_LTLIBRARIES = libmod_tuscany_java.la

INCLUDES = -I${JAVA_INCLUDE}

libmod_tuscany_java_la_SOURCES = mod-java.cpp
libmod_tuscany_java_la_LDFLAGS = -lxml2 -lcurl -lmozjs -L${JAVA_LIB} -R${JAVA_LIB} -R${JAVA_LIB}/server -ljava

java_test_SOURCES = java-test.cpp
java_test_LDFLAGS = -L${JAVA_LIB} -R${JAVA_LIB} -R${JAVA_LIB}/server -ljava

java_shell_SOURCES = java-shell.cpp
java_shell_LDFLAGS = -L${JAVA_LIB} -R${JAVA_LIB} -R${JAVA_LIB}/server -ljava

noinst_JAVA = org/apache/tuscany/*.java test/*.java

jarfile = libmod-tuscany-java-${PACKAGE_VERSION}.jar
jardir = ${libdir}
jar_DATA = ${jarfile}

${jarfile}: ${noinst_JAVA}
	${JAR} cf $@ org/apache/tuscany/*.class

CLEANFILES = ${jarfile} org/apache/tuscany/*.class	test/*.class

client_test_SOURCES = client-test.cpp
client_test_LDFLAGS = -lxml2 -lcurl -lmozjs

prefixdir = $(top_builddir)/modules/java
prefix_DATA = java.prefix

java.prefix: $(top_builddir)/config.status
	echo ${JAVA_PREFIX} >java.prefix

TESTS = java-test server-test

endif
