Add Arch package and prebuilt TDLib support

This commit is contained in:
2026-04-24 13:49:16 +03:00
parent 4910fb5e8e
commit 89772e74b1
5 changed files with 125 additions and 3 deletions

View File

@@ -11,11 +11,64 @@ find_program(CLANG_FORMAT_BIN clang-format)
include(FetchContent)
option(TELEGRAM_TUI_USE_SYSTEM_TDLIB "Use an installed TDLib package instead of fetching it." OFF)
set(TELEGRAM_TUI_TDLIB_ROOT ""
CACHE PATH "Path to a prebuilt TDLib root containing include/ and lib/ directories.")
set(CURSES_NEED_WIDE TRUE)
find_package(Curses REQUIRED)
if(TELEGRAM_TUI_USE_SYSTEM_TDLIB)
set(TELEGRAM_TUI_APP_CONFIG_PATH "")
if(DEFINED ENV{XDG_DATA_HOME} AND NOT "$ENV{XDG_DATA_HOME}" STREQUAL "")
set(TELEGRAM_TUI_APP_CONFIG_PATH "$ENV{XDG_DATA_HOME}/telegram-tui/config.json")
elseif(DEFINED ENV{HOME} AND NOT "$ENV{HOME}" STREQUAL "")
set(TELEGRAM_TUI_APP_CONFIG_PATH "$ENV{HOME}/.local/share/telegram-tui/config.json")
endif()
set(TELEGRAM_TUI_BUILD_API_ID "")
set(TELEGRAM_TUI_BUILD_API_HASH "")
if(TELEGRAM_TUI_APP_CONFIG_PATH AND EXISTS "${TELEGRAM_TUI_APP_CONFIG_PATH}")
file(READ "${TELEGRAM_TUI_APP_CONFIG_PATH}" TELEGRAM_TUI_APP_CONFIG_JSON)
string(REGEX MATCH "\"api_id\"[ \t\r\n]*:[ \t\r\n]*\"?([0-9]+)\"?"
TELEGRAM_TUI_APP_CONFIG_API_ID_MATCH "${TELEGRAM_TUI_APP_CONFIG_JSON}")
if(CMAKE_MATCH_1)
set(TELEGRAM_TUI_BUILD_API_ID "${CMAKE_MATCH_1}")
endif()
string(REGEX MATCH "\"api_hash\"[ \t\r\n]*:[ \t\r\n]*\"([^\"]+)\""
TELEGRAM_TUI_APP_CONFIG_API_HASH_MATCH "${TELEGRAM_TUI_APP_CONFIG_JSON}")
if(CMAKE_MATCH_1)
set(TELEGRAM_TUI_BUILD_API_HASH "${CMAKE_MATCH_1}")
endif()
endif()
configure_file(
${CMAKE_SOURCE_DIR}/src/build_config.h.in
${CMAKE_CURRENT_BINARY_DIR}/build_config.h
@ONLY
)
if(TELEGRAM_TUI_TDLIB_ROOT)
find_path(TELEGRAM_TUI_TDLIB_INCLUDE_DIR
NAMES td/telegram/td_json_client.h
PATHS "${TELEGRAM_TUI_TDLIB_ROOT}/include"
NO_DEFAULT_PATH
REQUIRED
)
find_library(TELEGRAM_TUI_TDLIB_LIBRARY
NAMES tdjson libtdjson.so libtdjson.so.1.8.61
PATHS "${TELEGRAM_TUI_TDLIB_ROOT}/lib"
NO_DEFAULT_PATH
REQUIRED
)
add_library(TdJsonPrebuilt SHARED IMPORTED GLOBAL)
set_target_properties(TdJsonPrebuilt PROPERTIES
IMPORTED_LOCATION "${TELEGRAM_TUI_TDLIB_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${TELEGRAM_TUI_TDLIB_INCLUDE_DIR}"
)
add_library(Td::TdJson ALIAS TdJsonPrebuilt)
elseif(TELEGRAM_TUI_USE_SYSTEM_TDLIB)
find_package(Td REQUIRED)
else()
set(TD_ENABLE_JNI OFF CACHE BOOL "" FORCE)
@@ -65,7 +118,7 @@ if(CLANG_FORMAT_BIN)
)
endif()
target_include_directories(shinoa PRIVATE ${CURSES_INCLUDE_DIRS})
target_include_directories(shinoa PRIVATE ${CURSES_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(shinoa PRIVATE ${CURSES_LIBRARIES})
if(TELEGRAM_TUI_USE_SYSTEM_TDLIB)

51
PKGBUILD Normal file
View File

@@ -0,0 +1,51 @@
_tdlib_rs_version=1.4.0
_tdlib_version=1.8.61
pkgname=shinoa-git
pkgver=r4.4910fb5
pkgrel=1
pkgdesc='Minimal Telegram terminal client built with ncurses and TDLib'
arch=('x86_64')
url='https://git.mshq.dev/AxiFisk/shinoa'
license=('custom:unknown')
depends=('gcc-libs' 'glibc' 'ncurses' 'openssl' 'zlib')
depends+=('libc++' 'libunwind')
makedepends=('cmake' 'git' 'gperf' 'patchelf')
provides=('shinoa')
conflicts=('shinoa')
source=(
'git+https://git.mshq.dev/AxiFisk/shinoa.git'
"tdlib-${_tdlib_version}-linux-x86_64.zip::https://github.com/FedericoBruzzone/tdlib-rs/releases/download/v${_tdlib_rs_version}/tdlib-${_tdlib_version}-linux-x86_64.zip"
)
noextract=("tdlib-${_tdlib_version}-linux-x86_64.zip")
sha256sums=(
'SKIP'
'997069633f54306ada33776d2c4a530017d2e7325a22e0f12701d52438c37383'
)
pkgver() {
cd "$srcdir/shinoa"
printf 'r%s.%s' "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
rm -rf "$srcdir/tdlib"
bsdtar -xf "$srcdir/tdlib-${_tdlib_version}-linux-x86_64.zip" -C "$srcdir"
}
build() {
cmake -S "$srcdir/shinoa" -B "$srcdir/build" \
-DCMAKE_BUILD_TYPE=None \
-DCMAKE_INSTALL_PREFIX=/usr \
-DTELEGRAM_TUI_TDLIB_ROOT="$srcdir/tdlib"
cmake --build "$srcdir/build"
}
package() {
install -Dm755 "$srcdir/build/shinoa" "$pkgdir/usr/bin/shinoa"
install -Dm755 "$srcdir/tdlib/lib/libtdjson.so.${_tdlib_version}" \
"$pkgdir/usr/lib/libtdjson.so.${_tdlib_version}"
ln -sf "libtdjson.so.${_tdlib_version}" "$pkgdir/usr/lib/libtdjson.so"
patchelf --remove-rpath "$pkgdir/usr/bin/shinoa"
install -Dm644 "$srcdir/shinoa/README.md" "$pkgdir/usr/share/doc/$pkgname/README.md"
}

View File

@@ -18,6 +18,8 @@ A minimal Telegram terminal client built with `ncurses` and TDLib.
- TDLib build dependencies (`gperf`, `openssl`, `zlib`, `git`)
The project vendors TDLib automatically by default. If you already have TDLib installed with CMake package metadata, configure with `-DTELEGRAM_TUI_USE_SYSTEM_TDLIB=ON`.
If you have a prebuilt TDLib bundle with `include/` and `lib/`, configure with
`-DTELEGRAM_TUI_TDLIB_ROOT=/path/to/tdlib`.
## Build
@@ -26,9 +28,14 @@ cmake -S . -B build
cmake --build build -j
```
During configure, CMake also checks the app config at
`$XDG_DATA_HOME/telegram-tui/config.json` or `~/.local/share/telegram-tui/config.json`.
If that file contains `api_id` and `api_hash`, they are embedded into the build.
## Run
Create a Telegram application at <https://my.telegram.org/apps>, then either export credentials:
Create a Telegram application at <https://my.telegram.org/apps>, then either rely on the
embedded credentials from the app config above, or export credentials:
```bash
export TELEGRAM_API_ID=123456

View File

@@ -2,6 +2,7 @@
#include <curses.h>
#include "build_config.h"
#include "util.h"
namespace telegram_tui {
@@ -19,6 +20,12 @@ App::App() {
const StoredConfig config = load_app_config();
api_id_ = get_env("TELEGRAM_API_ID");
api_hash_ = get_env("TELEGRAM_API_HASH");
if (api_id_.empty()) {
api_id_ = TELEGRAM_TUI_BUILD_API_ID;
}
if (api_hash_.empty()) {
api_hash_ = TELEGRAM_TUI_BUILD_API_HASH;
}
if (api_id_.empty()) {
api_id_ = config.api_id;
}

4
src/build_config.h.in Normal file
View File

@@ -0,0 +1,4 @@
#pragma once
#define TELEGRAM_TUI_BUILD_API_ID "@TELEGRAM_TUI_BUILD_API_ID@"
#define TELEGRAM_TUI_BUILD_API_HASH "@TELEGRAM_TUI_BUILD_API_HASH@"