305 lines
8.8 KiB
Nix

{
stdenv,
clang,
callPackage,
lib,
gn,
fetchurl,
fetchpatch,
xcbuild,
python3,
ninja,
apple-sdk_14,
darwinMinVersionHook,
git,
cpio,
pkg-config,
glib,
alsa-lib,
pulseaudio,
nasm,
brotli,
fontconfig,
freetype,
harfbuzz,
icu,
jsoncpp,
libpng,
libwebp,
libxml2,
libxslt,
minizip,
ffmpeg_6,
writeShellScript,
}:
let
sources = callPackage ./sources.nix { };
platformMap = {
"x86_64" = "x64";
"i686" = "x86";
"arm" = "arm";
"aarch64" = "arm64";
};
cpuName = stdenv.hostPlatform.parsed.cpu.name;
gnArch = platformMap."${cpuName}" or (throw "unsupported arch ${cpuName}");
gnOs =
if stdenv.hostPlatform.isLinux then
"linux"
else if stdenv.hostPlatform.isDarwin then
"mac"
else
throw "unknown platform ${stdenv.hostPlatform.config}";
boringSslSymbols = fetchurl {
url = "https://raw.githubusercontent.com/livekit/rust-sdks/refs/tags/webrtc-dac8015-6/webrtc-sys/libwebrtc/boringssl_prefix_symbols.txt";
hash = "sha256-dAweArv8zjsFPENEKi9mNBQkt4y+hh3rCqG6QZjRC20=";
};
gnSystemLibraries = import ./mkSystemLibraries.nix {
inherit
brotli
fontconfig
freetype
harfbuzz
icu
jsoncpp
libpng
libwebp
libxml2
libxslt
minizip
ffmpeg_6
;
};
gclient2nix = python3.pkgs.callPackage ./gclient2nix.nix { };
in
stdenv.mkDerivation {
pname = "livekit-libwebrtc";
version = "m114";
src = "${sources}/src";
patches =
[
# Adds missing dependencies to generated LICENSE
(fetchpatch {
url = "https://raw.githubusercontent.com/livekit/rust-sdks/b41861c7b71762d5d85b3de07ae67ffcae7c3fa2/webrtc-sys/libwebrtc/patches/add_licenses.patch";
hash = "sha256-9A4KyRW1K3eoQxsTbPX0vOnj66TCs2Fxjpsu5wO8mGI=";
})
# Fixes the certificate chain, required for Let's Encrypt certs
(fetchpatch {
url = "https://raw.githubusercontent.com/livekit/rust-sdks/b41861c7b71762d5d85b3de07ae67ffcae7c3fa2/webrtc-sys/libwebrtc/patches/ssl_verify_callback_with_native_handle.patch";
hash = "sha256-/gneuCac4VGJCWCjJZlgLKFOTV+x7Lc5KVFnNIKenwM=";
})
# Adds dependencies and features required by livekit
(fetchpatch {
url = "https://raw.githubusercontent.com/livekit/rust-sdks/b41861c7b71762d5d85b3de07ae67ffcae7c3fa2/webrtc-sys/libwebrtc/patches/add_deps.patch";
hash = "sha256-EMNYcTcBYh51Tt96+HP43ND11qGKClfx3xIPQmIBSo0=";
})
# Fixes concurrency and localization issues
(fetchpatch {
url = "https://github.com/zed-industries/webrtc/commit/08f7a701a2eda6407670508fc2154257a3c90308.patch";
hash = "sha256-oWYZLwqjRSHDt92MqsxsoBSMyZKj1ubNbOXZRbPpbEw=";
})
# Required for dynamically linking to ffmpeg libraries and exposing symbols
./0001-shared-libraries.patch
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
./0002-disable-narrowing-const-reference.patch
];
postPatch =
''
substituteInPlace tools/generate_shim_headers/generate_shim_headers.py \
--replace-fail "OFFICIAL_BUILD" "GOOGLE_CHROME_BUILD"
substituteInPlace BUILD.gn \
--replace-fail "rtc_static_library" "rtc_shared_library" \
--replace-fail "complete_static_lib = true" ""
substituteInPlace webrtc.gni \
--replace-fail "!build_with_chromium && is_component_build" "false"
substituteInPlace rtc_tools/BUILD.gn \
--replace-fail "\":frame_analyzer\"," ""
for lib in ${toString (builtins.attrNames gnSystemLibraries)}; do
if [ -d "third_party/$lib" ]; then
find "third_party/$lib" -type f \
\! -path "third_party/$lib/chromium/*" \
\! -path "third_party/$lib/google/*" \
\! -path "third_party/harfbuzz-ng/utils/hb_scoped.h" \
\! -regex '.*\.\(gn\|gni\|isolate\)' \
\! -name 'LICENSE*' \
\! -name 'COPYING*' \
-delete
fi
done
''
+ lib.optionalString stdenv.hostPlatform.isLinux ''
ln -sf ${lib.getExe gn} buildtools/linux64/gn
substituteInPlace build/toolchain/linux/BUILD.gn \
--replace 'toolprefix = "aarch64-linux-gnu-"' 'toolprefix = ""'
''
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
ln -sf ${lib.getExe gn} buildtools/mac/gn
chmod +x build/toolchain/apple/linker_driver.py
patchShebangs build/toolchain/apple/linker_driver.py
substituteInPlace build/toolchain/apple/toolchain.gni --replace-fail "/bin/cp -Rc" "cp -a"
'';
outputs = [
"dev"
"out"
];
nativeBuildInputs =
(builtins.concatLists (
lib.mapAttrsToList (
_: library: if (library.package ? dev) then [ library.package.dev ] else [ ]
) gnSystemLibraries
))
++ [
gn
(python3.withPackages (ps: [ ps.setuptools ]))
ninja
git
cpio
pkg-config
]
++ lib.optionals stdenv.isDarwin [ xcbuild ];
buildInputs =
[ nasm ]
++ (lib.mapAttrsToList (_: library: library.package) gnSystemLibraries)
++ (lib.optionals stdenv.hostPlatform.isLinux [
glib
alsa-lib
pulseaudio
])
++ lib.optionals stdenv.hostPlatform.isDarwin [
apple-sdk_14
(darwinMinVersionHook "12.3")
];
preConfigure = ''
echo "generate_location_tags = true" >> build/config/gclient_args.gni
echo "0" > build/util/LASTCHANGE.committime
python build/linux/unbundle/replace_gn_files.py \
--system-libraries ${toString (builtins.attrNames gnSystemLibraries)}
'';
gnFlags =
[
"is_debug=false"
"rtc_include_tests=false"
''target_os="${gnOs}"''
''target_cpu="${gnArch}"''
"treat_warnings_as_errors=false"
"rtc_enable_protobuf=false"
"rtc_include_tests=false"
"rtc_build_examples=false"
"rtc_build_tools=false"
"rtc_libvpx_build_vp9=true"
"enable_libaom=true"
"use_dummy_lastchange=true"
"is_component_build=true"
"enable_stripping=true"
"rtc_use_h264=true"
"use_custom_libcxx=false"
"use_rtti=true"
]
++ (lib.optionals stdenv.hostPlatform.isLinux [
"use_goma=false"
"rtc_use_pipewire=false"
"symbol_level=0"
"enable_iterator_debugging=false"
"rtc_use_x11=false"
"use_sysroot=false"
"is_clang=false"
])
++ (lib.optionals stdenv.hostPlatform.isDarwin [
''mac_deployment_target="12.3"''
"rtc_enable_symbol_export=true"
"rtc_enable_objc_symbol_export=true"
"rtc_include_dav1d_in_internal_decoder_factory=true"
"clang_use_chrome_plugins=false"
"use_lld=false"
''clang_base_path="${clang}"''
]);
ninjaFlags =
[ ":default" ]
++ lib.optionals stdenv.hostPlatform.isDarwin [
"api/audio_codecs:builtin_audio_decoder_factory"
"api/task_queue:default_task_queue_factory"
"sdk:native_api"
"sdk:default_codec_factory_objc"
"pc:peerconnection"
"sdk:videocapture_objc"
"sdk:mac_framework_objc"
];
postBuild =
lib.optionalString stdenv.hostPlatform.isLinux ''
objcopy --redefine-syms="${boringSslSymbols}" "libwebrtc.so"
''
+ ''
# Generate licenses
python3 "../../tools_webrtc/libs/generate_licenses.py" \
--target ${if stdenv.hostPlatform.isDarwin then ":webrtc" else ":default"} $PWD $PWD
'';
installPhase =
''
runHook preInstall
mkdir -p $out/lib
mkdir -p $dev/include
install -m0644 obj/webrtc.ninja args.gn LICENSE.md $dev
pushd ../..
find . -name "*.h" -print | cpio -pd $dev/include
popd
''
+ lib.optionalString stdenv.hostPlatform.isLinux ''
install -m0644 libwebrtc.so libthird_party_boringssl.so $out/lib
''
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
install -m0644 WebRTC.framework/Versions/A/WebRTC $out/lib/libwebrtc.dylib
install -m0644 libthird_party_boringssl.dylib $out/lib
''
+ ''
ln -s $out/lib $dev/lib
runHook postInstall
'';
postFixup = lib.optionalString stdenv.hostPlatform.isDarwin ''
boringssl="$out/lib/libthird_party_boringssl.dylib"
webrtc="$out/lib/libwebrtc.dylib"
install_name_tool -id "$boringssl" "$boringssl"
install_name_tool -id "$webrtc" "$webrtc"
install_name_tool -change @rpath/libthird_party_boringssl.dylib "$boringssl" "$webrtc"
'';
passthru.updateScript = writeShellScript "update-livekit-libwebrtc" ''
set -eou pipefail
cd pkgs/by-name/li/livekit-libwebrtc
${lib.getExe gclient2nix} --main-source-path src https://github.com/webrtc-sdk/webrtc.git m114_release
'';
meta = {
description = "WebRTC library used by livekit";
homepage = "https://github.com/livekit/rust-sdks/";
license = lib.licenses.bsd3;
maintainers = with lib.maintainers; [
WeetHet
niklaskorz
];
platforms = lib.platforms.linux ++ lib.platforms.darwin;
};
}