CMAKE_MINIMUM_REQUIRED(VERSION 2.4)

PROJECT(claw)

INCLUDE_DIRECTORIES(.)
SET( CLAW_VERSION 1.5.4 )
SET( CLAW_VERSION_MAJOR 1 )
SET( CLAW_CODE_DIR claw/code/ )
SET( CLAW_INCLUDE_DIRECTORY "${CMAKE_INSTALL_PREFIX}/include/" )
SET( CLAW_INSTALLDIR_SOURCE include/claw/ )
SET( CLAW_INSTALLDIR_LIB lib/ )
SET( CLAW_INSTALLDIR_DOC share/doc/libclaw${CLAW_VERSION_MAJOR}/ )
SET( CLAW_EXECUTABLE_DIR bin/ )

SET( CLAW_LIBRARIES
  claw_application
  claw_configuration_file
  claw_dynamic_library
  claw_graphic
  claw_logger
  claw_net
  )

# custom build options
OPTION( CLAW_NO_JPEG
        "Turn off jpeg support"
        OFF )
OPTION( CLAW_NO_PNG
        "Turn off png support"
        OFF )
OPTION( CLAW_INSTALL_CMAKE_MODULES
        "Install cmake modules for CLAW"
        ON )

# common flags
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ansi -pedantic -Wall")

#-------------------------------------------------------------------------------
# look for the jpeg library
IF( CLAW_NO_JPEG )
ELSE( CLAW_NO_JPEG )
  INCLUDE( ${CMAKE_ROOT}/Modules/FindJPEG.cmake )
  SET( CLAW_DEFINITIONS ${CLAW_DEFINITIONS} -DCLAW_JPEG_SUPPORT )
  INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR})
ENDIF( CLAW_NO_JPEG )

# look for the png library
IF( CLAW_NO_PNG )
ELSE( CLAW_NO_PNG )
  INCLUDE( ${CMAKE_ROOT}/Modules/FindPNG.cmake )
  SET( CLAW_DEFINITIONS ${CLAW_DEFINITIONS} -DCLAW_PNG_SUPPORT )
  INCLUDE_DIRECTORIES(${PNG_INCLUDE_DIR})
ENDIF( CLAW_NO_PNG )

#-------------------------------------------------------------------------------
# set compilation defines
ADD_DEFINITIONS( ${CLAW_DEFINITIONS} )

#-------------------------------------------------------------------------------
# application
SET( CLAW_APPLICATION_SOURCES
  ${CLAW_CODE_DIR}application.cpp
  ${CLAW_CODE_DIR}arguments.cpp
  ${CLAW_CODE_DIR}arguments_table.cpp
)
ADD_LIBRARY( claw_application SHARED ${CLAW_APPLICATION_SOURCES} )
ADD_LIBRARY( claw_application-static STATIC ${CLAW_APPLICATION_SOURCES} )
TARGET_LINK_LIBRARIES( claw_application claw_logger )

# configuration file
SET( CLAW_CONFIGURATION_FILE_SOURCES
  ${CLAW_CODE_DIR}configuration_file.cpp
)
ADD_LIBRARY( claw_configuration_file SHARED ${CLAW_CONFIGURATION_FILE_SOURCES} )
ADD_LIBRARY(
  claw_configuration_file-static
  STATIC ${CLAW_CONFIGURATION_FILE_SOURCES}
)

# dynamic libraries
SET( CLAW_DYNAMIC_LIBRARY_SOURCES
  ${CLAW_CODE_DIR}dynamic_library.cpp
)
ADD_LIBRARY( claw_dynamic_library SHARED ${CLAW_DYNAMIC_LIBRARY_SOURCES} )
ADD_LIBRARY(
  claw_dynamic_library-static
  STATIC ${CLAW_DYNAMIC_LIBRARY_SOURCES}
)
TARGET_LINK_LIBRARIES( claw_dynamic_library ${CMAKE_DL_LIBS} )

# log system
SET( CLAW_LOGGER_SOURCES
  ${CLAW_CODE_DIR}logger.cpp
	${CLAW_CODE_DIR}log_stream.cpp
	${CLAW_CODE_DIR}log_level.cpp
)
ADD_LIBRARY( claw_logger SHARED ${CLAW_LOGGER_SOURCES} )
ADD_LIBRARY( claw_logger-static STATIC ${CLAW_LOGGER_SOURCES} )

# network
SET( CLAW_NET_SOURCES
  ${CLAW_CODE_DIR}basic_socket.cpp
  ${CLAW_CODE_DIR}socket_server.cpp
)
ADD_LIBRARY( claw_net SHARED ${CLAW_NET_SOURCES} )
ADD_LIBRARY( claw_net-static STATIC ${CLAW_NET_SOURCES} )

IF( WIN32 )
  TARGET_LINK_LIBRARIES( claw_net wsock32 )
ENDIF( WIN32 )

# graphic
SET( CLAW_GRAPHIC_LIBRARIES )
SET( CLAW_GRAPHIC_SOURCES
     ${CLAW_CODE_DIR}image.cpp
     ${CLAW_CODE_DIR}bitmap.cpp
     ${CLAW_CODE_DIR}bitmap_writer.cpp
     ${CLAW_CODE_DIR}bitmap_reader.cpp
     ${CLAW_CODE_DIR}pcx.cpp
     ${CLAW_CODE_DIR}pcx_reader.cpp
     ${CLAW_CODE_DIR}pcx_writer.cpp
     ${CLAW_CODE_DIR}pixel.cpp
     ${CLAW_CODE_DIR}targa.cpp
     ${CLAW_CODE_DIR}targa_writer.cpp
     ${CLAW_CODE_DIR}targa_reader.cpp
     ${CLAW_CODE_DIR}targa_file_structure.cpp
     ${CLAW_CODE_DIR}xbm.cpp
     ${CLAW_CODE_DIR}xbm_reader.cpp
     ${CLAW_CODE_DIR}xbm_writer.cpp
 )

# check jpeg library
IF( JPEG_FOUND )
  SET( CLAW_GRAPHIC_LIBRARIES ${CLAW_GRAPHIC_LIBRARIES} ${JPEG_LIBRARIES} )
  SET( CLAW_GRAPHIC_SOURCES ${CLAW_GRAPHIC_SOURCES}
      ${CLAW_CODE_DIR}jpeg.cpp
      ${CLAW_CODE_DIR}jpeg_reader.cpp
      ${CLAW_CODE_DIR}jpeg_writer.cpp
      ${CLAW_CODE_DIR}jpeg_error_manager.cpp
   )
ELSE( JPEG_FOUND )
  MESSAGE( "jpeg library not found." )
ENDIF( JPEG_FOUND )

# check png library
IF( PNG_FOUND )
  SET( CLAW_GRAPHIC_LIBRARIES ${CLAW_GRAPHIC_LIBRARIES} ${PNG_LIBRARIES} )
  SET( CLAW_GRAPHIC_SOURCES ${CLAW_GRAPHIC_SOURCES}
      ${CLAW_CODE_DIR}png.cpp
      ${CLAW_CODE_DIR}png_reader.cpp
      ${CLAW_CODE_DIR}png_writer.cpp
   )
ELSE( PNG_FOUND )
  MESSAGE( "png library not found." )
ENDIF( PNG_FOUND )

ADD_LIBRARY( claw_graphic SHARED ${CLAW_GRAPHIC_SOURCES} )
ADD_LIBRARY( claw_graphic-static STATIC ${CLAW_GRAPHIC_SOURCES} )
TARGET_LINK_LIBRARIES(claw_graphic ${CLAW_GRAPHIC_LIBRARIES})

# extra flags for the link
SET_TARGET_PROPERTIES(
 ${CLAW_LIBRARIES}
 PROPERTIES LINK_FLAGS "-s -Wl,--as-needed" )

# all libraries
SET( CLAW_ALL_LIBRARIES ${CLAW_LIBRARIES} ${CLAW_GRAPHIC_LIBRARIES})

#-------------------------------------------------------------------------------
# subdirectories
SUBDIRS( doc claw )

#-------------------------------------------------------------------------------
# install libraries
FOREACH( lib ${CLAW_LIBRARIES} )
  SET_TARGET_PROPERTIES(
    ${lib} PROPERTIES
    VERSION ${CLAW_VERSION}
    SOVERSION ${CLAW_VERSION_MAJOR}
  )

  INSTALL( TARGETS ${lib} DESTINATION ${CLAW_INSTALLDIR_LIB}  )
  INSTALL( TARGETS ${lib}-static DESTINATION ${CLAW_INSTALLDIR_LIB}  )
ENDFOREACH( lib )

INSTALL( FILES COPYING DESTINATION ${CLAW_INSTALLDIR_DOC} )

# target to uninstall files
CONFIGURE_FILE(
  "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  IMMEDIATE @ONLY)

ADD_CUSTOM_TARGET(uninstall
  "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")

IF(UNIX)
  # configuration script
  CONFIGURE_FILE(
    "${CMAKE_CURRENT_SOURCE_DIR}/claw-config.in"
    "${CMAKE_CURRENT_BINARY_DIR}/claw-config"
    IMMEDIATE @ONLY)

  INSTALL( FILES "${CMAKE_CURRENT_BINARY_DIR}/claw-config"
    DESTINATION ${CLAW_EXECUTABLE_DIR}
    PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
      GROUP_READ GROUP_EXECUTE
      WORLD_READ WORLD_EXECUTE )
ENDIF(UNIX)

IF(WIN32)
  SUBDIRS(win)
ENDIF(WIN32)

# check if we have to install cmake modules
IF( CLAW_INSTALL_CMAKE_MODULES )
  SUBDIRS( cmake-module )
ENDIF( CLAW_INSTALL_CMAKE_MODULES )
