# ---------------------
# Open Sonic
# CMakeLists.txt
# ---------------------

# Initializing...
CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
PROJECT(opensonic C)
SET(GAME_BIN opensonic)
SET(LAUNCHER_BIN opensonic_launcher)
SET(GAME_VERSION "0.1.2")
SET(ALLEGRO_RECOMMENDED_VERSION "4.2.2")
SET(CMAKE_BUILD_TYPE Release)
MESSAGE("Open Sonic version ${GAME_VERSION}")


# Modules
#SET(DISABLE_DUMB TRUE) # uncomment this line to disable .mod/.it/.s3m/.xm support (DUMB Library)
#SET(DISABLE_LOGG TRUE) # uncomment this line to disable .ogg support (LOGG Library)


# configuring...
SET(DEFS "")
SET(CFLAGS "")

IF(UNIX)
  SET(ALLEGRO_UNIX_LIBS "$ENV{OPENSNC_ALLEGRO_LIBS}")
  IF(NOT ALLEGRO_UNIX_LIBS)
    MESSAGE(FATAL_ERROR "Please do not invoke CMake directly. Run ./configure instead.")
  ENDIF(NOT ALLEGRO_UNIX_LIBS)
ENDIF(UNIX)

IF(NOT DISABLE_DUMB)
  SET(DUMB_LIBS aldmb dumb)
ELSE(NOT DISABLE_DUMB)
  SET(DUMB_LIBS "")
  SET(DEFS ${DEFS} DISABLE_DUMB)
  MESSAGE("DUMB has been disabled. The game will be compiled without .mod/.it/.xm/.s3m support.")
ENDIF(NOT DISABLE_DUMB)

IF(NOT DISABLE_LOGG)
  SET(LOGG_LIBS vorbisfile vorbis ogg)
  SET(LOGG_CFILE "src/logg.c")
  SET(LOGG_HFILE "src/logg.h")
ELSE(NOT DISABLE_LOGG)
  SET(LOGG_LIBS "")
  SET(LOGG_CFILE "")
  SET(LOGG_HFILE "")
  SET(DEFS ${DEFS} DISABLE_LOGG)
  MESSAGE("LOGG has been disabled. The game will be compiled without .ogg support.")
ENDIF(NOT DISABLE_LOGG)




# We need some libraries...
FIND_LIBRARY(LALLEG NAMES alleg)
IF(NOT LALLEG)
  MESSAGE(FATAL_ERROR "Fatal error: lib Allegro not found! Please read the docs for more information.")
ELSE(NOT LALLEG)
  IF(UNIX)
    SET(ALLEGRO_UNIX_VERSION "$ENV{OPENSNC_ALLEGRO_VERSION}")
    IF(NOT ALLEGRO_UNIX_VERSION STREQUAL ALLEGRO_RECOMMENDED_VERSION)
      MESSAGE("\nWARNING: your Allegro version is ${ALLEGRO_UNIX_VERSION}. The recommended version is ${ALLEGRO_RECOMMENDED_VERSION}.\n         Some errors may occur during the process.\n")
    ENDIF(NOT ALLEGRO_UNIX_VERSION STREQUAL ALLEGRO_RECOMMENDED_VERSION)
  ENDIF(UNIX)
ENDIF(NOT LALLEG)

FIND_LIBRARY(LALPNG NAMES alpng)
IF(NOT LALPNG)
  MESSAGE(FATAL_ERROR "Fatal error: lib alpng (AllegroPNG) not found (.png support)! Please read the docs for more information.")
ENDIF(NOT LALPNG)

IF(NOT DISABLE_DUMB)
  FIND_LIBRARY(LALDMB NAMES aldmb)
  IF(NOT LALDMB)
    MESSAGE(FATAL_ERROR "Fatal error: lib aldmb (DUMB with Allegro support) not found (.mod/.it/.s3m/.xm support)! Please read the docs for more information.")
  ENDIF(NOT LALDMB)

  FIND_LIBRARY(LDUMB NAMES dumb)
  IF(NOT LDUMB)
    MESSAGE(FATAL_ERROR "Fatal error: lib dumb not found (.mod/.it/.s3m/.xm support)! Please read the docs for more information.")
  ENDIF(NOT LDUMB)
ENDIF(NOT DISABLE_DUMB)

IF(NOT DISABLE_LOGG)
  FIND_LIBRARY(LOGG NAMES ogg)
  IF(NOT LOGG)
    MESSAGE(FATAL_ERROR "Fatal error: lib ogg not found (.ogg support)! Please read the docs for more information.")
  ENDIF(NOT LOGG)

  FIND_LIBRARY(LVORBIS NAMES vorbis)
  IF(NOT LVORBIS)
    MESSAGE(FATAL_ERROR "Fatal error: lib vorbis not found (.ogg support)! Please read the docs for more information.")
  ENDIF(NOT LVORBIS)

  FIND_LIBRARY(LVORBISFILE NAMES vorbisfile)
  IF(NOT LVORBISFILE)
    MESSAGE(FATAL_ERROR "Fatal error: lib vorbisfile not found (.ogg support)! Please read the docs for more information.")
  ENDIF(NOT LVORBISFILE)
ENDIF(NOT DISABLE_LOGG)


# pre-processor: #define's
IF(MSVC)
  FOREACH(d ${DEFS})
    SET(CFLAGS "${CFLAGS} /D${d}")
  ENDFOREACH(d)
ELSE(MSVC)
  FOREACH(d ${DEFS})
    SET(CFLAGS "${CFLAGS} -D${d}")
  ENDFOREACH(d)
ENDIF(MSVC)


# source files
SET(
  GAME_SRCS
  src/2xsai.c
  src/actor.c
  src/audio.c
  src/boss.c
  src/brick.c
  src/confirmbox.c
  src/credits.c
  src/endofdemo.c
  src/enemy.c
  src/font.c
  src/input.c
  src/intro.c
  src/item.c
  src/lang.c
  src/langselect.c
  src/level.c
  ${LOGG_CFILE}
  src/main.c
  src/menu.c
  src/osspec.c
  src/player.c
  src/quest.c
  src/questover.c
  src/scene.c
  src/screenshot.c
  src/sprite.c
  src/util.c
  src/video.c
)

SET(
  LAUNCHER_SRCS
  src/launcher.c
  src/lexgui.c
  src/osspec.c
)



# *nix executable
IF(UNIX)
  SET(GAME_SRCS ${GAME_SRCS} src/iconlin.c)
  SET(LAUNCHER_SRCS ${LAUNCHER_SRCS} src/iconlin.c)
  ADD_EXECUTABLE(${GAME_BIN} ${GAME_SRCS})
  ADD_EXECUTABLE(${LAUNCHER_BIN} ${LAUNCHER_SRCS})
  SET_TARGET_PROPERTIES(${GAME_BIN} PROPERTIES LINK_FLAGS ${ALLEGRO_UNIX_LIBS})
  TARGET_LINK_LIBRARIES(${GAME_BIN} m ${LOGG_LIBS} ${DUMB_LIBS} alpng)
  SET_TARGET_PROPERTIES(${LAUNCHER_BIN} PROPERTIES LINK_FLAGS ${ALLEGRO_UNIX_LIBS})
  SET_TARGET_PROPERTIES(${GAME_BIN} PROPERTIES COMPILE_FLAGS "-Wall -O2 ${CFLAGS}")
  SET_TARGET_PROPERTIES(${LAUNCHER_BIN} PROPERTIES COMPILE_FLAGS "-Wall -O2")
ENDIF(UNIX)



# Windows executable
IF(WIN32)

  # MSVC fix
  IF(MSVC)
    SET(
      GAME_SRCS
      ${GAME_SRCS}
      src/2xsai.h
      src/actor.h
      src/audio.h
      src/boss.h
      src/brick.h
      src/confirmbox.h
      src/credits.h
      src/endofdemo.h
      src/enemy.h
      src/font.h
      src/global.h
      src/input.h
      src/intro.h
      src/item.h
      src/lang.h
      src/langselect.h
      src/level.h
      ${LOGG_HFILE}
      src/menu.h
      src/osspec.h
      src/player.h
      src/quest.h
      src/questover.h
      src/scene.h
      src/screenshot.h
      src/sprite.h
      src/util.h
      src/video.h
      src/iconwin.rc
    )
    SET(
      LAUNCHER_SRCS
      ${LAUNCHER_SRCS}
      src/global.h
      src/lexgui.h
      src/osspec.h
      src/iconwin.rc
    )
  ENDIF(MSVC)

  # Executables
  ADD_EXECUTABLE(${GAME_BIN} WIN32 ${GAME_SRCS})
  ADD_EXECUTABLE(${LAUNCHER_BIN} WIN32 ${LAUNCHER_SRCS})

  # Other properties
  IF(MSVC)
    SET_TARGET_PROPERTIES(${GAME_BIN} PROPERTIES COMPILE_FLAGS "/D_CRT_SECURE_NO_DEPRECATE /D__WIN32__ /D__MSVC__ ${CFLAGS}")
    SET_TARGET_PROPERTIES(${LAUNCHER_BIN} PROPERTIES COMPILE_FLAGS "/D_CRT_SECURE_NO_DEPRECATE /D__WIN32__ /D__MSVC__")
    TARGET_LINK_LIBRARIES(${GAME_BIN} ${LOGG_LIBS} ${DUMB_LIBS} alpng alleg)
    TARGET_LINK_LIBRARIES(${LAUNCHER_BIN} alleg)
  ELSE(MSVC)
    SET_TARGET_PROPERTIES(${GAME_BIN} PROPERTIES COMPILE_FLAGS "-Wall -O2 -ansi ${CFLAGS}")
    SET_TARGET_PROPERTIES(${LAUNCHER_BIN} PROPERTIES COMPILE_FLAGS "-Wall -O2")
    TARGET_LINK_LIBRARIES(${GAME_BIN} m ${LOGG_LIBS} ${DUMB_LIBS} alpng alleg)
    TARGET_LINK_LIBRARIES(${LAUNCHER_BIN} alleg)
    SET_TARGET_PROPERTIES(${GAME_BIN} PROPERTIES LINK_FLAGS "src/iconwin.res")
    SET_TARGET_PROPERTIES(${LAUNCHER_BIN} PROPERTIES LINK_FLAGS "src/iconwin.res")
  ENDIF(MSVC)
ENDIF(WIN32)



# Misc
SET_TARGET_PROPERTIES(${GAME_BIN} PROPERTIES PROJECT_NAME "Open Sonic")
SET_TARGET_PROPERTIES(${LAUNCHER_BIN} PROPERTIES PROJECT_NAME "Open Sonic Launcher")



# Installing on *nix
IF(UNIX)
  SET(GAME_INSTALL_DIR "/usr/share/opensonic")
  SET(GAME_FINAL_DIR "/usr/bin")

  INSTALL(CODE "MESSAGE(\"Installing Open Sonic ${GAME_VERSION}... Make sure you have root privileges.\")")
  INSTALL(TARGETS ${GAME_BIN} ${LAUNCHER_BIN} RUNTIME DESTINATION ${GAME_INSTALL_DIR})
  INSTALL(FILES license.txt readme.html DESTINATION ${GAME_INSTALL_DIR})
  INSTALL(DIRECTORY config gui images levels licenses musics quests samples screenshots themes languages DESTINATION ${GAME_INSTALL_DIR} PATTERN ".svn" EXCLUDE)

  INSTALL(CODE "MESSAGE(\"Creating files at ${GAME_FINAL_DIR}...\")")
  INSTALL(CODE "EXECUTE_PROCESS(COMMAND \"cmake\" \"-E\" \"copy\" \"${GAME_INSTALL_DIR}/${GAME_BIN}\" \"${GAME_FINAL_DIR}/${GAME_BIN}\")")
  INSTALL(CODE "EXECUTE_PROCESS(COMMAND \"cmake\" \"-E\" \"copy\" \"${GAME_INSTALL_DIR}/${LAUNCHER_BIN}\" \"${GAME_FINAL_DIR}/${LAUNCHER_BIN}\")")

  INSTALL(CODE "MESSAGE(\"Done! Run ${LAUNCHER_BIN} to start the game.\")")
ENDIF(UNIX)
