1# 2# Copyright (C) 2018 Huawei Technologies Co, Ltd. 3# 4 5cmake_minimum_required(VERSION 3.10) 6cmake_policy(SET CMP0091 NEW) # Required by CMAKE_MSVC_RUNTIME_LIBRARY 7project(LumeShaderCompiler) 8 9if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") 10 # enable multi-processor compilation. 11 add_compile_options(/MP) 12 13 # use the statically linked runtime libarary to not require a specific vs runtime from the user 14 set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") 15endif() 16 17#workaround for "PythonInterp" finds old version of python... 18find_package (Python3 COMPONENTS Interpreter) 19set(Python_EXECUTABLE ${Python3_EXECUTABLE} CACHE STRING "" FORCE) 20 21if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") 22 #make a staticly linked executable with hidden / gc symbols. (to minimize) 23 #also we use libc++ so build with clang. 24 set(CMAKE_THREAD_PREFER_PTHREAD true) 25 SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") 26 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -stdlib=libc++ -Wl,--gc-sections -Wl,--exclude-libs,ALL") 27 add_compile_options(-stdlib=libc++ -fvisibility=hidden -ffunction-sections -fdata-sections) 28 #workaround for spirv-tools forcibly linking LIBRT with out actually needing it (blocks static link) 29 set(LIBRT "" CACHE STRING "" FORCE) 30endif() 31 32include(ExternalProject) 33find_package(PythonInterp 3) 34if(NOT ${PYTHONINTERP_FOUND}) 35 message(FATAL_ERROR "Python interpreter required to build shaderc/spirv-tools etc..") 36endif() 37set(CMAKE_CXX_STANDARD 17) 38set(CMAKE_CXX_STANDARD_REQUIRED ON) 39set(CMAKE_CXX_EXTENSIONS OFF) 40set_property(GLOBAL PROPERTY USE_FOLDERS ON) 41 42function(get_all_targets _result _dir) 43 get_property(_subdirs DIRECTORY "${_dir}" PROPERTY SUBDIRECTORIES) 44 foreach(_subdir IN LISTS _subdirs) 45 get_all_targets(${_result} "${_subdir}") 46 endforeach() 47 get_property(_sub_targets DIRECTORY "${_dir}" PROPERTY BUILDSYSTEM_TARGETS) 48 set(${_result} ${${_result}} ${_sub_targets} PARENT_SCOPE) 49endfunction() 50 51function(add_subdirectory_with_folder _folder_name _folder) 52 add_subdirectory(${_folder} ${ARGN} EXCLUDE_FROM_ALL) 53 54 get_all_targets(_targets "${_folder}") 55 foreach(_target IN LISTS _targets) 56 set_target_properties( 57 ${_target} 58 PROPERTIES FOLDER "${_folder_name}" 59 ) 60 endforeach() 61endfunction() 62 63cmake_policy(SET CMP0077 OLD) 64 65#set default and modified options for glslang 66set(ENABLE_CTEST OFF CACHE BOOL "" FORCE) 67set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) 68set(BUILD_TESTING OFF CACHE BOOL "" FORCE) 69set(SKIP_GLSLANG_INSTALL ON CACHE BOOL "" FORCE) 70set(ENABLE_SPVREMAPPER OFF CACHE BOOL "" FORCE) 71set(ENABLE_GLSLANG_BINARIES OFF CACHE BOOL "" FORCE) 72set(ENABLE_HLSL OFF CACHE BOOL "" FORCE) 73set(ENABLE_OPT OFF CACHE BOOL "" FORCE) 74 75#set default and modified options for spirv-tools 76set(SKIP_SPIRV_TOOLS_INSTALL ON CACHE BOOL "" FORCE) 77set(SPIRV_BUILD_COMPRESSION OFF CACHE BOOL "" FORCE) 78set(SPIRV_WERROR OFF CACHE BOOL "" FORCE) 79set(SPIRV_WARN_EVERYTHING OFF CACHE BOOL "" FORCE) 80set(SPIRV_COLOR_TERMINAL ON CACHE BOOL "" FORCE) 81set(SPIRV_LOG_DEBUG OFF CACHE BOOL "" FORCE) 82set(SPIRV_SKIP_EXECUTABLES ON CACHE BOOL "" FORCE) 83set(SPIRV_SKIP_TESTS ON CACHE BOOL "" FORCE) 84set(SPIRV_CHECK_CONTEXT ON CACHE BOOL "" FORCE) 85set(SPIRV_TOOLS_INSTALL_EMACS_HELPERS OFF CACHE BOOL "" FORCE) 86 87#set default and modified options for spirv-cross 88set(SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS OFF CACHE BOOL "") 89set(SPIRV_CROSS_CLI OFF CACHE BOOL "" FORCE) 90set(SPIRV_CROSS_ENABLE_CPP OFF CACHE BOOL "" FORCE) 91set(SPIRV_CROSS_ENABLE_C_API OFF CACHE BOOL "" FORCE) 92set(SPIRV_CROSS_ENABLE_TESTS OFF CACHE BOOL "" FORCE) 93set(SPIRV_CROSS_ENABLE_GLSL ON CACHE BOOL "" FORCE) 94set(SPIRV_CROSS_ENABLE_HLSL OFF CACHE BOOL "" FORCE) 95set(SPIRV_CROSS_ENABLE_MSL OFF CACHE BOOL "" FORCE) 96set(SPIRV_CROSS_ENABLE_REFLECT OFF CACHE BOOL "" FORCE) 97set(SPIRV_CROSS_ENABLE_UTIL OFF CACHE BOOL "" FORCE) 98set(SPIRV_CROSS_SKIP_INSTALL ON CACHE BOOL "" FORCE) 99 100string(REPLACE "/foundation" ";" TEMP_PATH ${CMAKE_CURRENT_LIST_FILE}) 101list(GET TEMP_PATH 0 OHOS_ROOT_PATH) 102set(SPIRV_TOOLS_PATH "${OHOS_ROOT_PATH}/third_party/spirv-tools") 103set(SPIRV_TOOLS_EXTENSION_PATH "${OHOS_ROOT_PATH}/third_party/vk-gl-cts/build/external/spirv-tools/spirv-tools") 104# temp solution 105#set(SPIRV_CROSS_PATH "${OHOS_ROOT_PATH}/third_party/spirv-cross") 106set(SPIRV_CROSS_PATH "${OHOS_ROOT_PATH}/third_party/skia/third_party/externals/spirv-cross") 107set(GLSLANG_PATH "${OHOS_ROOT_PATH}/third_party/glslang") 108set(KHRONOS_GL "${OHOS_ROOT_PATH}/third_party/openGLES/api/GL") 109set(KHRONOS_KHR "${OHOS_ROOT_PATH}/third_party/EGL/api") 110 111# SPIRV-Headers causes "INTERFACE_LIBRARY targets may only have whitelisted properties.", but we don't need to include is as it's header only 112add_library(SPIRV-Headers INTERFACE) 113target_sources(SPIRV-Headers INTERFACE "${OHOS_ROOT_PATH}/third_party/spirv-headers") 114set(SPIRV-Headers_SOURCE_DIR "${OHOS_ROOT_PATH}/third_party/spirv-headers") 115message(STATUS "spirv-tools: ${SPIRV_TOOLS_PATH} spirv-cross: ${SPIRV_CROSS_PATH} spirv-headers: ${SPIRV-Headers_SOURCE_DIR} glslang: ${GLSLANG_PATH}") 116add_subdirectory(${SPIRV_TOOLS_PATH} "3rdPartyST" EXCLUDE_FROM_ALL) 117add_subdirectory(${GLSLANG_PATH} "3rdPartyGL" EXCLUDE_FROM_ALL) 118add_subdirectory(${SPIRV_CROSS_PATH} "3rdPartCross" EXCLUDE_FROM_ALL ) 119#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) 120#string(REGEX REPLACE "tags/([0-9]+).([0-9]+).([0-9]+)" "(\\1 * 10000) + (\\2 * 100) + (\\3)" GLSLANG_VERSION ${GLSLANG_VERSION}) 121 122#math(EXPR GLSLANG_VERSION "${GLSLANG_VERSION}") 123set(GLSLANG_VERSION "120000") 124 125set(sources 126 src/compiler_main.h 127 src/compiler_main.cpp 128 src/shader_type.h 129 src/default_limits.h 130 src/default_limits.cpp 131 src/io/dev/FileMonitor.h 132 src/io/dev/FileMonitor.cpp 133 src/lume/Log.h 134 src/lume/log/Logger.h 135 src/lume/log/Logger.cpp 136 src/lume/log/LoggerOutput.cpp 137 src/array_view.h 138 src/spirv_cross_helpers_gles.cpp 139 src/spirv_cross_helpers_gles.h 140 src/spirv_cross_helper_structs_gles.h 141 src/spirv_opt_strip_extensions.h 142 src/spirv_opt_strip_extensions.cpp 143 src/spirv_opt_extensions.h 144 src/spirv_opt_extensions.cpp 145 src/main.cpp 146) 147source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${sources}) 148 149set(executable "LumeShaderCompiler") 150add_executable(${executable} ${sources}) 151target_include_directories(${executable} PRIVATE 152 include 153 src 154 ${SPIRV_TOOLS_PATH} 155 ${SPIRV_TOOLS_EXTENSION_PATH} 156 ${KHRONOS_KHR} 157 ${KHRONOS_GL} 158) 159 160target_compile_definitions(${executable} PRIVATE GLSLANG_VERSION=${GLSLANG_VERSION} ) 161target_compile_definitions(${executable} PRIVATE LUME_PUBLIC= WIN32_LEAN_AND_MEAN=1) 162# Strip all debug logging code from a release build. 163target_compile_definitions(${executable} PRIVATE 164 __STDC_WANT_LIB_EXT1__=1 165 "$<$<CONFIG:Release>:LUME_LOG_NO_DEBUG>" 166 "$<$<CONFIG:MinSizeRel>:LUME_LOG_NO_DEBUG>" 167) 168target_link_libraries(${executable} PRIVATE glslang SPIRV) 169target_link_libraries(${executable} PRIVATE SPIRV-Tools-opt 170 spirv-cross-core 171 spirv-cross-glsl 172 $<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,9.0>>:stdc++fs> 173 $<$<AND:$<CXX_COMPILER_ID:Clang>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,9.0>>:stdc++fs> 174) 175 176 177if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") 178 target_link_libraries(${executable} PRIVATE c++abi) 179 set_target_properties(${executable} PROPERTIES LINK_FLAGS_RELEASE -s) 180endif() 181 182 183option(SHADERCOMPILER_UNIT_TESTS_ENABLED "Build SHADERCOMPILER unit tests" OFF) 184# 185# Testing project. Not enabled by default. 186# 187if(SHADERCOMPILER_UNIT_TESTS_ENABLED) 188 # API Unit tests 189 add_subdirectory(test/src_unit_test) 190 add_test(NAME shaderCompilerSRC COMMAND shaderCompilerSRCTestRunner) 191 192 enable_testing() 193endif() 194 195