# Подключение сторонних библиотек как подпроектов (FetchContent). # Все библиотеки собираются статически. include(FetchContent) set(FETCHCONTENT_QUIET OFF) set(BUILD_SHARED_LIBS OFF CACHE BOOL "Static build for third-party libs" FORCE) # --- cmark-gfm (Markdown: CommonMark + GFM-таблицы, зачёркивание, задачи, автоссылки) --- FetchContent_Declare(cmark GIT_REPOSITORY https://github.com/github/cmark-gfm.git GIT_TAG 0.29.0.gfm.13 GIT_SHALLOW TRUE ) set(CMARK_STATIC ON CACHE BOOL "build static cmark-gfm" FORCE) set(CMARK_SHARED OFF CACHE BOOL "no shared cmark-gfm" FORCE) set(CMAKE_C_STANDARD 99) # cmark-gfm требует C99 (CMake 4 по умолчанию подставляет c90) FetchContent_MakeAvailable(cmark) set(_cmark_target libcmark-gfm_static) foreach(_cand IN ITEMS libcmark-gfm_static cmark-gfm_static cmark_gfm_static) if(TARGET ${_cand}) set(_cmark_target ${_cand}) break() endif() endforeach() # cmark-gfm: INTERFACE-обёртка (алиасы нельзя модифицировать; include-пути наружу не экспортируются). add_library(cmark_wrapper INTERFACE) target_link_libraries(cmark_wrapper INTERFACE ${_cmark_target}) target_include_directories(cmark_wrapper INTERFACE "${cmark_SOURCE_DIR}/src" "${cmark_BINARY_DIR}/src" "${cmark_BINARY_DIR}/extensions") if(NOT TARGET cmark::cmark) add_library(cmark::cmark ALIAS cmark_wrapper) endif() if(TARGET libcmark-gfm-extensions_static) add_library(cmark_extensions_wrapper INTERFACE) target_link_libraries(cmark_extensions_wrapper INTERFACE libcmark-gfm-extensions_static) target_include_directories(cmark_extensions_wrapper INTERFACE "${cmark_SOURCE_DIR}/extensions" "${cmark_BINARY_DIR}/extensions") if(NOT TARGET cmark::cmark_extensions) add_library(cmark::cmark_extensions ALIAS cmark_extensions_wrapper) endif() endif() # --- libssh2 (SSH-транспорт для libgit2) --- FetchContent_Declare(libssh2 GIT_REPOSITORY https://github.com/libssh2/libssh2.git GIT_TAG libssh2-1.11.1 GIT_SHALLOW TRUE ) set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) set(BUILD_TESTING OFF CACHE BOOL "" FORCE) FetchContent_MakeAvailable(libssh2) # macOS (новые SDK): strtoll требует _DARWIN_C_SOURCE, memset_s — __STDC_WANT_LIB_EXT1__. foreach(_libssh2_tgt IN ITEMS libssh2_static libssh2_shared) if(TARGET ${_libssh2_tgt}) target_compile_definitions(${_libssh2_tgt} PRIVATE __STDC_WANT_LIB_EXT1__=1 _DARWIN_C_SOURCE=1) endif() endforeach() # libgit2 ищет libssh2 через переменные LIBSSH2_LIBRARY / LIBSSH2_INCLUDE_DIR. if(TARGET libssh2_static) get_target_property(_libssh2_out libssh2_static OUTPUT_NAME) set(LIBSSH2_LIBRARY "${libssh2_BINARY_DIR}/src/${_libssh2_out}.a" CACHE FILEPATH "libssh2 static library" FORCE) set(LIBSSH2_INCLUDE_DIR "${libssh2_SOURCE_DIR}/include" CACHE PATH "libssh2 headers" FORCE) endif() # --- libgit2 (Git: история, откаты, push/pull) с SSH через libssh2 --- FetchContent_Declare(libgit2 GIT_REPOSITORY https://github.com/libgit2/libgit2.git GIT_TAG v1.9.7 GIT_SHALLOW TRUE ) set(USE_SSH ON CACHE BOOL "Enable SSH transport (libssh2)" FORCE) set(BUILD_TESTS OFF CACHE BOOL "" FORCE) set(BUILD_CLI OFF CACHE BOOL "" FORCE) set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) FetchContent_MakeAvailable(libgit2) # libgit2 не создаёт таргет «git2» при сборке как подпроекта: # наружу экспортируются только include-пути основного таргета libgit2package. if(TARGET git2 AND NOT TARGET libgit2package) # (не бывает; оставлено на будущее) endif() if(TARGET libgit2package AND NOT TARGET Flora_libgit2_static) add_library(Flora_libgit2_static INTERFACE) target_link_libraries(Flora_libgit2_static INTERFACE libgit2package) target_include_directories(Flora_libgit2_static INTERFACE "${libgit2_SOURCE_DIR}/include") endif()