From d661841789f350674de72875775b01b128364ee8 Mon Sep 17 00:00:00 2001 From: Cyberhan123 <255542417@qq.com> Date: Thu, 11 Jun 2026 11:19:06 +0800 Subject: [PATCH 1/3] feat: add installation support and configuration files for stable-diffusion --- CMakeLists.txt | 43 ++++++++++++++++++++++++++ cmake/stable-diffusion-config.cmake.in | 30 ++++++++++++++++++ cmake/stable-diffusion.pc.in | 10 ++++++ 3 files changed, 83 insertions(+) create mode 100644 cmake/stable-diffusion-config.cmake.in create mode 100644 cmake/stable-diffusion.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 150ecde1c..1c09c0d66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -339,4 +339,47 @@ endif() set(SD_PUBLIC_HEADERS include/stable-diffusion.h) set_target_properties(${SD_LIB} PROPERTIES PUBLIC_HEADER "${SD_PUBLIC_HEADERS}") +# +# install +# + +include(CMakePackageConfigHelpers) + +set(SD_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files") +set(SD_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files") +set(SD_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Location of binary files") + +set(SD_PUBLIC_HEADERS + ${CMAKE_CURRENT_SOURCE_DIR}/include/stable-diffusion.h) + +set_target_properties(${SD_LIB} + PROPERTIES + PUBLIC_HEADER "${SD_PUBLIC_HEADERS}") + + install(TARGETS ${SD_LIB} LIBRARY PUBLIC_HEADER) + + +configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/stable-diffusion-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion-config.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/stable-diffusion + PATH_VARS SD_INCLUDE_INSTALL_DIR + SD_LIB_INSTALL_DIR + SD_BIN_INSTALL_DIR ) + +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion-version.cmake + VERSION ${SDCPP_BUILD_VERSION} + COMPATIBILITY SameMajorVersion) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion-version.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/stable-diffusion) + +configure_file(cmake/stable-diffusion.pc.in + "${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion.pc" + @ONLY) + +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion.pc" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) \ No newline at end of file diff --git a/cmake/stable-diffusion-config.cmake.in b/cmake/stable-diffusion-config.cmake.in new file mode 100644 index 000000000..7b224924e --- /dev/null +++ b/cmake/stable-diffusion-config.cmake.in @@ -0,0 +1,30 @@ +set(SD_VERSION @SD_INSTALL_VERSION@) +set(SD_BUILD_COMMIT @SD_BUILD_COMMIT@) +set(SD_BUILD_NUMBER @SD_BUILD_NUMBER@) +set(SD_SHARED_LIB @BUILD_SHARED_LIBS@) + +@PACKAGE_INIT@ + +set_and_check(SD_INCLUDE_DIR "@PACKAGE_SD_INCLUDE_INSTALL_DIR@") +set_and_check(SD_LIB_DIR "@PACKAGE_SD_LIB_INSTALL_DIR@") +set_and_check(SD_BIN_DIR "@PACKAGE_SD_BIN_INSTALL_DIR@") + +find_package(ggml REQUIRED HINTS ${SD_LIB_DIR}/cmake) + +find_library(stable-diffusion_LIBRARY stable-diffusion + REQUIRED + HINTS ${SD_LIB_DIR} + NO_CMAKE_FIND_ROOT_PATH +) + +add_library(stable-diffusion UNKNOWN IMPORTED) +set_target_properties(stable-diffusion + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${SD_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "ggml::ggml;ggml::ggml-base;" + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${stable-diffusion_LIBRARY}" + INTERFACE_COMPILE_FEATURES "c_std_11;cxx_std_17" + POSITION_INDEPENDENT_CODE ON) + +check_required_components(Stable-diffusion) \ No newline at end of file diff --git a/cmake/stable-diffusion.pc.in b/cmake/stable-diffusion.pc.in new file mode 100644 index 000000000..f0a5ebc7d --- /dev/null +++ b/cmake/stable-diffusion.pc.in @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: stable-diffusion +Description: Diffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C++ +Version: @SD_INSTALL_VERSION@ +Libs: -L${libdir} -lggml -lggml-base -lstable-diffusion +Cflags: -I${includedir} \ No newline at end of file From 04ed1ea9740ba56b0d4d36c29671cb2eeead4424 Mon Sep 17 00:00:00 2001 From: Cyberhan123 <255542417@qq.com> Date: Thu, 11 Jun 2026 11:38:09 +0800 Subject: [PATCH 2/3] fix: correct public header setting and update version variable in pkg-config --- CMakeLists.txt | 3 +-- cmake/stable-diffusion-config.cmake.in | 2 +- cmake/stable-diffusion.pc.in | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c09c0d66..044000f22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -336,8 +336,7 @@ if (SD_BUILD_EXAMPLES) add_subdirectory(examples) endif() -set(SD_PUBLIC_HEADERS include/stable-diffusion.h) -set_target_properties(${SD_LIB} PROPERTIES PUBLIC_HEADER "${SD_PUBLIC_HEADERS}") + # # install diff --git a/cmake/stable-diffusion-config.cmake.in b/cmake/stable-diffusion-config.cmake.in index 7b224924e..97d03f04a 100644 --- a/cmake/stable-diffusion-config.cmake.in +++ b/cmake/stable-diffusion-config.cmake.in @@ -27,4 +27,4 @@ set_target_properties(stable-diffusion INTERFACE_COMPILE_FEATURES "c_std_11;cxx_std_17" POSITION_INDEPENDENT_CODE ON) -check_required_components(Stable-diffusion) \ No newline at end of file +check_required_components(stable-diffusion) \ No newline at end of file diff --git a/cmake/stable-diffusion.pc.in b/cmake/stable-diffusion.pc.in index f0a5ebc7d..f9045b5d6 100644 --- a/cmake/stable-diffusion.pc.in +++ b/cmake/stable-diffusion.pc.in @@ -5,6 +5,6 @@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ Name: stable-diffusion Description: Diffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C++ -Version: @SD_INSTALL_VERSION@ +Version: @SDCPP_BUILD_VERSION@ Libs: -L${libdir} -lggml -lggml-base -lstable-diffusion Cflags: -I${includedir} \ No newline at end of file From 3b60d171a729cbb7f4e8a540e6c01326cbb6e22b Mon Sep 17 00:00:00 2001 From: leejet Date: Mon, 29 Jun 2026 00:14:50 +0800 Subject: [PATCH 3/3] fix stable-diffusion install package metadata --- CMakeLists.txt | 20 ++++++++--- cmake/stable-diffusion-config.cmake.in | 49 +++++++++++++++----------- cmake/stable-diffusion.pc.in | 7 ++-- examples/cli/CMakeLists.txt | 2 +- 4 files changed, 48 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b880b53fc..f15fdbf28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -331,7 +331,8 @@ endif() add_subdirectory(thirdparty) -target_link_libraries(${SD_LIB} PUBLIC ggml zip) +target_sources(${SD_LIB} PRIVATE $) +target_link_libraries(${SD_LIB} PUBLIC ggml) target_include_directories(${SD_LIB} PUBLIC . src include) target_include_directories(${SD_LIB} PRIVATE src/core) target_include_directories(${SD_LIB} PUBLIC . thirdparty) @@ -349,6 +350,11 @@ endif() # include(CMakePackageConfigHelpers) +include(GNUInstallDirs) + +set(SD_INSTALL_VERSION "${SDCPP_BUILD_VERSION}") +set(SD_INSTALL_COMMIT "${SDCPP_BUILD_COMMIT}") +set(SD_SHARED_LIB ${SD_BUILD_SHARED_LIBS}) set(SD_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Location of header files") set(SD_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Location of library files") @@ -356,13 +362,17 @@ set(SD_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Location of b set(SD_PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/stable-diffusion.h) - + set_target_properties(${SD_LIB} PROPERTIES PUBLIC_HEADER "${SD_PUBLIC_HEADERS}") -install(TARGETS ${SD_LIB} LIBRARY PUBLIC_HEADER) +install(TARGETS ${SD_LIB} + ARCHIVE + LIBRARY + RUNTIME + PUBLIC_HEADER) configure_package_config_file( @@ -375,7 +385,7 @@ configure_package_config_file( write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion-version.cmake - VERSION ${SDCPP_BUILD_VERSION} + VERSION ${SD_INSTALL_VERSION} COMPATIBILITY SameMajorVersion) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion-config.cmake @@ -387,4 +397,4 @@ configure_file(cmake/stable-diffusion.pc.in @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/stable-diffusion.pc" - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) \ No newline at end of file + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/cmake/stable-diffusion-config.cmake.in b/cmake/stable-diffusion-config.cmake.in index 97d03f04a..c3d7433c2 100644 --- a/cmake/stable-diffusion-config.cmake.in +++ b/cmake/stable-diffusion-config.cmake.in @@ -1,30 +1,37 @@ -set(SD_VERSION @SD_INSTALL_VERSION@) -set(SD_BUILD_COMMIT @SD_BUILD_COMMIT@) -set(SD_BUILD_NUMBER @SD_BUILD_NUMBER@) -set(SD_SHARED_LIB @BUILD_SHARED_LIBS@) +set(SD_VERSION "@SD_INSTALL_VERSION@") +set(SD_BUILD_COMMIT "@SD_INSTALL_COMMIT@") +set(SD_SHARED_LIB @SD_SHARED_LIB@) @PACKAGE_INIT@ set_and_check(SD_INCLUDE_DIR "@PACKAGE_SD_INCLUDE_INSTALL_DIR@") set_and_check(SD_LIB_DIR "@PACKAGE_SD_LIB_INSTALL_DIR@") -set_and_check(SD_BIN_DIR "@PACKAGE_SD_BIN_INSTALL_DIR@") +set(SD_BIN_DIR "@PACKAGE_SD_BIN_INSTALL_DIR@") -find_package(ggml REQUIRED HINTS ${SD_LIB_DIR}/cmake) +include(CMakeFindDependencyMacro) +find_dependency(ggml REQUIRED HINTS "${SD_LIB_DIR}/cmake") -find_library(stable-diffusion_LIBRARY stable-diffusion - REQUIRED - HINTS ${SD_LIB_DIR} - NO_CMAKE_FIND_ROOT_PATH -) +if(NOT TARGET stable-diffusion) + find_library(stable-diffusion_LIBRARY stable-diffusion + REQUIRED + HINTS "${SD_LIB_DIR}" + NO_CMAKE_FIND_ROOT_PATH + ) -add_library(stable-diffusion UNKNOWN IMPORTED) -set_target_properties(stable-diffusion - PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${SD_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "ggml::ggml;ggml::ggml-base;" - IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" - IMPORTED_LOCATION "${stable-diffusion_LIBRARY}" - INTERFACE_COMPILE_FEATURES "c_std_11;cxx_std_17" - POSITION_INDEPENDENT_CODE ON) + add_library(stable-diffusion UNKNOWN IMPORTED) + set_target_properties(stable-diffusion + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${SD_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "ggml::ggml" + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${stable-diffusion_LIBRARY}" + INTERFACE_COMPILE_FEATURES "c_std_11;cxx_std_17" + POSITION_INDEPENDENT_CODE ON) -check_required_components(stable-diffusion) \ No newline at end of file + if(SD_SHARED_LIB) + target_compile_definitions(stable-diffusion + INTERFACE SD_BUILD_SHARED_LIB) + endif() +endif() + +check_required_components(stable-diffusion) diff --git a/cmake/stable-diffusion.pc.in b/cmake/stable-diffusion.pc.in index f9045b5d6..dad257b9f 100644 --- a/cmake/stable-diffusion.pc.in +++ b/cmake/stable-diffusion.pc.in @@ -1,10 +1,11 @@ prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} libdir=@CMAKE_INSTALL_FULL_LIBDIR@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ Name: stable-diffusion Description: Diffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C++ Version: @SDCPP_BUILD_VERSION@ -Libs: -L${libdir} -lggml -lggml-base -lstable-diffusion -Cflags: -I${includedir} \ No newline at end of file +Libs: -L${libdir} -lstable-diffusion +Libs.private: -lggml -lggml-base +Cflags: -I${includedir} diff --git a/examples/cli/CMakeLists.txt b/examples/cli/CMakeLists.txt index 6b1266cf5..a97cb1ca1 100644 --- a/examples/cli/CMakeLists.txt +++ b/examples/cli/CMakeLists.txt @@ -15,7 +15,7 @@ target_include_directories(${TARGET} PRIVATE "${PROJECT_SOURCE_DIR}/src" ) install(TARGETS ${TARGET} RUNTIME) -target_link_libraries(${TARGET} PRIVATE stable-diffusion zip ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(${TARGET} PRIVATE stable-diffusion ${CMAKE_THREAD_LIBS_INIT}) if(SD_WEBP) target_compile_definitions(${TARGET} PRIVATE SD_USE_WEBP) target_link_libraries(${TARGET} PRIVATE webp libwebpmux)