@lmagder/node-stable-diffusion-cpp
Version:
Node bindings for https://github.com/leejet/stable-diffusion.cpp
119 lines (92 loc) • 4.18 kB
Plain Text
cmake_minimum_required(VERSION 3.21)
cmake_policy(SET CMP0091 NEW)
cmake_policy(SET CMP0042 NEW)
cmake_policy(SET CMP0091 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0091 NEW)
#required for linux, harmless elsehwer
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
include(FetchContent)
find_package(CUDAToolkit)
if (MSVC)
set(CMake_MSVC_PARALLEL ON)
set(MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>)
endif()
FetchContent_Declare(
stable-diffusion-cpp
GIT_REPOSITORY https://github.com/leejet/stable-diffusion.cpp.git
GIT_TAG ac54e0076052a196b7df961eb1f792c9ff4d7f22 # sd 3.5 support
)
FetchContent_Declare(
implib-so
GIT_REPOSITORY https://github.com/yugr/Implib.so.git
GIT_TAG f9ff166845a59327eda431af82ee85a9c7532c5d
)
find_package(Vulkan QUIET)
if(NOT WIN32 AND NOT Vulkan_FOUND)
if(EXISTS ${CMAKE_SYSROOT}/usr/lib/x86_64-linux-gnu/libvulkan.so)
set(Vulkan_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/include)
set(Vulkan_LIBRARY ${CMAKE_SYSROOT}/usr/lib/x86_64-linux-gnu/libvulkan.so)
find_package(Vulkan)
endif()
endif()
if(Vulkan_FOUND)
set(SD_FLASH_ATTN ON)
set(SD_VULKAN ON)
endif()
set(IMPLIB_SOURCE_FILES "")
if (CUDAToolkit_FOUND AND NOT Vulkan_FOUND)
set(SD_CUBLAS ON)
set(SD_FLASH_ATTN ON)
set(GGML_CUDA_F16 ON)
if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
set(CMAKE_CUDA_ARCHITECTURES "86")
endif()
if (NOT WIN32)
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler \"-Wno-expansion-to-defined\"")
FetchContent_MakeAvailable(implib-so)
FetchContent_GetProperties(implib-so SOURCE_DIR IMPLIB_SO_FOLDER)
message(STATUS "Extracted implib-gen to ${IMPLIB_SO_FOLDER}")
get_target_property(LIBCUDAPATH CUDA::cuda_driver IMPORTED_LOCATION)
if (${LIBCUDAPATH} STREQUAL "LIBCUDAPATH-NOTFOUND")
set(LIBCUDAPATH ${CMAKE_SYSROOT}/usr/local/cuda-${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR}/targets/x86_64-linux/lib/stubs/libcuda.so)
if (EXISTS ${LIBCUDAPATH})
message(STATUS "Can't find libcuda.so but have a valid toolkit. Asssuming we are using the stub")
set_target_properties(CUDA::cuda_driver PROPERTIES IMPORTED_LOCATION ${LIBCUDAPATH})
endif()
endif()
set(IMPLIB_SOURCE_FILES ${CMAKE_CURRENT_BINARY_DIR}/libcuda.so.tramp.S ${CMAKE_CURRENT_BINARY_DIR}/libcuda.so.init.c)
add_custom_command(
OUTPUT ${IMPLIB_SOURCE_FILES}
COMMAND ${IMPLIB_SO_FOLDER}/implib-gen.py -q ${LIBCUDAPATH}
DEPENDS ${LIBCUDAPATH}
)
endif()
endif()
FetchContent_MakeAvailable(stable-diffusion-cpp)
project(node-stable-diffusion-cpp)
if (NOT WIN32)
add_compile_options(-Wno-expansion-to-defined)
endif()
enable_language(ASM)
file(GLOB SOURCE_FILES CONFIGURE_DEPENDS "src/*.cpp" "src/*.h")
add_library(node-stable-diffusion-cpp SHARED ${SOURCE_FILES} ${IMPLIB_SOURCE_FILES} ${CMAKE_JS_SRC})
set_target_properties(node-stable-diffusion-cpp PROPERTIES PREFIX "" SUFFIX ".node")
set_target_properties(node-stable-diffusion-cpp PROPERTIES CXX_STANDARD 20)
target_include_directories(node-stable-diffusion-cpp SYSTEM PRIVATE ${CMAKE_JS_INC})
target_compile_definitions(node-stable-diffusion-cpp PRIVATE NAPI_VERSION=9 NODE_ADDON_API_DISABLE_DEPRECATED)
target_link_libraries(node-stable-diffusion-cpp ${CMAKE_JS_LIB} stable-diffusion)
if (CUDAToolkit_FOUND AND NOT Vulkan_FOUND)
file(GENERATE OUTPUT $<TARGET_FILE_DIR:node-stable-diffusion-cpp>/cuda_version.json INPUT ${CUDAToolkit_LIBRARY_ROOT}/version.json)
else()
file(GENERATE OUTPUT $<TARGET_FILE_DIR:node-stable-diffusion-cpp>/cuda_version.json CONTENT "{}")
endif()
if(MSVC AND CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
# Generate node.lib
execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS})
if (SD_VULKAN)
target_link_options(node-stable-diffusion-cpp PRIVATE "/DELAYLOAD:vulkan-1.dll")
elseif (SD_CUBLAS)
target_link_options(node-stable-diffusion-cpp PRIVATE "/DELAYLOAD:nvcuda.dll")
endif()
endif()