# CMake Configuration for Gura
# Available operations:
#  - Build library and executables.
#    $ make
#  - Install files to the system.
#    $ sudo make install
#  - Make packages of Debian, RPM or DMG.
#    $ make package
# When you want to see the detailed process, run "make VERBOSE=1".

cmake_minimum_required(VERSION 2.6)

project(gura)

# Needs to modify content of include/gura/Version.h as well.

set(GURA_VERSION_MAJOR		0)
set(GURA_VERSION_MINOR		7)
set(GURA_VERSION_PATCH		0)

if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  set(CMAKE_INSTALL_PREFIX	/Applications/Gura.app/Contents/Resources)
else (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  set(CMAKE_INSTALL_PREFIX	/usr)
endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")

set(CMAKE_CXX_FLAGS			"-std=c++11 -Wall -Wno-sign-compare")

set(GURA_VERSION			${GURA_VERSION_MAJOR}.${GURA_VERSION_MINOR}.${GURA_VERSION_PATCH})
set(GURA_VERSION_SO			${GURA_VERSION_MAJOR})

set(GURA_SRCDIR_ROOT		${PROJECT_SOURCE_DIR}/..)
set(GURA_SRCDIR_DOC			${GURA_SRCDIR_ROOT}/doc)
set(GURA_SRCDIR_EDITOR		${GURA_SRCDIR_ROOT}/editor)
set(GURA_SRCDIR_FONT		${GURA_SRCDIR_ROOT}/font)
set(GURA_SRCDIR_GUEST		${GURA_SRCDIR_ROOT}/guest/dylib)
set(GURA_SRCDIR_INCLUDE		${GURA_SRCDIR_ROOT}/include)
set(GURA_SRCDIR_MODULE		${GURA_SRCDIR_ROOT}/module)
set(GURA_SRCDIR_SAMPLE		${GURA_SRCDIR_ROOT}/sample)
set(GURA_SRCDIR_SCRIPT		${GURA_SRCDIR_ROOT}/script)

set(GURA_RELDIR_BINARY		bin)
set(GURA_RELDIR_LIBRARY		lib)
set(GURA_RELDIR_GUEST		lib/gura/guest)
set(GURA_RELDIR_MODULE		lib/gura/${GURA_VERSION}/module)
set(GURA_RELDIR_INCLUDE		include/gura/${GURA_VERSION})
set(GURA_RELDIR_SHARE		share/gura/${GURA_VERSION})

set(GURA_DSTDIR_BINARY		${CMAKE_INSTALL_PREFIX}/${GURA_RELDIR_BINARY})
set(GURA_DSTDIR_LIBRARY		${CMAKE_INSTALL_PREFIX}/${GURA_RELDIR_LIBRARY})
set(GURA_DSTDIR_INCLUDE		${CMAKE_INSTALL_PREFIX}/${GURA_RELDIR_INCLUDE})
set(GURA_DSTDIR_SHARE		${CMAKE_INSTALL_PREFIX}/${GURA_RELDIR_SHARE})
set(GURA_DSTDIR_MODULE		${CMAKE_INSTALL_PREFIX}/${GURA_RELDIR_MODULE})
set(GURA_DSTDIR_GUEST		${CMAKE_INSTALL_PREFIX}/${GURA_RELDIR_GUEST})

configure_file(
  ${PROJECT_SOURCE_DIR}/resource/build/build-modules.in
  ${CMAKE_BINARY_DIR}/tmp/build-modules)

file(COPY ${CMAKE_BINARY_DIR}/tmp/build-modules
  DESTINATION ${CMAKE_BINARY_DIR}
  FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
                   GROUP_READ GROUP_EXECUTE WORLD_READ)

if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
  configure_file(
    ${PROJECT_SOURCE_DIR}/resource/build/setup-guest.in
    ${CMAKE_BINARY_DIR}/tmp/setup-guest)
  file(COPY ${CMAKE_BINARY_DIR}/tmp/setup-guest
    DESTINATION ${CMAKE_BINARY_DIR}
    FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
                     GROUP_READ GROUP_EXECUTE WORLD_READ)
endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")

include_directories(
  ${GURA_SRCDIR_INCLUDE}
  ${PROJECT_SOURCE_DIR}/lib
  ${PROJECT_SOURCE_DIR}/lib/SFMT-src-1.3.3)

add_subdirectory(${PROJECT_SOURCE_DIR}/lib)
add_subdirectory(${PROJECT_SOURCE_DIR}/program-gura)
#add_subdirectory(${PROJECT_SOURCE_DIR}/program-guri)

install(DIRECTORY ${GURA_SRCDIR_DOC}/
  DESTINATION ${GURA_RELDIR_SHARE}/doc
  USE_SOURCE_PERMISSIONS
  FILES_MATCHING PATTERN "*.pdf" PATTERN "html" EXCLUDE)

install(DIRECTORY ${GURA_SRCDIR_EDITOR}/
  DESTINATION ${GURA_RELDIR_SHARE}/editor
  USE_SOURCE_PERMISSIONS
  FILES_MATCHING PATTERN "*" PATTERN "#*" EXCLUDE PATTERN "*~" EXCLUDE PATTERN "*.swp" EXCLUDE)

install(DIRECTORY ${GURA_SRCDIR_FONT}/
  DESTINATION ${GURA_RELDIR_SHARE}/font
  USE_SOURCE_PERMISSIONS
  FILES_MATCHING PATTERN "*" PATTERN "#*" EXCLUDE PATTERN "*~" EXCLUDE PATTERN "*.swp" EXCLUDE)

install(DIRECTORY ${GURA_SRCDIR_GUEST}/
  DESTINATION ${GURA_RELDIR_GUEST}
  USE_SOURCE_PERMISSIONS
  FILES_MATCHING PATTERN "*" PATTERN "#*" EXCLUDE PATTERN "*~" EXCLUDE PATTERN "*.swp" EXCLUDE)

install(DIRECTORY ${GURA_SRCDIR_INCLUDE}/
  DESTINATION ${GURA_RELDIR_INCLUDE}
  USE_SOURCE_PERMISSIONS
  FILES_MATCHING PATTERN "*.h" PATTERN "#*" EXCLUDE)

install(DIRECTORY ${GURA_SRCDIR_MODULE}/
  DESTINATION ${GURA_RELDIR_MODULE}
  USE_SOURCE_PERMISSIONS
  FILES_MATCHING PATTERN "*.gura" PATTERN "*.gurd" PATTERN "#*" EXCLUDE)

install(DIRECTORY ${GURA_SRCDIR_SAMPLE}/
  DESTINATION ${GURA_RELDIR_SHARE}/sample
  USE_SOURCE_PERMISSIONS
  FILES_MATCHING PATTERN "*" PATTERN "#*" EXCLUDE PATTERN "*~" EXCLUDE PATTERN "*.swp" EXCLUDE)

install(DIRECTORY ${GURA_SRCDIR_SCRIPT}/
  DESTINATION ${GURA_RELDIR_SHARE}/script
  USE_SOURCE_PERMISSIONS
  FILES_MATCHING PATTERN "*" PATTERN "#*" EXCLUDE PATTERN "*~" EXCLUDE PATTERN "*.swp" EXCLUDE)

find_program(DPKG NAMES dpkg-deb PATHS "/usr/bin")
find_program(RPMBUILD NAMES rpmbuild PATHS "/usr/bin")

set(CPACK_PACKAGE_NAME					"gura")
set(CPACK_PACKAGE_CONTACT				"Yutaka Saito <ypsitau@nifty.com>")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY	"Gura Programming Language")
set(CPACK_PACKAGE_VERSION_MAJOR			${GURA_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR			${GURA_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH			${GURA_VERSION_PATCH})
set(CPACK_PACKAGE_VERSION				"${GURA_VERSION_MAJOR}.${GURA_VERSION_MINOR}.${GURA_VERSION_PATCH}")

if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  message(STATUS "Packaging disk image file -- OK")
  set(CPACK_GENERATOR "Bundle")   
  set(CPACK_BUNDLE_ICON					"${PROJECT_SOURCE_DIR}/resource/dmg/Gura.icns")
  set(CPACK_BUNDLE_NAME					"Gura")
  set(CPACK_BUNDLE_PLIST				"${PROJECT_SOURCE_DIR}/resource/dmg/Info.plist")
  set(CPACK_BUNDLE_STARTUP_COMMAND		"${PROJECT_SOURCE_DIR}/resource/dmg/StartupCommand")
  set(CPACK_BUNDLE_ICON					"${PROJECT_SOURCE_DIR}/resource/dmg/Gura.icns")
  set(CPACK_PACKAGE_FILE_NAME			"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
  set(CPACK_PACKAGE_ICON				"${PROJECT_SOURCE_DIR}/resource/dmg/Gura.icns")
else (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  set(CPACK_SET_DESTDIR					true)
  set(CPACK_PACKAGE_RELOCATABLE			false)
  if (DPKG)
    get_filename_component(DPKG_PATH ${DPKG} ABSOLUTE)
    message(STATUS "Packaging deb file using ${DPKG_PATH} -- OK")
    set(CPACK_GENERATOR "DEB")
    set(CPACK_PACKAGE_FILE_NAME				"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-ubuntu")
	set(CPACK_DEBIAN_PACKAGE_NAME			${CPACK_PACKAGE_NAME})
	set(CPACK_DEBIAN_PACKAGE_PRIORITY		"optional")
	set(CPACK_DEBIAN_PACKAGE_SECTION		"interpreters")
	set(CPACK_DEBIAN_PACKAGE_MAINTAINER		${CPACK_PACKAGE_CONTACT})
	set(CPACK_DEBIAN_PACKAGE_DESCRIPTION	${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
	set(CPACK_DEBIAN_PACKAGE_VERSION		${CPACK_PACKAGE_VERSION})
	set(CPACK_DEBIAN_PACKAGE_DEPENDS		"libc6 (>= 2.3),libreadline6 (>= 6.0),libonig2,libyaml-0-2,libwxgtk3.0-dev,tk8.5,libsdl1.2debian,libsdl2-dev")
	if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
	  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
	elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
	  set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE	"i386")
	endif ()
  elseif (RPMBUILD)
    get_filename_component(RPMBUILD_PATH ${RPMBUILD} ABSOLUTE)
    message(STATUS "Packaging rpm file using ${RPMBUILD_PATH} -- OK")
    if (DEFINED CPACK_GENERATOR)
      set(CPACK_GENERATOR ${CPACK_GENERATOR} "RPM")
    else ()
      set(CPACK_GENERATOR "RPM")
    endif ()
    set(CPACK_PACKAGE_FILE_NAME				"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-fedora")
    set(CPACK_RPM_PACKAGE_NAME				${CPACK_PACKAGE_NAME})
    set(CPACK_RPM_PACKAGE_DESCRIPTION		${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
    set(CPACK_RPM_PACKAGE_VERSION			${CPACK_PACKAGE_VERSION})
    set(CPACK_RPM_PACKAGE_VENDOR			${CPACK_PACKAGE_CONTACT})
    set(CPACK_RPM_PACKAGE_REQUIRES			"glibc >= 2.3, readline >= 6.0")
    if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
      set(CPACK_RPM_PACKAGE_ARCHITECTURE "x86_64")
    elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
      set(CPACK_RPM_PACKAGE_ARCHITECTURE	"i386")
    endif ()
  endif ()
endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")

include(CPack)
