4 changed files with 259 additions and 45 deletions
@ -1,44 +1,44 @@
|
||||
#
|
||||
# ZeroTier SDK - Network Virtualization Everywhere
|
||||
# Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# --
|
||||
#
|
||||
# You can be released from the requirements of the license by purchasing
|
||||
# a commercial license. Buying such a license is mandatory as soon as you
|
||||
# develop commercial closed-source software that incorporates or links
|
||||
# directly against ZeroTier software without disclosing the source code
|
||||
# of your own application.
|
||||
#
|
||||
|
||||
# NOTE: This file only exists as a convenience for cleaning. To build, use
|
||||
# CMake. Instructions are given in README.md
|
||||
# NOTE: This file only exists as a convenience for cleaning and building
|
||||
# products for release. To build, use CMake. Instructions in README.md
|
||||
|
||||
.PHONY: clean |
||||
clean: |
||||
rm -rf bin build
|
||||
rm -rf bin build products tmp
|
||||
rm -f *.o *.s *.exp *.lib .depend* *.core core
|
||||
rm -rf .depend
|
||||
find . -type f \( -name '*.a' -o -name '*.o' -o -name '*.so' -o -name \
|
||||
'*.o.d' -o -name '*.out' -o -name '*.log' -o -name '*.dSYM' \) -delete
|
||||
'*.o.d' -o -name '*.out' -o -name '*.log' -o -name '*.dSYM' -o -name '*.dylib' -o -name '*.class' \) -delete
|
||||
|
||||
# Build and package everything
|
||||
# This command shall be run twice:
|
||||
# (1) Generates projects
|
||||
# <perform any required modifications>
|
||||
# (2) Build products and package everything
|
||||
.PHONY: dist |
||||
dist: patch |
||||
./packages/dist.sh
|
||||
|
||||
# Initialize submodules and apply patches
|
||||
.PHONY: all |
||||
all: update patch |
||||
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build build
|
||||
|
||||
# Clean build paths
|
||||
clean_win: |
||||
-"rd /S /Q bin"
|
||||
-"rd /S /Q build"
|
||||
|
||||
# Remove any CMake-generated library-building projects
|
||||
clean_packages: |
||||
rm -rf packages/xcode_ios
|
||||
rm -rf packages/xcode_macos
|
||||
|
||||
.PHONY: update |
||||
update: |
||||
git submodule update --init --recursive
|
||||
|
||||
# Patch submodules
|
||||
patch: |
||||
git -C ext/lwip apply ../lwip.patch
|
||||
git -C ext/lwip-contrib apply ../lwip-contrib.patch
|
||||
-git -C ext/lwip apply ../lwip.patch
|
||||
-git -C ext/lwip-contrib apply ../lwip-contrib.patch
|
||||
@ -0,0 +1,211 @@
|
||||
#!/bin/bash |
||||
|
||||
# Call this script from the root project directory via `make dist` |
||||
# - submodules will be recursively initialized and updated |
||||
# - patches will be applied to submodules if needed |
||||
# - this script will call CMake to generate library-building packages if necessary |
||||
# - once projects have been generated, this script will use their tooling to build the libraries/packages |
||||
# - when all products have been built and moved to `tmp`, they will be compressed and moved to `products` |
||||
|
||||
PROJNAME="zt" |
||||
LIBNAME="lib"$PROJNAME |
||||
OSNAME=$(uname | tr '[A-Z]' '[a-z]') |
||||
LIBZT_VERSION="1.2.0" |
||||
LIBZT_REVISION="1" |
||||
ZT_CORE_VERSION="1.2.12" |
||||
FILENAME_PREFIX=${LIBNAME}"-"${LIBZT_VERSION}"r"${LIBZT_REVISION} |
||||
|
||||
PROJROOT=$(pwd) |
||||
BUILD_PRODUCTS_DIR=$(pwd)/bin |
||||
LIB_PRODUCTS_DIR=${BUILD_PRODUCTS_DIR}/lib |
||||
FINISHED_PRODUCTS_DIR=$(pwd)/products |
||||
TMP_PRODUCTS_DIR=${BUILD_PRODUCTS_DIR}/tmp |
||||
|
||||
# previously built, will include in package |
||||
WIN_PREBUILT_DIR=${PROJROOT}/prebuilt |
||||
WIN_RELEASE_PRODUCTS_DIR=${WIN_PREBUILT_DIR}/release |
||||
WIN_DEBUG_PRODUCTS_DIR=${WIN_PREBUILT_DIR}/debug |
||||
WIN32_RELEASE_PRODUCTS_DIR=${WIN_RELEASE_PRODUCTS_DIR}/win32 |
||||
WIN64_RELEASE_PRODUCTS_DIR=${WIN_RELEASE_PRODUCTS_DIR}/win64 |
||||
WIN32_DEBUG_PRODUCTS_DIR=${WIN_DEBUG_PRODUCTS_DIR}/win32 |
||||
WIN64_DEBUG_PRODUCTS_DIR=${WIN_DEBUG_PRODUCTS_DIR}/win64 |
||||
|
||||
XCODE_IOS_PROJ_DIR=$(pwd)/"packages/xcode_ios" |
||||
XCODE_MACOS_PROJ_DIR=$(pwd)/"packages/xcode_macos" |
||||
|
||||
ANDROID_PROJ_DIR=$(pwd)/"packages/android" |
||||
ANDROID_ARCHIVE_FILENAME="zt.aar" |
||||
|
||||
mkdir ${FINISHED_PRODUCTS_DIR} |
||||
mkdir ${TMP_PRODUCTS_DIR} |
||||
|
||||
# Check that projects exist, generate them and exit if they don't exist |
||||
generate_projects_if_necessary() |
||||
{ |
||||
# iOS |
||||
if [ ! -d "$XCODE_IOS_PROJ_DIR" ]; then |
||||
echo "BUILDING: iOS project" |
||||
should_exit=1 |
||||
mkdir -p $XCODE_IOS_PROJ_DIR |
||||
cd $XCODE_IOS_PROJ_DIR |
||||
cmake -G Xcode ../../ |
||||
# Bug in CMake requires us to manually replace architecture strings in project file |
||||
sed -i '' 's/x86_64/$(CURRENT_ARCH)/g' $PROJNAME.xcodeproj/project.pbxproj |
||||
cd - |
||||
fi |
||||
# macOS |
||||
if [ ! -d "$XCODE_MACOS_PROJ_DIR" ]; then |
||||
echo "BUILDING: macOS project" |
||||
should_exit=1 |
||||
mkdir -p $XCODE_MACOS_PROJ_DIR |
||||
cd $XCODE_MACOS_PROJ_DIR |
||||
cmake -G Xcode ../../ |
||||
cd - |
||||
fi |
||||
# android? |
||||
if [[ $should_exit = 1 ]]; then |
||||
echo "Generated projects. Perform necessary modifications and then re-run this script" |
||||
echo "Please place previously built windows binaries in ${WIN_PREBUILT_DIR} before running again." |
||||
exit 0 |
||||
else |
||||
echo "Projects detected, going to build stage next" |
||||
fi |
||||
} |
||||
|
||||
# Xcode Frameworks |
||||
build_xcode_targets() |
||||
{ |
||||
CMAKE_CONFIG=${1} |
||||
UPPERCASE_CONFIG="$(tr '[:lower:]' '[:upper:]' <<< ${1:0:1})${1:1}" |
||||
if [[ ${2} = *"jni"* ]]; then |
||||
CMAKE_FLAGS=${CMAKE_FLAGS}" -DJNI=1" |
||||
fi |
||||
if [[ $OSNAME = *"darwin"* && ${2} != *"JNI"* ]]; then |
||||
CURR_BUILD_PRODUCTS_DIR=${LIB_PRODUCTS_DIR}/${UPPERCASE_CONFIG} |
||||
# (iOS) |
||||
echo "BUILDING: iOS" |
||||
cd $XCODE_IOS_PROJ_DIR |
||||
xcodebuild -target zt -configuration "${UPPERCASE_CONFIG}" -sdk "iphoneos" |
||||
xcodebuild -target zt-static -configuration "${UPPERCASE_CONFIG}" -sdk "iphoneos" |
||||
cd - |
||||
CURR_ARCH="arm64" # anything older should be built custom |
||||
CURR_TMP_PRODUCT_DIR=${TMP_PRODUCTS_DIR}/ios-${CURR_ARCH} |
||||
mkdir -p ${CURR_TMP_PRODUCT_DIR} |
||||
mv ${CURR_BUILD_PRODUCTS_DIR}/*.framework ${CURR_TMP_PRODUCT_DIR} |
||||
mv ${CURR_BUILD_PRODUCTS_DIR}/libzt.* ${CURR_TMP_PRODUCT_DIR} |
||||
|
||||
# (macOS) |
||||
echo "BUILDING: macOS" |
||||
cd $XCODE_MACOS_PROJ_DIR |
||||
xcodebuild -target zt -configuration "${UPPERCASE_CONFIG}" -sdk "macosx" |
||||
xcodebuild -target zt-static -configuration "${UPPERCASE_CONFIG}" -sdk "macosx" |
||||
xcodebuild -target zt-shared -configuration "${UPPERCASE_CONFIG}" -sdk "macosx" |
||||
cd - |
||||
CURR_ARCH=${HOSTTYPE} |
||||
CURR_TMP_PRODUCT_DIR=${TMP_PRODUCTS_DIR}/macos-${CURR_ARCH} |
||||
mkdir -p ${CURR_TMP_PRODUCT_DIR} |
||||
mv ${CURR_BUILD_PRODUCTS_DIR}/*.framework ${CURR_TMP_PRODUCT_DIR} |
||||
mv ${CURR_BUILD_PRODUCTS_DIR}/libzt.* ${CURR_TMP_PRODUCT_DIR} |
||||
fi |
||||
} |
||||
|
||||
# Android archive (AAR) |
||||
build_aar() |
||||
{ |
||||
CMAKE_CONFIG=${1} |
||||
UPPERCASE_CONFIG="$(tr '[:lower:]' '[:upper:]' <<< ${1:0:1})${1:1}" |
||||
if [[ ${2} = *"jni"* ]]; then |
||||
CMAKE_FLAGS=${CMAKE_FLAGS}" -DJNI=1" |
||||
fi |
||||
CURR_ARCH="armeabi-v7a" |
||||
CURR_TMP_PRODUCT_DIR=${TMP_PRODUCTS_DIR}/android-${CURR_ARCH} |
||||
mkdir -p ${CURR_TMP_PRODUCT_DIR} |
||||
echo "BUILDING: AAR" |
||||
cd ${ANDROID_PROJ_DIR} |
||||
./gradlew assemble${UPPERCASE_CONFIG} # e.g. assembleRelease |
||||
mv ${ANDROID_PROJ_DIR}/app/build/outputs/aar/app-${CONFIG}.aar ${CURR_TMP_PRODUCT_DIR}/${ANDROID_ARCHIVE_FILENAME} |
||||
cd - |
||||
} |
||||
|
||||
# Java archive (JAR) |
||||
#Call ordinary CMake build script with JNI flag set, use product in JAR file |
||||
build_jar() |
||||
{ |
||||
CMAKE_CONFIG=${1} |
||||
UPPERCASE_CONFIG="$(tr '[:lower:]' '[:upper:]' <<< ${1:0:1})${1:1}" |
||||
if [[ ${2} = *"jni"* ]]; then |
||||
CMAKE_FLAGS=${CMAKE_FLAGS}" -DJNI=1" |
||||
fi |
||||
CURR_ARCH=${HOSTTYPE} |
||||
CURR_TMP_PRODUCT_DIR=${TMP_PRODUCTS_DIR}/macos-${CURR_ARCH} |
||||
mkdir -p ${CURR_TMP_PRODUCT_DIR} |
||||
echo "BUILDING: JAR" |
||||
rm -rf ${LIB_PRODUCTS_DIR} # clean-lite |
||||
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=${CMAKE_CONFIG} "-DJNI=1 -DBUILD_TESTS=0" |
||||
cmake --build build |
||||
cd ${PROJROOT}/examples/java |
||||
cp ../../bin/lib/libzt.dylib . |
||||
mv ${LIB_PRODUCTS_DIR}/libzt.a ${CURR_TMP_PRODUCT_DIR}/libzt-jni.a |
||||
mv ${LIB_PRODUCTS_DIR}/libzt.dylib ${CURR_TMP_PRODUCT_DIR}/libzt-jni.dylib |
||||
javac com/zerotier/libzt/*.java |
||||
jar cf libzt.jar libzt.dylib com/zerotier/libzt/*.class |
||||
mv libzt.jar ${CURR_TMP_PRODUCT_DIR} |
||||
cd - |
||||
} |
||||
|
||||
# Build everything (to a specific configuration) |
||||
build() |
||||
{ |
||||
if [[ $OSNAME == *"darwin"* ]]; then |
||||
build_xcode_targets ${1} ${2} |
||||
build_aar ${1} ${2} |
||||
fi |
||||
build_jar ${1} ${2} |
||||
} |
||||
|
||||
# Package everything together |
||||
package_products() |
||||
{ |
||||
CONFIG=${1} |
||||
PRODUCT_FILENAME=${FILENAME_PREFIX}-${CONFIG}.tar.gz |
||||
echo "Making: " ${FINISHED_PRODUCTS_DIR}/${PRODUCT_FILENAME} |
||||
cd ${TMP_PRODUCTS_DIR} |
||||
tar -zcvf ${PRODUCT_FILENAME} . |
||||
mv *.tar.gz ${FINISHED_PRODUCTS_DIR} |
||||
cd - |
||||
} |
||||
|
||||
copy_windows_targets() |
||||
{ |
||||
echo "Copying prebuilt windows binaries into temporary staging directory" |
||||
if [ ! -d "$XCODE_MACOS_PROJ_DIR" ]; then |
||||
echo "WARNING: windows products directory appears to be empty. Exiting" |
||||
exit 0 |
||||
fi |
||||
CONFIG=${1} |
||||
cp -r ${WIN_PREBUILT_DIR}/${CONFIG}/win32 ${TMP_PRODUCTS_DIR} |
||||
cp -r ${WIN_PREBUILT_DIR}/${CONFIG}/win64 ${TMP_PRODUCTS_DIR} |
||||
} |
||||
|
||||
build_all_products() |
||||
{ |
||||
CONFIG=${1} |
||||
build ${CONFIG} |
||||
copy_windows_targets ${CONFIG} |
||||
package_products ${CONFIG} |
||||
} |
||||
|
||||
main() |
||||
{ |
||||
# prepare environment |
||||
generate_projects_if_necessary |
||||
mkdir -p ${WIN32_RELEASE_PRODUCTS_DIR} |
||||
mkdir -p ${WIN64_RELEASE_PRODUCTS_DIR} |
||||
mkdir -p ${WIN32_DEBUG_PRODUCTS_DIR} |
||||
mkdir -p ${WIN64_DEBUG_PRODUCTS_DIR} |
||||
# build |
||||
build_all_products "release" |
||||
build_all_products "debug" |
||||
} |
||||
|
||||
main "$@" |
||||
Loading…
Reference in new issue