# Copyright 2020 The Dawn 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.

if (NOT TARGET SPIRV-Headers)
    set(SPIRV_HEADERS_SKIP_EXAMPLES ON)
    set(SPIRV_HEADERS_SKIP_INSTALL ON)

    message(STATUS "Dawn: using SPIRV-Headers at ${DAWN_SPIRV_HEADERS_DIR}")
    add_subdirectory(${DAWN_SPIRV_HEADERS_DIR})
endif()

if (NOT TARGET SPIRV-Tools)
    set(SPIRV_SKIP_TESTS ON)
    set(SPIRV_SKIP_EXECUTABLES ON)
    set(SKIP_SPIRV_TOOLS_INSTALL ON)

    message(STATUS "Dawn: using SPIRV-Tools at ${DAWN_SPIRV_TOOLS_DIR}")
    add_subdirectory(${DAWN_SPIRV_TOOLS_DIR})
endif()

if (NOT TARGET glslang)
    set(SKIP_GLSLANG_INSTALL ON)
    set(ENABLE_SPVREMAPPER OFF)
    set(ENABLE_GLSLANG_BINARIES OFF)
    set(ENABLE_CTEST OFF)

    message(STATUS "Dawn: using GLSLang at ${DAWN_GLSLANG_DIR}")
    add_subdirectory(${DAWN_GLSLANG_DIR})
endif()

if (TARGET shaderc)
    if (NOT TARGET shaderc_spvc)
        message(FATAL_ERROR "Dawn: If shaderc is configured before Dawn, it must include SPVC")
    endif()
else()
    set(SHADERC_SKIP_TESTS ON)
    set(SHADERC_SKIP_INSTALL ON)
    set(SHADERC_ENABLE_SPVC ON)

    # Let SPVC's CMakeLists.txt deal with configuring SPIRV-Cross
    set(SPIRV_CROSS_ENABLE_TESTS OFF)
    set(SHADERC_SPIRV_CROSS_DIR "${DAWN_SPIRV_CROSS_DIR}")

    message(STATUS "Dawn: using shaderc[_spvc] at ${DAWN_SHADERC_DIR}")
    message(STATUS "Dawn:  - with SPIRV-Cross at ${DAWN_SPIRV_CROSS_DIR}")
    add_subdirectory(${DAWN_SHADERC_DIR})
endif()

if (DAWN_BUILD_EXAMPLES)
    if (NOT TARGET glfw)
        set(GLFW_BUILD_DOCS OFF)
        set(GLFW_BUILD_TESTS OFF)
        set(GLFW_BUILD_EXAMPLES OFF)

        message(STATUS "Dawn: using GLFW at ${DAWN_GLFW_DIR}")
        add_subdirectory(${DAWN_GLFW_DIR})
    endif()

    if (NOT TARGET glm)
        message(STATUS "Dawn: using GLM at ${DAWN_GLM_DIR}")
        add_subdirectory(${DAWN_GLM_DIR})
    endif()
endif()
