# ==============================================================================
cmake_minimum_required(VERSION 2.8.6)

# Enable folder grouping of projects in IDEs
set_property(GLOBAL PROPERTY USE_FOLDERS ON)



# ==============================================================================
# For convenience we define the sources as a variable. You can add 
# header files and cpp/c files and CMake will sort them out
# ==============================================================================

list (APPEND INTERNAL_HEADER_FILES
	${XMPROOT_DIR}/source/ExpatAdapter.hpp
	${XMPROOT_DIR}/source/UnicodeConversions.hpp
	${XMPROOT_DIR}/source/UnicodeInlines.incl_cpp
	${XMPROOT_DIR}/source/XMLParserAdapter.hpp
	${XMPROOT_DIR}/build/XMP_BuildInfo.h
	${SOURCE_ROOT}/XMPCore_Impl.hpp
	${SOURCE_ROOT}/XMPIterator.hpp
	${SOURCE_ROOT}/XMPMeta.hpp
	${SOURCE_ROOT}/XMPUtils.hpp
	)
source_group("Header Files\\Private\\XMPCore" FILES ${INTERNAL_HEADER_FILES})

if (INCLUDE_CPP_DOM_SOURCE)
	file (GLOB_RECURSE PRIVATE_XMPCOMMON_HEADERS ${XMPROOT_DIR}/XMPCommon/*.h)
	source_group("Header Files\\Private\\XMPCommon" FILES ${PRIVATE_XMPCOMMON_HEADERS})

	file (GLOB_RECURSE PRIVATE_XMPCOMMON_SOURCES ${XMPROOT_DIR}/XMPCommon/source/*.cpp)
	source_group("Source Files\\Private\\XMPCommon" FILES ${PRIVATE_XMPCOMMON_SOURCES})
endif (INCLUDE_CPP_DOM_SOURCE)

file (GLOB PRIVATE_XMPCORE_HEADERS 
	${XMPROOT_DIR}/XMPCore/*.h 
	${XMPROOT_DIR}/XMPCore/ImplHeaders/*.h 
	${XMPROOT_DIR}/XMPCore/headers/*.h 
	${XMPROOT_DIR}/XMPCore/Interfaces/*.h )
source_group("Header Files\\Private\\XMPCore" FILES ${PRIVATE_XMPCORE_HEADERS})
	
file (GLOB_RECURSE PUBLIC_CLIENTGLUE_HEADER_FILES ${XMPROOT_DIR}/public/include/client-glue/*.*)
list (REMOVE_ITEM PUBLIC_CLIENTGLUE_HEADER_FILES
	${XMPROOT_DIR}/public/include/client-glue/TXMPFiles.incl_cpp
	${XMPROOT_DIR}/public/include/client-glue/WXMPFiles.hpp
	)
source_group("Header Files\\Public\\Client Glue" FILES ${PUBLIC_CLIENTGLUE_HEADER_FILES})

file (GLOB PUBLIC_HEADER_FILES ${XMPROOT_DIR}/public/include/*.*)
list (REMOVE_ITEM PUBLIC_HEADER_FILES
	${XMPROOT_DIR}/public/include/TXMPFiles.hpp
	${XMPROOT_DIR}/public/include/XMP_IO.hpp
	)
source_group("Header Files\\Public" FILES ${PUBLIC_HEADER_FILES})

file (GLOB_RECURSE PUBLIC_XMPCOMMON_HEADERS ${XMPROOT_DIR}/public/include/XMPCommon/*.h )
source_group("Header Files\\Public\\XMPCommon" FILES ${PUBLIC_XMPCOMMON_HEADERS})

file (GLOB_RECURSE PUBLIC_XMPCOMMON_SOURCES ${XMPROOT_DIR}/public/include/XMPCommon/source/*.cpp )
source_group("Source Files\\Public\\XMPCommon" FILES ${PUBLIC_XMPCOMMON_SOURCES})

file (GLOB_RECURSE PUBLIC_XMPCORE_HEADERS ${XMPROOT_DIR}/public/include/XMPCore/*.h)
source_group("Header Files\\Public\\XMPCore" FILES ${PUBLIC_XMPCORE_HEADERS})

file (GLOB_RECURSE PUBLIC_XMPCORE_SOURCES ${XMPROOT_DIR}/public/include/XMPCore/source/*.cpp )
source_group("Source Files\\Public\\XMPCore" FILES ${PUBLIC_XMPCORE_SOURCES})

file (GLOB ABIWRAPPER_SOURCE_FILES ${SOURCE_ROOT}/WXMP*.cpp)
source_group("Source Files\\ABI Wrappers" FILES ${ABIWRAPPER_SOURCE_FILES})

if (INCLUDE_CPP_DOM_SOURCE)
	file (GLOB PRIVATE_XMPCORE_ISOURCE_FILES ${SOURCE_ROOT}/*_I.cpp)
	file (GLOB PRIVATE_XMPCORE_IMPLSOURCE_FILES ${SOURCE_ROOT}/*Impl.cpp)
	list (REMOVE_ITEM PRIVATE_XMPCORE_IMPLSOURCE_FILES ${SOURCE_ROOT}/XMPCore_Impl.cpp)
	source_group("Source Files\\Private\\XMPCore" FILES ${PRIVATE_XMPCORE_ISOURCE_FILES} ${PRIVATE_XMPCORE_IMPLSOURCE_FILES})
else (INCLUDE_CPP_DOM_SOURCE)
	file (GLOB PRIVATE_XMPCORE_IMPLSOURCE_FILES ${SOURCE_ROOT}/CoreObjectFactoryImpl.cpp)
	source_group("Source Files\\Private\\XMPCore" FILES ${PRIVATE_XMPCORE_IMPLSOURCE_FILES})
endif (INCLUDE_CPP_DOM_SOURCE)

#XMP Core classes
file (GLOB CORECLASS_SOURCE_FILES ${SOURCE_ROOT}/XMP*.cpp)
list (REMOVE_ITEM CORECLASS_SOURCE_FILES ${SOURCE_ROOT}/XMPCore_Impl.cpp)
source_group("Source Files\\Core Classes" FILES ${CORECLASS_SOURCE_FILES})

file (GLOB THIRDPARTY_SOURCE_FILES ${TP_ZUID_PATH}/*.cpp)
list (APPEND THIRDPARTY_SOURCE_FILES
	${TP_EXPAT_PATH}/xmlparse.c
	${TP_EXPAT_PATH}/xmlrole.c
	${TP_EXPAT_PATH}/xmltok.c
	)
if(WIN32)
	list (APPEND THIRDPARTY_SOURCE_FILES ${RESOURCE_ROOT}/win/expat_config.h)
else()
	list (APPEND THIRDPARTY_SOURCE_FILES ${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT}/expat_config.h)
endif()
source_group("Source Files\\Third Party" FILES ${THIRDPARTY_SOURCE_FILES})

list (APPEND UTILITY_SOURCE_FILES
	${SOURCE_ROOT}/ExpatAdapter.cpp
	${SOURCE_ROOT}/ParseRDF.cpp
	${SOURCE_ROOT}/XMPCore_Impl.cpp
	${XMPROOT_DIR}/source/UnicodeConversions.cpp
	${XMPROOT_DIR}/source/XML_Node.cpp
	${XMPROOT_DIR}/source/XMP_LibUtils.cpp
	)
source_group("Source Files\\Utilities" FILES ${UTILITY_SOURCE_FILES})

#resource files
if (WIN32)
	file (GLOB RESOURCE_FILES ${RESOURCE_ROOT}/win/*.*)
else ()
	file (GLOB RESOURCE_FILES ${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT}/*.*)
endif()
if(WIN32 AND ${XMP_BUILD_STATIC})
	list(REMOVE_ITEM RESOURCE_FILES ${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT}/${TARGET_NAME}.rc)
endif()
source_group("Resource Files" FILES ${RESOURCE_FILES})

if (WIN32 OR UNIX)
	list(APPEND SOURCE_FILES 
		${PUBLIC_CLIENTGLUE_HEADER_FILES}
		${PUBLIC_HEADER_FILES}
		${INTERNAL_HEADER_FILES}
		${ABIWRAPPER_SOURCE_FILES}
		${ABIWRAPPER_SOURCE_FILES}
		${CORECLASS_SOURCE_FILES}
		${THIRDPARTY_SOURCE_FILES}
		${UTILITY_SOURCE_FILES}
		${PRIVATE_XMPCORE_ISOURCE_FILES}
		${PRIVATE_XMPCORE_IMPLSOURCE_FILES}
		${PRIVATE_XMPCOMMON_HEADERS}
		${PRIVATE_XMPCOMMON_SOURCES}
		${PRIVATE_XMPCORE_HEADERS}
		${PUBLIC_XMPCOMMON_HEADERS}
		${PUBLIC_XMPCOMMON_SOURCES}
		${PUBLIC_XMPCORE_HEADERS}
		${PUBLIC_XMPCORE_SOURCES}
		${RESOURCE_FILES}
	)
endif()

# include directories
include_directories(${XMPROOT_DIR})
include_directories(${XMPROOT_DIR}/public/include)
include_directories(${XMPROOT_DIR}/third-party/expat/public/lib)
include_directories(${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT})
if(UNIX AND NOT APPLE AND NOT ${XMP_BUILD_STATIC})
include_directories(${XMPROOT_DIR}/XMPCore/third-party/uuid/include)
endif()
if (WIN32)
	include_directories(${RESOURCE_ROOT}/win)
else ()
	include_directories(${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT})
endif ()

#additional link directory
link_directories(${OUTPUT_DIR})


# ==============================================================================
# Define what to do, lib, exe, etc 
if (UNIX AND APPLE AND NOT ${XMP_BUILD_STATIC})
	# preprocess Info.plist
	#if (${CMAKE_BUILD_TYPE} strequal "Debug")
	if((${CMAKE_BUILD_TYPE} MATCHES "Debug") OR (${CMAKE_BUILD_TYPE} MATCHES "debug"))
			set (INFO_PLIST_FLAGS "-DDEBUG=1")
	else()
		set (INFO_PLIST_FLAGS "-DNDEBUG=1")
	endif()
	if(NOT APPLE_IOS)
		add_custom_target(${TARGET_NAME}InfoPlist
			COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
			COMMAND if [ $(CONFIGURATION) != Debug ]; then
				${GCCTOOL} -E -P -x c ${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT}/${TARGET_NAME}.plist
				-F${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
				-DPRODUCT_NAME=${TARGET_NAME} -DMAC_ENV=1 -DNDEBUG=1
				-include ${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT}/${TARGET_NAME}PList.h
				-o ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/Info.plist
				\; else
				${GCCTOOL} -E -P -x c ${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT}/${TARGET_NAME}.plist
				-F${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
				-DPRODUCT_NAME=${TARGET_NAME} -DMAC_ENV=1 -DDEBUG=1
				-include ${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT}/${TARGET_NAME}PList.h
				-o ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/Info.plist
				\; fi
			COMMAND rm -f ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/../CMakeFiles/${TARGET_NAME}.dir/Info.plist
			COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/Info.plist ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/../CMakeFiles/${TARGET_NAME}.dir/Info.plist
			COMMENT "Preprocessing Info-plist"
		)
	else()
		add_custom_target(${TARGET_NAME}InfoPlist
			COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
			COMMAND if [ $(CONFIGURATION) != Debug ]; then
				${GCCTOOL} -E -P -x c ${RESOURCE_ROOT}/ios/${TARGET_NAME}.plist
				-F${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
				-DPRODUCT_NAME=${TARGET_NAME} -DIOS_ENV=1 -DNDEBUG=1
				-include ${RESOURCE_ROOT}/ios/${TARGET_NAME}PList.h
				-o ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/Info.plist
				\; else
				${GCCTOOL} -E -P -x c ${RESOURCE_ROOT}/ios/${TARGET_NAME}.plist
				-F${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
				-DPRODUCT_NAME=${TARGET_NAME} -DIOS_ENV=1 -DDEBUG=1
				-include ${RESOURCE_ROOT}/ios/${TARGET_NAME}PList.h
				-o ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/Info.plist
				\; fi
			COMMAND rm -f ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/../CMakeFiles/${TARGET_NAME}.dir/Info.plist
			COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/Info.plist ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/../CMakeFiles/${TARGET_NAME}.dir/Info.plist
			COMMENT "Preprocessing Info-plist"
		)
	endif()
	set(DEPENDENCY_LIST "ALL:${TARGET_NAME}InfoPlist")
else ()
	set(DEPENDENCY_LIST "")
endif()

AddLibraryAndDependencies(${TARGET_NAME} ${XMP_BUILD_STATIC} YES "SHARED" SOURCE_FILES DEPENDENCY_LIST)

#set the output name
set_target_properties(${TARGET_NAME} PROPERTIES OUTPUT_NAME  ${XMPCORE_LIB})

# ==============================================================================
# Link dependencies
set(FRAMEWORK_LIST "ALL:CoreFoundation" "Mac:CoreServices")
AddMacFramework(${TARGET_NAME} FRAMEWORK_LIST)


if(WIN32)
	SetWinLinkFlags(${TARGET_NAME} "rpcrt4.lib" "${XMPCORE_LIB}")
else(WIN32)
	if(UNIX AND NOT APPLE)
		SetWinLinkFlags(${TARGET_NAME} "-Xlinker --version-script -Xlinker \"${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT}/${TARGET_NAME}.exp\"" "")
	else()
		if(APPLE_IOS AND NOT XMP_BUILD_STATIC)
			set_target_properties(${TARGET_NAME} PROPERTIES XCODE_ATTRIBUTE_DYLIB_INSTALL_NAME_BASE "@rpath")
			set_target_properties(${TARGET_NAME} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.adobe.Adobe${TARGET_NAME}")
		endif()
		set_target_properties(${TARGET_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH ON INSTALL_NAME_DIR "@executable_path/../Frameworks")
		SetWinLinkFlags(${TARGET_NAME} "-unexported_symbols_list \"${RESOURCE_ROOT}/${XMP_PLATFORM_SHORT}/XMPCore.unexp\"" "${XMPCORE_LIB}")
		set_target_properties(${TARGET_NAME} PROPERTIES XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "YES")
	endif()
endif()

# ==============================================================================
# Define output
SetOutputPath(${OUTPUT_DIR} 0)

# ==============================================================================
# Post build
# ==============================================================================
if(UNIX)
	if (NOT APPLE)
		if (${XMP_BUILD_STATIC})
			add_custom_command (TARGET ${TARGET_NAME}
				POST_BUILD
				COMMAND  mv ${OUTPUT_DIR}/lib${XMPCORE_LIB}.a  ${OUTPUT_DIR}/${XMPCORE_LIB}.ar
			)
		else()
			if((${CMAKE_BUILD_TYPE} MATCHES "Debug") OR (${CMAKE_BUILD_TYPE} MATCHES "debug") )
				add_custom_command (TARGET ${TARGET_NAME}
					POST_BUILD
					COMMAND ls -l ${OUTPUT_DIR}/lib${XMPCORE_LIB}.so
				)
			else()
				add_custom_command (TARGET ${TARGET_NAME}
					POST_BUILD
					COMMAND strip ${OUTPUT_DIR}/lib${XMPCORE_LIB}.so
					COMMAND ls -l ${OUTPUT_DIR}/lib${XMPCORE_LIB}.so
				)
			endif()
		endif()
	endif()
else()
	set_target_properties(${TARGET_NAME} PROPERTIES PROJECT_LABEL ${PROJECT_LABEL_STR})	
endif()

message (STATUS "===========================================================================")
message (STATUS " ${PROJECT_NAME} ")
message (STATUS "===========================================================================")
message (STATUS " OUTPUT_DIR = ${OUTPUT_DIR}")