raldus/roland

View on GitHub
CMakeLists.txt

Summary

Maintainability
Test Coverage
cmake_minimum_required(VERSION 2.8)

project(ROLAND CXX C)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/assets/cmake")
math(EXPR CMAKE_BITS ${CMAKE_SIZEOF_VOID_P}*8)

set(PACKAGE_TITLE "Roland" CACHE STRING "Package Title")
set(PACKAGE_NAME  "roland" CACHE STRING "Package Name")
set(PACKAGE_DEPLOY  "RPM;DEB" CACHE STRING "Package deploy")

set(ROLAND_ASSETS  "${CMAKE_SOURCE_DIR}/assets")

if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(ROLAND_ROOTDIR "${ROLAND_ASSETS}")
    set(ROLAND_DATADIR "${ROLAND_ROOTDIR}/app")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(ROLAND_ROOTDIR "${CMAKE_INSTALL_PREFIX}/share/${PACKAGE_NAME}")
    set(ROLAND_DATADIR "${ROLAND_ROOTDIR}")
endif()

set(ROLAND_ROMDIR  "${ROLAND_ROOTDIR}/roms")
set(ROLAND_DISKDIR "${ROLAND_ROOTDIR}/disks")
set(ROLAND_AMSROM  "${ROLAND_ROOTDIR}/roms/amsdos.rom")
set(ROLAND_CPCROM  "${ROLAND_ROOTDIR}/roms/cpc6128.rom")

#set(CMAKE_BINARY_DIR       "${CMAKE_SOURCE_DIR}/bin" CACHE STRING "Build Dir")
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin" CACHE STRING "Executable Output Path")
set(LIBRARY_OUTPUT_PATH    "${CMAKE_BINARY_DIR}/bin" CACHE STRING "Library Output Path")

if (NOT EXISTS "${CMAKE_BINARY_DIR}/version") 
    if(UNIX)
        execute_process(COMMAND "${ROLAND_ASSETS}/gen_changelog.sh" OUTPUT_FILE "${CMAKE_SOURCE_DIR}/CHANGELOG.md")
    endif()
        execute_process(COMMAND git describe --abbrev=0 --tags --always OUTPUT_VARIABLE PACKAGE_VERSION)
        string(REGEX REPLACE "\n$" "" PACKAGE_VERSION "${PACKAGE_VERSION}")
        file(WRITE "${CMAKE_BINARY_DIR}/version" "${PACKAGE_VERSION}")
    else() 
        file(READ "${CMAKE_BINARY_DIR}/version" PACKAGE_VERSION)
endif()

if (WIN32)
    set(_WIN32 TRUE CACHE BOOL "Win32")
endif (WIN32)

if (MSVC)
    #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ROLAND_BUILD_VERBOSE:lib")
    set(_WIN32 TRUE BOOL)

    if (${CMAKE_GENERATOR} MATCHES "Visual Studio 14 2015")
        if (${CMAKE_SIZEOF_VOID_P} EQUAL "8")
            message(FATAL_ERROR "SDL Prebuild libs for 64bit not available")
            set(SDL_LIBRARY "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc2015/lib/x64/SDL.lib")
            set(SDL_LIBRARY "${SDL_LIBRARY};${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc2015/lib/x64/SDLmain.lib")
            set(SDLIMAGE_LIBRARY "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc2015/lib/x64/SDL_image.lib")
        else()
            set(SDL_LIBRARY "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc2015/lib/x86/SDL.lib")
            set(SDL_LIBRARY "${SDL_LIBRARY};${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc2015/lib/x86/SDLmain.lib")
            set(SDLIMAGE_LIBRARY "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc2015/lib/x86/SDL_image.lib")
        endif()
        set(SDL_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc2015/include")
    else()
        if (${CMAKE_SIZEOF_VOID_P} EQUAL "8")
            set(SDL_LIBRARY "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc/lib/x64/SDL.lib")
            set(SDL_LIBRARY "${SDL_LIBRARY};${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc/lib/x64/SDLmain.lib")
            set(SDLIMAGE_LIBRARY "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc/lib/x64/SDL_image.lib")
        else()
            set(SDL_LIBRARY "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc/lib/x86/SDL.lib")
            set(SDL_LIBRARY "${SDL_LIBRARY};${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc/lib/x86/SDLmain.lib")
            set(SDLIMAGE_LIBRARY "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc/lib/x86/SDL_image.lib")
        endif()
        set(SDL_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/sdl-vc/include")
    endif()
endif (MSVC)

if(UNIX)
    # C++ version
    include(CheckCXXCompilerFlag)
    CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
    CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
    if(COMPILER_SUPPORTS_CXX11)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    elseif(COMPILER_SUPPORTS_CXX0X)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
    else()
        message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. \
                        Please use a different C++ compiler.")
    endif()

    # C++ flags
    set(CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG}   -Wall")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")


    if(${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND ${CMAKE_SIZEOF_VOID_P} EQUAL "8")
        set(LIB_SUFFIX "64")
    endif()
    
    # eclipse stop on error
    add_definitions(-Wfatal-errors)
    # be ROLAND_BUILD_VERBOSE
    if(${ROLAND_BUILD_VERBOSE})
        add_definitions(-Wall -Wextra -pedantic -Wno-unused-parameter)
        if (CMAKE_BUILD_TYPE STREQUAL "Debug")
            set(VERBOSE 1)
        endif()
    endif()


    # SDL
    find_package(SDL REQUIRED)
    find_package(SDL_image REQUIRED)
    include_directories("${SDL_INCLUDE_DIR}")

endif(UNIX)

# sdl
include_directories("${SDL_INCLUDE_DIR}")
message(STATUS "SDL_INCLUDE_DIR:  ${SDL_INCLUDE_DIR}")
message(STATUS "SDL_LIBRARY:      ${SDL_LIBRARY}")
message(STATUS "SDLIMAGE_LIBRARY: ${SDLIMAGE_LIBRARY}")

# roland
option(ROLAND_BUILD_VERBOSE "ROLAND_BUILD_VERBOSE" TRUE)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(DEBUG 1)
endif()
add_definitions("-DHAVE_CONFIG_H")
configure_file("${ROLAND_ASSETS}/config.h.in" 
               "${PROJECT_SOURCE_DIR}/src/config.h")
configure_file("${ROLAND_ASSETS}/roland.spec.in" 
               "${CMAKE_BINARY_DIR}/roland.spec")

install(DIRECTORY "${ROLAND_ASSETS}/roms"  DESTINATION "${CMAKE_INSTALL_PREFIX}/share/${PACKAGE_NAME}")
install(DIRECTORY "${ROLAND_ASSETS}/disks" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/${PACKAGE_NAME}")
install(DIRECTORY "${ROLAND_ASSETS}/app/"  DESTINATION "${CMAKE_INSTALL_PREFIX}/share/${PACKAGE_NAME}")


# Compiler Specifications
include(CompilerSpec)


# doxygen target to generate API documentation with Doxygen
find_package(Doxygen)
if(DOXYGEN_FOUND)
    configure_file("${ROLAND_ASSETS}/doxyfile.in" 
                   "${CMAKE_BINARY_DIR}/doxyfile" @ONLY)
    
    file(GLOB ROLAND_FONTS "${ROLAND_ASSETS}/dox/Amstrad-CPC*")
    file(COPY ${ROLAND_FONTS} DESTINATION "${CMAKE_BINARY_DIR}/doc/html/")
    
    file(GLOB ROLAND_HTML "${ROLAND_ASSETS}/dox/*.html")
    file(COPY ${ROLAND_HTML} DESTINATION "${CMAKE_BINARY_DIR}/doc/html/")
    
    add_custom_target(doc
        ${DOXYGEN_EXECUTABLE} "${CMAKE_BINARY_DIR}/doxyfile"
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        COMMENT "Generating API documentation with Doxygen" VERBATIM)
endif(DOXYGEN_FOUND)

# uninstall target
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_BINARY_DIR}/CMakeModules)
configure_file(
    "${CMAKE_SOURCE_DIR}/assets/uninstall.in"
    "${CMAKE_BINARY_DIR}/uninstall"
    IMMEDIATE @ONLY)
add_custom_target(uninstall
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/uninstall)


set(ROLAND_DESKTOP_DIR  "${ROLAND_DATADIR}")
set(ROLAND_PIXMAPS_DIR  "${ROLAND_DATADIR}")

set(CPACK_CMAKE_GENERATOR "Unix Makefiles")
set(CPACK_GENERATOR "STGZ;TGZ;TZ")
set(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR};${PACKAGE_NAME};ALL;/")
set(CPACK_OUTPUT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CPackConfig.cmake")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Amstrad Emulator based on Caprice Source rewritten in C++")
set(CPACK_PACKAGE_EXECUTABLES "${PACKAGE_NAME};${PACKAGE_TITLE}")
if(${PACKAGE_NUMBER})
        set(CPACK_PACKAGE_FILE_NAME "${PACKAGE_NAME}-${CMAKE_BUILD_TYPE}-${PACKAGE_VERSION}_${PACKAGE_NUMBER}")
else()
        set(CPACK_PACKAGE_FILE_NAME "${PACKAGE_NAME}-${CMAKE_BUILD_TYPE}-${PACKAGE_VERSION}")
endif()
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PACKAGE_NAME}-${PACKAGE_VERSION}")
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${PACKAGE_NAME}-${PACKAGE_VERSION}")
set(CPACK_PACKAGE_NAME ${PACKAGE_NAME})
set(CPACK_PACKAGE_CONTACT "Fred Klaus <development@rolandemu.de")
set(CPACK_PACKAGE_VENDOR  "Fred Klaus <development@rolandemu.de")
set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README  "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_SOURCE_GENERATOR "TBZ2;ZIP;RPM;DEB")
set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CPackSourceConfig.cmake")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${PACKAGE_NAME}-${PACKAGE_VERSION}.src")
set(CPACK_SOURCE_STRIP_FILES "")
set(CPACK_STRIP_FILES "${EXECUTABLE_OUTPUT_PATH}/roland")
set(CPACK_SYSTEM_NAME "x86_64")
set(CPACK_TOPLEVEL_TAG "Linux-x86_64")
set(CPACK_SOURCE_IGNORE_FILES ".directory;.git/;3rdparty/;build/;doc/")
set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})

set(CPACK_RPM_PACKAGE_NAME "${PACKAGE_NAME}")
set(CPACK_RPM_PACKAGE_VERSION "${PACKAGE_VERSION}")
set(CPACK_RPM_PACKAGE_MAINTAINER "Fred Klaus") #required
set(CPACK_RPM_PACKAGE_REQUIRES "libSDL-1_2-0 >= 1.2, libSDL_image-1_2-0 >= 1.2")
set(CPACK_RPM_PACKAGE_GROUP "System/Emulators/PC")
set(CPACK_RPM_PACKAGE_URL "https://www.rolandemu.de")

set(CPACK_DEBIAN_PACKAGE_NAME "${PACKAGE_NAME}")
set(CPACK_DEBIAN_PACKAGE_VERSION "${PACKAGE_VERSION}")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Fred Klaus") #required
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libsdl-image1.2 (>= 1.2), libsdl1.2debian (>= 1.2)")
set(CPACK_DEBIAN_PACKAGE_GROUP "System/Emulators/PC")
set(CPACK_DEBIAN_PACKAGE_URL "https://www.rolandemu.de")

set(CPACK_NSIS_PACKAGE_NAME "${PACKAGE_NAME}")
set(CPACK_NSIS_DISPLAY_NAME "${PACKAGE_TITLE} ${PACKAGE_VERSION} ${CMAKE_BUILD_TYPE}")
set(CPACK_NSIS_CONTACT "development@rolandemu.de")

if(UNIX)
    set(CPACK_GENERATOR "${PACKAGE_DEPLOY}")
else()
    set(CPACK_GENERATOR "ZIP;NSIS")
endif()

include(CPack)


include_directories("${PROJECT_SOURCE_DIR}/src")
include_directories("${PROJECT_SOURCE_DIR}/src/common")
include_directories("${PROJECT_SOURCE_DIR}/src/common/filesys")
include_directories("${PROJECT_SOURCE_DIR}/src/cpc")
include_directories("${PROJECT_SOURCE_DIR}/src/cpc/z80")
include_directories("${PROJECT_SOURCE_DIR}/src/cpc/floppy")
include_directories("${PROJECT_SOURCE_DIR}/src/sdltk")

add_subdirectory(src)

# output
message("")
message("  * ${PACKAGE_TITLE} ${PACKAGE_VERSION} ${CMAKE_BUILD_TYPE} ${CMAKE_BITS}bit")
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    message("  * CXX_FLAGS_DEBUG..: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
endif()
if (CMAKE_BUILD_TYPE STREQUAL "Release")
    message("  * CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
endif()
message("")
message("  * ROLAND_ROOTDIR: ${ROLAND_ROOTDIR}")
message("")