mirror of
https://github.com/pion/mediadevices.git
synced 2026-04-22 15:57:27 +08:00
Enhance build system by switching to Makefile
By switching to Makefile, parallel builds and single build are now
possible.
Examples:
Parallel Build:
make -j
Single Build:
make opus-darwin-x64
Also, since Makefile has a dependency change detection feature, the
build time is reduced significantly when there are only a few things that
change, Makefile will not rebuild everything unnecessarily.
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
# When there's no argument provided to make, all codecs will be built to all
|
||||
# supported platforms. Otherwise, it'll build only the provided target.
|
||||
#
|
||||
# Usage:
|
||||
# make [<codec_name>-<os>-<arch>]
|
||||
#
|
||||
# Examples:
|
||||
# * make: build all codecs for all supported platforms
|
||||
# * make opus-darwin-x64: only build opus for darwin-x64 platform
|
||||
|
||||
docker_owner := lherman
|
||||
docker_prefix := cross
|
||||
toolchain_dockerfiles := dockerfiles
|
||||
script_path := $(realpath scripts)
|
||||
toolchain_path := $(script_path)/$(docker_prefix)
|
||||
os_list := \
|
||||
linux \
|
||||
windows \
|
||||
darwin
|
||||
arch_list := \
|
||||
armv7 \
|
||||
arm64 \
|
||||
x64
|
||||
supported_platforms := \
|
||||
linux-armv7 \
|
||||
linux-arm64 \
|
||||
linux-x64 \
|
||||
windows-x64 \
|
||||
darwin-x64
|
||||
codec_dir := pkg/codec
|
||||
codec_list := $(shell ls $(codec_dir)/*/Makefile)
|
||||
codec_list := $(codec_list:$(codec_dir)/%/Makefile=%)
|
||||
targets := $(foreach codec, $(codec_list), $(addprefix $(codec)-, $(supported_platforms)))
|
||||
|
||||
define BUILD_TEMPLATE
|
||||
ifneq (,$$(findstring $(2)-$(3),$$(supported_platforms)))
|
||||
$(1)-$(2)-$(3): toolchain-$(2)-$(3)
|
||||
$$(MAKE) --directory=$$(codec_dir)/$(1) \
|
||||
MEDIADEVICES_TOOLCHAIN_BIN=$$(toolchain_path)/$(docker_prefix)-$(2)-$(3) \
|
||||
MEDIADEVICES_TARGET_PLATFORM=$(2)-$(3) \
|
||||
MEDIADEVICES_TARGET_OS=$(2) \
|
||||
MEDIADEVICES_TARGET_ARCH=$(3)
|
||||
endif
|
||||
endef
|
||||
|
||||
.PHONY: all
|
||||
all: $(targets)
|
||||
|
||||
toolchain-%: $(toolchain_dockerfiles)
|
||||
$(MAKE) --directory=$< "$*" \
|
||||
MEDIADEVICES_DOCKER_OWNER=$(docker_owner) \
|
||||
MEDIADEVICES_DOCKER_PREFIX=$(docker_prefix)
|
||||
@mkdir -p $(toolchain_path)
|
||||
@docker run $(docker_owner)/$(docker_prefix)-$* > \
|
||||
$(toolchain_path)/$(docker_prefix)-$*
|
||||
@chmod +x $(toolchain_path)/$(docker_prefix)-$*
|
||||
|
||||
$(foreach codec, $(codec_list), \
|
||||
$(foreach os, $(os_list), \
|
||||
$(foreach arch, $(arch_list), \
|
||||
$(eval $(call BUILD_TEMPLATE,$(codec),$(os),$(arch))))))
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
MEDIADEVICES_TOOLCHAIN_OWNER=lherman
|
||||
MEDIADEVICES_TOOLCHAIN_PREFIX=cross
|
||||
MEDIADEVICES_SCRIPT_PATH=$(realpath ./scripts)
|
||||
MEDIADEVICES_TOOLCHAIN_PATH=${MEDIADEVICES_SCRIPT_PATH}/${MEDIADEVICES_TOOLCHAIN_PREFIX}
|
||||
MEDIADEVICES_DOCKERFILES_PATH=dockerfiles
|
||||
|
||||
# Reference: https://github.com/dockcross/dockcross#cross-compilers
|
||||
MEDIADEVICES_TARGET_PLATFORMS=(
|
||||
linux-armv7
|
||||
linux-arm64
|
||||
linux-x64
|
||||
windows-x64
|
||||
darwin-x64
|
||||
)
|
||||
|
||||
if [[ -z ${VERBOSE} ]]; then
|
||||
MEDIADEVICES_OUTPUT=/dev/null
|
||||
else
|
||||
MEDIADEVICES_OUTPUT=/dev/stdout
|
||||
fi
|
||||
|
||||
install_toolchains() {
|
||||
bash ${MEDIADEVICES_DOCKERFILES_PATH}/build.sh &> ${MEDIADEVICES_OUTPUT}
|
||||
for platform in ${MEDIADEVICES_TARGET_PLATFORMS[@]}
|
||||
do
|
||||
mkdir -p ${MEDIADEVICES_TOOLCHAIN_PATH}
|
||||
image=${MEDIADEVICES_TOOLCHAIN_OWNER}/${MEDIADEVICES_TOOLCHAIN_PREFIX}-${platform}
|
||||
bin_path=${MEDIADEVICES_TOOLCHAIN_PATH}/${MEDIADEVICES_TOOLCHAIN_PREFIX}-${platform}
|
||||
docker run ${image} > ${bin_path}
|
||||
chmod +x ${bin_path}
|
||||
done
|
||||
}
|
||||
|
||||
build() {
|
||||
sub_builds=$(find pkg -type f -name "build.sh")
|
||||
for sub_build in ${sub_builds[@]}
|
||||
do
|
||||
sub_build=$(realpath ${sub_build})
|
||||
sub_build_dir=$(dirname ${sub_build})
|
||||
current_dir=${PWD}
|
||||
cd $sub_build_dir
|
||||
for platform in ${MEDIADEVICES_TARGET_PLATFORMS[@]}
|
||||
do
|
||||
export MEDIADEVICES_TOOLCHAIN_BIN=${MEDIADEVICES_TOOLCHAIN_PATH}/${MEDIADEVICES_TOOLCHAIN_PREFIX}-${platform}
|
||||
# convert '-' to '_' since '_' is more common in library names
|
||||
export MEDIADEVICES_TARGET_PLATFORM=${platform//-/_}
|
||||
export MEDIADEVICES_TARGET_OS=$(echo $MEDIADEVICES_TARGET_PLATFORM | cut -d'_' -f1)
|
||||
export MEDIADEVICES_TARGET_ARCH=${platform//${MEDIADEVICES_TARGET_OS}-/}
|
||||
|
||||
echo "Building ${sub_build_dir}:"
|
||||
echo " PLATFORM : ${MEDIADEVICES_TARGET_PLATFORM}"
|
||||
echo " OS : ${MEDIADEVICES_TARGET_OS}"
|
||||
echo " ARCH : ${MEDIADEVICES_TARGET_ARCH}"
|
||||
echo " TOOLCHAIN_BIN : ${MEDIADEVICES_TOOLCHAIN_BIN}"
|
||||
echo ""
|
||||
|
||||
${sub_build} &> ${MEDIADEVICES_OUTPUT}
|
||||
done
|
||||
cd ${current_dir}
|
||||
done
|
||||
}
|
||||
|
||||
if [[ $# > 0 && $1 != "all" ]]; then
|
||||
MEDIADEVICES_TARGET_PLATFORMS=($1)
|
||||
fi
|
||||
|
||||
install_toolchains
|
||||
build
|
||||
@@ -0,0 +1,11 @@
|
||||
dockerfiles := $(wildcard *.Dockerfile)
|
||||
supported_platforms := $(dockerfiles:.Dockerfile=)
|
||||
|
||||
.PHONY: all
|
||||
all: $(supported_platforms)
|
||||
|
||||
%: %.Dockerfile guard-MEDIADEVICES_DOCKER_OWNER guard-MEDIADEVICES_DOCKER_PREFIX
|
||||
docker build -t "$(MEDIADEVICES_DOCKER_OWNER)/$(MEDIADEVICES_DOCKER_PREFIX)-$@" -f "$<" .
|
||||
|
||||
guard-%:
|
||||
@if [ -z ${$*} ]; then echo "$* is a required environment variable"; exit 1; fi
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd $(dirname $0)
|
||||
|
||||
OWNER=lherman
|
||||
PREFIX=cross
|
||||
IMAGES=$(ls *.Dockerfile)
|
||||
|
||||
for image in ${IMAGES[@]}
|
||||
do
|
||||
tag=${OWNER}/cross-${image//.Dockerfile/}
|
||||
docker build -t "${tag}" -f "$image" .
|
||||
done
|
||||
@@ -0,0 +1,47 @@
|
||||
git_url := https://github.com/cisco/openh264.git
|
||||
version := v2.1.1
|
||||
src_root_dir := src
|
||||
lib_dir := lib
|
||||
include_dir := include/openh264
|
||||
lib_prefix := libopenh264
|
||||
src_dir := $(src_root_dir)/$(MEDIADEVICES_TARGET_PLATFORM)
|
||||
output_path := $(lib_dir)/$(lib_prefix)-$(MEDIADEVICES_TARGET_PLATFORM).a
|
||||
|
||||
# OS and Arch mapping to OpenH264 parameters
|
||||
ifeq (windows,$(MEDIADEVICES_TARGET_OS))
|
||||
os := mingw_nt
|
||||
else
|
||||
os := $(MEDIADEVICES_TARGET_OS)
|
||||
endif
|
||||
|
||||
ifneq (,$(findstring $(MEDIADEVICES_TARGET_ARCH),armv6 armv7 armv8))
|
||||
arch := arm
|
||||
else ifeq (x64,$(MEDIADEVICES_TARGET_ARCH))
|
||||
arch := x86_64
|
||||
else
|
||||
arch := $(MEDIADEVICES_TARGET_ARCH)
|
||||
endif
|
||||
|
||||
.PHONY: all
|
||||
all: guard-MEDIADEVICES_TARGET_PLATFORM guard-MEDIADEVICES_TARGET_PLATFORM \
|
||||
guard-MEDIADEVICES_TARGET_OS guard-MEDIADEVICES_TARGET_ARCH \
|
||||
$(output_path) headers
|
||||
|
||||
headers: | $(src_dir) $(include_dir)
|
||||
@cp $(src_dir)/codec/api/svc/*.h $(include_dir)
|
||||
|
||||
$(output_path): $(src_dir)/$(lib_prefix).a | $(lib_dir)
|
||||
@cp $< $@
|
||||
|
||||
$(src_dir)/$(lib_prefix).a: | $(src_dir)
|
||||
$(MEDIADEVICES_TOOLCHAIN_BIN) make --directory=$(src_dir) $(lib_prefix).a \
|
||||
OS=$(os) ARCH=$(arch)
|
||||
|
||||
$(src_dir): | $(src_root_dir)
|
||||
git clone --depth=1 --branch=$(version) $(git_url) $@
|
||||
|
||||
$(src_root_dir) $(lib_dir) $(include_dir):
|
||||
@mkdir -p $@
|
||||
|
||||
guard-%:
|
||||
@if [ -z ${$*} ]; then echo "$* is a required environment variable"; exit 1; fi
|
||||
@@ -1,36 +0,0 @@
|
||||
GIT_URL=https://github.com/cisco/openh264.git
|
||||
VERSION=v2.1.1
|
||||
SRC_DIR=src
|
||||
LIB_DIR=lib
|
||||
INCLUDE_DIR=include/openh264
|
||||
ROOT_DIR=${PWD}
|
||||
LIB_PREFIX=libopenh264
|
||||
|
||||
OS=${MEDIADEVICES_TARGET_OS}
|
||||
ARCH=${MEDIADEVICES_TARGET_ARCH}
|
||||
|
||||
case ${MEDIADEVICES_TARGET_OS} in
|
||||
windows)
|
||||
OS=mingw_nt
|
||||
;;
|
||||
esac
|
||||
|
||||
case ${MEDIADEVICES_TARGET_ARCH} in
|
||||
armv6 | armv7 | armv8)
|
||||
ARCH=arm
|
||||
;;
|
||||
x64)
|
||||
ARCH=x86_64
|
||||
;;
|
||||
esac
|
||||
|
||||
mkdir -p ${LIB_DIR} ${INCLUDE_DIR}
|
||||
|
||||
git clone --depth=1 --branch=${VERSION} ${GIT_URL} ${SRC_DIR}
|
||||
cd ${SRC_DIR}
|
||||
${MEDIADEVICES_TOOLCHAIN_BIN} make -j2 ${LIB_PREFIX}.a OS=${OS} ARCH=${ARCH}
|
||||
${MEDIADEVICES_TOOLCHAIN_BIN} echo $PATH
|
||||
mv ${LIB_PREFIX}.a ${ROOT_DIR}/${LIB_DIR}/${LIB_PREFIX}_${MEDIADEVICES_TARGET_PLATFORM}.a
|
||||
mkdir -p ${ROOT_DIR}/${INCLUDE_DIR}
|
||||
cp codec/api/svc/*.h ${ROOT_DIR}/${INCLUDE_DIR}
|
||||
make clean
|
||||
@@ -4,12 +4,12 @@
|
||||
|
||||
#include "codec_app_def.h"
|
||||
|
||||
static const OpenH264Version g_stCodecVersion = {2, 1, 0, 2002};
|
||||
static const char* const g_strCodecVer = "OpenH264 version:2.1.0.2002";
|
||||
static const OpenH264Version g_stCodecVersion = {2, 1, 1, 2005};
|
||||
static const char* const g_strCodecVer = "OpenH264 version:2.1.1.2005";
|
||||
|
||||
#define OPENH264_MAJOR (2)
|
||||
#define OPENH264_MINOR (1)
|
||||
#define OPENH264_REVISION (0)
|
||||
#define OPENH264_RESERVED (2002)
|
||||
#define OPENH264_REVISION (1)
|
||||
#define OPENH264_RESERVED (2005)
|
||||
|
||||
#endif // CODEC_VER_H
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -4,9 +4,9 @@ package openh264
|
||||
|
||||
//#cgo CFLAGS: -I${SRCDIR}/include
|
||||
//#cgo CXXFLAGS: -I${SRCDIR}/include
|
||||
//#cgo linux,arm LDFLAGS: ${SRCDIR}/lib/libopenh264_linux_armv7.a
|
||||
//#cgo linux,arm64 LDFLAGS: ${SRCDIR}/lib/libopenh264_linux_arm64.a
|
||||
//#cgo linux,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264_linux_x64.a
|
||||
//#cgo darwin,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264_darwin_x64.a
|
||||
//#cgo windows,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264_windows_x64.a -lssp
|
||||
//#cgo linux,arm LDFLAGS: ${SRCDIR}/lib/libopenh264-linux-armv7.a
|
||||
//#cgo linux,arm64 LDFLAGS: ${SRCDIR}/lib/libopenh264-linux-arm64.a
|
||||
//#cgo linux,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264-linux-x64.a
|
||||
//#cgo darwin,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264-darwin-x64.a
|
||||
//#cgo windows,amd64 LDFLAGS: ${SRCDIR}/lib/libopenh264-windows-x64.a -lssp
|
||||
import "C"
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
git_url := https://github.com/xiph/opus.git
|
||||
version := v1.3.1
|
||||
src_root_dir := src
|
||||
lib_dir := lib
|
||||
include_dir := include
|
||||
lib_prefix := libopus
|
||||
src_dir := $(src_root_dir)/$(MEDIADEVICES_TARGET_PLATFORM)
|
||||
output_path := $(lib_dir)/$(lib_prefix)-$(MEDIADEVICES_TARGET_PLATFORM).a
|
||||
|
||||
.PHONY: all
|
||||
all: guard-MEDIADEVICES_TARGET_PLATFORM guard-MEDIADEVICES_TOOLCHAIN_BIN $(output_path) headers
|
||||
|
||||
headers: | $(src_dir) $(include_dir)
|
||||
@cp $(src_dir)/include/*.h $(include_dir)
|
||||
|
||||
$(output_path): $(src_dir)/$(lib_prefix).a | $(lib_dir)
|
||||
@cp $< $@
|
||||
|
||||
$(src_dir)/$(lib_prefix).a: | $(src_dir)
|
||||
cd $(src_dir) && \
|
||||
$(MEDIADEVICES_TOOLCHAIN_BIN) cmake -DOPUS_STACK_PROTECTOR=OFF && \
|
||||
$(MEDIADEVICES_TOOLCHAIN_BIN) make
|
||||
|
||||
$(src_dir): | $(src_root_dir)
|
||||
git clone --depth=1 --branch=$(version) $(git_url) $@
|
||||
|
||||
$(src_root_dir) $(lib_dir) $(include_dir):
|
||||
@mkdir -p $@
|
||||
|
||||
guard-%:
|
||||
@if [ -z ${$*} ]; then echo "$* is a required environment variable"; exit 1; fi
|
||||
@@ -1,19 +0,0 @@
|
||||
GIT_URL=https://github.com/xiph/opus.git
|
||||
VERSION=v1.3.1
|
||||
SRC_DIR=src
|
||||
LIB_DIR=lib
|
||||
INCLUDE_DIR=include
|
||||
ROOT_DIR=${PWD}
|
||||
LIB_PREFIX=libopus
|
||||
|
||||
mkdir -p ${LIB_DIR} ${INCLUDE_DIR}
|
||||
|
||||
git clone --depth=1 --branch=${VERSION} ${GIT_URL} ${SRC_DIR}
|
||||
cd ${SRC_DIR}
|
||||
${MEDIADEVICES_TOOLCHAIN_BIN} cmake -DOPUS_STACK_PROTECTOR=OFF .
|
||||
${MEDIADEVICES_TOOLCHAIN_BIN} make -j2
|
||||
mv ${LIB_PREFIX}.a ${ROOT_DIR}/${LIB_DIR}/${LIB_PREFIX}_${MEDIADEVICES_TARGET_PLATFORM}.a
|
||||
mkdir -p ${ROOT_DIR}/${INCLUDE_DIR}
|
||||
cp include/*.h ${ROOT_DIR}/${INCLUDE_DIR}
|
||||
git clean -dfx
|
||||
git reset --hard
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -4,9 +4,9 @@ package opus
|
||||
|
||||
//#cgo CFLAGS: -I${SRCDIR}/include
|
||||
//#cgo CXXFLAGS: -I${SRCDIR}/include
|
||||
//#cgo linux,arm LDFLAGS: ${SRCDIR}/lib/libopus_linux_armv7.a -lm
|
||||
//#cgo linux,arm64 LDFLAGS: ${SRCDIR}/lib/libopus_linux_arm64.a -lm
|
||||
//#cgo linux,amd64 LDFLAGS: ${SRCDIR}/lib/libopus_linux_x64.a -lm
|
||||
//#cgo darwin,amd64 LDFLAGS: ${SRCDIR}/lib/libopus_darwin_x64.a
|
||||
//#cgo windows,amd64 LDFLAGS: ${SRCDIR}/lib/libopus_windows_x64.a
|
||||
//#cgo linux,arm LDFLAGS: ${SRCDIR}/lib/libopus-linux-armv7.a -lm
|
||||
//#cgo linux,arm64 LDFLAGS: ${SRCDIR}/lib/libopus-linux-arm64.a -lm
|
||||
//#cgo linux,amd64 LDFLAGS: ${SRCDIR}/lib/libopus-linux-x64.a -lm
|
||||
//#cgo darwin,amd64 LDFLAGS: ${SRCDIR}/lib/libopus-darwin-x64.a
|
||||
//#cgo windows,amd64 LDFLAGS: ${SRCDIR}/lib/libopus-windows-x64.a
|
||||
import "C"
|
||||
|
||||
Reference in New Issue
Block a user