diff --git a/.github/workflows/prebuilt-tdlib.yml b/.github/workflows/prebuilt-tdlib.yml index 6a3494e..6d40f14 100644 --- a/.github/workflows/prebuilt-tdlib.yml +++ b/.github/workflows/prebuilt-tdlib.yml @@ -17,11 +17,10 @@ on: type: string required: false default: 'latest' -# NOTE: The ZLIB_USE_STATIC_LIBS option requires CMake >= 3.24 jobs: - build-linux-x86_64: + build-linux-x86_64-glibc: name: 'Build TDLib / Linux x86_64 glibc' - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@v27 @@ -30,15 +29,15 @@ jobs: - name: Build TDLib run: | cd packages/prebuilt-tdlib/ci - ./build-linux.sh ${{ inputs.tdlib }} x86_64-linux-gnu.2.22 + ./build-linux.sh ${{ inputs.tdlib }} x86_64 gnu - uses: actions/upload-artifact@v4 with: name: tdlib-linux-x86_64-glibc path: ${{ env.TO_UPLOAD }} - build-linux-arm64: + build-linux-arm64-glibc: name: 'Build TDLib / Linux arm64 glibc (cross)' - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@v27 @@ -47,7 +46,7 @@ jobs: - name: Build TDLib run: | cd packages/prebuilt-tdlib/ci - ./build-linux.sh ${{ inputs.tdlib }} aarch64-linux-gnu.2.22 + ./build-linux.sh ${{ inputs.tdlib }} aarch64 gnu - uses: actions/upload-artifact@v4 with: name: tdlib-linux-arm64-glibc @@ -108,6 +107,7 @@ jobs: run: vcpkg install gperf:x64-windows-static openssl:x64-windows-static zlib:x64-windows-static - name: CMake version run: cmake --version + # NOTE: The ZLIB_USE_STATIC_LIBS option requires CMake >= 3.24 - name: Build TDLib run: | mkdir to-upload @@ -129,7 +129,8 @@ jobs: test: name: 'Test / ${{ matrix.v.bin }} / ${{ matrix.v.os }}' needs: - - build-linux-x86_64 + - build-linux-x86_64-glibc + - build-linux-arm64-glibc - build-macos-x86_64 - build-macos-arm64 - build-windows-x86_64 @@ -138,11 +139,15 @@ jobs: fail-fast: false matrix: v: - - os: ubuntu-latest + # use an older ubuntu version to test the library working with + # previous glibc version + - os: ubuntu-22.04 bin: tdlib-linux-x86_64-glibc + - os: ubuntu-24.04-arm + bin: tdlib-linux-arm64-glibc - os: macos-13 bin: tdlib-macos-x86_64 - - os: macos-14 + - os: macos-latest bin: tdlib-macos-arm64 - os: windows-latest bin: tdlib-windows-x86_64 @@ -163,38 +168,9 @@ jobs: 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 < { }).callPackage ./tdlib.nix { rev = \"$tdlib\" }" mkdir to-upload cp -L ./result/lib/libtdjson.dylib to-upload/libtdjson.dylib diff --git a/packages/prebuilt-tdlib/ci/openssl-zig.nix b/packages/prebuilt-tdlib/ci/openssl-zig.nix deleted file mode 100644 index e09fe6f..0000000 --- a/packages/prebuilt-tdlib/ci/openssl-zig.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ openssl, zig-toolchain }: -(openssl.override { static = true; }).overrideAttrs (final: prev: { - preConfigure = zig-toolchain.env; - doCheck = false; -}) diff --git a/packages/prebuilt-tdlib/ci/tdlib-linux.nix b/packages/prebuilt-tdlib/ci/tdlib-linux.nix deleted file mode 100644 index ec1924a..0000000 --- a/packages/prebuilt-tdlib/ci/tdlib-linux.nix +++ /dev/null @@ -1,64 +0,0 @@ -{ target, rev }: -let - pkgs = if builtins.substring 0 7 target == "aarch64" - then import { crossSystem.config = "aarch64-unknown-linux-gnu"; } - else import {}; - inherit (pkgs) lib stdenv; - zig-toolchain = import ./zig-toolchain.nix { inherit target; pkgs = pkgs.buildPackages.buildPackages; }; - zlib = pkgs.callPackage ./zlib-zig.nix { inherit zig-toolchain; }; - openssl = pkgs.callPackage ./openssl-zig.nix { inherit zig-toolchain; }; -in -# Based on https://github.com/NixOS/nixpkgs/blob/af51e23ce535b1bfa8484021ff3913d876e09082/pkgs/development/libraries/tdlib/default.nix -stdenv.mkDerivation { - pname = "tdlib"; - version = "0.0"; - - src = builtins.fetchTarball "https://github.com/tdlib/td/archive/${rev}.tar.gz"; - - buildInputs = [ openssl zlib ]; - nativeBuildInputs = with pkgs.buildPackages; [ cmake gperf ]; - - preConfigure = '' - export CC=${pkgs.buildPackages.stdenv.cc}/bin/cc - export CXX=${pkgs.buildPackages.stdenv.cc}/bin/c++ - mkdir native-build && cd native-build - cmake -DOPENSSL_ROOT_DIR=${pkgs.buildPackages.openssl.dev} \ - -DZLIB_ROOT=${pkgs.buildPackages.zlib.dev} \ - .. - cmake --build . --target prepare_cross_compiling -j $NIX_BUILD_CORES - cd .. - '' + zig-toolchain.env; - - patches = [ ./tdlib-zig.patch ]; - - cmakeFlags = [ - "-DCMAKE_BUILD_TYPE=Release" - "-DOPENSSL_USE_STATIC_LIBS=TRUE" - "-DZLIB_USE_STATIC_LIBS=TRUE" - "-DCMAKE_SYSTEM_NAME=Linux" - "-DCMAKE_CROSSCOMPILING=TRUE" - ]; - - buildPhase = '' - cmake --build . --target tdjson -j $NIX_BUILD_CORES - ''; - - installPhase = '' - runHook preInstall - mkdir -p "$out"/lib - cp -L ./libtdjson.so "$out"/lib/ - runHook postInstall - ''; - - # https://github.com/tdlib/td/issues/1974 - postPatch = '' - substituteInPlace CMake/GeneratePkgConfig.cmake \ - --replace 'function(generate_pkgconfig' \ - 'include(GNUInstallDirs) - function(generate_pkgconfig' \ - --replace '\$'{prefix}/'$'{CMAKE_INSTALL_LIBDIR} '$'{CMAKE_INSTALL_FULL_LIBDIR} \ - --replace '\$'{prefix}/'$'{CMAKE_INSTALL_INCLUDEDIR} '$'{CMAKE_INSTALL_FULL_INCLUDEDIR} - '' + lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) '' - sed -i "/vptr/d" test/CMakeLists.txt - ''; -} diff --git a/packages/prebuilt-tdlib/ci/tdlib-macos.nix b/packages/prebuilt-tdlib/ci/tdlib-macos.nix deleted file mode 100644 index 62dbaf9..0000000 --- a/packages/prebuilt-tdlib/ci/tdlib-macos.nix +++ /dev/null @@ -1,46 +0,0 @@ -{ rev }: -let - pkgs = import {}; - inherit (pkgs) lib stdenv apple-sdk_11; - zlib = pkgs.zlib.override { static = true; shared = false; }; - openssl = pkgs.openssl.override { static = true; }; -in -# Based on https://github.com/NixOS/nixpkgs/blob/af51e23ce535b1bfa8484021ff3913d876e09082/pkgs/development/libraries/tdlib/default.nix -stdenv.mkDerivation { - pname = "tdlib"; - version = "0.0"; - - src = builtins.fetchTarball "https://github.com/tdlib/td/archive/${rev}.tar.gz"; - - buildInputs = [ openssl zlib apple-sdk_11 ]; - nativeBuildInputs = with pkgs; [ cmake gperf ]; - - cmakeFlags = [ - "-DCMAKE_BUILD_TYPE=Release" - "-DOPENSSL_USE_STATIC_LIBS=TRUE" - "-DZLIB_USE_STATIC_LIBS=TRUE" - ]; - - buildPhase = '' - cmake --build . --target tdjson -j $NIX_BUILD_CORES - ''; - - installPhase = '' - runHook preInstall - mkdir -p "$out"/lib - cp -L ./libtdjson.dylib "$out"/lib/ - runHook postInstall - ''; - - # https://github.com/tdlib/td/issues/1974 - postPatch = '' - substituteInPlace CMake/GeneratePkgConfig.cmake \ - --replace 'function(generate_pkgconfig' \ - 'include(GNUInstallDirs) - function(generate_pkgconfig' \ - --replace '\$'{prefix}/'$'{CMAKE_INSTALL_LIBDIR} '$'{CMAKE_INSTALL_FULL_LIBDIR} \ - --replace '\$'{prefix}/'$'{CMAKE_INSTALL_INCLUDEDIR} '$'{CMAKE_INSTALL_FULL_INCLUDEDIR} - '' + lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) '' - sed -i "/vptr/d" test/CMakeLists.txt - ''; -} diff --git a/packages/prebuilt-tdlib/ci/tdlib-zig-wrapper.nix b/packages/prebuilt-tdlib/ci/tdlib-zig-wrapper.nix new file mode 100644 index 0000000..1afadd1 --- /dev/null +++ b/packages/prebuilt-tdlib/ci/tdlib-zig-wrapper.nix @@ -0,0 +1,23 @@ +{ pkgs ? import {}, rev, arch, abi, libcVersion ? "" }: +# Linux-only +let + target = "${arch}-linux-${abi}" + + (if builtins.stringLength libcVersion > 0 then ".${libcVersion}" else ""); + pkgs' = import pkgs.path { crossSystem.config = "${arch}-unknown-linux-${abi}"; }; + zig-toolchain = import ./zig-toolchain.nix { + inherit target; + pkgs = pkgs'.buildPackages.buildPackages; + }; + openssl = pkgs'.openssl.overrideAttrs (final: prev: { + preConfigure = (prev.preConfigure or "") + zig-toolchain.env; + doCheck = false; + }); + zlib = pkgs'.zlib.overrideAttrs (final: prev: { + preConfigure = (prev.preConfigure or "") + zig-toolchain.env; + doCheck = false; + }); +in +(pkgs'.callPackage ./tdlib.nix { inherit rev openssl zlib; }).overrideAttrs (final: prev: { + preConfigure = (prev.preConfigure or "") + zig-toolchain.env; + patches = [ ./tdlib-zig.patch ]; +}) diff --git a/packages/prebuilt-tdlib/ci/tdlib.nix b/packages/prebuilt-tdlib/ci/tdlib.nix new file mode 100644 index 0000000..6ded69f --- /dev/null +++ b/packages/prebuilt-tdlib/ci/tdlib.nix @@ -0,0 +1,87 @@ +{ + stdenv, + lib, + openssl, + zlib, + cmake, + gperf, + apple-sdk_11, + buildPackages, + breakpointHook, + + rev, +}: +# Based on https://github.com/NixOS/nixpkgs/blob/af51e23ce535b1bfa8484021ff3913d876e09082/pkgs/development/libraries/tdlib/default.nix +stdenv.mkDerivation { + pname = "tdlib"; + version = "0.0"; + + src = builtins.fetchTarball "https://github.com/tdlib/td/archive/${rev}.tar.gz"; + + buildInputs = [ + (openssl.override { static = true; }).dev + (zlib.override { static = true; shared = false; }) + ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ apple-sdk_11 ]; + + nativeBuildInputs = [ + cmake + gperf + breakpointHook + ]; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + # Note: Even if we compile for the same architecture, the hostPlatform + # compiler can be zig cc for different glibc version that doesn't produce + # runnable executables + preConfigure = '' + cmake -B native-build \ + -DCMAKE_C_COMPILER=$CC_FOR_BUILD \ + -DCMAKE_CXX_COMPILER=$CXX_FOR_BUILD \ + -DCMAKE_AR=$(command -v $AR_FOR_BUILD) \ + -DCMAKE_RANLIB=$(command -v $RANLIB_FOR_BUILD) \ + -DCMAKE_STRIP=$(command -v $STRIP_FOR_BUILD) \ + -DTD_GENERATE_SOURCE_FILES=ON . + cmake --build native-build -j $NIX_BUILD_CORES + ''; + + cmakeFlags = [ + "-DCMAKE_BUILD_TYPE=Release" + "-DOPENSSL_USE_STATIC_LIBS=TRUE" + "-DZLIB_USE_STATIC_LIBS=TRUE" + "-DCMAKE_CROSSCOMPILING=TRUE" + ] ++ lib.optionals stdenv.hostPlatform.isLinux [ + "-DCMAKE_SYSTEM_NAME=Linux" + ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ + "-DCMAKE_SYSTEM_NAME=Darwin" + ]; + + buildPhase = '' + runHook preBuild + cmake --build . --target tdjson -j $NIX_BUILD_CORES + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + mkdir -p $out/lib + '' + (if stdenv.hostPlatform.isDarwin then '' + cp -L libtdjson.dylib $out/lib + '' else '' + cp -L libtdjson.so $out/lib + '') + '' + runHook postInstall + ''; + + # https://github.com/tdlib/td/issues/1974 + postPatch = '' + substituteInPlace CMake/GeneratePkgConfig.cmake \ + --replace 'function(generate_pkgconfig' \ + 'include(GNUInstallDirs) + function(generate_pkgconfig' \ + --replace '\$'{prefix}/'$'{CMAKE_INSTALL_LIBDIR} '$'{CMAKE_INSTALL_FULL_LIBDIR} \ + --replace '\$'{prefix}/'$'{CMAKE_INSTALL_INCLUDEDIR} '$'{CMAKE_INSTALL_FULL_INCLUDEDIR} + '' + lib.optionalString (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) '' + sed -i "/vptr/d" test/CMakeLists.txt + ''; +} diff --git a/packages/prebuilt-tdlib/ci/zlib-zig.nix b/packages/prebuilt-tdlib/ci/zlib-zig.nix deleted file mode 100644 index 40443b0..0000000 --- a/packages/prebuilt-tdlib/ci/zlib-zig.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ zlib, zig-toolchain }: -(zlib.override { static = true; shared = false; }).overrideAttrs (final: prev: { - preConfigure = prev.preConfigure + zig-toolchain.env; - doCheck = false; -})