Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

port to Android #90

Merged
merged 7 commits into from
Jan 9, 2019
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
164 changes: 164 additions & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@

# use the packages for Go
.ubuntu-template: &ubuntu-template
variables:
DEBIAN_FRONTEND: noninteractive
GOPATH: /usr/share/gocode
before_script:
- apt-get -qy update
- apt-get -qy install --no-install-recommends
build-essential
git
golang-github-smartystreets-goconvey-dev
golang-race-detector-runtime
libx11-dev
locales
pkg-config
- mkdir -p $GOPATH

# use Go installed as part of the official, Debian-based Docker images
.golang-docker-debian-template: &golang-docker-debian-template
variables:
DEBIAN_FRONTEND: noninteractive
before_script:
- apt-get -qy update
- apt-get -qy install --no-install-recommends
ca-certificates
git
lbzip2
libx11-dev
locales
pkg-config
wget
xz-utils
- go get github.com/smartystreets/goconvey/convey

.build_env_setup: &build_env_setup |
set -x
cat /etc/apt/sources.list | sed 's,^deb,deb-src,' >> /etc/apt/sources.list
apt-get -qy update
apt-get -qy install --no-install-recommends git locales
apt-get -qy build-dep chromium-browser
# libwebrtc build wants en_US.UTF-8
grep '^en_US.UTF-8 UTF-8' /etc/locale.gen || echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
# Create symbolic links under $GOPATH, this is needed for local build
export src=$GOPATH/src
mkdir -p $src/github.com/keroserene
mkdir -p $src/gitlab.com/$CI_PROJECT_NAMESPACE
ln -s $CI_PROJECT_DIR $src/github.com/keroserene/go-webrtc
ln -s $CI_PROJECT_DIR $src/gitlab.com/$CI_PROJECT_PATH
# build libwebrtc binaries
git config --global user.name "John Doe"
git config --global user.email "[email protected]"
git config --global core.autocrlf false
git config --global core.filemode false
rm -rf include/ lib/
set +x

.artifacts-template: &artifacts-template
artifacts:
name: "${CI_PROJECT_PATH}_${CI_JOB_STAGE}_${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHA}"
paths:
- include/
- lib/
when:
always
expire_in: 1 day
after_script:
- echo "Download debug artifacts from https://gitlab.com/${CI_PROJECT_PATH}/-/jobs"

.script-template: &script-template
except:
- schedules
script:
# Create symbolic links under $GOPATH, this is needed for local build
- export src=$GOPATH/src
- mkdir -p $src/github.com/keroserene
- mkdir -p $src/gitlab.com/$CI_PROJECT_NAMESPACE
- ln -s $CI_PROJECT_DIR $src/github.com/keroserene/go-webrtc
- ln -s $CI_PROJECT_DIR $src/gitlab.com/$CI_PROJECT_PATH

# build it for go
- cd $src/github.com/keroserene/go-webrtc
- go get -v .
- go build -v -x .
- go vet -v .
- go test -v -race .


# -- jobs ------------------------------------------------------------

debian-stretch_go-1.10:
image: golang:1.10-stretch
<<: *golang-docker-debian-template
<<: *artifacts-template
<<: *script-template

debian-stretch_go-1.11:
image: golang:1.11-stretch
<<: *golang-docker-debian-template
<<: *artifacts-template
<<: *script-template

ubuntu-devel:
image: ubuntu:devel
<<: *ubuntu-template
<<: *artifacts-template
<<: *script-template

ubuntu-rolling:
image: ubuntu:rolling
<<: *ubuntu-template
<<: *artifacts-template
<<: *script-template

ubuntu-lts:
image: ubuntu:latest
<<: *ubuntu-template
<<: *artifacts-template
<<: *script-template

libwebrtc-linux-amd64-magic:
only:
- schedules
image: debian:stretch
# this job needs 20+ gigs of disk
tags:
- largedisk
<<: *artifacts-template
script:
- *build_env_setup
- GOOS=linux GOARCH=amd64 ./build.sh

libwebrtc-linux-arm-magic:
only:
- schedules
image: debian:stretch
# this job needs 20+ gigs of disk
tags:
- largedisk
<<: *artifacts-template
script:
- *build_env_setup
- apt-get -qy install --no-install-recommends binutils-arm-linux-gnueabihf
- GOOS=linux GOARCH=arm ./build.sh

android:
image: golang:1.11-stretch
# this job needs 20+ gigs of disk
tags:
- largedisk
only:
- schedules
<<: *golang-docker-debian-template
<<: *artifacts-template
script:
- *build_env_setup
- apt-get -qy install --no-install-recommends lsb-release sudo
- export WEBRTC_SRC="$CI_PROJECT_DIR/third_party/webrtc/src"
- export ANDROID_HOME=$WEBRTC_SRC/third_party/android_tools/sdk
- GOOS=android GOARCH=arm ./build.sh || ( $WEBRTC_SRC/build/install-build-deps-android.sh && GOOS=android GOARCH=arm ./build.sh )
after_script:
- cat third_party/webrtc/.gclient || true
- cat third_party/webrtc/.gclient_entries || true
59 changes: 41 additions & 18 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
# For a cross compile:
# GOOS=linux GOARCH=amd64 ./build.sh
# GOOS=linux GOARCH=arm ./build.sh
# (For a cross-compile from linux-amd64 to linux-arm, you may need to install the binutils-arm-linux-gnueabihf package.)
# GOOS=android GOARCH=arm ./build.sh
# For macOS (GOOS=darwin GOARCH=amd64), you can currently only do a native compile.
# For a cross-compile to linux-arm, you need to install the binutils-arm-linux-gnueabihf package.
# For a cross-compile to android-arm, first run third_party/webrtc/src/build/install-build-deps-android.sh to install needed dependencies.

PROJECT_DIR=$(pwd)
THIRD_PARTY_DIR="$PROJECT_DIR/third_party"
Expand All @@ -21,7 +23,11 @@ COMMIT="88f5d9180eae78a6162cccd78850ff416eb82483" # branch-heads/64

# Values are from,
# https://github.com/golang/go/blob/master/src/go/build/syslist.go
# https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/reference.md
# https://gn.googlesource.com/gn/+/master/docs/reference.md
#
# Android steps from:
# https://www.chromium.org/developers/gn-build-configuration
# https://chromium.googlesource.com/chromium/src/+/master/docs/android_build_instructions.md

oses=",linux:linux,darwin:mac,windows:win,android:android,"
cpus=",386:x86,amd64:x64,arm:arm,"
Expand Down Expand Up @@ -53,8 +59,22 @@ else
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git $DEPOT_TOOLS_DIR || exit 1
fi

if [[ -d $WEBRTC_DIR ]]; then
echo "Syncing webrtc ..."
if [[ ! -d $WEBRTC_DIR ]]; then
echo "Getting webrtc ..."
mkdir -p $WEBRTC_DIR
pushd $WEBRTC_DIR
gclient config --name src $WEBRTC_REPO || exit 1
popd
fi

if [[ $TARGET_OS == 'android' ]]; then
echo "Setting gclient target_os to android"
# Whacky sed to append 'android' to the target_os list, without clobbering what may be there already.
sed -i "/^target_os *= *.*\\<android\\>/{p;h;d}; /^target_os *= */{s/ *]/, 'android'&/;p;h;d}; \${x;s/^target_os/&/;tx;atarget_os = [ 'android' ]"$'\n'";:x x}" $WEBRTC_DIR/.gclient
fi

echo "Syncing webrtc ..."
if [[ -d $WEBRTC_SRC ]]; then
pushd $WEBRTC_SRC || exit 1
if ! git diff-index --quiet HEAD --; then
echo -en "\nOpen files present in $WEBRTC_SRC\nReset them? (y/N): "
Expand All @@ -66,18 +86,18 @@ if [[ -d $WEBRTC_DIR ]]; then
git reset --hard HEAD || exit 1
fi
popd

pushd $WEBRTC_DIR
gclient sync --with_branch_heads -r $COMMIT || exit 1
popd
else
echo "Getting webrtc ..."
mkdir -p $WEBRTC_DIR
pushd $WEBRTC_DIR
gclient config --name src $WEBRTC_REPO || exit 1
gclient sync --with_branch_heads -r $COMMIT || exit 1
popd
fi
pushd $WEBRTC_DIR
# "echo n" is to say "no" to the Google Play services license agreement and download.
echo n | gclient sync --with_branch_heads -r $COMMIT || exit 1
# Delete where the Google Play services downloads to, just to be sure.
# First check that an ancestor directory of what we're deleting exists, so we're more likely to notice a source reorganization.
if [[ $TARGET_OS == 'android' && ! -d "$WEBRTC_SRC/third_party/android_tools/sdk/extras/google/m2repository" ]]; then
echo "Didn't find Google Play services directory for removal, please check" 1>&2
exit 1
fi
rm -rf "$WEBRTC_SRC/third_party/android_tools/sdk/extras/google/m2repository/com/google/android/gms"
popd

if [ "$ARCH" = "arm" ]; then
echo "Manually fetching arm sysroot"
Expand All @@ -98,7 +118,7 @@ popd

echo "Building webrtc ..."
pushd $WEBRTC_SRC
gn gen out/$CONFIG --args="target_os=\"$TARGET_OS\" target_cpu=\"$TARGET_CPU\" is_debug=false use_custom_libcxx=false" || exit 1
gn gen out/$CONFIG --args="target_os=\"$TARGET_OS\" target_cpu=\"$TARGET_CPU\" is_debug=false symbol_level=0 use_custom_libcxx=false" || exit 1
ninja -C out/$CONFIG webrtc field_trial metrics_default pc_test_utils || exit 1
popd

Expand All @@ -121,12 +141,15 @@ if [ "$OS" = "darwin" ]; then
find obj -name '*.o' -print0 \
| xargs -0 -- libtool -static -o libwebrtc-magic.a
strip -S -x -o libwebrtc-magic.a libwebrtc-magic.a
elif [ "$OS" = "android" ]; then
find obj -name '*.o' -print0 | sort -z \
| xargs -0 -- $WEBRTC_SRC/third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar crsD libwebrtc-magic.a
elif [ "$ARCH" = "arm" ]; then
find obj -name '*.o' -print0 | sort -z \
| xargs -0 -- arm-linux-gnueabihf-ar crs libwebrtc-magic.a
| xargs -0 -- arm-linux-gnueabihf-ar crsD libwebrtc-magic.a
else
find obj -name '*.o' -print0 | sort -z \
| xargs -0 -- ar crs libwebrtc-magic.a
| xargs -0 -- ar crsD libwebrtc-magic.a
fi
OUT_LIBRARY=$LIB_DIR/libwebrtc-$OS-$ARCH-magic.a
mv libwebrtc-magic.a ${OUT_LIBRARY}
Expand Down
1 change: 1 addition & 0 deletions datachannel.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ package webrtc
/*
#cgo CXXFLAGS: -std=c++0x
#cgo LDFLAGS: -L${SRCDIR}/lib
#cgo android pkg-config: webrtc-android-armeabi-v7a.pc
#cgo linux,arm pkg-config: webrtc-linux-arm.pc
#cgo linux,386 pkg-config: webrtc-linux-386.pc
#cgo linux,amd64 pkg-config: webrtc-linux-amd64.pc
Expand Down
Binary file added lib/libwebrtc-android-arm-magic.a
Binary file not shown.
1 change: 1 addition & 0 deletions peerconnection.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ package webrtc
/*
#cgo CXXFLAGS: -std=c++0x
#cgo LDFLAGS: -L${SRCDIR}/lib
#cgo android pkg-config: webrtc-android-armeabi-v7a.pc
#cgo linux,arm pkg-config: webrtc-linux-arm.pc
#cgo linux,386 pkg-config: webrtc-linux-386.pc
#cgo linux,amd64 pkg-config: webrtc-linux-amd64.pc
Expand Down
17 changes: 17 additions & 0 deletions webrtc-android-armeabi-v7a.pc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
pc=${pcfiledir}

Name: webrtc
Description: webrtc
Version: 1

Cflags: \
-I${pc}/include \
-DPOSIX \
-DWEBRTC_ANDROID

Libs: \
-L${pc}/lib \
-lwebrtc-android-arm-magic \
-lOpenSLES \
-llog \
-ldl