# ---------------------------------------------------------------------------
# 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.
# ---------------------------------------------------------------------------

# Set the environment variables DEBUGUIMA & DEBUGTEST to build debug library & test routines

#VERBOSE:=--verbose
BUILD_DIR ?= .
PWD := $(shell pwd)/..

CONFIGURE_ARGS := --disable-static --prefix=/install --includedir=/install/include/uima --disable-dependency-tracking

ifneq ($(DEBUGUIMA),)
CONFIGURE_ARGS := $(CONFIGURE_ARGS)  --enable-debuguima=yes
endif

ifneq ($(DEBUGTEST),)
CONFIGURE_ARGS := $(CONFIGURE_ARGS)  --enable-debugtest=yes
endif

ifneq ($(APR_HOME),)
CONFIGURE_ARGS := $(CONFIGURE_ARGS)  --with-apr=$(APR_HOME)
endif

ifneq ($(ICU_HOME),)
CONFIGURE_ARGS := $(CONFIGURE_ARGS)  --with-icu=$(ICU_HOME)
endif

ifneq ($(XERCES_HOME),)
CONFIGURE_ARGS := $(CONFIGURE_ARGS)  --with-xerces=$(XERCES_HOME)
endif

ifneq ($(ACTIVEMQ_HOME),)
CONFIGURE_ARGS := $(CONFIGURE_ARGS)  --with-activemq=$(ACTIVEMQ_HOME)
endif

CONFIGURE_ARGS := $(CONFIGURE_ARGS)  --with-jdk=$(JAVA_INCLUDE)

AC_FLAGS=CFLAGS="$(CFLAGS)" CXXFLAGS="$(CFLAGS)"

.PHONY: all install dist clean distclean

all: $(BUILD_DIR)/Makefile
	$(MAKE) -C $(BUILD_DIR) $(MAKE_ARGS) all

install: $(BUILD_DIR)/Makefile
	$(MAKE) -C $(BUILD_DIR) $(MAKE_ARGS) install-strip DESTDIR=$(PWD)

dist: $(BUILD_DIR)/Makefile
	$(MAKE) -C $(BUILD_DIR) $(MAKE_ARGS) dist

clean: $(BUILD_DIR)/Makefile
	test ! -f $(BUILD_DIR)/Makefile || $(MAKE) -C $(BUILD_DIR) $(MAKE_ARGS) clean

distclean:
	test ! -f $(BUILD_DIR)/Makefile || $(MAKE) -C $(BUILD_DIR) $(MAKE_ARGS) distclean

$(BUILD_DIR)/Makefile: $(BUILD_DIR)/Makefile.in $(BUILD_DIR)/configure
	mkdir -p $(BUILD_DIR)
	cd $(BUILD_DIR) && $(AC_FLAGS) ./configure $(CONFIGURE_ARGS)
