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