Skip to content

Commit

Permalink
Merge pull request #192 from shiguredo/feature/support-macos-arm64
Browse files Browse the repository at this point in the history
Apple Silicon に対応
  • Loading branch information
hakobera committed Jan 14, 2021
2 parents 178401e + d5b03f2 commit 9bc2579
Show file tree
Hide file tree
Showing 10 changed files with 235 additions and 46 deletions.
23 changes: 15 additions & 8 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,13 @@ jobs:
name: windows.env
path: windows.env
build-macos:
name: Build momo for macOS
strategy:
fail-fast: false
matrix:
arch:
- arm64
- x86_64
name: Build momo for macOS_${{ matrix.arch }}
runs-on: macos-11.0
steps:
- uses: actions/checkout@v2
Expand All @@ -74,17 +80,17 @@ jobs:
with:
path: _cache/boost
key: macos-boost-${{ steps.versions.outputs.boost_version }}.tar.gz.v2
- run: ./build.sh --package macos
- run: ./build.sh --package macos_${{ matrix.arch }}
working-directory: build
timeout-minutes: 120
- name: Output package name
shell: bash
run: |
source VERSION
MACOS_VERSION=`sw_vers -productVersion | cut -d '.' -f-2`
echo "PACKAGE_NAME=momo-${MOMO_VERSION}_macos-${MACOS_VERSION}.tar.gz" >> macos.env
echo "CONTENT_TYPE=application/gzip" >> macos.env
echo "::set-output name=name::momo-${MOMO_VERSION}_macos-${MACOS_VERSION}.tar.gz"
echo "PACKAGE_NAME=momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${{ matrix.arch }}.tar.gz" >> macos_${{ matrix.arch }}.env
echo "CONTENT_TYPE=application/gzip" >> macos_${{ matrix.arch }}.env
echo "::set-output name=name::momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${{ matrix.arch }}.tar.gz"
id: package_name
- name: Upload Artifact
uses: actions/upload-artifact@v1
Expand All @@ -94,8 +100,8 @@ jobs:
- name: Upload Environment
uses: actions/upload-artifact@v1
with:
name: macos.env
path: macos.env
name: macos_${{ matrix.arch }}.env
path: macos_${{ matrix.arch }}.env
build-linux:
strategy:
fail-fast: false
Expand Down Expand Up @@ -181,7 +187,8 @@ jobs:
matrix:
name:
- windows
- macos
- macos_arm64
- macos_x86_64
- raspberry-pi-os_armv6
- raspberry-pi-os_armv7
- raspberry-pi-os_armv8
Expand Down
12 changes: 9 additions & 3 deletions .github/workflows/daily_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,14 @@ jobs:
working-directory: build
timeout-minutes: 120
build-macos:
name: Build momo for macOS
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
arch:
- arm64
- x86_64
name: Build momo for macOS_${{ matrix.arch }}
runs-on: macos-11.0
steps:
- uses: actions/checkout@v2
- name: Get Versions
Expand All @@ -46,7 +52,7 @@ jobs:
with:
path: _cache/boost
key: macos-boost-${{ steps.versions.outputs.boost_version }}.tar.gz.v2
- run: ./build.sh macos
- run: ./build.sh macos_${{ matrix.arch }}
working-directory: build
timeout-minutes: 120
build-linux:
Expand Down
6 changes: 3 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ webrtc_logs_0
/build/windows/_source
/build/windows/_build
/build/windows/_install
/build/macos/_source
/build/macos/_build
/build/macos/_install
/build/macos_*/_source
/build/macos_*/_build
/build/macos_*/_install

/src/hwenc_jetson/Nv*
36 changes: 33 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,28 @@ if(MOMO_PACKAGE_NAME STREQUAL "windows")
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${SDL2_ROOT_DIR}/cmake)
list(APPEND CMAKE_PREFIX_PATH ${BOOST_ROOT_DIR} ${SDL2_ROOT_DIR})

elseif(MOMO_PACKAGE_NAME STREQUAL "macos")
elseif(MOMO_PACKAGE_NAME STREQUAL "macos_arm64")

set(_INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build/macos/_install)
set(_INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build/macos_arm64/_install)

set(TARGET_OS "macos")
set(TARGET_ARCH "arm64")
set(USE_H264 ON)
set(USE_SDL2 ON)
set(USE_SCREEN_CAPTURER ON)
set(BOOST_ROOT_DIR ${_INSTALL_DIR}/boost)
set(SDL2_ROOT_DIR ${_INSTALL_DIR}/SDL2)
set(CLI11_ROOT_DIR ${_INSTALL_DIR}/CLI11)
set(WEBRTC_INCLUDE_DIR ${_INSTALL_DIR}/webrtc/include)
set(WEBRTC_LIBRARY_DIR ${_INSTALL_DIR}/webrtc/lib)
set(CLANG_ROOT ${_INSTALL_DIR}/llvm/clang)

set(USE_LIBCXX ON)
set(LIBCXX_INCLUDE_DIR ${_INSTALL_DIR}/llvm/libcxx/include)

elseif(MOMO_PACKAGE_NAME STREQUAL "macos_x86_64")

set(_INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build/macos_x86_64/_install)

set(TARGET_OS "macos")
set(TARGET_ARCH "x86_64")
Expand Down Expand Up @@ -262,6 +281,17 @@ if (TARGET_OS STREQUAL "linux")
endif()
endif()

if (TARGET_OS STREQUAL "macos")
if (TARGET_ARCH STREQUAL "x86_64")
set(ARCH_NAME x86_64-apple-darwin)
else()
set(ARCH_NAME aarch64-apple-darwin)
set(CMAKE_SYSTEM_PROCESSOR arm64)
endif()

set(CMAKE_C_COMPILER_TARGET ${ARCH_NAME})
set(CMAKE_CXX_COMPILER_TARGET ${ARCH_NAME})
endif()

project(momo C CXX)

Expand Down Expand Up @@ -481,7 +511,7 @@ elseif (TARGET_OS STREQUAL "macos")
src/mac_helper/objc_codec_factory_helper.mm
)

target_compile_options(momo PRIVATE -fconstant-string-class=NSConstantString)
target_compile_options(momo PRIVATE -fconstant-string-class=NSConstantString -mmacosx-version-min=11.0)
target_link_options(momo PRIVATE -ObjC)
set_target_properties(momo PROPERTIES CXX_VISIBILITY_PRESET hidden)

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ MOMO_VERSION=2021.1
WEBRTC_BUILD_VERSION=88.4324.3.1
BOOST_VERSION=1.75.0
CLI11_VERSION=1.9.1
SDL2_VERSION=2.0.12
SDL2_VERSION=2.0.14
CMAKE_VERSION=3.19.2
CUDA_VERSION=11.0.2-1
45 changes: 26 additions & 19 deletions build/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ PROGRAM="$0"

_PACKAGES=" \
windows \
macos \
macos_arm64 \
macos_x86_64 \
raspberry-pi-os_armv6 \
raspberry-pi-os_armv7 \
raspberry-pi-os_armv8 \
Expand Down Expand Up @@ -85,18 +86,23 @@ case "$PACKAGE" in
echo "Windows では build.bat を利用してください。"
exit 1
;;
"macos" )
macos_* )
if [ $FLAG_CLEAN -eq 1 ]; then
rm -rf ../_build/macos
rm -rf macos/_source
rm -rf macos/_build
rm -rf macos/_install
rm -rf ../_build/$PACKAGE
rm -rf $PACKAGE/_source
rm -rf $PACKAGE/_build
rm -rf $PACKAGE/_install
exit 0
fi

./macos/install_deps.sh
MACOS_ARCH="arm64"
if [ $PACKAGE -eq "macos_x86_64" ]; then
MACOS_ARCH="x86_64"
fi

./$PACKAGE/install_deps.sh

source ./macos/_install/webrtc/VERSIONS
source ./$PACKAGE/_install/webrtc/VERSIONS

if [ -z "$JOBS" ]; then
JOBS=`sysctl -n hw.logicalcpu_max`
Expand All @@ -109,7 +115,7 @@ case "$PACKAGE" in
pushd ../_build/$PACKAGE
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DMOMO_PACKAGE_NAME="macos" \
-DMOMO_PACKAGE_NAME="$PACKAGE" \
-DMOMO_VERSION="$MOMO_VERSION" \
-DMOMO_COMMIT="$MOMO_COMMIT" \
-DWEBRTC_BUILD_VERSION="$WEBRTC_BUILD_VERSION" \
Expand All @@ -124,20 +130,21 @@ case "$PACKAGE" in

pushd ..
# パッケージのバイナリを作る
rm -rf _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}
rm -f _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}.tar.gz
mkdir -p _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}
cp _build/macos/momo _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}/
cp LICENSE _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}/
cp NOTICE _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}/
cp -r html _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}/html
MACOS_ARCH=${PACKAGE#"macos_"}
rm -rf _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}
rm -f _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}.tar.gz
mkdir -p _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}
cp _build/${PACKAGE}/momo _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}/
cp LICENSE _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}/
cp NOTICE _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}/
cp -r html _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}/html
pushd _package
tar czf momo-${MOMO_VERSION}_macos-${MACOS_VERSION}.tar.gz momo-${MOMO_VERSION}_macos-${MACOS_VERSION}
tar czf momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}.tar.gz momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}
popd

rm -rf _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}
rm -rf _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}
echo ""
echo "パッケージが _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}.tar.gz に生成されました。"
echo "パッケージが _package/momo-${MOMO_VERSION}_macos-${MACOS_VERSION}_${MACOS_ARCH}.tar.gz に生成されました。"
popd
fi

Expand Down
130 changes: 130 additions & 0 deletions build/macos_arm64/install_deps.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
#!/bin/bash

cd "`dirname $0`"

set -ex

ARCH_NAME="aarch64-apple-darwin"

SOURCE_DIR="`pwd`/_source"
BUILD_DIR="`pwd`/_build"
INSTALL_DIR="`pwd`/_install"
CACHE_DIR="`pwd`/../../_cache"

mkdir -p $SOURCE_DIR
mkdir -p $BUILD_DIR
mkdir -p $INSTALL_DIR
mkdir -p $CACHE_DIR

source ../../VERSION

if [ -z "$JOBS" ]; then
JOBS=`sysctl -n hw.logicalcpu_max`
if [ -z "$JOBS" ]; then
JOBS=1
fi
fi

# CLI11
CLI11_VERSION_FILE="$INSTALL_DIR/cli11.version"
CLI11_CHANGED=0
if [ ! -e $CLI11_VERSION_FILE -o "$CLI11_VERSION" != "`cat $CLI11_VERSION_FILE`" ]; then
CLI11_CHANGED=1
fi

if [ $CLI11_CHANGED -eq 1 -o ! -e $INSTALL_DIR/CLI11/include/CLI/Version.hpp ]; then
pushd $INSTALL_DIR
rm -rf CLI11
git clone --branch v$CLI11_VERSION --depth 1 https://github.com/CLIUtils/CLI11.git
popd
fi
echo $CLI11_VERSION > $CLI11_VERSION_FILE

# WebRTC
WEBRTC_VERSION_FILE="$INSTALL_DIR/webrtc.version"
WEBRTC_CHANGED=0
if [ ! -e $WEBRTC_VERSION_FILE -o "$WEBRTC_BUILD_VERSION" != "`cat $WEBRTC_VERSION_FILE`" ]; then
WEBRTC_CHANGED=1
fi

if [ $WEBRTC_CHANGED -eq 1 -o ! -e $INSTALL_DIR/webrtc/lib/libwebrtc.a ]; then
rm -rf $INSTALL_DIR/webrtc
../../script/get_webrtc.sh $WEBRTC_BUILD_VERSION macos_arm64 $INSTALL_DIR $SOURCE_DIR
fi
echo $WEBRTC_BUILD_VERSION > $WEBRTC_VERSION_FILE

# LLVM
if [ ! -e $INSTALL_DIR/llvm/clang/bin/clang++ ]; then
rm -rf $INSTALL_DIR/llvm
../../script/get_llvm.sh $INSTALL_DIR/webrtc $INSTALL_DIR
fi

# Boost
BOOST_VERSION_FILE="$INSTALL_DIR/boost.version"
BOOST_CHANGED=0
if [ ! -e $BOOST_VERSION_FILE -o "$BOOST_VERSION" != "`cat $BOOST_VERSION_FILE`" ]; then
BOOST_CHANGED=1
fi

if [ $BOOST_CHANGED -eq 1 -o ! -e $INSTALL_DIR/boost/lib/libboost_filesystem.a ]; then
rm -rf $SOURCE_DIR/boost
rm -rf $BUILD_DIR/boost
rm -rf $INSTALL_DIR/boost
../../script/setup_boost.sh $BOOST_VERSION $SOURCE_DIR/boost $CACHE_DIR/boost
pushd $SOURCE_DIR/boost/source
echo "using clang : : $INSTALL_DIR/llvm/clang/bin/clang++ : ;" > project-config.jam
SYSROOT="`xcrun --sdk macosx --show-sdk-path`"
./b2 \
cflags=" \
-target $ARCH_NAME \
-mmacosx-version-min=11.0 \
--sysroot=$SYSROOT \
" \
cxxflags=" \
-target $ARCH_NAME \
-mmacosx-version-min=11.0 \
-isystem $INSTALL_DIR/llvm/libcxx/include \
-nostdinc++ \
--sysroot=$SYSROOT \
" \
toolset=clang \
visibility=hidden \
link=static \
variant=release \
install \
-j$JOBS \
--build-dir=$BUILD_DIR/boost \
--prefix=$INSTALL_DIR/boost \
--ignore-site-config \
--with-filesystem \
--with-json
popd
fi
echo $BOOST_VERSION > $BOOST_VERSION_FILE

# SDL2
SDL2_VERSION_FILE="$INSTALL_DIR/sdl2.version"
SDL2_CHANGED=0
if [ ! -e $SDL2_VERSION_FILE -o "$SDL2_VERSION" != "`cat $SDL2_VERSION_FILE`" ]; then
SDL2_CHANGED=1
fi

if [ $SDL2_CHANGED -eq 1 -o ! -e $INSTALL_DIR/SDL2/lib/libSDL2.a ]; then
rm -rf $SOURCE_DIR/SDL2
rm -rf $BUILD_DIR/SDL2
rm -rf $INSTALL_DIR/SDL2
mkdir -p $SOURCE_DIR/SDL2
mkdir -p $BUILD_DIR/SDL2
../../script/setup_sdl2.sh $SDL2_VERSION $SOURCE_DIR/SDL2
pushd $BUILD_DIR/SDL2
# SDL2 の CMakeLists.txt は Metal をサポートしてくれてないので、configure でビルドする
# ref: https://bugzilla.libsdl.org/show_bug.cgi?id=4617
SYSROOT="`xcrun --sdk macosx --show-sdk-path`"
CC="$INSTALL_DIR/llvm/clang/bin/clang -target $ARCH_NAME -mmacosx-version-min=11.0 --sysroot=$SYSROOT" \
CXX="$INSTALL_DIR/llvm/clang/bin/clang++ -target $ARCH_NAME -mmacosx-version-min=11.0 --sysroot=$SYSROOT -nostdinc++" \
$SOURCE_DIR/SDL2/source/configure --host=$ARCH_NAME --disable-shared --prefix=$INSTALL_DIR/SDL2
make -j$JOBS
make install
popd
fi
echo $SDL2_VERSION > $SDL2_VERSION_FILE
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ cd "`dirname $0`"

set -ex

MACOS_ARCH=`uname -m`
if [ $MACOS_ARCH != "x86_64" ]; then
echo "You need to run this script on Intel Mac or Rosetta2 on Apple Silicon Mac"
exit 1
fi

SOURCE_DIR="`pwd`/_source"
BUILD_DIR="`pwd`/_build"
INSTALL_DIR="`pwd`/_install"
Expand Down Expand Up @@ -47,7 +53,7 @@ fi

if [ $WEBRTC_CHANGED -eq 1 -o ! -e $INSTALL_DIR/webrtc/lib/libwebrtc.a ]; then
rm -rf $INSTALL_DIR/webrtc
../../script/get_webrtc.sh $WEBRTC_BUILD_VERSION macos $INSTALL_DIR $SOURCE_DIR
../../script/get_webrtc.sh $WEBRTC_BUILD_VERSION macos_x86_64 $INSTALL_DIR $SOURCE_DIR
fi
echo $WEBRTC_BUILD_VERSION > $WEBRTC_VERSION_FILE

Expand Down
Loading

0 comments on commit 9bc2579

Please sign in to comment.