# Client flags
if(NOT MSVC)
  if(GCC_VERSION VERSION_GREATER 4.2)
    set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native")
  else(GCC_VERSION VERSION_GREATER 4.2)
    if(APPLE)
      set(CMAKE_CXX_FLAGS_RELEASE "-faltivec")
    endif()
  endif()
endif()


global_compile_options()

# #define CLIENT_APP for use in the source code
add_definitions(-DCLIENT_APP)

# Common
set(COMMON_DIR ../common)
file(GLOB COMMON_HEADERS ${COMMON_DIR}/*.h)
file(GLOB COMMON_SOURCES ${COMMON_DIR}/*.cpp)

# Client
set(CLIENT_DIR sdl src)
file(GLOB CLIENT_HEADERS sdl/*.h src/*.h)
file(GLOB CLIENT_SOURCES sdl/*.cpp src/*.cpp)
if(WIN32)
  set(CLIENT_WIN32_RESOURCES sdl/client.rc)
endif()
if(APPLE)
  set(CLIENT_MAC_OBJC_SOURCES sdl/SDLMain.m)
endif()

# Platform definitions
define_platform()

# Client definitions
include_directories(${COMMON_DIR} ${CLIENT_DIR})

# Textscreen
set(TEXTSCREEN_LIBRARY "textscreen")
set(TEXTSCREEN_DIR ../libraries/textscreen)
set(TEXTSCREEN_HEADERS ${TEXTSCREEN_DIR}/txt_sdl.h ${TEXTSCREEN_DIR}/txt_main.h)
set(TEXTSCREEN_SOURCES ${TEXTSCREEN_DIR}/txt_sdl.c)

include_directories(${TEXTSCREEN_DIR})
add_library(${TEXTSCREEN_LIBRARY} STATIC ${TEXTSCREEN_SOURCES} ${TEXTSCREEN_HEADERS})
message(STATUS "Textscreen will be statically linked.")

# Make sure we don't find libraries that are in Program Files/Odamex
if(WIN32)
  list(REMOVE_ITEM CMAKE_SYSTEM_PREFIX_PATH ${CMAKE_INSTALL_PREFIX})
endif()

# SDL configuration
find_package(SDL)
if(SDL_FOUND)
  include_directories(${SDL_INCLUDE_DIR})
else()
  message(WARNING "SDL not found, client application can not be built.")
endif()

# SDL_Mixer configuration
find_package(SDL_mixer)
if(SDLMIXER_FOUND)
  include_directories(${SDLMIXER_INCLUDE_DIR})
else()
  message(WARNING "SDL_mixer not found, client application can not be built.")
endif()

# zlib configuration
find_package(ZLIB QUIET)
if(NOT ZLIB_FOUND)
  set(USE_INTREE_ZLIB)
  set(ZLIB_LIBRARY "z")
  set(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
  set(ZLIB_DIR ../libraries/zlib/)
  set(ZLIB_INCLUDE_DIR ${ZLIB_DIR})
  set(ZLIB_INCLUDE_DIRS ${ZLIB_DIR})
  file(GLOB ZLIB_HEADERS ${ZLIB_DIR}/*.h)
  file(GLOB ZLIB_SOURCES ${ZLIB_DIR}/*.c)
  include_directories(${ZLIB_DIR})
  add_library(${ZLIB_LIBRARY} STATIC ${ZLIB_SOURCES} ${ZLIB_HEADERS})
  message(STATUS "zlib will be built and staticaly linked when compiling the client application.")
endif()

include_directories(${ZLIB_INCLUDE_DIRS})

# libpng configuration
find_package(PNG QUIET)
if(NOT PNG_FOUND)
  set(USE_INTREE_LIBPNG)
  set(PNG_LIBRARY "png")
  set(PNG_LIBRARIES ${PNG_LIBRARY})
  set(PNG_DIR ../libraries/libpng/)
  set(PNG_INCLUDE_DIR ${PNG_DIR})
  set(PNG_INCLUDE_DIRS ${PNG_DIR})
  file(GLOB PNG_HEADERS ${PNG_DIR}/*.h)
  file(GLOB PNG_SOURCES ${PNG_DIR}/*.c)
  include_directories(${LIBPNG_DIR})
  add_library(${PNG_LIBRARY} STATIC ${PNG_SOURCES} ${PNG_HEADERS})
  message(STATUS "libpng will be built and staticaly linked when compiling the client application.")
  add_definitions(-DUSE_PNG)
endif()

include_directories(${PNG_INCLUDE_DIRS})
add_definitions(-DUSE_PNG)

# PortMidi configuration
if(USE_INTREE_PORTMIDI)
  include_directories(../libraries/portmidi/pm_common/ ../libraries/portmidi/porttime/)
  add_definitions(-DPORTMIDI)
else()
  find_package(PortMidi QUIET)
  if(PORTMIDI_FOUND)
    include_directories(${PORTMIDI_INCLUDE_DIR})
    add_definitions(-DPORTMIDI)
  else()
    message(WARNING "PortMidi not found, client will be built without PortMidi support.")
  endif()
endif()

# Find Mac frameworks
if(APPLE)
  find_library(CARBON_LIBRARY Carbon)
  find_library(AUDIOTBOX_LIBRARY AudioToolbox)
  find_library(AUDIOUNIT_LIBRARY AudioUnit)
  set(APPLE_FRAMEWORKS ${CARBON_LIBRARY} ${AUDIOTBOX_LIBRARY}
    ${AUDIOUNIT_LIBRARY})
endif()

# Set up FHS installation path
if(NOT APPLE AND NOT WIN32)
  add_definitions("-DINSTALL_PREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
endif()

# Client target
if(SDL_FOUND AND SDLMIXER_FOUND)
  add_executable(odamex MACOSX_BUNDLE WIN32
    ${COMMON_SOURCES} ${COMMON_HEADERS}
    ${CLIENT_SOURCES} ${CLIENT_HEADERS} ${CLIENT_WIN32_RESOURCES}
    ${CLIENT_MAC_OBJC_SOURCES})
  target_link_libraries(odamex ${TEXTSCREEN_LIBRARY})
  target_link_libraries(odamex ${SDL_LIBRARY})
  target_link_libraries(odamex ${SDLMIXER_LIBRARY})

  target_link_libraries(odamex ${ZLIB_LIBRARY})
  target_link_libraries(odamex ${PNG_LIBRARY} ${ZLIB_LIBRARY})

  if(USE_INTREE_PORTMIDI)
    target_link_libraries(odamex portmidi-static)
  elseif(PORTMIDI_FOUND)
    target_link_libraries(odamex ${PORTMIDI_LIBRARIES})
  endif()

  if(WIN32)
    target_link_libraries(odamex winmm wsock32 Shlwapi)
  elseif(APPLE)
    target_link_libraries(odamex ${APPLE_FRAMEWORKS})
  elseif(SOLARIS)
    target_link_libraries(odamex socket nsl)
  endif()

  if(UNIX AND NOT APPLE)
    target_link_libraries(odamex rt)
  endif()

  set(MACOSX_BUNDLE_BUNDLE_NAME ${CMAKE_PROJECT_NAME})
  set(MACOSX_BUNDLE_INFO_STRING "ODAMEX and its likeness © ${PROJECT_COPYRIGHT} Odamex team.")
  set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_VERSION}")
  set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}")
  set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}")
  set(MACOSX_BUNDLE_ICON_FILE odamex.icns)

  if(APPLE)
    add_custom_command(
      TARGET odamex
      POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/Resources
      COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/media/${MACOSX_BUNDLE_ICON_FILE} ${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/Resources
      COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/odamex.wad ${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/MacOS
    )

    set_directory_properties(
      PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
      "${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/Resources/${MACOSX_BUNDLE_ICON_FILE};${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/MacOS/odamex.wad"
    )

    #****
    # The remaining commands are issued on 'make install'. They make the app
    # bundle "stand-alone" by packaging dependencies inside.
    #****

    # Install into bundle under client directory
    set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR})

    string(REPLACE "-framework Cocoa" "" SDL_DIR ${SDL_LIBRARY})
    string(REPLACE "-framework Cocoa" "" SDLMIXER_DIR ${SDLMIXER_LIBRARY})

    # Install the SDL framework into the bundle
    if(IS_DIRECTORY ${SDL_DIR})
      install(DIRECTORY ${SDL_DIR} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/Frameworks)
      install(CODE "execute_process(COMMAND
        install_name_tool -change @rpath/SDL.framework/Versions/A/SDL
        @executable_path/../Frameworks/SDL.framework/Versions/A/SDL
        ${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/MacOS/odamex)
        " )
    endif()

    # Install the SDL_mixer framework into the bundle
    if(IS_DIRECTORY ${SDLMIXER_DIR})
      install(DIRECTORY ${SDLMIXER_DIR} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/Frameworks)
    endif()

    # If PortMidi was built in install the PortMidi library into the bundle
    if(PortMidi_FOUND)
      install(FILES ${PORTMIDI_LIBRARIES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/Frameworks/)
      install(CODE "execute_process(COMMAND
        install_name_tool -change libportmidi.dylib
        @executable_path/../Frameworks/libportmidi.dylib
        ${CMAKE_CURRENT_BINARY_DIR}/odamex.app/Contents/MacOS/odamex)
        " )
    endif()

  elseif(WIN32)
    install(TARGETS odamex
      RUNTIME DESTINATION .
      COMPONENT client)
  else()
    install(TARGETS odamex
      RUNTIME DESTINATION bin
      COMPONENT client)
  endif()
endif()
