• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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