18bf80f4bSopenharmony_ci# Copyright (C) 2023 Huawei Device Co., Ltd.
28bf80f4bSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
38bf80f4bSopenharmony_ci# you may not use this file except in compliance with the License.
48bf80f4bSopenharmony_ci# You may obtain a copy of the License at
58bf80f4bSopenharmony_ci#
68bf80f4bSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
78bf80f4bSopenharmony_ci#
88bf80f4bSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
98bf80f4bSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
108bf80f4bSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
118bf80f4bSopenharmony_ci# See the License for the specific language governing permissions and
128bf80f4bSopenharmony_ci# limitations under the License.
138bf80f4bSopenharmony_ci
148bf80f4bSopenharmony_cicmake_minimum_required(VERSION 3.10)
158bf80f4bSopenharmony_ciproject(LumeShaderCompiler)
168bf80f4bSopenharmony_ci
178bf80f4bSopenharmony_ciif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
188bf80f4bSopenharmony_ci    # enable multi-processor compilation
198bf80f4bSopenharmony_ci    add_compile_options(/MP)
208bf80f4bSopenharmony_ciendif()
218bf80f4bSopenharmony_ci
228bf80f4bSopenharmony_ci#workaround for "PythonInterp" finds old version of python...
238bf80f4bSopenharmony_cifind_package (Python3 COMPONENTS Interpreter)
248bf80f4bSopenharmony_ciset(Python_EXECUTABLE ${Python3_EXECUTABLE} CACHE STRING "" FORCE)
258bf80f4bSopenharmony_ci
268bf80f4bSopenharmony_ciif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
278bf80f4bSopenharmony_ci    #make a staticly linked executable with hidden / gc symbols. (to minimize)
288bf80f4bSopenharmony_ci    #also we use libc++ so build with clang.
298bf80f4bSopenharmony_ci    set(CMAKE_THREAD_PREFER_PTHREAD true)
308bf80f4bSopenharmony_ci    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
318bf80f4bSopenharmony_ci    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -stdlib=libc++ -Wl,--gc-sections -Wl,--exclude-libs,ALL")
328bf80f4bSopenharmony_ci    add_compile_options(-stdlib=libc++ -fvisibility=hidden -ffunction-sections -fdata-sections)
338bf80f4bSopenharmony_ci    #workaround for spirv-tools forcibly linking LIBRT with out actually needing it (blocks static link)
348bf80f4bSopenharmony_ci    set(LIBRT "" CACHE STRING "" FORCE)
358bf80f4bSopenharmony_ciendif()
368bf80f4bSopenharmony_ci
378bf80f4bSopenharmony_ciinclude(ExternalProject)
388bf80f4bSopenharmony_cifind_package(PythonInterp 3)
398bf80f4bSopenharmony_ciif(NOT ${PYTHONINTERP_FOUND})
408bf80f4bSopenharmony_ci    message(FATAL_ERROR "Python interpreter required to build shaderc/spirv-tools etc..")
418bf80f4bSopenharmony_ciendif()
428bf80f4bSopenharmony_ciset(CMAKE_CXX_STANDARD 17)
438bf80f4bSopenharmony_ciset(CMAKE_CXX_STANDARD_REQUIRED ON)
448bf80f4bSopenharmony_ciset(CMAKE_CXX_EXTENSIONS OFF)
458bf80f4bSopenharmony_ciset_property(GLOBAL PROPERTY USE_FOLDERS ON)
468bf80f4bSopenharmony_ci
478bf80f4bSopenharmony_cifunction(get_all_targets _result _dir)
488bf80f4bSopenharmony_ci    get_property(_subdirs DIRECTORY "${_dir}" PROPERTY SUBDIRECTORIES)
498bf80f4bSopenharmony_ci    foreach(_subdir IN LISTS _subdirs)
508bf80f4bSopenharmony_ci        get_all_targets(${_result} "${_subdir}")
518bf80f4bSopenharmony_ci    endforeach()
528bf80f4bSopenharmony_ci    get_property(_sub_targets DIRECTORY "${_dir}" PROPERTY BUILDSYSTEM_TARGETS)
538bf80f4bSopenharmony_ci    set(${_result} ${${_result}} ${_sub_targets} PARENT_SCOPE)
548bf80f4bSopenharmony_ciendfunction()
558bf80f4bSopenharmony_ci
568bf80f4bSopenharmony_cifunction(add_subdirectory_with_folder _folder_name _folder)
578bf80f4bSopenharmony_ci    add_subdirectory(${_folder} ${ARGN} EXCLUDE_FROM_ALL)
588bf80f4bSopenharmony_ci
598bf80f4bSopenharmony_ci    get_all_targets(_targets "${_folder}")
608bf80f4bSopenharmony_ci    foreach(_target IN LISTS _targets)
618bf80f4bSopenharmony_ci        set_target_properties(
628bf80f4bSopenharmony_ci            ${_target}
638bf80f4bSopenharmony_ci            PROPERTIES FOLDER "${_folder_name}"
648bf80f4bSopenharmony_ci        )
658bf80f4bSopenharmony_ci    endforeach()
668bf80f4bSopenharmony_ciendfunction()
678bf80f4bSopenharmony_ci
688bf80f4bSopenharmony_cicmake_policy(SET CMP0077 OLD)
698bf80f4bSopenharmony_ci
708bf80f4bSopenharmony_ci#set default and modified options for glslang
718bf80f4bSopenharmony_ciset(ENABLE_CTEST OFF CACHE BOOL "" FORCE) 
728bf80f4bSopenharmony_ciset(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
738bf80f4bSopenharmony_ciset(BUILD_TESTING OFF CACHE BOOL "" FORCE)
748bf80f4bSopenharmony_ciset(SKIP_GLSLANG_INSTALL ON CACHE BOOL "" FORCE)
758bf80f4bSopenharmony_ciset(ENABLE_SPVREMAPPER OFF CACHE BOOL "" FORCE)
768bf80f4bSopenharmony_ciset(ENABLE_GLSLANG_BINARIES OFF CACHE BOOL "" FORCE)
778bf80f4bSopenharmony_ciset(ENABLE_HLSL OFF CACHE BOOL "" FORCE)
788bf80f4bSopenharmony_ciset(ENABLE_OPT OFF CACHE BOOL "" FORCE)
798bf80f4bSopenharmony_ci
808bf80f4bSopenharmony_ci#set default and modified options for spirv-tools
818bf80f4bSopenharmony_ciset(SKIP_SPIRV_TOOLS_INSTALL ON CACHE BOOL "" FORCE)
828bf80f4bSopenharmony_ciset(SPIRV_BUILD_COMPRESSION OFF CACHE BOOL "" FORCE)
838bf80f4bSopenharmony_ciset(SPIRV_WERROR OFF CACHE BOOL "" FORCE)
848bf80f4bSopenharmony_ciset(SPIRV_WARN_EVERYTHING OFF CACHE BOOL "" FORCE)
858bf80f4bSopenharmony_ciset(SPIRV_COLOR_TERMINAL ON CACHE BOOL "" FORCE)
868bf80f4bSopenharmony_ciset(SPIRV_LOG_DEBUG OFF CACHE BOOL "" FORCE)
878bf80f4bSopenharmony_ciset(SPIRV_SKIP_EXECUTABLES ON CACHE BOOL "" FORCE)
888bf80f4bSopenharmony_ciset(SPIRV_SKIP_TESTS ON CACHE BOOL "" FORCE)
898bf80f4bSopenharmony_ciset(SPIRV_CHECK_CONTEXT ON CACHE BOOL "" FORCE)
908bf80f4bSopenharmony_ciset(SPIRV_TOOLS_INSTALL_EMACS_HELPERS OFF CACHE BOOL "" FORCE)
918bf80f4bSopenharmony_ci
928bf80f4bSopenharmony_ci#set default and modified options for spirv-cross
938bf80f4bSopenharmony_ciset(SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS OFF CACHE BOOL "")
948bf80f4bSopenharmony_ciset(SPIRV_CROSS_CLI OFF CACHE BOOL "" FORCE)
958bf80f4bSopenharmony_ciset(SPIRV_CROSS_ENABLE_CPP OFF CACHE BOOL "" FORCE)
968bf80f4bSopenharmony_ciset(SPIRV_CROSS_ENABLE_C_API OFF CACHE BOOL "" FORCE)
978bf80f4bSopenharmony_ciset(SPIRV_CROSS_ENABLE_TESTS OFF CACHE BOOL "" FORCE)
988bf80f4bSopenharmony_ciset(SPIRV_CROSS_ENABLE_GLSL ON CACHE BOOL "" FORCE)
998bf80f4bSopenharmony_ciset(SPIRV_CROSS_ENABLE_HLSL OFF CACHE BOOL "" FORCE)
1008bf80f4bSopenharmony_ciset(SPIRV_CROSS_ENABLE_MSL OFF CACHE BOOL "" FORCE)
1018bf80f4bSopenharmony_ciset(SPIRV_CROSS_ENABLE_REFLECT OFF CACHE BOOL "" FORCE)
1028bf80f4bSopenharmony_ciset(SPIRV_CROSS_ENABLE_UTIL OFF CACHE BOOL "" FORCE)
1038bf80f4bSopenharmony_ciset(SPIRV_CROSS_SKIP_INSTALL ON CACHE BOOL "" FORCE)
1048bf80f4bSopenharmony_ci
1058bf80f4bSopenharmony_cistring(REPLACE "/foundation" ";" TEMP_PATH ${CMAKE_CURRENT_LIST_FILE})
1068bf80f4bSopenharmony_cilist(GET TEMP_PATH 0 OHOS_ROOT_PATH)
1078bf80f4bSopenharmony_ciset(SPIRV_TOOLS_PATH "${OHOS_ROOT_PATH}/third_party/spirv-tools")
1088bf80f4bSopenharmony_ci# temp solution
1098bf80f4bSopenharmony_ci#set(SPIRV_CROSS_PATH "${OHOS_ROOT_PATH}/third_party/spirv-cross")
1108bf80f4bSopenharmony_ciset(SPIRV_CROSS_PATH "${OHOS_ROOT_PATH}/third_party/skia/third_party/externals/spirv-cross")
1118bf80f4bSopenharmony_ciset(GLSLANG_PATH "${OHOS_ROOT_PATH}/third_party/glslang")
1128bf80f4bSopenharmony_ciset(KHRONOS_GL "${OHOS_ROOT_PATH}/third_party/openGLES/api/GL")
1138bf80f4bSopenharmony_ciset(KHRONOS_KHR "${OHOS_ROOT_PATH}/third_party/EGL/api/KHR")
1148bf80f4bSopenharmony_ci
1158bf80f4bSopenharmony_ci# SPIRV-Headers causes "INTERFACE_LIBRARY targets may only have whitelisted properties.", but we don't need to include is as it's header only
1168bf80f4bSopenharmony_ciadd_library(SPIRV-Headers INTERFACE)
1178bf80f4bSopenharmony_citarget_sources(SPIRV-Headers INTERFACE "${OHOS_ROOT_PATH}/third_party/spirv-headers")
1188bf80f4bSopenharmony_ciset(SPIRV-Headers_SOURCE_DIR "${OHOS_ROOT_PATH}/third_party/spirv-headers")
1198bf80f4bSopenharmony_cimessage(STATUS "spirv-tools: ${SPIRV_TOOLS_PATH} spirv-cross: ${SPIRV_CROSS_PATH} spirv-headers: ${SPIRV-Headers_SOURCE_DIR} glslang: ${GLSLANG_PATH}")
1208bf80f4bSopenharmony_ciadd_subdirectory(${SPIRV_TOOLS_PATH} "3rdPartyST" EXCLUDE_FROM_ALL)
1218bf80f4bSopenharmony_ciadd_subdirectory(${GLSLANG_PATH} "3rdPartyGL" EXCLUDE_FROM_ALL)
1228bf80f4bSopenharmony_ciadd_subdirectory(${SPIRV_CROSS_PATH} "3rdPartCross" EXCLUDE_FROM_ALL )
1238bf80f4bSopenharmony_ci#execute_process(COMMAND git describe --all WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/glslang" OUTPUT_VARIABLE GLSLANG_VERSION COMMAND_ERROR_IS_FATAL ANY OUTPUT_STRIP_TRAILING_WHITESPACE)
1248bf80f4bSopenharmony_ci#string(REGEX REPLACE "tags/([0-9]+).([0-9]+).([0-9]+)" "(\\1 * 10000) + (\\2 * 100) + (\\3)" GLSLANG_VERSION ${GLSLANG_VERSION})
1258bf80f4bSopenharmony_ciset(GLSLANG_VERSION "120000")
1268bf80f4bSopenharmony_ci#math(EXPR GLSLANG_VERSION "${GLSLANG_VERSION}")
1278bf80f4bSopenharmony_ci
1288bf80f4bSopenharmony_ciset(sources
1298bf80f4bSopenharmony_ci    src/main.cpp
1308bf80f4bSopenharmony_ci    src/shader_type.h
1318bf80f4bSopenharmony_ci    src/default_limits.h
1328bf80f4bSopenharmony_ci    src/default_limits.cpp
1338bf80f4bSopenharmony_ci    src/io/dev/FileMonitor.h
1348bf80f4bSopenharmony_ci    src/io/dev/FileMonitor.cpp
1358bf80f4bSopenharmony_ci    src/lume/Log.h
1368bf80f4bSopenharmony_ci    src/lume/log/Logger.h
1378bf80f4bSopenharmony_ci    src/lume/log/Logger.cpp
1388bf80f4bSopenharmony_ci    src/lume/log/LoggerOutput.cpp
1398bf80f4bSopenharmony_ci    src/array_view.h
1408bf80f4bSopenharmony_ci    src/spirv_cross_helpers_gles.cpp
1418bf80f4bSopenharmony_ci    src/spirv_cross_helpers_gles.h
1428bf80f4bSopenharmony_ci    src/spirv_cross_helper_structs_gles.h
1438bf80f4bSopenharmony_ci)
1448bf80f4bSopenharmony_cisource_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${sources})
1458bf80f4bSopenharmony_ci
1468bf80f4bSopenharmony_ciset(executable "LumeShaderCompiler")
1478bf80f4bSopenharmony_ciadd_executable(${executable} ${sources})
1488bf80f4bSopenharmony_citarget_include_directories(${executable} PRIVATE
1498bf80f4bSopenharmony_ci    include
1508bf80f4bSopenharmony_ci    src
1518bf80f4bSopenharmony_ci	${KHRONOS_GL}
1528bf80f4bSopenharmony_ci	${KHRONOS_KHR}
1538bf80f4bSopenharmony_ci)
1548bf80f4bSopenharmony_ci
1558bf80f4bSopenharmony_citarget_link_libraries(${executable} PRIVATE glslang SPIRV)
1568bf80f4bSopenharmony_citarget_link_libraries(${executable} PRIVATE SPIRV-Tools-opt
1578bf80f4bSopenharmony_ci    spirv-cross-core
1588bf80f4bSopenharmony_ci    spirv-cross-glsl
1598bf80f4bSopenharmony_ci    $<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,9.0>>:stdc++fs>
1608bf80f4bSopenharmony_ci    $<$<AND:$<CXX_COMPILER_ID:Clang>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,9.0>>:stdc++fs>
1618bf80f4bSopenharmony_ci)
1628bf80f4bSopenharmony_ci
1638bf80f4bSopenharmony_ci
1648bf80f4bSopenharmony_ciif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
1658bf80f4bSopenharmony_ci    target_link_libraries(${executable} PRIVATE c++abi)
1668bf80f4bSopenharmony_ci    set_target_properties(${executable} PROPERTIES LINK_FLAGS_RELEASE -s)
1678bf80f4bSopenharmony_ciendif()
1688bf80f4bSopenharmony_ci
1698bf80f4bSopenharmony_citarget_compile_definitions(${executable} PRIVATE GLSLANG_VERSION=${GLSLANG_VERSION} )
1708bf80f4bSopenharmony_citarget_compile_definitions(${executable} PRIVATE LUME_PUBLIC= WIN32_LEAN_AND_MEAN=1)
1718bf80f4bSopenharmony_ci
1728bf80f4bSopenharmony_ci# Strip all debug logging code from a release build.
1738bf80f4bSopenharmony_citarget_compile_definitions(${executable} PRIVATE
1748bf80f4bSopenharmony_ci    "$<$<CONFIG:Release>:LUME_LOG_NO_DEBUG>"
1758bf80f4bSopenharmony_ci    "$<$<CONFIG:MinSizeRel>:LUME_LOG_NO_DEBUG>"
1768bf80f4bSopenharmony_ci)
1778bf80f4bSopenharmony_ci
1788bf80f4bSopenharmony_ci# Tool for generating shader from template and snippet blocks.
1798bf80f4bSopenharmony_ciset(sources
1808bf80f4bSopenharmony_ci    src/json.h
1818bf80f4bSopenharmony_ci    $<$<BOOL:${MSVC_IDE}>:src/json.natvis>
1828bf80f4bSopenharmony_ci    src/snippet.cpp
1838bf80f4bSopenharmony_ci)
1848bf80f4bSopenharmony_cisource_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${sources})
185