# cURL/libcurl CMake script
# by Sukender (Benoit Neil), from OSG CMake script

# TODO:
# EVERYTHING!!! This is an alpha script!
# Check on Linux, Mac
# Add documentation subproject

CMAKE_MINIMUM_REQUIRED(VERSION 2.6.2 FATAL_ERROR)

project( CURL )
SET(CURL_MAJOR_VERSION 0)
SET(CURL_MINOR_VERSION 2)
SET(CURL_PATCH_VERSION 2)

SET(CURL_VERSION ${CURL_MAJOR_VERSION}.${CURL_MINOR_VERSION}.${CURL_PATCH_VERSION})


# We have some custom .cmake scripts not in the official distribution.
SET(CMAKE_MODULE_PATH "${CURL_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")

IF(UNIX)
	# Some Unicies need explicit linkage to the Math library or the build fails.
	FIND_LIBRARY(MATH_LIBRARY m)
ENDIF()

IF(WIN32 AND NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
	SET(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} wsock32.lib bufferoverflowu.lib ws2_32.lib wldap32.lib" CACHE STRING "" FORCE)
	SET(CMAKE_C_STANDARD_LIBRARIES   "${CMAKE_C_STANDARD_LIBRARIES} wsock32.lib bufferoverflowu.lib ws2_32.lib wldap32.lib"   CACHE STRING "" FORCE)
ENDIF()

OPTION(CURL_ZLIB "Set to ON to enable building cURL with zlib support." ON)
IF(CURL_ZLIB AND CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
	FIND_PACKAGE(ZLIB)
ENDIF()

OPTION(CURL_SSL "Set to ON to enable building cURL with SSL support." ON)
IF(CURL_SSL AND CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
	FIND_PACKAGE(OpenSSL)
ENDIF()

OPTION(BUILD_CURL_EXE "Set to ON to build cURL executable." ON)
OPTION(BUILD_CURL_TESTS "Set to ON to build cURL tests." ON)
OPTION(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)

IF(MSVC)
	OPTION(BUILD_RELEASE_DEBUG_DIRS "Set OFF to build each configuration to a separate directory" OFF)
	MARK_AS_ADVANCED(BUILD_RELEASE_DEBUG_DIRS)
ENDIF()

IF(WIN32)
	OPTION(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON)
	MARK_AS_ADVANCED(CURL_WINDOWS_SSPI)
ENDIF()


# Make the base headers visible to everything
IF(NOT ${PROJECT_BINARY_DIR} EQUAL ${PROJECT_SOURCE_DIR})
   INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR}/include)
ENDIF()

INCLUDE_DIRECTORIES(
    ${CURL_SOURCE_DIR}/include
)


################################################################################
# Create bin and lib directories if required

SET(OUTPUT_BINDIR ${PROJECT_BINARY_DIR}/bin)
MAKE_DIRECTORY(${OUTPUT_BINDIR})
SET(OUTPUT_LIBDIR ${PROJECT_BINARY_DIR}/lib)
MAKE_DIRECTORY(${OUTPUT_LIBDIR})

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_LIBDIR})
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_BINDIR})
IF(WIN32)
	SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_BINDIR})
ELSE()
	SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_LIBDIR})
ENDIF()

#MARK_AS_ADVANCED(...)

################################################################################
# Installation stuff

SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually d on windows")

# Adds includes for a library found with FIND_PACKAGE
MACRO(INCLUDE_WITH_VARIABLES TRGTNAME)
	FOREACH(varname ${ARGN})
		IF(${varname}_INCLUDE_DIR)
			INCLUDE_DIRECTORIES("${${varname}_INCLUDE_DIR}")
		ELSEIF(${varname} MATCHES "Boost_.+")		# For Boost
			IF(EXISTS ${Boost_INCLUDE_DIR})		# It doesn't work with IF(${Boost_INCLUDE_DIR}) in CMake 2.6.2!!! Very strange as the variable is not empty
				INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIR}")
			# ELSE()
				# MESSAGE(SEND_ERROR "Missing 'Boost_INCLUDE_DIR' variable")
			ENDIF()
		# ELSE()
			# MESSAGE(SEND_ERROR "Missing '${varname}_INCLUDE_DIR' variable")
		ENDIF()
	ENDFOREACH()
ENDMACRO()

# Adds includes and link properties for a library found with FIND_PACKAGE
MACRO(LINK_WITH_VARIABLES TRGTNAME)
	INCLUDE_WITH_VARIABLES(${ARGV})
	FOREACH(varname ${ARGN})
		IF(${varname}_LIBRARY MATCHES "optimized;.*;debug;.*")
			# Complete rule defined (Mainly for Boost)
			# Actually Boost libraries support auto-linking for some compilers (Including MSVC). However, adding twice the dependency is not an issue.
			TARGET_LINK_LIBRARIES(${TRGTNAME} ${${varname}_LIBRARY})
		ELSE()
			# Otherwise...
			IF(${varname}_LIBRARY_DEBUG)
				#TARGET_LINK_LIBRARIES(${TRGTNAME} optimized "${${varname}_LIBRARY}" debug "${${varname}_LIBRARY_DEBUG}")
				FOREACH(CUR_LIB ${${varname}_LIBRARY})
					TARGET_LINK_LIBRARIES(${TRGTNAME} optimized ${CUR_LIB})
				ENDFOREACH()
				FOREACH(CUR_LIB ${${varname}_LIBRARY_DEBUG})
					TARGET_LINK_LIBRARIES(${TRGTNAME} debug ${CUR_LIB})
				ENDFOREACH()
			ELSE()
				TARGET_LINK_LIBRARIES(${TRGTNAME} ${${varname}_LIBRARY} )
			ENDIF()
		ENDIF()
	ENDFOREACH()
ENDMACRO()

################################################################################
# Set Config file

OPTION(HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF)
MARK_AS_ADVANCED(HTTP_ONLY)
OPTION(CURL_DISABLE_FTP "disables FTP" OFF)
MARK_AS_ADVANCED(CURL_DISABLE_FTP)
OPTION(CURL_DISABLE_LDAP "disables LDAP" OFF)
MARK_AS_ADVANCED(CURL_DISABLE_LDAP)
OPTION(CURL_DISABLE_TELNET "disables Telnet" OFF)
MARK_AS_ADVANCED(CURL_DISABLE_TELNET)
OPTION(CURL_DISABLE_DICT "disables DICT" OFF)
MARK_AS_ADVANCED(CURL_DISABLE_DICT)
OPTION(CURL_DISABLE_FILE "disables FILE" OFF)
MARK_AS_ADVANCED(CURL_DISABLE_FILE)
OPTION(CURL_DISABLE_TFTP "disables TFTP" OFF)
MARK_AS_ADVANCED(CURL_DISABLE_TFTP)
OPTION(CURL_DISABLE_HTTP "disables HTTP" OFF)
MARK_AS_ADVANCED(CURL_DISABLE_HTTP)

IF(HTTP_ONLY)
	SET(CURL_DISABLE_FTP ON)
	SET(CURL_DISABLE_LDAP ON)
	SET(CURL_DISABLE_TELNET ON)
	SET(CURL_DISABLE_DICT ON)
	SET(CURL_DISABLE_FILE ON)
	SET(CURL_DISABLE_TFTP ON)
ENDIF()

# SET(CURL_CONFIG_HEADER "${PROJECT_BINARY_DIR}/lib/config.h")
# CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/lib/config.in" "${CURL_CONFIG_HEADER}")


ADD_SUBDIRECTORY(lib)

IF(BUILD_CURL_EXE)
	ADD_SUBDIRECTORY(src)
ENDIF()

IF(BUILD_CURL_TESTS)
	ADD_SUBDIRECTORY(tests)
ENDIF()


# This needs to be run very last so other parts of the scripts can take advantage of this.
IF(NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
    SET(CURL_CONFIG_HAS_BEEN_RUN_BEFORE 1 CACHE INTERNAL "Flag to track whether this is the first time running CMake or if CMake has been configured before")
ENDIF()
