project(dxc-bin)

if (CMAKE_OSX_ARCHITECTURES)
    set(DXC_ARCHITECTURE ${CMAKE_OSX_ARCHITECTURES})
elseif(CMAKE_SYSTEM_PROCESSOR)
    set(DXC_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
else()
    set(DXC_ARCHITECTURE ${CMAKE_HOST_SYSTEM_PROCESSOR})
endif()
string(TOLOWER "${DXC_ARCHITECTURE}" DXC_ARCHITECTURE)
message(STATUS "Detected architecture: ${DXC_ARCHITECTURE}")

set(DIRECTX_DXC_INCLUDE "${PROJECT_SOURCE_DIR}/inc")
if (DXC_ARCHITECTURE STREQUAL "x86_64" OR DXC_ARCHITECTURE STREQUAL "amd64")
    if (WIN32)
        set(DIRECTX_DXC_TOOL "${PROJECT_SOURCE_DIR}/bin/x64/dxc.exe" CACHE INTERNAL "")
        set(DIRECTX_DXCOMPILER_LIB "${PROJECT_SOURCE_DIR}/lib/x64/dxcompiler.lib")
        set(DIRECTX_DXCOMPILER_DLL "${PROJECT_SOURCE_DIR}/bin/x64/dxcompiler.dll")
        set(DIRECTX_DXIL_DLL "${PROJECT_SOURCE_DIR}/bin/x64/dxil.dll")
    elseif (APPLE)
        set(DIRECTX_DXC_TOOL "DYLD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/lib/x64" "${PROJECT_SOURCE_DIR}/bin/x64/dxc-macos" CACHE INTERNAL "")
        set(DIRECTX_DXCOMPILER_LIB "${PROJECT_SOURCE_DIR}/lib/x64/libdxcompiler.dylib")
    elseif (EXISTS "${PROJECT_SOURCE_DIR}/lib/x64/libdxcompiler.so")
        set(DIRECTX_DXC_TOOL "LD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/lib/x64" "${PROJECT_SOURCE_DIR}/bin/x64/dxc-linux" CACHE INTERNAL "")
        set(DIRECTX_DXCOMPILER_LIB "${PROJECT_SOURCE_DIR}/lib/x64/libdxcompiler.so")
    else()
        # futari-linux: the repository has no dxc-bin Linux binaries; the system's DirectXShaderCompiler instead (Arch's
        # directx-shader-compiler, or DXC_SYSTEM_TOOL / DXC_SYSTEM_LIB).
        find_program(DXC_SYSTEM_TOOL NAMES dxc)
        find_library(DXC_SYSTEM_LIB NAMES dxcompiler)
        if (NOT DXC_SYSTEM_TOOL OR NOT DXC_SYSTEM_LIB)
            message(FATAL_ERROR "Linux x86-64: install DirectXShaderCompiler (dxc and libdxcompiler.so)")
        endif()
        set(DIRECTX_DXC_TOOL "${DXC_SYSTEM_TOOL}" CACHE INTERNAL "")
        set(DIRECTX_DXCOMPILER_LIB "${DXC_SYSTEM_LIB}")
    endif()
elseif (DXC_ARCHITECTURE STREQUAL "arm64" OR DXC_ARCHITECTURE STREQUAL "aarch64")
    if (WIN32)
        set(DIRECTX_DXC_TOOL "${PROJECT_SOURCE_DIR}/bin/arm64/dxc.exe" CACHE INTERNAL "")
        set(DIRECTX_DXCOMPILER_LIB "${PROJECT_SOURCE_DIR}/lib/arm64/dxcompiler.lib")
        set(DIRECTX_DXCOMPILER_DLL "${PROJECT_SOURCE_DIR}/bin/arm64/dxcompiler.dll")
        set(DIRECTX_DXIL_DLL "${PROJECT_SOURCE_DIR}/bin/arm64/dxil.dll")
    elseif (APPLE)
        set(DIRECTX_DXC_TOOL "DYLD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/lib/arm64" "${PROJECT_SOURCE_DIR}/bin/arm64/dxc-macos" CACHE INTERNAL "")
        set(DIRECTX_DXCOMPILER_LIB "${PROJECT_SOURCE_DIR}/lib/arm64/libdxcompiler.dylib")
    elseif (EXISTS "${PROJECT_SOURCE_DIR}/lib/arm64/libdxcompiler.so")
        set(DIRECTX_DXC_TOOL "LD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/lib/arm64" "${PROJECT_SOURCE_DIR}/bin/arm64/dxc-linux" CACHE INTERNAL "")
        set(DIRECTX_DXCOMPILER_LIB "${PROJECT_SOURCE_DIR}/lib/arm64/libdxcompiler.so")
    else()
        # futari-nx (2026-10-26): dxc-bin ships no Linux AArch64 build; the system's DirectXShaderCompiler instead
        # (/usr/bin/dxc and libdxcompiler.so, e.g. Arch Linux ARM's directx-shader-compiler).
        find_program(DXC_SYSTEM_TOOL NAMES dxc)
        find_library(DXC_SYSTEM_LIB NAMES dxcompiler)
        if (NOT DXC_SYSTEM_TOOL OR NOT DXC_SYSTEM_LIB)
            message(FATAL_ERROR "Linux AArch64: install DirectXShaderCompiler (dxc and libdxcompiler.so)")
        endif()
        set(DIRECTX_DXC_TOOL "${DXC_SYSTEM_TOOL}" CACHE INTERNAL "")
        set(DIRECTX_DXCOMPILER_LIB "${DXC_SYSTEM_LIB}")
    endif()
else()
    message(FATAL_ERROR "Unsupported architecture '${DXC_ARCHITECTURE}'")
endif()

add_library(Microsoft::DirectXShaderCompiler SHARED IMPORTED GLOBAL)
target_include_directories(Microsoft::DirectXShaderCompiler INTERFACE "${DIRECTX_DXC_INCLUDE}")
if (WIN32)
    set_property(TARGET Microsoft::DirectXShaderCompiler PROPERTY IMPORTED_LOCATION "${DIRECTX_DXCOMPILER_DLL}")
    set_property(TARGET Microsoft::DirectXShaderCompiler PROPERTY IMPORTED_IMPLIB "${DIRECTX_DXCOMPILER_LIB}")

    add_library(Microsoft::DXIL SHARED IMPORTED GLOBAL)
    target_include_directories(Microsoft::DXIL INTERFACE "${DIRECTX_DXC_INCLUDE}")
    set_property(TARGET Microsoft::DXIL PROPERTY IMPORTED_LOCATION "${DIRECTX_DXIL_DLL}")
    set_property(TARGET Microsoft::DXIL PROPERTY IMPORTED_IMPLIB "${DIRECTX_DXCOMPILER_LIB}")
else()
    set_property(TARGET Microsoft::DirectXShaderCompiler PROPERTY IMPORTED_LOCATION "${DIRECTX_DXCOMPILER_LIB}")
endif()
