Skip to content

Pre-built TDLib

Pre-built TDLib #175

name: Pre-built TDLib
# This workflow can be executed using a command like this:
# gh workflow run prebuilt-tdlib.yml --ref develop -f tdlib=v1.8.0 -f npm-patch=0
on:
workflow_dispatch:
inputs:
tdlib:
description: 'TDLib git ref (e.g. v1.8.0 or a commit hash)'
type: string
required: true
npm-patch:
description: 'prebuilt-tdlib patch version, required to publish (e.g. 0, 1)'
type: string
required: false
npm-tag:
description: 'npm tag (e.g. latest, beta)'
type: string
required: false
default: 'latest'
# NOTE: The ZLIB_USE_STATIC_LIBS option requires CMake >= 3.24
jobs:
build-linux-x86_64:
name: 'Build TDLib / Linux x86_64 glibc'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixos-unstable
- name: Build TDLib
run: |
cd packages/prebuilt-tdlib/ci
./build-linux.sh ${{ inputs.tdlib }} x86_64-linux-gnu.2.22
- uses: actions/upload-artifact@v4
with:
name: tdlib-linux-x86_64-glibc
path: ${{ env.TO_UPLOAD }}
build-linux-arm64:
name: 'Build TDLib / Linux arm64 glibc (cross)'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixos-unstable
- name: Build TDLib
run: |
cd packages/prebuilt-tdlib/ci
./build-linux.sh ${{ inputs.tdlib }} aarch64-linux-gnu.2.22
- uses: actions/upload-artifact@v4
with:
name: tdlib-linux-arm64-glibc
path: ${{ env.TO_UPLOAD }}
build-macos-x86_64:
name: 'Build TDLib / macOS x86_64'
runs-on: macos-13
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixpkgs-unstable
- name: Build TDLib
run: |
cd packages/prebuilt-tdlib/ci
./build-macos.sh ${{ inputs.tdlib }}
- uses: actions/upload-artifact@v4
with:
name: temp-macos-x86_64
path: ${{ env.TO_UPLOAD }}
build-macos-arm64:
name: 'Build TDLib / macOS arm64'
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixpkgs-unstable
- name: Build TDLib
run: |
cd packages/prebuilt-tdlib/ci
./build-macos.sh ${{ inputs.tdlib }}
- name: Verify codesigning
run: codesign -v ${{ env.TO_UPLOAD }}/libtdjson.dylib
- uses: actions/upload-artifact@v4
with:
name: temp-macos-arm64
path: ${{ env.TO_UPLOAD }}
build-macos:
name: Create universal macOS shared library
needs: [build-macos-x86_64, build-macos-arm64]
runs-on: macos-13
steps:
- uses: actions/download-artifact@v4
with:
pattern: temp-macos-*
- name: Combine shared libraries
run: |
mkdir -p to-upload
lipo temp-macos-x86_64/libtdjson.dylib temp-macos-arm64/libtdjson.dylib \
-output to-upload/libtdjson.dylib -create
cd to-upload
file libtdjson.dylib
otool -L libtdjson.dylib
- uses: actions/upload-artifact@v4
with:
name: tdlib-macos
path: to-upload
build-windows-x86_64:
name: 'Build TDLib / Windows x86_64'
runs-on: windows-2019
steps:
- uses: actions/checkout@v4
with:
repository: 'tdlib/td'
ref: ${{ inputs.tdlib }}
- name: vcpkg cache
uses: actions/cache@v4
with:
path: '~\AppData\Local\vcpkg\archives'
key: windows-vcpkg-${{ github.run_id }}
restore-keys: |
windows-vcpkg-
- name: Install dependencies using vcpkg
run: vcpkg install gperf:x64-windows-static openssl:x64-windows-static zlib:x64-windows-static
- name: CMake version
run: cmake --version
- name: Build TDLib
run: |
mkdir to-upload
mkdir build
cd build
cmake -A x64 `
-DCMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake `
-DVCPKG_TARGET_TRIPLET=x64-windows-static `
-DOPENSSL_USE_STATIC_LIBS=TRUE -DZLIB_USE_STATIC_LIBS=TRUE ..
cmake --build . --target tdjson --config Release --parallel 4
cd ..
cp build\Release\tdjson.dll to-upload\tdjson.dll
vcpkg list | Select-String openssl,zlib
- uses: actions/upload-artifact@v4
with:
name: tdlib-windows-x86_64
path: to-upload
test:
name: 'Test / ${{ matrix.v.bin }} / ${{ matrix.v.os }}'
needs:
- build-linux-x86_64
- build-macos
- build-windows-x86_64
runs-on: ${{ matrix.v.os }}
strategy:
fail-fast: false
matrix:
v:
- os: ubuntu-latest
bin: tdlib-linux-x86_64-glibc
- os: macos-13
bin: tdlib-macos
- os: macos-14
bin: tdlib-macos
- os: windows-latest
bin: tdlib-windows-x86_64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: lts/*
cache: npm
- run: npm install
- name: Uninstall the prebuilt-tdlib dev dependency
run: npm uninstall -D prebuilt-tdlib # just in case
- uses: actions/download-artifact@v4
with:
name: ${{ matrix.v.bin }}
merge-multiple: true
- run: npm run test:integration
env:
LIBDIR_PATH: '.'
test-linux-arm64:
name: 'Test / ${{ matrix.v.bin }} / ${{ matrix.v.os }} (docker arm64)'
needs: [build-linux-arm64]
runs-on: ${{ matrix.v.os }}
strategy:
matrix:
v:
- os: ubuntu-latest
bin: tdlib-linux-arm64-glibc
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: ${{ matrix.v.bin }}
merge-multiple: true
- run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- name: Run in docker
run: |
cat > test-linux-aarch64.sh <<EOF
set -ex
cd /usr/src/app
ldd libtdjson.so # Info
npm install
npm uninstall -D prebuilt-tdlib
LIBDIR_PATH=. npm run test:integration
EOF
docker run -v $(pwd):/usr/src/app --platform linux/arm64 node:20 \
bash /usr/src/app/test-linux-aarch64.sh
publish:
name: 'Publish to npm'
needs: [test, test-linux-arm64]
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: lts/*
cache: npm
# registry-url is mandatory here
registry-url: 'https://registry.npmjs.org'
- run: npm install
- run: npm uninstall -D prebuilt-tdlib
- uses: actions/download-artifact@v4
with:
pattern: tdlib-*
path: packages/prebuilt-tdlib/prebuilds
- run: tree packages/prebuilt-tdlib
- run: du -hsc packages/prebuilt-tdlib/prebuilds/*
env:
PREBUILT_PATH: packages/prebuilt-tdlib
- run: |
git clone https://github.com/tdlib/td td
cd td
git checkout ${{ inputs.tdlib }}
echo "TDLIB_COMMIT_HASH=$(git rev-parse ${{ inputs.tdlib }})" >> "$GITHUB_ENV"
__ver=`grep -Po "(?<=TDLib VERSION )\d+\.\d+\.\d+" ./CMakeLists.txt`
echo "TDLIB_VERSION=$__ver" >> "$GITHUB_ENV"
echo NPM_TAG=${{ inputs.npm-tag }} >> "$GITHUB_ENV"
- name: Publish
run: node packages/prebuilt-tdlib/publish.js ${{ inputs.npm-patch }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
if: "${{ inputs.npm-patch != '' }}"