# ---------------------------------------------------------------------------
# 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.
# ---------------------------------------------------------------------------

all:	cas sofa engine typepriority language iterators casserializer primitivetypes xcasdeserialization xmideserialization jni

cas:
	$(DEBUG_FVT)test_cas

sofa:
	$(DEBUG_FVT)test_sofa
	$(RM) temp.xcas

engine:	
	$(DEBUG_FVT)test_engine 

typepriority:
	$(DEBUG_FVT)test_typepriority
	$(RM) ANDump.xml

language:
	$(DEBUG_FVT)test_language

iterators:	
	$(DEBUG_FVT)test_iterators

casserializer:
	$(DEBUG_FVT)test_casserializer

primitivetypes:
	$(DEBUG_FVT)test_primitivetypes
	$(RM) temp.xcas
	$(RM) testprimitivetypes.xmi

xcasdeserialization:
	$(DEBUG_FVT)test_xcasdeserialization
	$(RM) temp.xcas

xmideserialization:
	$(DEBUG_FVT)test_xmideserialization
	$(RM) temp.xmi
	$(RM) oots.xmi
	$(RM) oots2.xmi

jni:
	$(UIMACPPTEST_JNI)
