summaryrefslogtreecommitdiffstats
path: root/external/CMakeLists.txt
blob: 9a27f7bcc55d5e6894ce2002f206b512df6d69c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# Don't let all these packages spam up with status messages, filter to only the
# important stuff.
# Don't change things however if the user has explicitly set
# CMAKE_MESSAGE_LOG_LEVEL
set(set_cmake_log_level FALSE)
if(NOT CMAKE_MESSAGE_LOG_LEVEL)
    set(set_cmake_log_level TRUE)
    set(CMAKE_MESSAGE_LOG_LEVEL NOTICE)
endif()

if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25")
    set(system SYSTEM)
else()
    message(
        STATUS
        "CMake 3.25 is required to suppress warnings originating in headers in external/ but you are using ${CMAKE_VERSION}, be prepared for some warnings"
    )
    set(system)
endif()

# Similarly, disable warnings for external projects
if(NOT SLANG_ENABLE_EXTERNAL_COMPILER_WARNINGS)
    if(MSVC)
        add_compile_options(/W0)
    else()
        add_compile_options(-w)
    endif()
endif()

if(NOT ${SLANG_USE_SYSTEM_UNORDERED_DENSE})
    add_subdirectory(unordered_dense EXCLUDE_FROM_ALL ${system})
endif()

# Miniz
if(NOT ${SLANG_USE_SYSTEM_MINIZ})
    add_subdirectory(miniz EXCLUDE_FROM_ALL ${system})
    set_property(TARGET miniz PROPERTY POSITION_INDEPENDENT_CODE ON)
    # Work around https://github.com/richgel999/miniz/pull/292
    get_target_property(miniz_c_launcher miniz C_COMPILER_LAUNCHER)
    if(MSVC AND miniz_c_launcher MATCHES "ccache")
        set_property(TARGET miniz PROPERTY C_COMPILER_LAUNCHER)
        set_property(TARGET miniz PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "")
    endif()
endif()

# LZ4
if(NOT ${SLANG_USE_SYSTEM_LZ4})
    set(LZ4_BUNDLED_MODE ON)
    add_subdirectory(lz4/build/cmake EXCLUDE_FROM_ALL ${system})
    if(MSVC)
        target_compile_options(
            lz4_static
            PRIVATE /wd5045 /wd4820 /wd4711 /wd6385 /wd6262
        )
    endif()
endif()

# Vulkan headers
if(NOT ${SLANG_USE_SYSTEM_VULKAN_HEADERS})
    add_subdirectory(vulkan EXCLUDE_FROM_ALL ${system})
endif()

# metal-cpp headers
add_library(metal-cpp INTERFACE)
target_include_directories(
    metal-cpp
    INTERFACE "${CMAKE_CURRENT_LIST_DIR}/metal-cpp"
)

# SPIRV-Headers
if(NOT ${SLANG_USE_SYSTEM_SPIRV_HEADERS})
    add_subdirectory(spirv-headers EXCLUDE_FROM_ALL ${system})
endif()

if(SLANG_ENABLE_SLANG_GLSLANG)
    # SPIRV-Tools
    set(SPIRV_TOOLS_BUILD_STATIC ON)
    set(SPIRV_WERROR OFF)
    set(SPIRV_HEADER_DIR "${CMAKE_CURRENT_LIST_DIR}/spirv-headers/")
    set(SPIRV_SKIP_TESTS ON)
    add_subdirectory(spirv-tools EXCLUDE_FROM_ALL ${system})

    # glslang
    set(SKIP_GLSLANG_INSTALL ON)
    set(ENABLE_OPT ON)
    set(ENABLE_PCH OFF)
    add_subdirectory(glslang EXCLUDE_FROM_ALL ${system})
endif()

# imgui
add_library(imgui INTERFACE)
target_include_directories(imgui INTERFACE "${CMAKE_CURRENT_LIST_DIR}/imgui")

if(SLANG_ENABLE_SLANG_RHI)
    # slang-rhi
    set(SLANG_RHI_BINARY_DIR ${CMAKE_BINARY_DIR}/$<CONFIG>/bin)
    set(SLANG_RHI_SLANG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include)
    set(SLANG_RHI_SLANG_BINARY_DIR ${CMAKE_BINARY_DIR})
    set(SLANG_RHI_BUILD_TESTS OFF)
    set(SLANG_RHI_BUILD_EXAMPLES OFF)
    if(SLANG_ENABLE_DX_ON_VK)
        set(SLANG_RHI_HAS_D3D12 ON)
    endif()
    if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
        set(SLANG_RHI_ENABLE_WGPU OFF)
    endif()
    add_subdirectory(slang-rhi)
endif()

# Tidy things up:

# Restore log level if we set it
if(set_cmake_log_level)
    unset(CMAKE_MESSAGE_LOG_LEVEL)
endif()

# for this directory and all subdirectories, prepend
# `external/` to the IDE FOLDER property to every target
function(make_external dir)
    get_property(external_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)
    foreach(external_target ${external_targets})
        get_property(folder TARGET ${external_target} PROPERTY FOLDER)
        set_property(
            TARGET ${external_target}
            PROPERTY FOLDER "external/${folder}"
        )
    endforeach()

    get_property(subdirs DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)
    foreach(subdir ${subdirs})
        make_external(${subdir})
    endforeach()
endfunction()
make_external(.)