# -*- cmake -*-

project(dullahan)

cmake_minimum_required(VERSION 3.5)

if (CEF_BASE_DIR STREQUAL "")
    MESSAGE("CEF_BASE_DIR not set" FATAL)
endif()

if (ARCH STREQUAL "")
    MESSAGE("ARCH not set" FATAL)
endif()

# For all OSes, the boost header files used to compile the viewer must be
# present in packages/include.
set(PACKAGES_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../packages/include")
# Not really used any more (we do not use the boost libraries for Dullahan, and
# under Linux, I could not find a way to get the CEF wrapper library to link
# against a custom glib (so it always links against the build system glib and,
# as a result, so should our dullahan library...).
set(PACKAGES_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../packages/lib/release")

set(CEF_INCLUDE_DIR ${CEF_BASE_DIR}/include)
include_directories(
	${CEF_BASE_DIR}
	${CEF_BASE_DIR}/include
	${CEF_BASE_DIR}/include/cef/include
	${PACKAGES_INCLUDE_DIR}
	${CMAKE_CURRENT_SOURCE_DIR}
)

if ("${CMAKE_CURRENT_SOURCE_DIR}/dullahan_version.h.in" IS_NEWER_THAN "${CMAKE_CURRENT_SOURCE_DIR}/dullahan_version.h")
	# Parse CEF version header and process into dullahan header
	file(STRINGS ${CEF_INCLUDE_DIR}/cef_version.h CEF_VERSION_STR REGEX "\#define CEF_VERSION ")
	file(STRINGS ${CEF_INCLUDE_DIR}/cef_version.h CHROME_VERSION_MAJOR_STR REGEX "\#define CHROME_VERSION_MAJOR ")
	file(STRINGS ${CEF_INCLUDE_DIR}/cef_version.h CHROME_VERSION_MINOR_STR REGEX "\#define CHROME_VERSION_MINOR ")
	file(STRINGS ${CEF_INCLUDE_DIR}/cef_version.h CHROME_VERSION_BUILD_STR REGEX "\#define CHROME_VERSION_BUILD ")
	file(STRINGS ${CEF_INCLUDE_DIR}/cef_version.h CHROME_VERSION_PATCH_STR REGEX "\#define CHROME_VERSION_PATCH ")
	string(TIMESTAMP BUILDNUMBER "#define DULLAHAN_VERSION_BUILD %Y%m%d")
	configure_file (
	  "${CMAKE_CURRENT_SOURCE_DIR}/dullahan_version.h.in"
	  "${CMAKE_CURRENT_SOURCE_DIR}/dullahan_version.h"
	)
endif ()

set(dullahan_SOURCE_FILES
	dullahan.cpp
	dullahan_browser_client.cpp
	dullahan_callback_manager.cpp
	dullahan_impl.cpp
	dullahan_impl_mouse.cpp
	dullahan_render_handler.cpp
	dullahan_version.h.in
)

if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
	list(APPEND dullahan_SOURCE_FILES dullahan_impl_lin.cpp)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
	list(APPEND dullahan_SOURCE_FILES dullahan_impl_win.cpp)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
	list(APPEND dullahan_SOURCE_FILES dullahan_impl_mac.mm)
endif ()

set(dullahan_HEADER_FILES
	CMakeLists.txt

	dullahan.h
	dullahan_browser_client.h
	dullahan_callback_manager.h
	dullahan_debug.h
	dullahan_impl.h
	dullahan_version.h
	dullahan_render_handler.h
)

set_source_files_properties(${dullahan_HEADER_FILES}
							PROPERTIES HEADER_FILE_ONLY TRUE)

list(APPEND dullahan_SOURCE_FILES ${dullahan_HEADER_FILES})

if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
	add_definitions(-D_REENTRANT)
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARCH} -std=c++17 -fPIC -O2 -fomit-frame-pointer")
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARCH} -fPIC -O2 -fomit-frame-pointer")
	set(CMAKE_CXX_LINK_FLAGS "-Wl,--exclude-libs,ALL")
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
	set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /std:c++17 /MD /DCEF_RUNTIME_LIBRARY_FLAG=/MD /DNDEBUG /D_NDEBUG /DUSE_SANDBOX=OFF")
	set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /std:c++17 /MDd /DCEF_RUNTIME_LIBRARY_FLAG=/MD /D_HAS_ITERATOR_DEBUGGING=0 /DUSE_SANDBOX=OFF")
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
	set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++17 -xobjective-c++ -stdlib=libc++")
	set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++17 -xobjective-c++ -stdlib=libc++")
    set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "")
	set(CMAKE_OSX_DEPLOYMENT_TARGET 10.8)
endif ()

# Dullahan library

add_library (dullahan STATIC ${dullahan_SOURCE_FILES})

if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
	# Depending on the CEF package layout (Spotify's, LL's or ours), we need
	# various library directories...
	link_directories(
		${CMAKE_CURRENT_SOURCE_DIR}
		${CEF_BASE_DIR}/Release
		${CEF_BASE_DIR}/build/libcef_dll_wrapper
		${PACKAGES_LIB_DIR}
	)
	target_link_libraries(dullahan
		cef_dll_wrapper
		cef
	)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
	# Depending on the CEF package layout (Spotify's, LL's or ours), we need
	# various library directories...
	link_directories(
		${CMAKE_CURRENT_SOURCE_DIR}
		${CEF_BASE_DIR}/Release
		${CEF_BASE_DIR}/lib/release
		${CEF_BASE_DIR}/libcef_dll_wrapper/Release
		${PACKAGES_LIB_DIR}
	)
	target_link_libraries(dullahan
		libcef_dll_wrapper.lib
 		libcef.lib
	)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
	# This is for LL's package layout
	find_library(CEF_DLL_LIBRARY_RELEASE
		NAMES libcef_dll_wrapper.a
		PATHS ${CEF_BASE_DIR}/build/libcef_dll_wrapper/Release
	)
	set(CEF_DLL_LIBRARY optimized ${CEF_DLL_LIBRARY_RELEASE})

	find_library(CEF_FRAMEWORK_RELEASE
		NAMES "Chromium Embedded Framework"
		PATHS ${CEF_BASE_DIR}/Release
	)
	set(CEF_FRAMEWORK optimized ${CEF_FRAMEWORK_RELEASE})
endif ()

# Dullahan host executable

set(dullahan_host_SOURCE_FILES
	host/dullahan_host.cpp
)

if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
	add_executable(dullahan_host ${dullahan_host_SOURCE_FILES})
	target_link_libraries(dullahan_host
		cef_dll_wrapper
 		cef
        X11
 		pthread
	)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
	add_executable(dullahan_host ${dullahan_host_SOURCE_FILES})
	target_link_libraries(dullahan_host
		libcef_dll_wrapper.lib
 		libcef.lib
	)
	set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS")
	add_custom_command(
		TARGET dullahan_host POST_BUILD
		COMMAND "mt.exe" -manifest \"${CMAKE_CURRENT_SOURCE_DIR}\\host\\compatibility.manifest\" -outputresource:"$(TargetDir)$(TargetFileName)"\;\#1
		COMMENT "Adding custom manifest..."
	)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
	add_executable(DullahanHelper
		MACOSX_BUNDLE
		${dullahan_host_SOURCE_FILES}
	)
	target_link_libraries(DullahanHelper
		${CEF_DLL_LIBRARY}
        ${CEF_FRAMEWORK}
	)
	# Info.plist.in template adds a new key called "LSUIElement" with value
	# "true" to surpress the appearance of the DullahanHelper app icon in the
	# dock
	set_target_properties(DullahanHelper PROPERTIES
		MACOSX_BUNDLE_BUNDLE_NAME "DullahanHelper"
		MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/host/Info.plist.in")
endif ()
