cmake_minimum_required(VERSION 3.15)

set(CMAKE_OSX_DEPLOYMENT_TARGET "14.0" CACHE STRING "Minimum macOS version")

project(mtlpy LANGUAGES CXX OBJCXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_OBJCXX_STANDARD 17)
set(CMAKE_OBJCXX_STANDARD_REQUIRED ON)

find_package(Python COMPONENTS Interpreter Development.Module REQUIRED)

execute_process(
    COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
    OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE NB_DIR)
list(APPEND CMAKE_PREFIX_PATH "${NB_DIR}")
find_package(nanobind CONFIG REQUIRED)

set(METAL_CPP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/metal-cpp)

nanobind_add_module(_mtlpy
    csrc/metal_impl.mm
    csrc/device.cpp
    csrc/pipeline_cache.cpp
    csrc/buffer.cpp
    csrc/texture.cpp
    csrc/heap.cpp
    csrc/sampler.cpp
    csrc/pipeline.cpp
    csrc/command_buffer.cpp
    csrc/bindings.cpp
)

target_include_directories(_mtlpy PRIVATE
    ${METAL_CPP_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/csrc
)

target_link_libraries(_mtlpy PRIVATE
    "-framework Metal"
    "-framework Foundation"
    "-framework QuartzCore"
)

install(TARGETS _mtlpy LIBRARY DESTINATION mtlpy)
