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



# this file describes all the external libraries
# depending on the configure options these may be taken from the system,
# or the internal/bundled copy may be built.

# for every external, a function gb_LinkTarget_use__FOO is defined,
# once for the system case, once for the internal case.

# in the system case, no libraries should be registered, but the target-local
# variable LIBS should be set to FOO_LIBS, and INCLUDES to FOO_CFLAGS.


ifeq ($(SYSTEM_ZLIB),YES)

define gb_LinkTarget__use_zlib
$(call gb_LinkTarget_add_defs,$(1),\
	-DSYSTEM_ZLIB \
)
$(call gb_LinkTarget_add_libs,$(1),-lz)
endef

else # !SYSTEM_ZLIB

$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS, \
	zlib \
))

define gb_LinkTarget__use_zlib
$(call gb_LinkTarget_add_linked_static_libs,$(1),\
	zlib \
)
endef

endif # SYSTEM_ZLIB


ifeq ($(SYSTEM_JPEG),YES)

define gb_LinkTarget__use_jpeg
$(call gb_LinkTarget_add_libs,$(1),-ljpeg)
$(call gb_LinkTarget_set_ldflags,$(1),\
	$$(filter-out -L/usr/lib/jvm%,$$(T_LDFLAGS)) \
)
ifeq ($(OS),FREEBSD)
# JDK jpeg library on FreeBSD lives under ${JAVA_HOME}/jre/lib/${ARCH}/
$(call gb_LinkTarget_set_ldflags,$(1),\
	$$(filter-out -L$$(JAVA_HOME)/jre/lib/%,$$(T_LDFLAGS)) \
)
endif
endef

else # !SYSTEM_JPEG

$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS, \
	jpeglib \
))

define gb_LinkTarget__use_jpeg
$(call gb_LinkTarget_add_linked_static_libs,$(1),\
	jpeglib \
)
endef

endif # SYSTEM_JPEG


ifeq ($(SYSTEM_EXPAT),YES)

define gb_LinkTarget__use_expat
$(if $(2),,$(error gb_LinkTarget__use_expat needs additional parameter))

$(call gb_LinkTarget_add_defs,$(1),\
	-DSYSTEM_EXPAT \
)

$(call gb_LinkTarget_add_libs,$(1),-lexpat)
endef

else # !SYSTEM_EXPAT

$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS, \
	ascii_expat_xmlparse \
	expat_xmlparse \
	expat_xmltok \
))

define gb_LinkTarget__use_expat
$(if $(2),,$(error gb_LinkTarget__use_expat needs additional parameter))

$(if $(filter-out ascii_expat_xmlparse,$(2)),\
	$(call gb_LinkTarget_add_defs,$(1),\
		-DXML_UNICODE \
))

$(call gb_LinkTarget_add_linked_static_libs,$(1),\
	$(2) \
	expat_xmltok \
)
endef

endif # SYSTEM_EXPAT

# now define 2 wrappers that select which internal static library to use...
define gb_LinkTarget__use_expat_utf8
$(call gb_LinkTarget__use_expat,$(1),ascii_expat_xmlparse)
endef

define gb_LinkTarget__use_expat_utf16
$(call gb_LinkTarget__use_expat,$(1),expat_xmlparse)
endef


ifeq ($(SYSTEM_LIBXML),YES)

define gb_LinkTarget__use_libxml2
$(call gb_LinkTarget_add_defs,$(1),\
	-DSYSTEM_LIBXML \
)
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	$(LIBXML_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(LIBXML_LIBS))
endef

else # !SYSTEM_LIBXML

$(eval $(call gb_Helper_register_libraries,PLAINLIBS_URE, \
	xml2 \
))

define gb_LinkTarget__use_libxml2
$(call gb_LinkTarget_add_linked_libs,$(1),\
	xml2 \
)
endef

endif # SYSTEM_LIBXML


ifeq ($(SYSTEM_LIBXSLT),YES)

define gb_LinkTarget__use_libxslt
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	$(LIBXSLT_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(LIBXSLT_LIBS))
endef

else # !SYSTEM_LIBXSLT

$(eval $(call gb_Helper_register_libraries,PLAINLIBS_OOO, \
	xslt \
))

define gb_LinkTarget__use_libxslt
$(call gb_LinkTarget_add_linked_libs,$(1),\
	xslt \
)
endef

endif # SYSTEM_LIBXSLT


ifeq ($(SYSTEM_REDLAND),YES)

define gb_LinkTarget__use_librdf
$(call gb_LinkTarget_add_defs,$(1),\
	-DSYSTEM_REDLAND \
)
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	$(REDLAND_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(REDLAND_LIBS))
endef

else # !SYSTEM_REDLAND

$(eval $(call gb_Helper_register_libraries,PLAINLIBS_OOO, \
	rdf \
))

define gb_LinkTarget__use_librdf
$(call gb_LinkTarget_add_linked_libs,$(1),\
	rdf \
)
endef

endif # SYSTEM_REDLAND


ifeq ($(SYSTEM_CAIRO),YES)

# FREETYPE_CLAGS from environment if ENABLE_CAIRO is used
define gb_LinkTarget__use_cairo
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	$(FREETYPE_CFLAGS) \
	$(CAIRO_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(CAIRO_LIBS))
endef

else # !SYSTEM_CAIRO

$(eval $(call gb_Helper_register_libraries,PLAINLIBS_OOO, \
	cairo \
))
ifneq ($(OS),WNT)
$(eval $(call gb_Helper_register_libraries,PLAINLIBS_OOO, \
	pixman-1 \
))
endif # WNT

define gb_LinkTarget__use_cairo
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	-I$(OUTDIR)/inc/cairo \
	$(FREETYPE_CFLAGS) \
)
$(call gb_LinkTarget_add_linked_libs,$(1),\
	cairo \
)
ifneq ($(OS),WNT)
$(call gb_LinkTarget_add_linked_libs,$(1),\
	pixman-1 \
)
endif
endef

endif # SYSTEM_CAIRO


ifeq ($(SYSTEM_GRAPHITE),YES)

#check for building with stlport, but graphite was not built with stlport
define gb_LinkTarget__use_graphite
ifneq ($(USE_SYSTEM_STL),YES)
$(call gb_LinkTarget_add_defs,$(1),\
	-DADAPT_EXT_STL \
)
endif
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	$(GRAPHITE_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(GRAPHITE_LIBS))
endef

else # !SYSTEM_GRAPHITE

$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS, \
	graphite \
))
define gb_LinkTarget__use_graphite
$(call gb_LinkTarget_add_linked_static_libs,$(1),\
	graphite \
)
endef

endif # SYSTEM_GRAPHITE


ifeq ($(SYSTEM_ICU),YES)

define gb_LinkTarget__use_icudata
$(call gb_LinkTarget_add_libs,$(1),-licudata)
endef
define gb_LinkTarget__use_icui18n
$(call gb_LinkTarget_add_libs,$(1),-licui18n)
endef
define gb_LinkTarget__use_icule
$(call gb_LinkTarget_add_libs,$(1),-licule)
endef
define gb_LinkTarget__use_icuuc
$(call gb_LinkTarget_add_libs,$(1),-licuuc)
endef

else # !SYSTEM_ICU

define gb_LinkTarget__use_icudata
ifeq ($(OS)$(COM),WNTMSC)
$(call gb_LinkTarget_add_libs,$(1),icudata.lib)
else ifeq ($(OS)$(COM),WNTGCC)
$(call gb_LinkTarget_add_libs,$(1),-licudt40)
else ifeq ($(OS),OS2)
$(call gb_LinkTarget_add_libs,$(1),-licudt)
else
$(call gb_LinkTarget_add_libs,$(1),-licudata)
endif
endef

define gb_LinkTarget__use_icui18n
ifeq ($(OS)$(COM),WNTMSC)
$(call gb_LinkTarget_add_libs,$(1),icuin.lib)
else ifeq ($(OS)$(COM),WNTGCC)
$(call gb_LinkTarget_add_libs,$(1),-licuin40)
else ifeq ($(OS),OS2)
$(call gb_LinkTarget_add_libs,$(1),-licuin)
else
$(call gb_LinkTarget_add_libs,$(1),-licui18n)
endif
endef

define gb_LinkTarget__use_icule
ifeq ($(OS)$(COM),WNTMSC)
$(call gb_LinkTarget_add_libs,$(1),icule.lib)
else ifeq ($(OS)$(COM),WNTGCC)
$(call gb_LinkTarget_add_libs,$(1),-licule40)
else
$(call gb_LinkTarget_add_libs,$(1),-licule)
endif
endef

define gb_LinkTarget__use_icuuc
ifeq ($(OS)$(COM),WNTMSC)
$(call gb_LinkTarget_add_libs,$(1),icuuc.lib)
else ifeq ($(OS)$(COM),WNTGCC)
$(call gb_LinkTarget_add_libs,$(1),-licuuc40)
else
$(call gb_LinkTarget_add_libs,$(1),-licuuc)
endif
endef

endif # SYSTEM_ICU


ifeq ($(SYSTEM_OPENSSL),YES)

define gb_LinkTarget__use_openssl
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	$(OPENSSL_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(OPENSSL_LIBS))
endef

else # !SYSTEM_OPENSSL

$(eval $(call gb_Helper_register_libraries,PLAINLIBS_OOO, \
	crypto \
	ssl \
))

define gb_LinkTarget__use_openssl
$(call gb_LinkTarget_add_linked_libs,$(1),\
	crypto \
	ssl \
)
ifeq ($(OS),SOLARIS)
$(call gb_LinkTarget_add_libs,$(1),\
	-lnsl \
	-lsocket \
)
endif
ifeq ($(OS),LINUX)
$(call gb_LinkTarget_add_libs,$(1),\
	-lpthread \
)
endif
endef

endif # SYSTEM_OPENSSL


ifeq ($(SYSTEM_CURL),YES)

define gb_LinkTarget__use_curl
$(call gb_LinkTarget_add_defs,$(1),\
	-DSYSTEM_CURL \
)
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	$(CURL_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(CURL_LIBS))
endef

else # !SYSTEM_CURL

ifeq ($(OS),WNT)
$(eval $(call gb_Helper_register_libraries,PLAINLIBS_NONE,libcurl))
else
$(eval $(call gb_Helper_register_libraries,PLAINLIBS_NONE,curl))
endif

define gb_LinkTarget__use_curl
ifeq ($(OS),WNT)
$(call gb_LinkTarget_add_linked_libs,$(1),libcurl)
else
$(call gb_LinkTarget_add_linked_libs,$(1),curl)
endif
endef

endif # SYSTEM_CURL


ifeq ($(SYSTEM_COINMP),YES)

define gb_LinkTarget__use_coinmp
$(call gb_LinkTarget_add_defs,$(1),\
	-DSYSTEM_COINMP \
)
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	$(COINMP_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(COINMP_LIBS))
endef

else # !SYSTEM_COINMP

$(eval $(call gb_Helper_register_libraries,PLAINLIBS_NONE,CoinMP))
ifneq ($(OS),WNT)
$(eval $(call gb_Helper_register_libraries,PLAINLIBS_NONE, \
	CoinUtils \
	Clp \
	Cbc \
	Osi \
	OsiClp \
	Cgl \
	CbcSolver \
))
endif

define gb_LinkTarget__use_coinmp
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	-I$(OUTDIR)/inc/coinmp \
)
$(call gb_LinkTarget_add_linked_libs,$(1),CoinMP)
ifneq ($(OS),WNT)
ifneq ($(OS),OS2)
$(call gb_LinkTarget_add_linked_libs,$(1),\
	CoinUtils \
	Clp \
	Cbc \
	Osi \
	OsiClp \
	Cgl \
	CbcSolver \
)
endif
endif
endef

endif # SYSTEM_COINMP


ifeq ($(SYSTEM_HYPH),YES)

define gb_LinkTarget__use_hyphen
$(call gb_LinkTarget_add_defs,$(1),\
		-DSYSTEM_HYPH \
)
$(call gb_LinkTarget_add_libs,$(1),$(HYPHEN_LIB))
endef

else # !SYSTEM_HYPH

$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS, \
		hyphen \
))

define gb_LinkTarget__use_hyphen
$(call gb_LinkTarget_add_linked_static_libs,$(1),\
		hyphen \
)
endef

endif # SYSTEM_HYPH


ifeq ($(SYSTEM_LIBTEXTCAT),YES)

define gb_LinkTarget__use_libtextcat
$(call gb_LinkTarget_add_libs,$(1),-ltextcat)
endef

else # !SYSTEM_LIBTEXTCAT

$(eval $(call gb_Helper_register_libraries,PLAINLIBS_OOO, \
	libtextcat \
	textcat \
))

define gb_LinkTarget__use_libtextcat
ifeq ($(OS),WNT)
$(call gb_LinkTarget_add_linked_libs,$(1),libtextcat)
else
$(call gb_LinkTarget_add_linked_libs,$(1),textcat)
endif
endef

endif # SYSTEM_LIBTEXTCAT


ifeq ($(SYSTEM_MYTHES),YES)

define gb_LinkTarget__use_mythes
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	$(MYTHES_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(MYTHES_LIBS))
endef

else # !SYSTEM_MYTHES

ifeq ($(OS),WNT)
$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS,libmythes))
else
$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS,mythes-1.2))
endif

define gb_LinkTarget__use_mythes
ifeq ($(OS),WNT)
$(call gb_LinkTarget_add_linked_static_libs,$(1),libmythes)
else
$(call gb_LinkTarget_add_linked_static_libs,$(1),mythes-1.2)
endif
endef

endif # SYSTEM_MYTHES


ifeq ($(SYSTEM_HUNSPELL),YES)

define gb_LinkTarget__use_hunspell
$(call gb_LinkTarget_set_include,$(1),\
		$$(INCLUDE) \
		$(HUNSPELL_CFLAGS) \
)
$(call gb_LinkTarget_add_libs,$(1),$(HUNSPELL_LIBS))
endef

else # !SYSTEM_HUNSPELL

ifeq ($(GUI),WNT)
$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS,libhunspell))
else ifeq ($(GUI),OS2)
$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS,hunspell))
else
$(eval $(call gb_Helper_register_static_libraries,PLAINLIBS,hunspell-1.3))
endif

define gb_LinkTarget__use_hunspell
$(call gb_LinkTarget_set_include,$(1),\
	$$(INCLUDE) \
	-I$(OUTDIR)/inc/hunspell \
)
$(call gb_LinkTarget_add_defs,$(1),\
	-DHUNSPELL_STATIC
)
ifeq ($(GUI),WNT)
$(call gb_LinkTarget_add_linked_static_libs,$(1),libhunspell)
else ifeq ($(GUI),OS2)
$(call gb_LinkTarget_add_linked_static_libs,$(1),hunspell)
else
$(call gb_LinkTarget_add_linked_static_libs,$(1),hunspell-1.3)
endif
endef

endif # SYSTEM_HUNSPELL



ifeq ($(SYSTEM_PYTHON),YES)

define gb_LinkTarget__use_python
$(call gb_LinkTarget_set_include,$(1),\
        $$(INCLUDE) \
        $(filter -I%,$(PYTHON_CFLAGS)) \
)
$(call gb_LinkTarget_add_defs,$(1),\
        $(filter-out -I%,$(PYTHON_CFLAGS)) \
)
$(call gb_LinkTarget_add_libs,$(1),\
        $(PYTHON_LIBS) \
)
endef

else # !SYSTEM_PYTHON

include $(SRCDIR)/python/pyversion.mk

define gb_LinkTarget__use_python
$(call gb_LinkTarget_set_include,$(1),\
        $$(INCLUDE) \
        -I$(OUTDIR)/inc/python \
)
$(call gb_LinkTarget_add_libs,$(1),$(PYTHONLIB))
endef

endif # SYSTEM_PYTHON

# vim: set noet sw=4 ts=4:
