# Copyright 2017 The NXT Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

cmake_minimum_required(VERSION 2.8)
project(nxt C CXX)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug" CACHE STRING
        "Build type (Debug, Release, RelWithDebInfo, MinSizeRel)" FORCE)
endif()

################################################################################
# Configuration options
################################################################################

option(NXT_USE_WERROR "Treat warnings as error (useful for CI)" 0)

# Default values for the backend-enabling options
set(ENABLE_D3D12 OFF)
set(ENABLE_METAL OFF)
if (WIN32)
    set(ENABLE_D3D12 ON)
elseif(APPLE)
    set(ENABLE_METAL ON)
endif()

option(NXT_ENABLE_D3D12 "Enable compilation of the D3D12 backend" ${ENABLE_D3D12})
option(NXT_ENABLE_METAL "Enable compilation of the Metal backend" ${ENABLE_METAL})
option(NXT_ENABLE_NULL "Enable compilation of the Null backend" ON)
option(NXT_ENABLE_OPENGL "Enable compilation of the OpenGL backend" ON)
option(NXT_ENABLE_VULKAN "Enable compilation of the Vulkan backend" OFF)
option(NXT_ALWAYS_ASSERT "Enable assertions on all build types" OFF)

################################################################################
# Precompute compile flags and defines, functions to set them
################################################################################

set(NXT_FLAGS "")
set(NXT_DEFS "")
set(NXT_INTERNAL_FLAGS "")
set(NXT_INTERNAL_DEFS "")
set(NXT_GENERATED_FLAGS "")

set(NXT_ENABLE_ASSERTS $<OR:$<CONFIG:Debug>,$<BOOL:${NXT_ALWAYS_ASSERT}>>)

list(APPEND NXT_DEFS $<${NXT_ENABLE_ASSERTS}:NXT_ENABLE_ASSERTS>)

if (NXT_ENABLE_D3D12)
    list(APPEND NXT_INTERNAL_DEFS "NXT_ENABLE_BACKEND_D3D12")
endif()
if (NXT_ENABLE_METAL)
    list(APPEND NXT_INTERNAL_DEFS "NXT_ENABLE_BACKEND_METAL")
endif()
if (NXT_ENABLE_NULL)
    list(APPEND NXT_INTERNAL_DEFS "NXT_ENABLE_BACKEND_NULL")
endif()
if (NXT_ENABLE_OPENGL)
    list(APPEND NXT_INTERNAL_DEFS "NXT_ENABLE_BACKEND_OPENGL")
endif()
if (NXT_ENABLE_VULKAN)
    list(APPEND NXT_INTERNAL_DEFS "NXT_ENABLE_BACKEND_VULKAN")
endif()

if (WIN32)
    # Define NOMINMAX to prevent conflicts between std::min/max and the min/max macros in WinDef.h
    list(APPEND NXT_DEFS "NOMINMAX")
    # Avoid Windows.h including a lot of headers
    list(APPEND NXT_DEFS "WIN32_LEAN_AND_MEAN")
    # Remove compile error where the mock NXT creates too many sections for the old obj format.
    list(APPEND NXT_FLAGS "/bigobj")
endif()

if (MSVC)
    list(APPEND NXT_FLAGS "/std:c++14")
    list(APPEND NXT_INTERNAL_FLAGS "/W4")
    # Allow declarations hiding members as it is used all over NXT
    list(APPEND NXT_INTERNAL_FLAGS "/wd4458")
    list(APPEND NXT_INTERNAL_FLAGS "/wd4996") # Allow deprecated functions like strncpy

    list(APPEND NXT_GENERATED_FLAGS "/wd4702") # Allow unreachable code
    list(APPEND NXT_GENERATED_FLAGS "/wd4189") # Allow unused variable

    if(NXT_USE_WERROR)
        list(APPEND NXT_INTERNAL_FLAGS "/WX")
    endif()
else()
    # Activate C++14 only on C++ files, not C files.
    list(APPEND NXT_FLAGS "$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:-std=c++14>")
    # enable -Wold-style-cast on C++
    list(APPEND NXT_FLAGS "$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:-Wold-style-cast>")
    list(APPEND NXT_FLAGS "-fPIC")

    list(APPEND NXT_INTERNAL_FLAGS "-Wall" "-Wextra")
    list(APPEND NXT_INTERNAL_FLAGS "-pedantic")
    list(APPEND NXT_GENERATED_FLAGS "-Wno-unused-variable" "-Wno-unused-function")

    if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
        # don't break the build on older clang versions
        list(APPEND NXT_INTERNAL_FLAGS "-Wno-error=unknown-warning-option")
        # GCC's conversion warnings are less useful than clang's
        list(APPEND NXT_INTERNAL_FLAGS "-Wconversion" "-Wno-sign-conversion")
        # disable a clang-only -pedantic warning
        list(APPEND NXT_INTERNAL_FLAGS "-Wno-gnu-zero-variadic-macro-arguments")
        # additional potentially useful warnings (feel free to remove if they prove un-useful)
        list(APPEND NXT_INTERNAL_FLAGS "-Wextra-semi")
        list(APPEND NXT_INTERNAL_FLAGS "-Wstrict-aliasing")
        list(APPEND NXT_INTERNAL_FLAGS "-Wunreachable-code")
        list(APPEND NXT_GENERATED_FLAGS "-Wno-unreachable-code")
        # Probably okay to enable if we establish a field naming convention:
        #list(APPEND NXT_INTERNAL_FLAGS "-Wshadow")
    endif()
    if(NXT_USE_WERROR)
        list(APPEND NXT_INTERNAL_FLAGS "-Werror")
    endif()
endif()

function(NXTExternalTarget folder target)
    set_property(TARGET ${target} APPEND PROPERTY COMPILE_OPTIONS ${NXT_FLAGS})
    set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS ${NXT_DEFS})
    set_property(TARGET ${target} PROPERTY FOLDER "nxt/${folder}")
endfunction()

function(NXTInternalTarget folder target)
    NXTExternalTarget("${folder}" ${target})
    set_property(TARGET ${target} APPEND PROPERTY COMPILE_OPTIONS ${NXT_INTERNAL_FLAGS})
    set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS ${NXT_INTERNAL_DEFS})

    # Group the target sources by folder to have folders show in Visual Studio
    if (MSVC)
        get_target_property(targetSources ${target} SOURCES)
        foreach(sourceFile IN ITEMS ${targetSources})
            if (IS_ABSOLUTE "${sourceFile}")
                file(RELATIVE_PATH sourceFile "${CMAKE_CURRENT_SOURCE_DIR}" "${sourceFile}")
            endif()
            get_filename_component(sourceDir "${sourceFile}" PATH)
            string(REPLACE "/" "\\" sourceDir "${sourceDir}")
            source_group("${sourceDir}" FILES "${sourceFile}")
        endforeach()
    endif()
endfunction()

# Enable the creation of folders for Visual Studio projects
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

################################################################################
# Generate the C and C++ NXT APIs
################################################################################

set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/include)
set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)

add_subdirectory(generator)

Generate(
    LIB_NAME nxt
    LIB_TYPE STATIC
    PRINT_NAME libNXT
    COMMAND_LINE_ARGS
        ${GENERATOR_COMMON_ARGS}
        -T nxt
)
target_include_directories(nxt PUBLIC ${GENERATED_DIR})

Generate(
    LIB_NAME nxtcpp
    LIB_TYPE STATIC
    PRINT_NAME libNXT++
    COMMAND_LINE_ARGS
        ${GENERATOR_COMMON_ARGS}
        -T nxtcpp
)
target_include_directories(nxtcpp PUBLIC ${GENERATED_DIR} PUBLIC ${INCLUDE_DIR})
target_link_libraries(nxtcpp nxt)

################################################################################
# Call to other CMakeLists.txt
################################################################################

add_subdirectory(third_party)

add_subdirectory(src/common)
add_subdirectory(src/backend)
add_subdirectory(src/wire)
add_subdirectory(src/utils)
add_subdirectory(src/tests)

add_subdirectory(examples)
