summaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
blob: 5bee59b10989dc1dc42b444ccd3242b7cf5739a6 (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
cmake_minimum_required(VERSION 3.20)
project(modular_slang_demo LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

include(FetchContent)

set(SLANG_SDK_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/slang/build/Release")
if(NOT EXISTS "${SLANG_SDK_ROOT}")
    message(FATAL_ERROR "Expected Slang SDK directory at ${SLANG_SDK_ROOT}")
endif()

FetchContent_Declare(
    abseil
    URL https://github.com/abseil/abseil-cpp/archive/refs/tags/20240116.1.zip
)

# Only populate abseil if it hasn't been built yet
FetchContent_GetProperties(abseil)
if(NOT abseil_POPULATED)
    # Check if the built libraries already exist
    set(ABSEIL_STATUS_LIB "${CMAKE_BINARY_DIR}/_deps/abseil-build/absl/status/absl_status.lib")
    set(ABSEIL_STATUSOR_LIB "${CMAKE_BINARY_DIR}/_deps/abseil-build/absl/status/absl_statusor.lib")

    if(NOT EXISTS "${ABSEIL_STATUS_LIB}" OR NOT EXISTS "${ABSEIL_STATUSOR_LIB}")
        message(STATUS "Abseil libraries not found, building abseil...")
        FetchContent_MakeAvailable(abseil)
    else()
        message(STATUS "Abseil libraries found, skipping rebuild")
        # Manually populate the source directory without building
        FetchContent_Populate(abseil)
        add_subdirectory(${abseil_SOURCE_DIR} ${abseil_BINARY_DIR} EXCLUDE_FROM_ALL)
    endif()
endif()

add_executable(modular_slang main.cc)
set_target_properties(modular_slang PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

target_include_directories(modular_slang PRIVATE
    "${SLANG_SDK_ROOT}/include"
)

target_link_libraries(modular_slang PRIVATE
    "${SLANG_SDK_ROOT}/lib/slang.lib"
    absl::status
    absl::statusor
)

if(MSVC)
    target_compile_options(modular_slang PRIVATE /W4 /EHsc)
else()
    target_compile_options(modular_slang PRIVATE -Wall -Wextra -pedantic)
endif()

add_custom_command(TARGET modular_slang POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "${SLANG_SDK_ROOT}/bin/slang.dll"
        "$<TARGET_FILE_DIR:modular_slang>/slang.dll"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "${SLANG_SDK_ROOT}/bin/slang-rt.dll"
        "$<TARGET_FILE_DIR:modular_slang>/slang-rt.dll"
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "${SLANG_SDK_ROOT}/bin/gfx.dll"
        "$<TARGET_FILE_DIR:modular_slang>/gfx.dll"
)