# CMakeLists.txt for CCM (climate calculation module)

CMAKE_MINIMUM_REQUIRED( VERSION 2.6 )

SET( CMAKE_VERBOSE_MAKEFILE ON )

PROJECT( ticpp )

# Options
OPTION( TICPP_INSTALL_DOC "Builds and installs the CCM API documentation with doxygen." OFF )
OPTION( TICPP_USE_CMAKE_INSTALL_PREFIX "Only required for system wide install. Only for release purposes. Use with care." OFF )
OPTION( TICPP_INSTALL_EXAMPLES "Builds and installs the TICPP API examples. USE WITH CARE! CMAKE BUGREPORT PENDING!" OFF )

SET( TICPP_BUILD_TARGETS "static" CACHE STRING "Builds different targets: all, shared, static")
SET( TICPP_GENERIC_DLL_VERSION "1.0" CACHE STRING "Major API version.")
SET( TICPP_SOVERSION "0" CACHE STRING "Minor SO verion for shared library support.")

MARK_AS_ADVANCED(CMAKE_INSTALL_PREFIX)


#
# project relative path setup
#
SET ( SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../src" CACHE INTERNAL "SOURCE DIR LOCALISED" FORCE )
SET ( EXAMPLES_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../src/examples/" CACHE INTERNAL "EXAMPLE SOURCE DIR LOCALISED" FORCE ) 
SET ( DOXY_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/../doc/dox" CACHE INTERNAL "TICPP doxygen file, localised" FORCE )


# Sources
SET( TICPP_SRCS
    ${SOURCE_DIR}/ticpp.cpp
    ${SOURCE_DIR}/tinystr.cpp
    ${SOURCE_DIR}/tinyxml.cpp
    ${SOURCE_DIR}/tinyxmlerror.cpp
    ${SOURCE_DIR}/tinyxmlparser.cpp
)

#SET( TICPP_EXAMPLES
#)


################################################################
#
# parameter setup
#
################################################################

# uncomment the next line to get really detailed warnings

ADD_DEFINITIONS( -DTIXML_USE_STL )

if ( UNIX )
  ADD_DEFINITIONS( -Wall )
endif( UNIX )


# some debug output
if (CMAKE_DEBUG)
  MESSAGE("PROJECT_BINARY_DIR SET TO :  ${PROJECT_BINARY_DIR} \n")
  MESSAGE("PROJECT_NAME SET TO :  ${PROJECT_NAME} \n")
  MESSAGE("PROJECT_SOURCE_DIR SET TO :  ${PROJECT_SOURCE_DIR} \n")
  MESSAGE("TICPP_SOURCE_DIR SET TO :  ${TICPP_SOURCE_DIR} \n")
  MESSAGE("TICPP_BINARY_DIR SET TO :  ${TICPP_BINARY_DIR} \n")
  MESSAGE("CMAKE_SOURCE_DIR SET TO :  ${CMAKE_SOURCE_DIR} \n")
  MESSAGE("CMAKE_CACHEFILE_DIR SET TO :  ${CMAKE_CACHEFILE_DIR} \n")
  MESSAGE("CMAKE_BINARY_DIR SET TO :  ${CMAKE_BINARY_DIR} \n")
  MESSAGE("CMAKE_CURRENT_BINARY_DIR SET TO :  ${CMAKE_CURRENT_BINARY_DIR} \n")
  MESSAGE("CMAKE_CFG_INTDIR SET TO :  ${CMAKE_CFG_INTDIR} \n")
  MESSAGE("CMAKE_SOURCE_DIR SET TO :  ${CMAKE_SOURCE_DIR} \n")
  MESSAGE("CMAKE_CURRENT_SOURCE_DIR SET TO :  ${CMAKE_CURRENT_SOURCE_DIR} \n")
  MESSAGE("CMAKE_HOME_DIRECTORY SET TO :  ${CMAKE_HOME_DIRECTORY} \n")
endif (CMAKE_DEBUG)


################################################################
#
# try to create output dir no problem if it does exist yet
#
################################################################
if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../lib )
  MAKE_DIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/../../lib)
endif ( NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../lib )

if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../include/${PROJECT_NAME} )
  MAKE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../../include/${PROJECT_NAME} )
endif ( NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../include/${PROJECT_NAME} )


#############################################################
#
# static libs
#
#############################################################
if ( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "static" )

  add_library( ${PROJECT_NAME} STATIC ${TICPP_SRCS} ) #EXCLUDE_FROM_ALL ${TICPP_SRCS} )

  if ( TICPP_USE_CMAKE_INSTALL_PREFIX )

    INSTALL(TARGETS ${PROJECT_NAME}
      RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
      ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
      )

  else ( TICPP_USE_CMAKE_INSTALL_PREFIX )

    INSTALL(TARGETS ${PROJECT_NAME}
      RUNTIME DESTINATION ${SOURCE_DIR}/../../bin
      ARCHIVE DESTINATION ${SOURCE_DIR}/../../lib
      )

  endif ( TICPP_USE_CMAKE_INSTALL_PREFIX )


endif( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "static" )



#############################################################
#
# shared target handling
#
#############################################################

if ( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "shared" )

  ADD_LIBRARY( ${PROJECT_NAME}_SHARED SHARED ${TICPP_SRCS} ) #EXCLUDE_FROM_ALL ${TICPP_SRCS} )

  # set so version for ibk lib
  # this is supported on linux unix irix
  IF( WIN32 )
    SET_TARGET_PROPERTIES( ${PROJECT_NAME}_SHARED PROPERTIES OUTPUT_NAME "TICPP_SHARED-${TICPP_SOVERSION}" VERSION ${TICPP_GENERIC_DLL_VERSION} )
  ELSE( WIN32 )
    SET_TARGET_PROPERTIES( ${PROJECT_NAME}_SHARED PROPERTIES VERSION ${TICPP_GENERIC_DLL_VERSION} SOVERSION ${TICPP_SOVERSION} )
  ENDIF( WIN32 )

  if ( TICPP_USE_CMAKE_INSTALL_PREFIX )

    INSTALL(TARGETS ${PROJECT_NAME}_SHARED
      RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
      LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
      )

  else ( TICPP_USE_CMAKE_INSTALL_PREFIX )

    INSTALL(TARGETS ${PROJECT_NAME}_SHARED
      RUNTIME DESTINATION ${SOURCE_DIR}/../../bin
      LIBRARY DESTINATION ${SOURCE_DIR}/../../lib
      )

  endif ( TICPP_USE_CMAKE_INSTALL_PREFIX )

endif ( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "shared" )


#############################################################
#
# install header
#
#############################################################

FILE(GLOB files "${SOURCE_DIR}/*.h")

# release install prefix
# this is linux only at the moment
IF ( TICPP_USE_CMAKE_INSTALL_PREFIX )

	INSTALL(FILES ${files}
		DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}
		COMPONENT header)

ELSE ( TICPP_USE_CMAKE_INSTALL_PREFIX )

	INSTALL(FILES ${files}
		DESTINATION ${SOURCE_DIR}/../../include/${PROJECT_NAME}
		COMPONENT header)

ENDIF ( TICPP_USE_CMAKE_INSTALL_PREFIX )

ADD_CUSTOM_TARGET(install_header
	COMMAND ${CMAKE_COMMAND} -DCOMPONENT:STRING=header -P ${CMAKE_BINARY_DIR}/cmake_install.cmake 
	COMMENT "Installing header."
	VERBATIM
)


#############################################################
#
# examples
#
#############################################################
if ( TICPP_INSTALL_EXAMPLES )

INCLUDE_DIRECTORIES( ${SOURCE_DIR}/examples/ )
LINK_DIRECTORIES( ${CMAKE_BINARY_DIR} )

IF ( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "static" )

#    SET(CMAKE_CXX_LINK_FLAGS "-static")
    set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS)       # remove -Wl,-Bdynamic
    set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
#     set(CMAKE_SHARED_LIBRARY_C_FLAGS)         # remove -fPIC
#     set(CMAKE_SHARED_LIBRARY_CXX_FLAGS)
    set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)    # remove -rdynamic
    set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS)

	IF (NOT WIN32)
		SET(CMAKE_EXE_LINKER_FLAGS "-static")
	ENDIF (NOT WIN32)

ELSE ( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "static" )

ENDIF ( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "static" )

# generate build targets for all examples in example source dir
FOREACH(EXAMPLE_SRC ${TICPP_EXAMPLES} )

	# get example file name
	GET_FILENAME_COMPONENT( EX ${EXAMPLE_SRC} NAME_WE )
	
	# add example file name to list
	SET (ALL_EXAMPLES ${ALL_EXAMPLES} ${EX})
	
	IF (WIN32)
		ADD_EXECUTABLE( ${EX} WIN32 EXCLUDE_FROM_ALL ${EXAMPLE_SRC} )
		# add executable to list of installable examples
		# for win32 add the .exe extension
		SET (INSTALL_EXAMPLES ${INSTALL_EXAMPLES} ${CMAKE_BINARY_DIR}/${EX}.exe)
	ENDIF (WIN32)

	IF (UNIX)
		IF (APPLE)
			ADD_EXECUTABLE( ${EX} MACOSX_BUNDLE EXCLUDE_FROM_ALL ${EXAMPLE_SRC} )
		ELSE (APPLE)
			ADD_EXECUTABLE(	${EX} EXCLUDE_FROM_ALL ${EXAMPLE_SRC} )
		ENDIF (APPLE) 
		# add executable to list of installable examples
		SET (INSTALL_EXAMPLES ${INSTALL_EXAMPLES} ${CMAKE_BINARY_DIR}/${EX})
	ENDIF (UNIX)


	# add dependencies for linked libs, static linking is default case
	IF ( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "static" )

		# static linking
		TARGET_LINK_LIBRARIES( ${EX} ${PROJECT_NAME} )
		# only search for static libraries (to prevent linking against dynamic libs in same search path)
		SET_TARGET_PROPERTIES( ${EX} PROPERTIES LINK_SEARCH_END_STATIC ON)

	ELSEIF ( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "static" )

		# dynamic linking, links to dynamic libs by default
		TARGET_LINK_LIBRARIES( ${EX} ${PROJECT_NAME}_SHARED )

	ENDIF ( TICPP_BUILD_TARGETS STREQUAL "all" OR TICPP_BUILD_TARGETS STREQUAL "static" )

ENDFOREACH(EXAMPLE_SRC)



# installation
IF ( TICPP_USE_CMAKE_INSTALL_PREFIX )
	INSTALL(PROGRAMS ${INSTALL_EXAMPLES}
		DESTINATION ${CMAKE_INSTALL_PREFIX}/bin/examples
		COMPONENT examples-TICPP)
ELSE ( TICPP_USE_CMAKE_INSTALL_PREFIX )
	INSTALL(PROGRAMS ${INSTALL_EXAMPLES}
		DESTINATION ${SOURCE_DIR}/../../usr/local/bin/examples
		COMPONENT examples-TICPP)
ENDIF ( TICPP_USE_CMAKE_INSTALL_PREFIX )


# unified installer
ADD_CUSTOM_TARGET(install_examples
	COMMAND ${CMAKE_COMMAND} -DCOMPONENT:STRING=examples-TICPP -P ${CMAKE_BINARY_DIR}/cmake_install.cmake 
	COMMENT "Installing ${PROJECT_NAME} library examples."
	VERBATIM
)

# unified make target
ADD_CUSTOM_TARGET( examples )
ADD_DEPENDENCIES( examples ${ALL_EXAMPLES} )
ADD_DEPENDENCIES( install_examples examples )


endif ( TICPP_INSTALL_EXAMPLES )


#############################################################
#
# Documentation
#
#############################################################

# create and install various doc targets
#
IF (TICPP_INSTALL_DOC)

# Need Doxygen to generate documentation
FIND_PACKAGE(Doxygen)

	IF (DOXYGEN_FOUND)

		# click+jump in Emacs and Visual Studio
		IF    (CMAKE_BUILD_TOOL MATCHES "(msdev|devenv)")
			SET(DOXY_WARN_FORMAT "\"$file($line) : $text \"")
		ELSE  (CMAKE_BUILD_TOOL MATCHES "(msdev|devenv)")
			SET(DOXY_WARN_FORMAT "\"$file:$line: $text \"")
		ENDIF (CMAKE_BUILD_TOOL MATCHES "(msdev|devenv)")

		# check optional packages for doxygen
		FIND_PACKAGE(LATEX)
		IF    (NOT LATEX_COMPILER)
			MESSAGE(STATUS "latex command LATEX_COMPILER not found but usually required. You will probably get warnings and user interaction on doxy run.")
		ENDIF (NOT LATEX_COMPILER)
		IF    (NOT MAKEINDEX_COMPILER)
			MESSAGE(STATUS "makeindex command MAKEINDEX_COMPILER not found but usually required.")
		ENDIF (NOT MAKEINDEX_COMPILER)
		IF    (NOT DVIPS_CONVERTER)
			MESSAGE(STATUS "dvips command DVIPS_CONVERTER not found but usually required.")
		ENDIF (NOT DVIPS_CONVERTER)
		IF    (WIN32)
			FIND_PACKAGE(HTMLHelp)
			IF    (NOT HTML_HELP_COMPILER)
				MESSAGE(STATUS "htmlhelp command not found but usually required. You will probably get warnings and user interaction on doxy run.")
			ENDIF (NOT HTML_HELP_COMPILER)
		ENDIF (WIN32)

		# Build target to generate all documentation
		ADD_CUSTOM_TARGET(doc ${DOXYGEN_EXECUTABLE} ${DOXY_CONFIG})

		IF    (WIN32)
			IF   (HTML_HELP_COMPILER)       
				
				MESSAGE(STATUS "htmlhelp not ready and tested. TODO when build system is test on windows.")
				
				#       SET (TMP "${CMAKE_CURRENT_SOURCE_DIR}\\..\\doc\\html\\index.hhp")
				#       STRING(REGEX REPLACE "[/]" "\\\\" HHP_FILE ${TMP} )
				
				#       ADD_CUSTOM_TARGET(winhelp ${HTML_HELP_COMPILER} ${HHP_FILE})
				#       ADD_DEPENDENCIES (winhelp doc)
				
			ENDIF(HTML_HELP_COMPILER)      
		ENDIF (WIN32)

		# Install target for 'html' documentation
		ADD_CUSTOM_TARGET(install_html
			COMMAND ${CMAKE_COMMAND} -DCOMPONENT:STRING=doxy-html -P ${CMAKE_BINARY_DIR}/cmake_install.cmake 
			COMMENT "Installing doxygen html documentation."
			VERBATIM
		)

		# Install target for 'man' documentation
		ADD_CUSTOM_TARGET(install_man
			COMMAND ${CMAKE_COMMAND} -DCOMPONENT:STRING=doxy-man -P ${CMAKE_BINARY_DIR}/cmake_install.cmake 
			COMMENT "Installing doxygen man documentation."
			VERBATIM
		)

		# Master install target for all documentation
		ADD_CUSTOM_TARGET( install_doc )
		ADD_DEPENDENCIES( install_doc install_man install_html )
		ADD_DEPENDENCIES( install_man doc )
		ADD_DEPENDENCIES( install_html doc )

		# 'html' install target 
		IF (WIN32)
			IF ( TICPP_USE_CMAKE_INSTALL_PREFIX )
				SET(HTML_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/doc/${PROJECT_NAME} )
			ELSE ( TICPP_USE_CMAKE_INSTALL_PREFIX )
				SET(HTML_INSTALL_PATH ${SOURCE_DIR}/../../usr/share/doc/${PROJECT_NAME} )
			ENDIF ( TICPP_USE_CMAKE_INSTALL_PREFIX )
		ELSE (WIN32)
			IF ( TICPP_USE_CMAKE_INSTALL_PREFIX )
				SET(HTML_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME} )
			ELSE ( TICPP_USE_CMAKE_INSTALL_PREFIX )
				SET(HTML_INSTALL_PATH ${SOURCE_DIR}/../../usr/share/doc/${PROJECT_NAME} )
			ENDIF ( TICPP_USE_CMAKE_INSTALL_PREFIX )
		ENDIF (WIN32)

		# create install target	
		INSTALL(DIRECTORY 	${CMAKE_BINARY_DIR}/html/
				DESTINATION ${HTML_INSTALL_PATH}
				COMPONENT 	doxy-html
		)

		# 'man' install target, not relevant on windows
		IF (NOT WIN32)
			IF ( TICPP_USE_CMAKE_INSTALL_PREFIX )
				SET(MAN_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/man )
			ELSE ( TICPP_USE_CMAKE_INSTALL_PREFIX )
				SET(MAN_INSTALL_PATH ${SOURCE_DIR}/../../usr/local/man )
			ENDIF ( TICPP_USE_CMAKE_INSTALL_PREFIX )

			# copy the directory ${CMAKE_BINARY_DIR}/man into the DESTINATION path
			INSTALL(DIRECTORY 	${CMAKE_BINARY_DIR}/man/
					DESTINATION ${MAN_INSTALL_PATH}
					COMPONENT 	doxy-man
			)
		ENDIF (NOT WIN32)


	ENDIF (DOXYGEN_FOUND)

ENDIF(TICPP_INSTALL_DOC)
