# The project's name is VBA-M it uses assembly, C and C++ code
PROJECT(VBA-M ASM C CXX)

cmake_minimum_required( VERSION 2.4.6 )
if( COMMAND cmake_policy )
    cmake_policy( SET CMP0003 NEW )
    cmake_policy( SET CMP0005 OLD )
endif( COMMAND cmake_policy )
SET( CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeScripts )

# Include the definition of the ASM compiler. It will look for nasm
# This is probably not needed if CMake 2.6 or above is used
INCLUDE(CMakeScripts/CMakeDetermineASMCompiler.cmake)
INCLUDE(CMakeScripts/CMakeASMInformation.cmake)

# Also need to look for SFML
INCLUDE(CMakeScripts/FindSFML.cmake)

# Both the SDL and the GTK+ frontends are built by default
# To disable building the SDL frontend add -DNO_SDL=1 on the commandline
# To disable building the GTK+ frontend add -DNO_GTK=1 on the commandline
# To disable building the debugger, add -DNO_DEBUGGER=1.
# The SDL frontend can't be built without debugger support
# To use ASM scalers, add -DUSE_ASM_SCALERS=1
# To use the ASM core, add -DUSE_ASM_CORE=1
# Set the version number with -DVERSION=X.X.X-uber

# Version number
IF( NOT VERSION )
    SET( VERSION "1.8.0-SVN" )
ENDIF( NOT VERSION )

# Fill in SDLMAIN_LIBRARY on OS X manually to avoid using SDLMain.m
# OS X users will have to compile and install SDL from source.
if( APPLE )
	SET(SDLMAIN_LIBRARY "-lSDLmain")
endif( APPLE )

# Look for some dependencies using CMake scripts
FIND_PACKAGE ( ZLIB REQUIRED )
FIND_PACKAGE ( PNG REQUIRED )
FIND_PACKAGE ( OpenGL REQUIRED )
FIND_PACKAGE ( SDL REQUIRED )
FIND_PACKAGE ( SFML REQUIRED )

# Disable looking for GTK if not going to build the GTK frontend
# so that pkg-config is not required
IF(NOT NO_GTK)
    FIND_PACKAGE ( PkgConfig REQUIRED )

    # These dependencies require pkg-config to be found
    PKG_CHECK_MODULES ( GTKMM gtkmm-2.4 )
    PKG_CHECK_MODULES ( GLIBMM glibmm-2.4 )
    PKG_CHECK_MODULES ( GIOMM giomm-2.4 )
    PKG_CHECK_MODULES ( GLADEMM libglademm-2.4 )
    PKG_CHECK_MODULES ( GTKGLMM gtkglextmm-x11-1.2 )
ENDIF(NOT NO_GTK)

# Check that the dependencies are met to build the SDL frontend
IF( NOT NO_SDL )
    IF( SDL_FOUND )
        SET( CAN_BUILD_VBAM 1 )
    ENDIF( SDL_FOUND )
ENDIF( NOT NO_SDL )
IF( WITH_LIRC )
        SET( WITHLIRC 1 )
ELSE( WITH_LIRC )
        SET( WITHLIRC 0 )
ENDIF( WITH_LIRC )

# Check that the dependencies are met to build the GTK frontend
IF( NOT NO_GTK )
    IF( GLIBMM_FOUND AND GTKMM_FOUND AND GLADEMM_FOUND AND SDL_FOUND )
        SET( CAN_BUILD_GVBAM 1 )
    ENDIF( GLIBMM_FOUND AND GTKMM_FOUND AND GLADEMM_FOUND AND SDL_FOUND )
ENDIF( NOT NO_GTK )

# Set the default install dir
IF( NOT DATA_INSTALL_DIR )
    SET( DATA_INSTALL_DIR "share/vbam" )
ENDIF( NOT DATA_INSTALL_DIR )

SET( PKGDATADIR ${CMAKE_INSTALL_PREFIX}/${DATA_INSTALL_DIR} )

# Set the configuration file location
IF( NOT SYSCONFDIR )
    SET( SYSCONFDIR "/etc" )
ENDIF( NOT SYSCONFDIR )

# C defines
ADD_DEFINITIONS (-DHAVE_NETINET_IN_H -DHAVE_ARPA_INET_H -DHAVE_ZLIB_H -DFINAL_VERSION -DSDL -DUSE_OPENGL -DSYSCONFDIR='"${SYSCONFDIR}"' -DWITH_LIRC='${WITHLIRC}')

ADD_DEFINITIONS (-DVERSION='"${VERSION}"' -DPKGDATADIR='"${PKGDATADIR}"' -DPACKAGE='')

# The debugger is enabled by default
# The SDL port can't be built without debugging support
IF( NO_DEBUGGER )
    IF( CAN_BUILD_VBAM )
        MESSAGE(STATUS "The SDL port can't be built without debugging support")
        SET( CAN_BUILD_VBAM 0 )
    ENDIF( CAN_BUILD_VBAM )

    ADD_DEFINITIONS (-DNO_DEBUGGER)
ELSE( NO_DEBUGGER )
    ADD_DEFINITIONS (-DBKPT_SUPPORT)
ENDIF( NO_DEBUGGER )

# The ASM core is disabled by default because we don't know on which platform we are
IF( NOT USE_ASM_CORE )
    ADD_DEFINITIONS (-DC_CORE)
ENDIF( NOT USE_ASM_CORE )

# Compiler flags
IF ( WIN32 )
    SET( CMAKE_ASM_FLAGS "-I$(CMAKE_SOURCE_DIR)/src/filters/hq/asm/ -O1 -w-orphan-labels")
ELSE ( WIN32 )
    SET( CMAKE_ASM_FLAGS "-I$(CMAKE_SOURCE_DIR)/src/filters/hq/asm/ -O1 -DELF -w-orphan-labels")
ENDIF ( WIN32 )
SET( CMAKE_C_FLAGS "-O3 -Wall")
SET( CMAKE_CXX_FLAGS "-O3 -Wall")

# Source files definition
SET(SRC_FEX
    fex/7z_C/7zAlloc.c
    fex/7z_C/7zBuf.c
    fex/7z_C/7zCrc.c
    fex/7z_C/7zDecode.c
    fex/7z_C/7zExtract.c
    fex/7z_C/7zHeader.c
    fex/7z_C/7zIn.c
    fex/7z_C/7zItem.c
    fex/7z_C/7zStream.c
    fex/7z_C/Bcj2.c
    fex/7z_C/Bra86.c
    fex/7z_C/LzmaDec.c
    fex/fex/Binary_Extractor.cpp
    fex/fex/blargg_common.cpp
    fex/fex/blargg_errors.cpp
    fex/fex/Data_Reader.cpp
    fex/fex/fex.cpp
    fex/fex/File_Extractor.cpp
    fex/fex/Gzip_Extractor.cpp
    fex/fex/Gzip_Reader.cpp
    fex/fex/Rar_Extractor.cpp
    fex/fex/Zip7_Extractor.cpp
    fex/fex/Zip_Extractor.cpp
    fex/fex/Zlib_Inflater.cpp
)

SET(SRC_MAIN
    src/Util.cpp
    src/common/Patch.cpp
    src/common/memgzio.c
)

SET(SRC_GBA
    src/gba/agbprint.cpp
    src/gba/bios.cpp
    src/gba/Cheats.cpp
    src/gba/EEprom.cpp
    src/gba/Flash.cpp
    src/gba/GBA.cpp
    src/gba/GBAGfx.cpp
    src/gba/GBALink.cpp
    src/gba/GBASockClient.cpp
    src/gba/GBA-thumb.cpp
    src/gba/GBA-arm.cpp
    src/gba/gbafilter.cpp
    src/gba/Globals.cpp
    src/gba/Mode0.cpp
    src/gba/Mode1.cpp
    src/gba/Mode2.cpp
    src/gba/Mode3.cpp
    src/gba/Mode4.cpp
    src/gba/Mode5.cpp
    src/gba/RTC.cpp
    src/gba/Sound.cpp
    src/gba/Sram.cpp
)

SET(SRC_GB
    src/gb/GB.cpp
    src/gb/gbCheats.cpp
    src/gb/gbDis.cpp
    src/gb/gbGfx.cpp
    src/gb/gbGlobals.cpp
    src/gb/gbMemory.cpp
    src/gb/gbPrinter.cpp
    src/gb/gbSGB.cpp
    src/gb/gbSound.cpp
)

SET(SRC_APU
    src/apu/Blip_Buffer.cpp
    src/apu/Effects_Buffer.cpp
    src/apu/Gb_Apu.cpp
    src/apu/Gb_Apu_State.cpp
    src/apu/Gb_Oscs.cpp
    src/apu/Multi_Buffer.cpp
)

SET(SRC_SDL
    src/sdl/debugger.cpp
    src/sdl/SDL.cpp
    src/sdl/dummy.cpp
    src/sdl/filters.cpp
    src/sdl/text.cpp
    src/sdl/inputSDL.cpp
    src/common/SoundSDL.cpp
    src/sdl/expr.cpp
    src/sdl/exprNode.cpp
    src/sdl/expr-lex.cpp
)

SET(SRC_FILTERS
    src/filters/2xSaI.cpp
    src/filters/admame.cpp
    src/filters/bilinear.cpp
    src/filters/hq2x.cpp
    src/filters/interframe.cpp
    src/filters/pixel.cpp
    src/filters/scanline.cpp
)

SET(SRC_HQ_C
    src/filters/hq/c/hq_implementation.cpp
)

SET(SRC_HQ_ASM
    src/filters/hq/asm/hq3x_16.asm
    src/filters/hq/asm/hq3x_32.asm
    src/filters/hq/asm/hq4x_16.asm
    src/filters/hq/asm/hq4x_32.asm
    src/filters/hq/asm/hq3x32.cpp
)

SET(SRC_GTK
    src/gtk/configfile.cpp
    src/gtk/main.cpp
    src/gtk/system.cpp
    src/gtk/windowcallbacks.cpp
    src/gtk/filters.cpp
    src/gtk/gameboyconfig.cpp
    src/gtk/gameboyadvanceconfig.cpp
    src/gtk/joypadconfig.cpp
    src/gtk/directoriesconfig.cpp
    src/gtk/displayconfig.cpp
    src/gtk/soundconfig.cpp
    src/gtk/screenarea.cpp
    src/gtk/screenarea-cairo.cpp
    src/gtk/screenarea-opengl.cpp
    src/gtk/tools.cpp
    src/gtk/window.cpp
    src/sdl/inputSDL.cpp
    src/common/SoundSDL.cpp
)

IF( NOT NO_DEBUGGER )
    SET(SRC_DEBUGGER
        src/gba/armdis.cpp
        src/gba/elf.cpp
        src/gba/remote.cpp
    )
ENDIF( NOT NO_DEBUGGER )

IF(CMAKE_ASM_COMPILER_LOADED AND USE_ASM_SCALERS)
    SET(SRC_HQ ${SRC_HQ_ASM})
ELSE(CMAKE_ASM_COMPILER_LOADED AND USE_ASM_SCALERS)
    SET(SRC_HQ ${SRC_HQ_C})
ENDIF(CMAKE_ASM_COMPILER_LOADED AND USE_ASM_SCALERS)

INCLUDE_DIRECTORIES(
    ${ZLIB_INCLUDE_DIR}
    fex
    ${PNG_INCLUDE_DIR}
    ${SDL_INCLUDE_DIR}
)

IF( CAN_BUILD_GVBAM )
    INCLUDE_DIRECTORIES(
        ${GLIBMM_INCLUDE_DIRS}
        ${GIOMM_INCLUDE_DIRS}
        ${GTKMM_INCLUDE_DIRS}
        ${GTKGLMM_INCLUDE_DIRS}
        ${GLADEMM_INCLUDE_DIRS}
    )

    LINK_DIRECTORIES(
        ${GLIBMM_LIBRARY_DIRS}
        ${GIOMM_LIBRARY_DIRS}
        ${GTKMM_LIBRARY_DIRS}
        ${GTKGLMM_LIBRARY_DIRS}
        ${GLADEMM_LIBRARY_DIRS}
    )
ENDIF( CAN_BUILD_GVBAM )

ADD_LIBRARY(
    fex
    ${SRC_FEX}
)

ADD_LIBRARY (
    vbamcore
    ${PROJECT_SRCS}
    ${SRC_MAIN}
    ${SRC_GBA}
    ${SRC_GB}
    ${SRC_APU}
    ${SRC_FILTERS}
    ${SRC_DEBUGGER}
)

IF( CAN_BUILD_VBAM )
    ADD_EXECUTABLE (
        vbam
        WIN32
        ${SRC_SDL}
        ${SRC_HQ}
    )

    IF( WIN32 )
        SET( WIN32_LIBRARIES wsock32 )
    ENDIF( WIN32 )

    IF( WITH_LIRC )
        SET( LIRC_CLIENT_LIBRARY lirc_client )
    ENDIF( WITH_LIRC )

    TARGET_LINK_LIBRARIES (
        vbam
        vbamcore
        ${SDL_LIBRARY}
        ${ZLIB_LIBRARY}
        ${PNG_LIBRARY}
        ${OPENGL_LIBRARY}
        ${WIN32_LIBRARIES}
        ${LIRC_CLIENT_LIBRARY}
        ${SFML_LIBRARY}
        fex
    )

    INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/vbam DESTINATION bin)
    INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/sdl/vbam.cfg-example
            DESTINATION ${SYSCONFDIR}
            RENAME vbam.cfg)

ENDIF( CAN_BUILD_VBAM )

IF( CAN_BUILD_GVBAM )
    ADD_EXECUTABLE (
        gvbam
        WIN32
        MACOSX_BUNDLE
        ${SRC_GTK}
    )

    TARGET_LINK_LIBRARIES (
        gvbam
        vbamcore
        ${ZLIB_LIBRARY}
        ${PNG_LIBRARY}
        ${GLADEMM_LIBRARIES}
        ${SDL_LIBRARY}
        ${GTKGLMM_LIBRARIES}
        ${SFML_LIBRARY}
        fex
    )

    INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/gvbam DESTINATION bin)
    INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/gvbam.desktop DESTINATION share/applications)
    INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/icons/ DESTINATION share/icons/hicolor PATTERN ".svn" EXCLUDE)
    INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/gtk/ui DESTINATION ${DATA_INSTALL_DIR} PATTERN ".svn" EXCLUDE)

ENDIF( CAN_BUILD_GVBAM )