Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 20 additions & 50 deletions .github/actions/prepare-linux/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,77 +30,47 @@ runs:

- name: Install required packages
run: |
sudo apt-get update
sudo apt-get install -y pulseaudio libpulse-dev libasound2-dev libdbus-1-dev libudev-dev libv4l-dev libx11-dev libxcomposite-dev libxrandr-dev libxfixes-dev binutils cmake git locales lsb-release ninja-build pkg-config python3 python3-setuptools rsync unzip wget xz-utils
sudo apt update
sudo apt install -y binutils cmake git locales lsb-release ninja-build pkg-config python3 python3-setuptools rsync unzip wget xz-utils

# Chromium Clang to be used with the clang toolchain file
#curl -s https://raw.githubusercontent.com/chromium/chromium/main/tools/clang/scripts/update.py | python3 - --output-dir=/opt/clang
# Use a more stable version of Clang
sudo mkdir -p /opt/clang
wget https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-20-init-9764-gb81d8e90-72.tar.xz
sudo tar -xvf clang-llvmorg-20-init-9764-gb81d8e90-72.tar.xz -C /opt/clang

# Required for testing
#pulseaudio --start
sudo apt-get install -y pipewire pipewire-pulse gstreamer1.0-pipewire libspa-0.2-bluetooth libspa-0.2-jack pipewire-audio-client-libraries
sudo apt install -y pipewire pipewire-pulse gstreamer1.0-pipewire libspa-0.2-bluetooth libspa-0.2-jack pipewire-audio-client-libraries
systemctl --user daemon-reload
systemctl --user --now enable pipewire{,-pulse}.{socket,service}
shell: bash

- name: Install required packages for x86-64
if: matrix.platform.name == 'linux_x86-64'
run: |
sudo mkdir /opt/sysroot
python3 webrtc-jni/src/main/cpp/dependencies/webrtc/linux/sysroot/install-sysroot.py --arch=amd64
sudo mv webrtc-jni/src/main/cpp/dependencies/webrtc/linux/debian* /opt/sysroot/
shell: bash

- name: Install required packages for arm
if: matrix.platform.name == 'linux_arm'
run: |
sudo apt install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

sudo dpkg --add-architecture armhf

sudo rm /etc/apt/sources.list

sudo tee -a /etc/apt/sources.list > /dev/null <<EOT
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports jammy main restricted universe multiverse
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted universe multiverse
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted universe multiverse
EOT

sudo apt-get update

sudo apt install -y \
libpulse-dev:armhf \
libx11-dev:armhf \
libxfixes-dev:armhf \
libxrandr-dev:armhf \
libxcomposite-dev:armhf \
libdbus-1-dev:armhf

# Avoid python3 conflict errors.
sudo apt install -y --no-install-recommends libudev-dev:armhf

sudo mkdir /opt/sysroot
python3 webrtc-jni/src/main/cpp/dependencies/webrtc/linux/sysroot/install-sysroot.py --arch=armhf
sudo mv webrtc-jni/src/main/cpp/dependencies/webrtc/linux/debian* /opt/sysroot/
shell: bash

- name: Install required packages for arm64
if: matrix.platform.name == 'linux_arm64'
run: |
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

sudo dpkg --add-architecture arm64

sudo rm /etc/apt/sources.list

sudo tee -a /etc/apt/sources.list > /dev/null <<EOT
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy main restricted universe multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted universe multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted universe multiverse
EOT

sudo apt-get update

sudo apt install -y \
libpulse-dev:arm64 \
libx11-dev:arm64 \
libxfixes-dev:arm64 \
libxrandr-dev:arm64 \
libxcomposite-dev:arm64 \
libdbus-1-dev:arm64

# Avoid python3 conflict errors.
sudo apt install -y --no-install-recommends libudev-dev:arm64

sudo mkdir /opt/sysroot
python3 webrtc-jni/src/main/cpp/dependencies/webrtc/linux/sysroot/install-sysroot.py --arch=arm64
sudo mv webrtc-jni/src/main/cpp/dependencies/webrtc/linux/debian* /opt/sysroot/
shell: bash
2 changes: 2 additions & 0 deletions webrtc-jni/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
<goal>generate</goal>
</goals>
<configuration>
<downloadBinaries>false</downloadBinaries>
<sourcePath>src/main/cpp</sourcePath>
<targetPath>${project.build.directory}/${platform.classifier}</targetPath>
<options>
Expand Down Expand Up @@ -120,6 +121,7 @@
<goal>compile</goal>
</goals>
<configuration>
<downloadBinaries>false</downloadBinaries>
<config>${cmake.config}</config>
<target>install</target>
<projectDirectory>${project.build.directory}/${platform.classifier}</projectDirectory>
Expand Down
100 changes: 58 additions & 42 deletions webrtc-jni/src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,28 +1,44 @@
cmake_minimum_required(VERSION 3.13)

if(NOT WEBRTC_TOOLCHAIN_FILE STREQUAL "")
message(STATUS "Toolchain file: ${WEBRTC_TOOLCHAIN_FILE}")
set(CMAKE_TOOLCHAIN_FILE "${WEBRTC_TOOLCHAIN_FILE}")
message(STATUS "Toolchain file: ${WEBRTC_TOOLCHAIN_FILE}")
set(CMAKE_TOOLCHAIN_FILE "${WEBRTC_TOOLCHAIN_FILE}")
endif()

project(webrtc-java)

if(UNIX AND NOT APPLE)
set(LINUX TRUE)
# Apply the sysroot configuration for the actual build
if(DEFERRED_SYSROOT)
# Configure sysroot for all subsequent operations
set(CMAKE_SYSROOT ${DEFERRED_SYSROOT})
set(CMAKE_FIND_ROOT_PATH ${DEFERRED_SYSROOT})

# Set pkg-config environment
set(ENV{PKG_CONFIG_SYSROOT_DIR} "${DEFERRED_SYSROOT}")
set(ENV{PKG_CONFIG_PATH} "${DEFERRED_SYSROOT}/usr/lib/pkgconfig:${DEFERRED_SYSROOT}/usr/share/pkgconfig")

# Restrict library and header searches to sysroot only
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
endif()

set(LINUX TRUE)
endif()

if(APPLE)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
set(SOURCE_TARGET macos)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
set(SOURCE_TARGET macos)
elseif(LINUX)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
set(SOURCE_TARGET linux)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
set(SOURCE_TARGET linux)
elseif(WIN32)
set(CMAKE_CXX_FLAGS_RELEASE "/MT")
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
set(SOURCE_TARGET windows)
set(CMAKE_CXX_FLAGS_RELEASE "/MT")
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
set(SOURCE_TARGET windows)
endif()

if (CMAKE_CXX_COMPILER_ID STREQUAL Clang AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
Expand All @@ -45,54 +61,54 @@ file(GLOB SOURCES_PLATFORM "src/platform/${SOURCE_TARGET}/*.cpp")
file(GLOB SOURCES_RTC "src/rtc/*.cpp")

list(APPEND SOURCES
${SOURCES_ROOT}
${SOURCES_API}
${SOURCES_MEDIA}
${SOURCES_MEDIA_AUDIO}
${SOURCES_MEDIA_AUDIO_OS}
${SOURCES_MEDIA_VIDEO}
${SOURCES_MEDIA_VIDEO_DESKTOP}
${SOURCES_MEDIA_VIDEO_DESKTOP_OS}
${SOURCES_MEDIA_VIDEO_OS}
${SOURCES_PLATFORM}
${SOURCES_RTC}
${SOURCES_ROOT}
${SOURCES_API}
${SOURCES_MEDIA}
${SOURCES_MEDIA_AUDIO}
${SOURCES_MEDIA_AUDIO_OS}
${SOURCES_MEDIA_VIDEO}
${SOURCES_MEDIA_VIDEO_DESKTOP}
${SOURCES_MEDIA_VIDEO_DESKTOP_OS}
${SOURCES_MEDIA_VIDEO_OS}
${SOURCES_PLATFORM}
${SOURCES_RTC}
)

add_library(${PROJECT_NAME} SHARED ${SOURCES})

target_include_directories(${PROJECT_NAME}
PRIVATE
include
include/api
include/media
include/rtc
PRIVATE
include
include/api
include/media
include/rtc
)

set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
)

target_link_libraries(${PROJECT_NAME} jni-voithos)
target_link_libraries(${PROJECT_NAME} webrtc)

if(APPLE)
set_source_files_properties(${SOURCES} PROPERTIES COMPILE_FLAGS "-x objective-c++")
target_link_libraries(${PROJECT_NAME} "-framework Foundation" "-framework AVFoundation" "-framework CoreMedia" "-framework CoreAudio" "-framework IOKit")
set_source_files_properties(${SOURCES} PROPERTIES COMPILE_FLAGS "-x objective-c++")
target_link_libraries(${PROJECT_NAME} "-framework Foundation" "-framework AVFoundation" "-framework CoreMedia" "-framework CoreAudio" "-framework IOKit")
elseif(LINUX)
if(NOT TARGET_CPU MATCHES "^arm")
set(CXX_LIBS "-static-libgcc -stdlib=libc++ -lc++ -lc++abi")
else()
set(CXX_LIBS "-static-libgcc")
endif()
if(NOT TARGET_CPU MATCHES "^arm")
set(CXX_LIBS "-static-libgcc -stdlib=libc++ -lc++ -lc++abi")
else()
set(CXX_LIBS "-static-libgcc")
endif()

target_link_libraries(${PROJECT_NAME} ${CXX_LIBS} pulse udev)
target_link_libraries(${PROJECT_NAME} ${CXX_LIBS} pulse udev)
elseif(WIN32)
target_link_libraries(${PROJECT_NAME} c++.lib msvcprt.lib dwmapi.lib mf.lib mfreadwrite.lib mfplat.lib mfuuid.lib shcore.lib)
target_link_libraries(${PROJECT_NAME} dwmapi.lib mf.lib mfreadwrite.lib mfplat.lib mfuuid.lib shcore.lib)
endif()

install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} COMPONENT Runtime
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX} COMPONENT Runtime
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} COMPONENT Runtime
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX} COMPONENT Runtime
)
Loading