# vim: ts=4:sw=4:expandtab
CMAKE_MINIMUM_REQUIRED(VERSION 3.14...3.26 FATAL_ERROR)

## Check user set options.
IF(NOT CMAKE_BUILD_TYPE)
    MESSAGE(STATUS "CMAKE_BUILD_TYPE was not set by user; setting build type to Debug")
    SET(CMAKE_BUILD_TYPE "Debug")
ELSE()
    # List of valid build types
    SET(VALID_BUILD_TYPES Debug Release RelWithDebInfo MinSizeRel)
    LIST(FIND VALID_BUILD_TYPES ${CMAKE_BUILD_TYPE} IS_VALID_BUILD_TYPE)
    IF(IS_VALID_BUILD_TYPE EQUAL -1)
        MESSAGE(FATAL_ERROR "CMAKE_BUILD_TYPE was '${CMAKE_BUILD_TYPE}' but can only be set to one of ${VALID_BUILD_TYPES}")
    ENDIF()
ENDIF()

# Obtain version
INCLUDE(../../version.all)

# Initialise project information.
PROJECT(peanut-sdl
    LANGUAGES C
    VERSION
    ${PEANUTGB_VERSION_MAJOR}.${PEANUTGB_VERSION_MINOR}.${PEANUTGB_VERSION_PATCH}
    DESCRIPTION "Peanut-GB example with SDL2"
    HOMEPAGE_URL "https://github.com/deltabeard/peanut-gb")

# Add dependencies to project.
IF(NOT ${CMAKE_BUILD_TYPE} STREQUAL "Debug" AND APPLE)
    SET(EXE_TARGET_TYPE MACOSX_BUNDLE)
    MESSAGE(VERBOSE "Setting EXE type to MACOSX Bundle")
ELSEIF(NOT ${CMAKE_BUILD_TYPE} STREQUAL "Debug" AND MSVC)
    SET(EXE_TARGET_TYPE WIN32)
    MESSAGE(VERBOSE "Setting EXE type to WIN32")
ENDIF()

ADD_EXECUTABLE(${PROJECT_NAME} ${EXE_TARGET_TYPE})
TARGET_SOURCES(${PROJECT_NAME} PRIVATE peanut_sdl.c
    ../../peanut_gb.h
    minigb_apu/minigb_apu.c
    minigb_apu/minigb_apu.h)
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PRIVATE ../../)

# Discover libraries
IF(MSVC)
    SET(DEFAULT_LIBRARY_DISCOVER_METHOD "CPM")
ELSE()
    SET(DEFAULT_LIBRARY_DISCOVER_METHOD "PKG_CONFIG")
ENDIF()
SET(LIBRARY_DISCOVER_METHOD DEFAULT_LIBRARY_DISCOVER_METHOD CACHE STRING
    "Tool to use for discovering dependencies; options are: PKG_CONFIG, CPM")
SET(ENABLE_SOUND ON CACHE BOOL "Enable sound output")

IF(${LIBRARY_DISCOVER_METHOD} STREQUAL "PKG_CONFIG")
    INCLUDE(FindPkgConfig)
    PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
ELSEIF(${LIBRARY_DISCOVER_METHOD} STREQUAL "CPM")
    INCLUDE(CPM.cmake)
    CPMADDPACKAGE(GITHUB_REPOSITORY libsdl-org/SDL
        NAME SDL2
        GIT_TAG release-2.26.5
        OPTIONS
        "SDL_SHARED_ENABLED_BY_DEFAULT OFF"
        "SDL_STATIC_ENABLED_BY_DEFAULT ON")

    TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ${SDL2_SOURCE_DIR}/include)
    TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE SDL2-static SDL2main)
ELSE()
    MESSAGE(SEND_ERROR "LIBRARY_DISCOVER_METHOD '${LIBRARY_DISCOVER_METHOD}' is not valid")
ENDIF()

# Add required dependencies
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${SDL2_LIBRARIES})

# Some FindSDL2 modules use slightly different variables, so we just use both.
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ${SDL2_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR})

IF("${CMAKE_C_BYTE_ORDER}" STREQUAL "LITTLE_ENDIAN")
    ADD_COMPILE_DEFINITIONS(PEANUT_GB_IS_LITTLE_ENDIAN=1)
elseif("${CMAKE_C_BYTE_ORDER}" STREQUAL "BIG_ENDIAN")
    ADD_COMPILE_DEFINITIONS(PEANUT_GB_IS_LITTLE_ENDIAN=0)
else()
    message(FATAL_ERROR "CMAKE_C_BYTE_ORDER has unexpected value '${CMAKE_C_BYTE_ORDER}'")
ENDIF()

# Add definitions of project information.
ADD_COMPILE_DEFINITIONS(COMPANY=Deltabeard)
ADD_COMPILE_DEFINITIONS(DESCRIPTION=${PROJECT_DESCRIPTION})
ADD_COMPILE_DEFINITIONS(LICENSE=MIT)
ADD_COMPILE_DEFINITIONS(NAME=${PROJECT_NAME})
ADD_COMPILE_DEFINITIONS(ICON_FILE=${CMAKE_SOURCE_DIR}/meta/icon.ico)

IF(${ENABLE_SOUND})
    ADD_COMPILE_DEFINITIONS(ENABLE_SOUND=1)
    ADD_COMPILE_DEFINITIONS(ENABLE_SOUND_MINIGB)
ELSE()
    ADD_COMPILE_DEFINITIONS(ENABLE_SOUND=0)
ENDIF()

EXECUTE_PROCESS(
    COMMAND git describe --dirty --always --tags --long
    WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
    RESULT_VARIABLE GIT_RESULT
    OUTPUT_VARIABLE GIT_VER
    OUTPUT_STRIP_TRAILING_WHITESPACE)
IF(NOT GIT_RESULT EQUAL 0)
    SET(GIT_VER "LOCAL")
ENDIF()

# Platform specific options
IF(MSVC)
    ADD_COMPILE_DEFINITIONS(GIT_VER=${GIT_VER})
    ADD_COMPILE_DEFINITIONS(EXE_VER=${PEANUTGB_VERSION_MAJOR},${PEANUTGB_VERSION_MINOR},${PEANUTGB_VERSION_PATCH},0)
    ADD_COMPILE_DEFINITIONS(_CRT_SECURE_NO_WARNINGS)
    TARGET_SOURCES(${PROJECT_NAME} PRIVATE meta/winres.rc)
    SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY VS_DPI_AWARE "PerMonitor")
    TARGET_COMPILE_OPTIONS(${PROJECT_NAME} PRIVATE /W3)
ENDIF()

IF(APPLE)
    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES
        MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}"
        MACOSX_BUNDLE_BUNDLE_VERSION "${peanut-sdl_VERSION}"
        MACOSX_BUNDLE_COPYRIGHT "MIT"
        MACOSX_BUNDLE_INFO_STRING "${PROJECT_DESCRIPTION}"
        MACOSX_BUNDLE_SHORT_VERSION_STRING "${peanut-sdl_VERSION}"
        MACOSX_BUNDLE_LONG_VERSION_STRING "${GIT_VER}")
    INSTALL(TARGETS peanut-sdl BUNDLE DESTINATION
        ${CMAKE_INSTALL_BINDIR}/${PROJECT_NAME})
ELSE()
    INSTALL(TARGETS peanut-sdl RUNTIME)
ENDIF()

SET(CPACK_PACKAGE_VENDOR Deltabeard)
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_DESCRIPTION})
SET(CPACK_PACKAGE_ICON meta/icon.ico)
SET(CPACK_PACKAGE_EXECUTABLES peanut-sdl;Peanut-SDL)
INCLUDE(CPack)

MESSAGE(STATUS "Peanut-SDL ${peanut-sdl_VERSION} (git: ${GIT_VER}) will build with the following options:")
MESSAGE(STATUS "  CC:      ${CMAKE_C_COMPILER} '${CMAKE_C_COMPILER_ID}' on '${CMAKE_SYSTEM_NAME}'")
MESSAGE(STATUS "  CFLAGS:  ${CMAKE_C_FLAGS}")
MESSAGE(STATUS "  LDFLAGS: ${CMAKE_EXE_LINKER_FLAGS}")
