nappgui-sys 0.2.0

Rust raw bindings to NAppGUI
Documentation
#------------------------------------------------------------------------------
# This is part of NAppGUI build system
# See README.md and LICENSE.txt
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------

if (NOT NAPPGUI_ROOT_PATH)
    message(FATAL_ERROR "NAPPGUI_ROOT_PATH is not set.")
endif()

#------------------------------------------------------------------------------

# Configurations
include(${NAPPGUI_ROOT_PATH}/prj/NAppGenerators.cmake)
nap_generator_multiconfig(isMultiConfig)

if (isMultiConfig)
    set(CMAKE_BUILD_TYPE "Multiconfig [${CMAKE_CONFIGURATION_TYPES}]")
else()
    set(CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo;MinSizeRel")
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "${CMAKE_CONFIGURATION_TYPES}")
    if (NOT CMAKE_BUILD_TYPE)
        set(CMAKE_BUILD_TYPE "Debug")
    endif()
endif()

#------------------------------------------------------------------------------
# Compiler Settings for all targets in the solution
#------------------------------------------------------------------------------
macro(nap_config_compiler)

include(${NAPPGUI_ROOT_PATH}/prj/NAppUtils.cmake)

if (WIN32)

    if (${CMAKE_SIZEOF_VOID_P} STREQUAL 4)
        set(CMAKE_HOST_ARCHITECTURE "x86")
        set(CMAKE_ARCHITECTURE "x86")
    elseif (${CMAKE_SIZEOF_VOID_P} STREQUAL 8)
        set(CMAKE_HOST_ARCHITECTURE "x64")
        set(CMAKE_ARCHITECTURE "x64")
    else ()
        message (FATAL_ERROR "Unknown processor architecture")
    endif()

    if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)

        include(${NAPPGUI_ROOT_PATH}/prj/NAppMSVC.cmake)

        # Standard C Library Static or Dynamic
        # set(CMAKE_RUNTIME_LIBRARY static CACHE STRING "C Standard library static or dynamic linking.")
        # set_property(CACHE CMAKE_RUNTIME_LIBRARY PROPERTY STRINGS "static;dynamic")
        set(CMAKE_RUNTIME_LIBRARY "static")
        nap_msvc_flags(${CMAKE_RUNTIME_LIBRARY})

        # msvc definitions
        nap_msvc_warnings(msvcWarnList)
        string(REPLACE ";" " " msvcWarnList "${msvcWarnList}")
        string(REGEX REPLACE "/W[1-3]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:fast ${msvcWarnList}")
        string(REGEX REPLACE "/W[1-3]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fp:fast ${msvcWarnList}")
        add_definitions(-D_WINDOWS -DUNICODE -D_UNICODE /nologo)
        
        # Force compiler to read UTF-8
        add_compile_options("/source-charset:utf-8")

        # For Non-Visual Studio generators
        if (NOT CMAKE_VS_PLATFORM_TOOLSET)
            nap_msvc_toolset()
        endif()

        # Enhaced instruction set x86 Processors
        if (${CMAKE_ARCHITECTURE} STREQUAL "x86")
            if (${CMAKE_VS_PLATFORM_TOOLSET} STREQUAL "v80")
                # Not Set in VS2005 is /arch:IA32
            elseif (${CMAKE_VS_PLATFORM_TOOLSET} STREQUAL "v90")
                add_definitions(/arch:SSE)
            else()
                add_definitions(/arch:SSE2)
            endif()
        endif()

        set(CMAKE_COMPILER_TOOLSET ${CMAKE_VS_PLATFORM_TOOLSET})

    elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
        include(${NAPPGUI_ROOT_PATH}/prj/NAppGCC.cmake)

        # Required macros for Windows (defined in MSVC)
        add_definitions(-D_WINDOWS -DUNICODE -D_UNICODE)

        if (${CMAKE_SIZEOF_VOID_P} STREQUAL 4)
            add_definitions(-D_M_IX86)
        elseif (${CMAKE_SIZEOF_VOID_P} STREQUAL 8)
            add_definitions(-D_M_AMD64)
        endif()

        # GCC Version
        if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6)
            message(FATAL_ERROR "GCC 4.6 is the minimum supported version in Linux.")
        endif()

        # Compiler toolset
        set(CMAKE_COMPILER_TOOLSET mwgcc${CMAKE_CXX_COMPILER_VERSION})
        string(REPLACE "." "_" CMAKE_COMPILER_TOOLSET ${CMAKE_COMPILER_TOOLSET})

        # Set extra flags for GCC 'CMAKE_CXX_FLAGS' 'CMAKE_C_FLAGS'
        nap_gcc_flags(${CMAKE_ARCHITECTURE})

    elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
        include(${NAPPGUI_ROOT_PATH}/prj/NAppClang.cmake)

        # Required macros for Windows (defined in MSVC)
        add_definitions(-D_WINDOWS -DUNICODE -D_UNICODE)

        if (${CMAKE_SIZEOF_VOID_P} STREQUAL 4)
            add_definitions(-D_M_IX86)
        elseif (${CMAKE_SIZEOF_VOID_P} STREQUAL 8)
            add_definitions(-D_M_AMD64)
        endif()

        # Clang Version
        if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
            message(FATAL_ERROR "Clang 5.0 is the minimum supported version in Windows.")
        endif()

        # Compiler toolset
        set(CMAKE_COMPILER_TOOLSET mwclang${CMAKE_CXX_COMPILER_VERSION})
        string(REPLACE "." "_" CMAKE_COMPILER_TOOLSET ${CMAKE_COMPILER_TOOLSET})

        # Set extra flags for Clang 'CMAKE_CXX_FLAGS' 'CMAKE_C_FLAGS'
        nap_clang_flags(${CMAKE_ARCHITECTURE})

    else()
        message (FATAL_ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}")

    endif()

# Apple configuration
#------------------------------------------------------------------------------
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")

    include(${NAPPGUI_ROOT_PATH}/prj/NAppMacOS.cmake)

    # Get the Base SDK
    if (NOT CMAKE_OSX_SYSROOT)
        message(FATAL_ERROR "CMAKE_OSX_SYSROOT is not set")
    endif()

    get_filename_component(CMAKE_BASE_OSX_SDK ${CMAKE_OSX_SYSROOT} NAME)
    string(REPLACE "MacOSX" "" CMAKE_BASE_OSX_SDK ${CMAKE_BASE_OSX_SDK})
    string(REPLACE ".sdk" "" CMAKE_BASE_OSX_SDK ${CMAKE_BASE_OSX_SDK})

    # Get the Deployment target
    set(CMAKE_OSX_DEPLOYMENT_TARGET ${CMAKE_BASE_OSX_SDK} CACHE STRING "Minimun macOS SDK to support")
    if (NOT CMAKE_OSX_DEPLOYMENT_TARGET)
        set(CMAKE_OSX_DEPLOYMENT_TARGET ${CMAKE_BASE_OSX_SDK})
    endif()

    # Compiler toolset
    set(CMAKE_COMPILER_TOOLSET sdk${CMAKE_OSX_DEPLOYMENT_TARGET})
    string(REPLACE "." "_" CMAKE_COMPILER_TOOLSET ${CMAKE_COMPILER_TOOLSET})

    # Print BaseSDK/Deployment messages
    nap_macos_sdk_name("${CMAKE_BASE_OSX_SDK}" baseSDKName)
    nap_macos_sdk_name("${CMAKE_OSX_DEPLOYMENT_TARGET}" deploySDKName)
    nap_build_opt("BASE_OSX" "${CMAKE_BASE_OSX_SDK}")
    nap_build_opt("BASE_OSX_NAME" "${baseSDKName}")
    nap_build_opt("DEPLOYMENT_TARGET_OSX" "${CMAKE_OSX_DEPLOYMENT_TARGET}")
    nap_build_opt("DEPLOYMENT_TARGET_OSX_NAME" "${deploySDKName}")

    # Invalid deployment target
    if (CMAKE_OSX_DEPLOYMENT_TARGET VERSION_GREATER CMAKE_BASE_OSX_SDK)
        message(FATAL_ERROR "Deployment target '${CMAKE_OSX_DEPLOYMENT_TARGET}' greater than base SDK '${CMAKE_BASE_OSX_SDK}'")
    endif()

    # Host architecture
    if (CMAKE_HOST_SYSTEM_PROCESSOR)
        nap_osx_arch(${CMAKE_HOST_SYSTEM_PROCESSOR} CMAKE_HOST_ARCHITECTURE)
    else()
        message(FATAL_ERROR "- Unknown 'CMAKE_HOST_SYSTEM_PROCESSOR'")
    endif()

    # Build architecture
    if (NOT CMAKE_ARCHITECTURE)
        set(CMAKE_ARCHITECTURE ${CMAKE_HOST_ARCHITECTURE})
    endif()
    nap_osx_build_arch(${CMAKE_ARCHITECTURE} CMAKE_OSX_ARCHITECTURES)

    if (${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
        include(${NAPPGUI_ROOT_PATH}/prj/NAppAppleClang.cmake)
        nap_apple_clang_flags()

    elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
        include(${NAPPGUI_ROOT_PATH}/prj/NAppGCC.cmake)

        # GCC Version
        if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.2)
            message(FATAL_ERROR "GCC 4.2 is the minimum supported version in macOS.")
        endif()

        nap_gcc_flags("")

    else()
        message (FATAL_ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}")

    endif()

    if(CMAKE_GENERATOR STREQUAL "Xcode")
        nap_build_opt("XCODE_VERSION" "${XCODE_VERSION}")
    endif()

    # Libraries
    set(COCOA_LIB ${CMAKE_OSX_SYSROOT}/System/Library/Frameworks/Cocoa.framework)
    if (CMAKE_OSX_DEPLOYMENT_TARGET VERSION_GREATER 11.9999)
        set(COCOA_LIB ${COCOA_LIB};${CMAKE_OSX_SYSROOT}/System/Library/Frameworks/UniformTypeIdentifiers.framework)
    endif()

# Linux configuration
#------------------------------------------------------------------------------
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")

    # Look for Linux platform
    find_program(LSB_RELEASE lsb_release)
    execute_process(COMMAND ${LSB_RELEASE} -is OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE)
    execute_process(COMMAND ${LSB_RELEASE} -rs OUTPUT_VARIABLE LSB_RELEASE_VERSION_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE)
    unset(LSB_RELEASE CACHE)

    if (LSB_RELEASE_ID_SHORT AND LSB_RELEASE_VERSION_SHORT)
        nap_build_opt("LINUX_PLATFORM" "${LSB_RELEASE_ID_SHORT} ${LSB_RELEASE_VERSION_SHORT}")
    else()
        nap_build_opt("LINUX_PLATFORM" "Unknown")
    endif()

    # Host architecture
    # Intel 32 bits
    if (${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "i386" OR
        ${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "i486" OR
        ${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "i586" OR
        ${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "i686")
        set(CMAKE_HOST_ARCHITECTURE "x86")
        set(CMAKE_ARCHITECTURE "x86" CACHE STRING "Processor architecture")
        set_property(CACHE CMAKE_ARCHITECTURE PROPERTY STRINGS x86)

    # Intel 64 bits
    elseif (${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
        set(CMAKE_HOST_ARCHITECTURE "x64")
        set(CMAKE_ARCHITECTURE "x64" CACHE STRING "Processor architecture")
        set_property(CACHE CMAKE_ARCHITECTURE PROPERTY STRINGS x86 x64)

    # ARM 64 bits
    elseif (${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "aarch64")
        set(CMAKE_HOST_ARCHITECTURE "arm64")
        set(CMAKE_ARCHITECTURE "arm64" CACHE STRING "Processor architecture")
        set_property(CACHE CMAKE_ARCHITECTURE PROPERTY STRINGS arm64)

    # ARM 32 bits
    elseif (${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "armv7.*")
        set(CMAKE_HOST_ARCHITECTURE "arm")
        set(CMAKE_ARCHITECTURE "arm" CACHE STRING "Processor architecture")
        set_property(CACHE CMAKE_ARCHITECTURE PROPERTY STRINGS arm)

    else()
        message(FATAL_ERROR "- Unknown 'CMAKE_HOST_SYSTEM_PROCESSOR:${CMAKE_HOST_SYSTEM_PROCESSOR}'")

    endif()

    # GCC Compiler is used
    if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
        include(${NAPPGUI_ROOT_PATH}/prj/NAppGCC.cmake)

        # GCC Version
        if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6)
            message(FATAL_ERROR "GCC 4.6 is the minimum supported version in Linux.")
        endif()

        # Compiler toolset
        set(CMAKE_COMPILER_TOOLSET gcc${CMAKE_CXX_COMPILER_VERSION})
        string(REPLACE "." "_" CMAKE_COMPILER_TOOLSET ${CMAKE_COMPILER_TOOLSET})

        # Set extra flags for GCC 'CMAKE_CXX_FLAGS' 'CMAKE_C_FLAGS'
        nap_gcc_flags(${CMAKE_ARCHITECTURE})

    # Clang Compiler is used
    elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
        include(${NAPPGUI_ROOT_PATH}/prj/NAppClang.cmake)

        # Clang Version
        if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.0)
            message(FATAL_ERROR "Clang 3.0 is the minimum supported version in Linux.")
        endif()

        # Compiler toolset
        set(CMAKE_COMPILER_TOOLSET clang${CMAKE_CXX_COMPILER_VERSION})
        string(REPLACE "." "_" CMAKE_COMPILER_TOOLSET ${CMAKE_COMPILER_TOOLSET})

        # Set extra flags for Clang 'CMAKE_CXX_FLAGS' 'CMAKE_C_FLAGS'
        nap_clang_flags(${CMAKE_ARCHITECTURE})

    else()
        message (FATAL_ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}")

    endif()

    # ToolKit
    set(CMAKE_TOOLKIT "GTK3" CACHE STRING "User interface Toolkit")
    set_property(CACHE CMAKE_TOOLKIT PROPERTY STRINGS "GTK3;None")

    if (${CMAKE_TOOLKIT} STREQUAL "None")
        nap_build_opt("TOOLKIT" "None")

    elseif (${CMAKE_TOOLKIT} STREQUAL "GTK3")
        nap_build_opt("TOOLKIT" "GTK3")
        set(CMAKE_COMPILER_TOOLSET ${CMAKE_COMPILER_TOOLSET}_gtk3)

    else()
        message(FATAL_ERROR "Unknown toolkit ${CMAKE_TOOLKIT}")

    endif()

else()
    message(FATAL_ERROR "Unknown Platform (${CMAKE_SYSTEM_NAME})")

endif()

set(CMAKE_PACKAGE_ID "${CMAKE_COMPILER_TOOLSET}_${CMAKE_ARCHITECTURE}")

endmacro()