2026-08-17 00:05:20 +03:00
|
|
|
|
# Подключение сторонних библиотек как подпроектов (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"
|
2026-08-17 00:43:33 +03:00
|
|
|
|
"${cmark_SOURCE_DIR}/extensions"
|
2026-08-17 00:05:20 +03:00
|
|
|
|
"${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)
|
2026-08-17 00:43:33 +03:00
|
|
|
|
set(BUILD_TESTING OFF) # локально для подпроекта libssh2 (не трогаем глобальное значение)
|
2026-08-17 00:05:20 +03:00
|
|
|
|
FetchContent_MakeAvailable(libssh2)
|
2026-08-17 00:43:33 +03:00
|
|
|
|
unset(BUILD_TESTING) # возвращаем глобальное (из CMakeLists.txt)
|
2026-08-17 00:05:20 +03:00
|
|
|
|
|
|
|
|
|
|
# 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")
|
2026-08-17 13:05:19 +03:00
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
# --- KSyntaxHighlighting (подсветка кода) + Extra CMake Modules ---
|
|
|
|
|
|
FetchContent_Declare(extra-cmake-modules
|
|
|
|
|
|
GIT_REPOSITORY https://github.com/KDE/extra-cmake-modules.git
|
|
|
|
|
|
GIT_TAG v6.19.0
|
|
|
|
|
|
GIT_SHALLOW TRUE
|
|
|
|
|
|
)
|
|
|
|
|
|
set(ENABLE_BSYMBOLICFUNCTIONS OFF CACHE BOOL "" FORCE)
|
|
|
|
|
|
set(BUILD_TESTING OFF) # локально для подпроекта ECM (не трогаем глобальное)
|
|
|
|
|
|
FetchContent_MakeAvailable(extra-cmake-modules)
|
|
|
|
|
|
unset(BUILD_TESTING)
|
|
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${extra-cmake-modules_SOURCE_DIR}/modules")
|
|
|
|
|
|
set(ECM_ENABLE_SANITIZERS OFF CACHE BOOL "" FORCE)
|
|
|
|
|
|
# ECMConfig из build-дерева ссылается на установку — собираем префикс вручную.
|
|
|
|
|
|
set(ECM_PREFIX "${CMAKE_BINARY_DIR}/_ecm_prefix" CACHE PATH "ECM temp prefix" FORCE)
|
|
|
|
|
|
file(COPY "${extra-cmake-modules_SOURCE_DIR}/modules" DESTINATION "${ECM_PREFIX}/share/ECM")
|
|
|
|
|
|
file(COPY "${extra-cmake-modules_SOURCE_DIR}/find-modules" DESTINATION "${ECM_PREFIX}/share/ECM")
|
|
|
|
|
|
if(EXISTS "${extra-cmake-modules_SOURCE_DIR}/kde-modules")
|
|
|
|
|
|
file(COPY "${extra-cmake-modules_SOURCE_DIR}/kde-modules" DESTINATION "${ECM_PREFIX}/share/ECM")
|
|
|
|
|
|
endif()
|
|
|
|
|
|
file(MAKE_DIRECTORY "${ECM_PREFIX}/share/ECM/cmake")
|
|
|
|
|
|
file(COPY "${extra-cmake-modules_BINARY_DIR}/ECMConfig.cmake"
|
|
|
|
|
|
"${extra-cmake-modules_BINARY_DIR}/ECMConfigVersion.cmake"
|
|
|
|
|
|
DESTINATION "${ECM_PREFIX}/share/ECM/cmake")
|
|
|
|
|
|
set(ECM_DIR "${ECM_PREFIX}/share/ECM/cmake" CACHE PATH "ECM config dir" FORCE)
|
|
|
|
|
|
list(APPEND CMAKE_PREFIX_PATH "${ECM_PREFIX}")
|
|
|
|
|
|
|
|
|
|
|
|
set(BUILD_TESTING OFF) # локально для подпроекта syntax-highlighting
|
|
|
|
|
|
FetchContent_Declare(syntax-highlighting
|
|
|
|
|
|
GIT_REPOSITORY https://github.com/KDE/syntax-highlighting.git
|
|
|
|
|
|
GIT_TAG v6.19.0
|
|
|
|
|
|
GIT_SHALLOW TRUE
|
|
|
|
|
|
)
|
|
|
|
|
|
set(KSYNTAXHIGHLIGHTING_BUILD_TESTING OFF CACHE BOOL "" FORCE)
|
|
|
|
|
|
FetchContent_MakeAvailable(syntax-highlighting)
|
|
|
|
|
|
unset(BUILD_TESTING)
|
|
|
|
|
|
|
|
|
|
|
|
# Индексатор использует std::strong_ordering → требует C++20 (lib остаётся на 17,
|
|
|
|
|
|
# чтобы не спотыкаться о qfloat16 в Qt 6.11).
|
|
|
|
|
|
if(TARGET katehighlightingindexer)
|
|
|
|
|
|
set_target_properties(katehighlightingindexer PROPERTIES
|
|
|
|
|
|
CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON)
|
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
# КФ6 не добавляет BUILD_INTERFACE include при сборке как подпроектом.
|
|
|
|
|
|
if(TARGET KF6SyntaxHighlighting)
|
|
|
|
|
|
target_include_directories(KF6SyntaxHighlighting INTERFACE
|
|
|
|
|
|
"$<BUILD_INTERFACE:${syntax-highlighting_SOURCE_DIR}/src/lib>"
|
|
|
|
|
|
"$<BUILD_INTERFACE:${syntax-highlighting_BINARY_DIR}/src/lib>"
|
|
|
|
|
|
"$<BUILD_INTERFACE:${syntax-highlighting_BINARY_DIR}/src/lib/KSyntaxHighlighting>")
|
2026-08-17 00:05:20 +03:00
|
|
|
|
endif()
|