# ----------------------------------
# testing CMake script by ideasman42
#
# TODO:
# - explicitly include source, remove GLOB
# - split into multiple files
# - split into multiple libraries (linked into one exe)
# - remove hard coded defines
# - include find modules for OpenEXR, LibTiff
# - make options for SDL viewer
# - make options for image formats

# Example use:
# 
#   cmake -GNinja -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang ../povray
#

# temp hack, until we have real config.h
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include)
file(WRITE ${CMAKE_BINARY_DIR}/include/config.h "")

cmake_minimum_required(VERSION 2.8)

if(NOT EXECUTABLE_OUTPUT_PATH)
	set(FIRST_RUN "TRUE")
endif()


# avoid having empty buildtype
set(CMAKE_BUILD_TYPE_INIT "Release")

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE INTERNAL "" FORCE)

set(POVRAY_LINK_LIBS)



#-----------------------------------------------------------------------------
# Set policy

# see "cmake --help-policy CMP0003"
# So library linking is more sane
cmake_policy(SET CMP0003 NEW)

# So build strings are automatically quoted
cmake_policy(SET CMP0005 NEW)

# So syntax problems are errors
cmake_policy(SET CMP0010 NEW)

# Input directories must have CMakeLists.txt
cmake_policy(SET CMP0014 NEW)



#-----------------------------------------------------------------------------
# Macros

# Nicer makefiles with -I/1/foo/ instead of -I/1/2/3/../../foo/
# use it instead of include_directories()
macro(povray_include_dirs
	includes)
	set(_ALL_INCS "")
	foreach(_INC ${ARGV})
		get_filename_component(_ABS_INC ${_INC} ABSOLUTE)
		list(APPEND _ALL_INCS ${_ABS_INC})
		# for checking for invalid includes, disable for regular use
		##if(NOT EXISTS "${_ABS_INC}/")
		##	message(FATAL_ERROR "Include not found: ${_ABS_INC}/")
		##endif()
	endforeach()
	include_directories(${_ALL_INCS})
	unset(_INC)
	unset(_ABS_INC)
	unset(_ALL_INCS)
endmacro()

macro(povray_include_dirs_sys
	includes)
	set(_ALL_INCS "")
	foreach(_INC ${ARGV})
		get_filename_component(_ABS_INC ${_INC} ABSOLUTE)
		list(APPEND _ALL_INCS ${_ABS_INC})
		##if(NOT EXISTS "${_ABS_INC}/")
		##	message(FATAL_ERROR "Include not found: ${_ABS_INC}/")
		##endif()
	endforeach()
	include_directories(SYSTEM ${_ALL_INCS})
	unset(_INC)
	unset(_ABS_INC)
	unset(_ALL_INCS)
endmacro()

macro(povray_source_group
	sources)

	# Group by location on disk
	source_group("Source Files" FILES CMakeLists.txt)

	foreach(_SRC ${sources})
		get_filename_component(_SRC_EXT ${_SRC} EXT)
		if((${_SRC_EXT} MATCHES ".h") OR
		   (${_SRC_EXT} MATCHES ".hpp") OR
		   (${_SRC_EXT} MATCHES ".hh"))
			source_group("Header Files" FILES ${_SRC})
		else()
			source_group("Source Files" FILES ${_SRC})
		endif()
	endforeach()

	unset(_SRC)
	unset(_SRC_EXT)
endmacro()


# only MSVC uses SOURCE_GROUP
macro(povray_add_lib_nolist
	name
	sources
	includes
	includes_sys)

	# message(STATUS "Configuring library ${name}")

	# include_directories(${includes})
	# include_directories(SYSTEM ${includes_sys})
	povray_include_dirs("${includes}")
	povray_include_dirs_sys("${includes_sys}")

	add_library(${name} ${sources})

	# works fine without having the includes
	# listed is helpful for IDE's (QtCreator/MSVC)
	povray_source_group("${sources}")

endmacro()


macro(povray_add_lib
	name
	sources
	includes
	includes_sys)

	povray_add_lib_nolist(${name} "${sources}" "${includes}" "${includes_sys}")

	set_property(GLOBAL APPEND PROPERTY POVRAY_LINK_LIBS ${name})
endmacro()


#-----------------------------------------------------------------------------
# Initialize project.

project(Povray)



list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

# XXX, 
add_definitions(-DHAVE_CONFIG_H) # XXX 
add_definitions(-DHAVE_NANOSLEEP) # XXX 
add_definitions(-DUSE_OFFICIAL_BOOST) # XXX 
add_definitions(-DDISTRIBUTION_MESSAGE_2="CMake test build") # XXX 
add_definitions(-DBUILT_FOR="${CMAKE_SYSTEM_NAME}")
add_definitions(-DBUILD_ARCH="${CMAKE_SYSTEM_PROCESSOR}")
add_definitions(-DCOMPILER_VENDOR="${CMAKE_CXX_COMPILER_ID}")
add_definitions(-DCOMPILER_VERSION="${CMAKE_CXX_COMPILER_VERSION}")
add_definitions(-DCOMPILER_VER="${CMAKE_CXX_COMPILER_VERSION}")  # whats the difference?
add_definitions(-DCXXFLAGS="${CMAKE_CXX_FLAGS}")

add_definitions(-DPOV_RAY_IS_OFFICIAL=0)
add_definitions(-DSYS_FUNCTIONS=0)
add_definitions(-DPACKAGE_STRING="POV-Ray 3.7.0")
add_definitions(-DPACKAGE_NAME="POV-Ray")
add_definitions(-DPACKAGE_TARNAME="povray")
add_definitions(-DPACKAGE_BUGREPORT="unix-bugreports-2011@povray.org")
add_definitions(-DPACKAGE_URL="")
add_definitions(-DPACKAGE="povray")
add_definitions(-DVERSION_BASE="3.7")

add_definitions(-DHAVE_GETCWD)
add_definitions(-DIO_RESTRICTIONS_DISABLED=0)
add_definitions(-Dno_error_call=1)

# TODO
add_definitions(-DBUILTIN_IO_RESTRICTIONS="")
add_definitions(-DBUILTIN_XWIN_DISPLAY="")
add_definitions(-DBUILTIN_IMG_FORMATS="")
add_definitions(-DMISSING_IMG_FORMATS="")



#-----------------------------------------------------------------------------
# Flags
if(CMAKE_COMPILER_IS_GNUCC)
	set(CMAKE_CXX_FLAGS "-Wno-multichar ${CMAKE_CXX_FLAGS}")
endif()



#-----------------------------------------------------------------------------
# Libs

find_package(Boost 1.48 COMPONENTS system thread date_time)

set(CMAKE_THREAD_PREFER_PTHREAD ON)
find_package(Threads REQUIRED)

find_package(JPEG REQUIRED)
find_package(PNG REQUIRED)
find_package(ZLIB REQUIRED)



#-----------------------------------------------------------------------------
# Source

file(GLOB SRC
	./vfe/*.cpp
	./source/*.cpp
	./source/frontend/*.cpp
	./source/base/*.cpp
	./source/base/animation/*.cpp
	./source/base/image/*.cpp
	./source/base/font/*.cpp
	./source/backend/*.cpp
	./source/backend/lighting/*.cpp
	./source/backend/bounding/*.cpp
	./source/backend/pattern/*.cpp
	./source/backend/parser/*.cpp
	./source/backend/math/*.cpp
	./source/backend/interior/*.cpp
	./source/backend/render/*.cpp
	./source/backend/colour/*.cpp
	./source/backend/vm/*.cpp
	./source/backend/shape/*.cpp
	./source/backend/control/*.cpp
	./source/backend/scene/*.cpp
	./source/backend/support/*.cpp
	./source/backend/texture/*.cpp
)

set(INC
	./
	./source
	./source/base
	./source/backend
	./vfe
	./libraries/jpeg  # for jversion.h
	${CMAKE_BINARY_DIR}/include  # for config.h
)

set(INC_SYS
	./

	# libs
	${Boost_INCLUDE_DIRS}
	${ZLIB_INCLUDE_DIRS}
	${PNG_INCLUDE_DIR}
	${JPEG_INCLUDE_DIR}
	${PTHREADS_INCLUDE_DIRS}
)

if(WIN32)
	list(APPEND INC ./vfe/win ./windows)
	file(GLOB _SRC
		./vfe/win/*.cpp
		./windows/*.cpp
	)
	list(APPEND SRC ${_SRC})
	unset(_SRC)
else()
	list(APPEND INC ./vfe/unix ./unix)
	file(GLOB _SRC
		./vfe/unix/*.cpp
		./unix/*.cpp
	)
	list(APPEND SRC ${_SRC})
	unset(_SRC)
	# ./unix/disp_sdl.cpp

endif()


povray_include_dirs(${INC})
povray_include_dirs_sys(${INC_SYS})



add_executable(povray ${SRC})

target_link_libraries(
	povray

	${Boost_LIBRARIES}
	${CMAKE_THREAD_LIBS_INIT}
	${ZLIB_LIBRARIES}
	${PNG_LIBRARIES}
	${JPEG_LIBRARIES}
	${JPEG_LIBRARIES}
	
	# XXX
	"tiff"

	"Half"
	"IlmImf"
	"Iex"
)



#-----------------------------------------------------------------------------
# Install

install(
	PROGRAMS ${CMAKE_BINARY_DIR}/bin/povray
	DESTINATION ${CMAKE_INSTALL_PREFIX}/bin/
)

install(
	DIRECTORY
		${CMAKE_SOURCE_DIR}/distribution/include
	DESTINATION ${CMAKE_INSTALL_PREFIX}/share/povray
)

