Pre-built TDLib #88
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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-x64: | |
name: Build TDLib (GNU/Linux x86_64) | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
repository: 'tdlib/td' | |
ref: ${{ inputs.tdlib }} | |
- name: Create a build script | |
run: | | |
cat > prebuilt-tdlib-docker.sh <<EOF | |
set -e | |
source /hbb_shlib/activate | |
set -x | |
yum install -y gperf | |
cd /td | |
mkdir -p build && cd build | |
cmake --version | |
# Currently, cmake in this image should be 3.22.2 | |
cmake \ | |
-DCMAKE_BUILD_TYPE=Release \ | |
-DOPENSSL_USE_STATIC_LIBS=TRUE \ | |
-DZLIB_LIBRARY=/hbb_shlib/lib/libz.a \ | |
-DZLIB_INCLUDE_DIR=/hbb_shlib/include \ | |
.. | |
cmake --build . --target tdjson -- -j 2 | |
strip libtdjson.so | |
cd .. | |
cp -L build/libtdjson.so to-upload/libtdjson.so | |
cd to-upload | |
ldd libtdjson.so | |
touch info.txt | |
gcc --version | grep -i gcc >> info.txt | |
ldd --version | grep ldd >> info.txt | |
openssl version >> info.txt | |
sed -n 's/#define ZLIB_VERSION "\([^"]*\)"/zlib version: \1/p' /hbb_shlib/include/zlib.h >> info.txt | |
EOF | |
- name: Build in docker | |
run: | | |
mkdir to-upload | |
docker run -v $(pwd):/td ghcr.io/phusion/holy-build-box/hbb-64 \ | |
bash /td/prebuilt-tdlib-docker.sh | |
- name: Info | |
working-directory: to-upload | |
run: | | |
cat info.txt | |
echo "-----" | |
du -hs libtdjson.so | |
ldd libtdjson.so | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: tdlib-linux-x64 | |
path: to-upload | |
build-macos: | |
name: Build TDLib (macOS universal) | |
runs-on: macos-12 | |
env: | |
openssl_dir: /usr/local/opt/custom_openssl | |
openssl_tag: '1.1.2100' # OpenSSL 1.1.1u | |
zlib_ver: '1.2.13' | |
zlib_dir: /usr/local/opt/custom_zlib | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
repository: 'tdlib/td' | |
ref: ${{ inputs.tdlib }} | |
- name: Install gperf via homebrew | |
run: HOMEBREW_NO_INSTALL_CLEANUP=1 brew install gperf | |
- name: CMake version | |
run: cmake --version | |
# https://github.com/up9cloud/ios-libtdjson/blob/d4426dca16933b6178acb030955de92f040b7574/build.sh | |
- name: Download pre-built OpenSSL | |
run: | | |
# around 80 mb | |
curl -SL https://github.com/krzyzanowskim/OpenSSL/archive/refs/tags/${openssl_tag}.tar.gz -o OpenSSL.tar.gz | |
tar xzf OpenSSL.tar.gz | |
# As for now, MACOSX_DEPLOYMENT_TARGET in these pre-built openssl binaries should be 10.13 | |
mv OpenSSL-${openssl_tag}/macosx ${openssl_dir} | |
- name: Download and build zlib | |
run: | | |
set -x | |
curl -SL https://github.com/madler/zlib/releases/download/v${zlib_ver}/zlib-${zlib_ver}.tar.gz -o zlib.tar.gz | |
tar xzf zlib.tar.gz | |
cd zlib-${zlib_ver} | |
MACOSX_DEPLOYMENT_TARGET=10.14 CFLAGS="-O2 -mmacosx-version-min=10.14 -arch x86_64" \ | |
./configure --static --prefix=${zlib_dir} | |
MACOSX_DEPLOYMENT_TARGET=10.14 make | |
make install && rm ${zlib_dir}/lib/libz.a | |
cp libz.a libz-x86_64.a | |
make clean | |
MACOSX_DEPLOYMENT_TARGET=11.0 CFLAGS="-O2 -mmacosx-version-min=11.0 -arch arm64" \ | |
./configure --static | |
MACOSX_DEPLOYMENT_TARGET=11.0 make | |
mv libz.a libz-arm64.a | |
lipo -create libz-x86_64.a libz-arm64.a -output libz.a | |
cp libz.a ${zlib_dir}/lib/libz.a | |
- name: Build TDLib | |
run: | | |
mkdir to-upload | |
mkdir -p build && cd build | |
MACOSX_DEPLOYMENT_TARGET=10.14 cmake \ | |
-DCMAKE_BUILD_TYPE=Release \ | |
-DCMAKE_OSX_ARCHITECTURES='x86_64;arm64' \ | |
-DOPENSSL_USE_STATIC_LIBS=TRUE -DZLIB_USE_STATIC_LIBS=TRUE \ | |
-DOPENSSL_FOUND=1 \ | |
-DOPENSSL_CRYPTO_LIBRARY=${openssl_dir}/lib/libcrypto.a \ | |
-DOPENSSL_SSL_LIBRARY=${openssl_dir}/lib/libssl.a \ | |
-DOPENSSL_LIBRARIES="${openssl_dir}/lib/libcrypto.a;${openssl_dir}/lib/libssl.a" \ | |
-DOPENSSL_INCLUDE_DIR=${openssl_dir}/include \ | |
-DZLIB_INCLUDE_DIR=${zlib_dir}/include \ | |
-DZLIB_LIBRARY=${zlib_dir}/lib/libz.a \ | |
.. | |
cmake --build . --target tdjson -- -j 3 | |
cd .. | |
cp -L build/libtdjson.dylib to-upload/libtdjson.dylib | |
install_name_tool -id @rpath/libtdjson.dylib to-upload/libtdjson.dylib | |
- name: Info | |
working-directory: to-upload | |
run: | | |
touch info.txt | |
grep OPENSSL_VERSION_TEXT ${openssl_dir}/include/openssl/opensslv.h | sed 's/.*"\([^"]*\)"/\1/' >> info.txt | |
echo "zlib version: ${zlib_ver}" >> info.txt | |
otool -L libtdjson.dylib >> info.txt | |
cat info.txt | |
echo "-----" | |
uname -a | |
file libtdjson.dylib | |
du -hs libtdjson.dylib | |
otool -arch x86_64 -l libtdjson.dylib | |
echo "---" | |
otool -arch arm64 -l libtdjson.dylib | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: tdlib-macos | |
path: to-upload | |
build-windows-x64: | |
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 2 | |
cd .. | |
cp build\Release\tdjson.dll to-upload\tdjson.dll | |
- name: Info | |
# It should be possible to print the dependencies using dumpbin.exe | |
run: | | |
vcpkg list | Select-String openssl,zlib > to-upload\info.txt | |
cat to-upload\info.txt | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: tdlib-windows-x64 | |
path: to-upload | |
test: | |
name: 'Test the ${{ matrix.os[1] }} pre-built libraries' | |
needs: [build-linux-x64, build-macos, build-windows-x64] | |
runs-on: ${{ matrix.os[0] }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- [ubuntu-latest, tdlib-linux-x64] | |
- [macos-latest, tdlib-macos] | |
- [windows-latest, tdlib-windows-x64] | |
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.os[1] }} | |
merge-multiple: true | |
- run: npm run test:integration | |
env: | |
LIBDIR_PATH: '.' | |
publish: | |
name: 'Publish to npm' | |
needs: [test] | |
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: npm run test:integration | |
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 != '' }}" |