cmake_minimum_required(VERSION 3.20)
project(DennyTelegramRuntime LANGUAGES C CXX OBJC OBJCXX ASM)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_C_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_OBJC_VISIBILITY_PRESET hidden)
set(CMAKE_OBJCXX_VISIBILITY_PRESET hidden)
if(NOT RUNTIME_WORK)
 message(FATAL_ERROR "RUNTIME_WORK is required")
endif()
set(B "${RUNTIME_WORK}")
set(IOS "${B}/sources/telegram-ios")
set(OWT "${B}/sources/tg_owt")
set(TG "${B}/sources/tgcalls")
set(H264 "${IOS}/third-party/openh264/third_party/openh264/src/codec")
set(TG_OWT_SPECIAL_TARGET macstore CACHE STRING "" FORCE)
set(TG_OWT_BUILD_AUDIO_BACKENDS ON CACHE BOOL "" FORCE)
set(TG_OWT_OPENSSL_INCLUDE_PATH ${B}/openssl/include CACHE STRING "" FORCE)
set(TG_OWT_OPUS_INCLUDE_PATH "${B}/sources/opus-1.5.1/include" CACHE STRING "" FORCE)
set(TG_OWT_LIBVPX_INCLUDE_PATH "${B}/deps/include" CACHE STRING "" FORCE)
set(TG_OWT_FFMPEG_INCLUDE_PATH "${B}/deps/include" CACHE STRING "" FORCE)
set(TG_OWT_OPENH264_INCLUDE_PATH "${H264}/api" CACHE STRING "" FORCE)
set(TG_OWT_LIBJPEG_INCLUDE_PATH "${B}/build-jpeg;${IOS}/third-party/mozjpeg/mozjpeg" CACHE STRING "" FORCE)
add_subdirectory("${OWT}" owt)
set(OPUS_BUILD_TESTING OFF CACHE BOOL "" FORCE)
set(OPUS_BUILD_PROGRAMS OFF CACHE BOOL "" FORCE)
set(OPUS_INSTALL_PKG_CONFIG_MODULE OFF CACHE BOOL "" FORCE)
set(OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF CACHE BOOL "" FORCE)
add_subdirectory("${B}/sources/opus-1.5.1" opus)
include("${B}/openh264-sources.cmake")
add_library(denny_openh264 STATIC ${OPENH264_SOURCES})
target_compile_definitions(denny_openh264 PRIVATE HAVE_NEON_AARCH64=1)
target_include_directories(denny_openh264 PRIVATE "${H264}/encoder/core/inc" "${H264}/encoder/plus/inc" "${H264}/decoder/core/inc" "${H264}/decoder/plus/inc" "${H264}/common/inc" "${H264}/api/wels" "${H264}/processing/interface" "${H264}/processing/src/common" "${H264}/common/arm64")
file(GLOB RN "${IOS}/third-party/rnnoise/Sources/*.c")
add_library(denny_rnnoise STATIC ${RN})
target_include_directories(denny_rnnoise PRIVATE "${IOS}/third-party/rnnoise/PublicHeaders")
target_compile_definitions(denny_rnnoise PRIVATE
 _celt_autocorr=rnnoise__celt_autocorr
 celt_fir=rnnoise_celt_fir
 celt_iir=rnnoise_celt_iir
 _celt_lpc=rnnoise__celt_lpc
 celt_pitch_xcorr=rnnoise_celt_pitch_xcorr
 compute_band_corr=rnnoise_compute_band_corr
 compute_band_energy=rnnoise_compute_band_energy
 compute_dense=rnnoise_compute_dense
 compute_gru=rnnoise_compute_gru
 compute_rnn=rnnoise_compute_rnn
 interp_band_gain=rnnoise_interp_band_gain
 opus_fft_alloc=rnnoise_opus_fft_alloc
 opus_fft_alloc_arch_c=rnnoise_opus_fft_alloc_arch_c
 opus_fft_alloc_twiddles=rnnoise_opus_fft_alloc_twiddles
 opus_fft_c=rnnoise_opus_fft_c
 opus_fft_free=rnnoise_opus_fft_free
 opus_fft_free_arch_c=rnnoise_opus_fft_free_arch_c
 opus_fft_impl=rnnoise_opus_fft_impl
 opus_ifft_c=rnnoise_opus_ifft_c
 pitch_downsample=rnnoise_pitch_downsample
 pitch_filter=rnnoise_pitch_filter
 pitch_search=rnnoise_pitch_search
 remove_doubling=rnnoise_remove_doubling
)

file(GLOB_RECURSE TG_SOURCES CONFIGURE_DEPENDS "${TG}/tgcalls/*.cpp" "${TG}/tgcalls/*.cc" "${TG}/tgcalls/*.mm" "${TG}/tgcalls/*.m" "${TG}/macos/Sources/*.mm")
list(FILTER TG_SOURCES EXCLUDE REGEX "/platform/(android|tdesktop|uwp|fake)/|/platform/darwin/iOS/|/legacy/")
list(FILTER TG_SOURCES EXCLUDE REGEX "/platform/darwin/(VideoCaptureView|VideoMetalView|VideoSampleBufferView|VideoCameraCapturer|CustomExternalCapturer)\\.mm$")
add_library(TgVoipWebrtc SHARED ${TG_SOURCES})
set_target_properties(TgVoipWebrtc PROPERTIES FRAMEWORK TRUE FRAMEWORK_VERSION A MACOSX_FRAMEWORK_IDENTIFIER tech.afteam.denny.tgcalls MACOSX_FRAMEWORK_BUNDLE_VERSION 1 MACOSX_FRAMEWORK_SHORT_VERSION_STRING 1.0 INSTALL_NAME_DIR "@rpath" BUILD_WITH_INSTALL_NAME_DIR TRUE CXX_VISIBILITY_PRESET default OBJC_VISIBILITY_PRESET default OBJCXX_VISIBILITY_PRESET default)
file(GLOB PUBLIC_HEADERS "${TG}/macos/PublicHeaders/TgVoipWebrtc/*.h")
set_target_properties(TgVoipWebrtc PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}")
target_sources(TgVoipWebrtc PRIVATE ${PUBLIC_HEADERS})
target_compile_options(TgVoipWebrtc PRIVATE -fobjc-arc -Wno-deprecated-declarations)
target_compile_definitions(TgVoipWebrtc PRIVATE ABSL_ALLOCATOR_NOTHROW=1 HAVE_SCTP HAVE_NETINET_IN_H WEBRTC_ARCH_ARM64 WEBRTC_HAS_NEON)
target_include_directories(TgVoipWebrtc PRIVATE "${TG}" "${TG}/tgcalls" "${TG}/macos/PublicHeaders" "${OWT}/src" "${OWT}/src/sdk/objc" "${OWT}/src/sdk/objc/base" "${OWT}/src/sdk/objc/components/renderer/metal" "${OWT}/src/sdk/objc/components/renderer/opengl" "${OWT}/src/sdk/objc/components/video_codec" "${OWT}/src/sdk/objc/api/video_codec" "${OWT}/src/third_party/libyuv/include" "${B}/deps/include" "${B}/sources/opus-1.5.1/include" ${B}/openssl/include "${IOS}/third-party/rnnoise/PublicHeaders")
target_link_libraries(TgVoipWebrtc PRIVATE tg_owt tg_owt::libwebrtcbuild opus denny_openh264 denny_rnnoise "${B}/deps/lib/libvpx.a" "${B}/build-jpeg/libjpeg.a" "${B}/deps/lib/libavformat.a" "${B}/deps/lib/libavcodec.a" "${B}/deps/lib/libswresample.a" "${B}/deps/lib/libswscale.a" "${B}/deps/lib/libavutil.a" ${B}/openssl/lib/libssl.a ${B}/openssl/lib/libcrypto.a "-framework Foundation" "-framework AppKit" "-framework AVFoundation" "-framework AudioToolbox" "-framework CoreAudio" "-framework CoreMedia" "-framework CoreVideo" "-framework CoreGraphics" "-framework QuartzCore" "-framework Metal" "-framework MetalKit" "-framework VideoToolbox" "-framework CoreMediaIO" "-framework ScreenCaptureKit" "-framework IOKit" "-framework IOSurface" "-framework Accelerate" "-framework Security" z bz2 iconv)
