FIND_PACKAGE(Threads)
INCLUDE(CheckIncludeFile)
IF(Threads_FOUND)
  CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
  add_definitions(-DLIBXML_THREAD_ENABLED)
ENDIF(Threads_FOUND)
IF(CMAKE_USE_PTHREADS_INIT)
  SET(HAVE_LIBPTHREAD 1)
ENDIF(CMAKE_USE_PTHREADS_INIT)

CHECK_INCLUDE_FILE(ansidecl.h HAVE_ANSIDECL_H)
CHECK_INCLUDE_FILE(arpa/inet.h HAVE_ARPA_INET_H)
CHECK_INCLUDE_FILE(arpa/nameser.h HAVE_ARPA_NAMESER_H)
CHECK_INCLUDE_FILE(ctype.h HAVE_CTYPE_H)
CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
CHECK_INCLUDE_FILE(dl.h HAVE_DL_H)
CHECK_INCLUDE_FILE(errno.h HAVE_ERRNO_H)
CHECK_INCLUDE_FILE(fcntl.h HAVE_FCNTL_H)
CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
CHECK_INCLUDE_FILE(fp_class.h HAVE_FP_CLASS_H)
CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H)
CHECK_INCLUDE_FILE(inttypes.h.h HAVE_INTTYPES_H_H)
CHECK_INCLUDE_FILE(limits.h HAVE_LIMITS_H)
CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
CHECK_INCLUDE_FILE(math.h HAVE_MATH_H)
CHECK_INCLUDE_FILE(memory.h HAVE_MEMORY_H)
CHECK_INCLUDE_FILE(nan.h HAVE_NAN_H)
CHECK_INCLUDE_FILE(ndir.h HAVE_NDIR_H)
CHECK_INCLUDE_FILE(netdb.h HAVE_NETDB_H)
CHECK_INCLUDE_FILE(netinet/in.h HAVE_NETINET_IN_H)
CHECK_INCLUDE_FILE(poll.h HAVE_POLL_H)
CHECK_INCLUDE_FILE(resolv.h HAVE_RESOLV_H)
CHECK_INCLUDE_FILE(signal.h HAVE_SIGNAL_H)
CHECK_INCLUDE_FILE(stdarg.h HAVE_STDARG_H)
CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
CHECK_INCLUDE_FILE(stdlib.h HAVE_STDLIB_H)
CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
CHECK_INCLUDE_FILE(string.h HAVE_STRING_H)
#CHECK_INCLUDE_FILE(sys/dir.h HAVE_SYS_DIR_H)
CHECK_INCLUDE_FILE(sys/mman.h HAVE_SYS_MMAN_H)
CHECK_INCLUDE_FILE(sys/ndir.h HAVE_SYS_NDIR_H)
CHECK_INCLUDE_FILE(sys/select.h HAVE_SYS_SELECT_H)
CHECK_INCLUDE_FILE(sys/socket.h HAVE_SYS_SOCKET_H)
CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H)
CHECK_INCLUDE_FILE(sys/timeb.h HAVE_SYS_TIMEB_H)
CHECK_INCLUDE_FILE(sys/time.h HAVE_SYS_TIME_H)
CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
CHECK_INCLUDE_FILE(time.h HAVE_TIME_H)
CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)

INCLUDE(CheckFunctionExists)
CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
CHECK_FUNCTION_EXISTS(printf HAVE_PRINTF)
CHECK_FUNCTION_EXISTS(fprintf HAVE_FPRINTF)
CHECK_FUNCTION_EXISTS(sprintf HAVE_SPRINTF)
CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
CHECK_FUNCTION_EXISTS(vfprintf HAVE_VFPRINTF)
CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
CHECK_FUNCTION_EXISTS(vsprintf HAVE_VSPRINTF)
CHECK_FUNCTION_EXISTS(ftime HAVE_FTIME)
CHECK_FUNCTION_EXISTS(getaddrinfo HAVE_GETADDRINFO)
CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
CHECK_FUNCTION_EXISTS(isinf HAVE_ISINF)
CHECK_FUNCTION_EXISTS(isnan HAVE_ISNAN)
CHECK_FUNCTION_EXISTS(localtime HAVE_LOCALTIME)
CHECK_FUNCTION_EXISTS(signal HAVE_SIGNAL)
CHECK_FUNCTION_EXISTS(sscanf HAVE_SSCANF)
IF(NOT MSVC)
  CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
ELSE(NOT MSVC)
  SET(HAVE_STAT 0)
ENDIF(NOT MSVC)
CHECK_FUNCTION_EXISTS(strdup HAVE_STRDUP)
CHECK_FUNCTION_EXISTS(strndup HAVE_STRNDUP)
CHECK_FUNCTION_EXISTS(strerror HAVE_STRERROR)
CHECK_FUNCTION_EXISTS(strftime HAVE_STRFTIME)

INCLUDE(CheckCSourceCompiles)
SET(va_copy_srcs "
#include <stdarg.h> 
va_list ap1,ap2; 
int main () { 
   va_copy(ap1,ap2); 
   return 0; 
}
")
CHECK_C_SOURCE_COMPILES("${va_copy_srcs}" HAVE_VA_COPY)

CHECK_FUNCTION_EXISTS(__va_copy HAVE___VA_COPY)

INCLUDE(CheckLibraryExists)
CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_STD_DLOPEN)
IF(HAVE_STD_DLOPEN)
  set(DL_LIBRARY "dl")
  SET(HAVE_DLOPEN 1)
ELSE(HAVE_STD_DLOPEN)
  CHECK_LIBRARY_EXISTS(c dlopen "" HAVE_C_DLOPEN)
  IF(HAVE_C_DLOPEN)
    set(DL_LIBRARY "c")
    SET(HAVE_DLOPEN 1)
  ENDIF(HAVE_C_DLOPEN)
ENDIF(HAVE_STD_DLOPEN)


CHECK_LIBRARY_EXISTS(m pow "" HAVE_MATH_LIB)
IF(HAVE_MATH_LIB)
  set(M_LIBRARY "m")
ENDIF(HAVE_MATH_LIB)

SET(WITH_TRIO 0)
IF(CMAKE_THREAD_LIBS_INIT OR MSVC)
  SET(WITH_THREADS 1)
ELSE(CMAKE_THREAD_LIBS_INIT OR MSVC)
  SET(WITH_THREADS 0)
ENDIF(CMAKE_THREAD_LIBS_INIT OR MSVC)
SET(WITH_TREE 1)
SET(WITH_OUTPUT 1)
SET(WITH_PUSH 1)
SET(WITH_READER 1)
SET(WITH_PATTERN 1)
SET(WITH_WRITER 1)
SET(WITH_SAX1 1)
SET(WITH_FTP 0)
SET(WITH_HTTP 0)
SET(WITH_VALID 1)
SET(WITH_HTML 1)
SET(WITH_LEGACY 1)
SET(WITH_C14N 1)
SET(WITH_CATALOG 1)
SET(WITH_DOCB 1)
SET(WITH_XPATH 1)
SET(WITH_XPTR 1)
SET(WITH_XINCLUDE 1)
SET(WITH_ICONV 0)
SET(WITH_ICU 0)
SET(WITH_ISO8859X 1)
SET(WITH_DEBUG 1)
SET(WITH_MEM_DEBUG 0)
SET(WITH_RUN_DEBUG 0)
SET(WITH_REGEXPS 1)
SET(WITH_SCHEMAS 1)
SET(WITH_SCHEMATRON 1)
SET(WITH_MODULES 0)
SET(WITH_ZLIB 0)

SET(LIBXML_VERSION "2.7.8")
SET(LIBXML_VERSION_NUMBER "20708")
SET(LIBXML_VERSION_EXTRA "-BRLCAD")

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/libxml/xmlversion.h.in
  ${CMAKE_CURRENT_BINARY_DIR}/../include/libxml/xmlversion.h)
DISTCLEAN("${CMAKE_CURRENT_BINARY_DIR}/../include/libxml/xmlversion.h")

IF(WIN32)
	configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/libxml/xmlwin32version.h.in
		${CMAKE_CURRENT_BINARY_DIR}/../include/libxml/xmlwin32version.h)
	DISTCLEAN("${CMAKE_CURRENT_BINARY_DIR}/../include/libxml/xmlwin32version.h")
ENDIF(WIN32)

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
	${CMAKE_CURRENT_BINARY_DIR}/../include/libxml/config.h)
DISTCLEAN("${CMAKE_CURRENT_BINARY_DIR}/../include/libxml/config.h")

add_definitions(-DHAVE_CONFIG_H)

include_directories(
  ${CMAKE_CURRENT_BINARY_DIR}/../include
  ${CMAKE_CURRENT_BINARY_DIR}/../include/libxml/
  ${CMAKE_CURRENT_SOURCE_DIR}/include
  /usr/local/include
  )

IF(WITH_TRIO)
  SET(trio_srcs
    src/trio.c
    src/triostr.c
    )
ELSE(WITH_TRIO)
  SET(trio_srcs
    src/trionan.c
    )
ENDIF(WITH_TRIO)

SET(libxml_srcs
  src/DOCBparser.c
  src/HTMLparser.c
  src/HTMLtree.c
  src/SAX.c
  src/SAX2.c
  src/c14n.c
  src/catalog.c
  src/chvalid.c
  src/debugXML.c
  src/dict.c
  src/encoding.c
  src/entities.c
  src/error.c
  src/globals.c
  src/hash.c
  src/list.c
  src/parser.c
  src/parserInternals.c
  src/pattern.c
  src/relaxng.c
  src/schematron.c
  src/threads.c
  src/tree.c
  ${trio_srcs}
  src/uri.c
  src/valid.c
  src/xinclude.c
  src/xlink.c
  src/xlink.c
  src/xmlIO.c
  src/xmlmemory.c
  src/xmlmodule.c
  src/xmlreader.c
  src/xmlregexp.c
  src/xmlsave.c
  src/xmlschemas.c
  src/xmlschemastypes.c
  src/xmlstring.c
  src/xmlwriter.c
  src/xmlunicode.c
  src/xpath.c
  src/xpointer.c
  )

add_library(xml SHARED ${libxml_srcs})
target_link_libraries(xml ${DL_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${M_LIBRARY})
