Files
Flora/third_party/deps.cmake
T

101 lines
4.4 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Подключение сторонних библиотек как подпроектов (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_SOURCE_DIR}/extensions"
"${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) # локально для подпроекта libssh2 (не трогаем глобальное значение)
FetchContent_MakeAvailable(libssh2)
unset(BUILD_TESTING) # возвращаем глобальное (из CMakeLists.txt)
# 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()