Фаза 0: каркас — CMake (cmark-gfm, libgit2+SSH, libssh2), QML-скелет (меню, 3 панели, кнопка «+»), VaultManager, LICENSE GPL-3.0

This commit is contained in:
Flora (opencode)
2026-08-17 00:05:20 +03:00
parent d4734506cb
commit 980fbcedcb
10 changed files with 1251 additions and 0 deletions
+99
View File
@@ -0,0 +1,99 @@
# Подключение сторонних библиотек как подпроектов (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()