# ---------------------------------------------------------------------------
# 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_casD

sofa:
	$(DEBUG_FVT)test_sofaD
	$(RM) temp.xcas

engine:	
	$(DEBUG_FVT)test_engineD

typepriority:
	$(DEBUG_FVT)test_typepriorityD
	$(RM) ANDump.xml

language:
	$(DEBUG_FVT)test_languageD

iterators:	
	$(DEBUG_FVT)test_iteratorsD

casserializer:
	$(DEBUG_FVT)test_casserializerD

primitivetypes:
	$(DEBUG_FVT)test_primitivetypesD
	$(RM) temp.xcas
	$(RM) testprimitivetypes.xmi

xcasdeserialization:
	$(DEBUG_FVT)test_xcasdeserializationD
	$(RM) temp.xcas

xmideserialization:
	$(DEBUG_FVT)test_xmideserializationD
	$(RM) temp.xmi
	$(RM) oots.xmi
	$(RM) oots2.xmi

jni:
	$(UIMACPPTEST_JNI)
