@ -7,37 +7,38 @@
# - 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 }
BUILD_CONCURRENCY = 4
PROJROOT = $( pwd )
BUILD_PRODUCTS_DIR = $( pwd ) /bin
LIB_PRODUCTS_DIR = ${ BUILD_PRODUCTS_DIR } /lib
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"
STAGING_DIR = $( pwd ) /staging
# Windows (previously built)
WIN_PREBUILT_DIR = $PROJROOT /staging/win
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
# Linux
LINUX_PROD_DIR = $PROJROOT /staging/linux
# macOS
MACOS_PROD_DIR = $PROJROOT /staging/macos
MACOS_RELEASE_PROD_DIR = $MACOS_PROD_DIR /release
MACOS_DEBUG_PROD_DIR = $MACOS_PROD_DIR /debug
# iOS
IOS_PROD_DIR = $PROJROOT /staging/ios
# Android
ANDROID_PROJ_DIR = $( pwd ) /"packages/android"
ANDROID_ARCHIVE_FILENAME = "zt.aar"
# Xcode
XCODE_IOS_PROJ_DIR = $( pwd ) /"packages/xcode_ios"
XCODE_MACOS_PROJ_DIR = $( pwd ) /"packages/xcode_macos"
mkdir ${ FINISHED_PRODUCTS_DIR }
mkdir ${ TMP_PRODUCTS_DIR }
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( )
@ -65,145 +66,112 @@ generate_projects_if_necessary()
# 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. "
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( )
build_all_products( )
{
CMAKE_CONFIG = ${ 1 }
UPPERCASE_CONFIG = " $( tr '[:lower:]' '[:upper:]' <<< ${ 1 : 0 : 1 } ) ${ 1 : 1 } "
if [ [ ${ 2 } = *"jni" * ] ] ; then
CMAKE_FLAGS = ${ CMAKE_FLAGS } " -DJNI=1"
CONFIG = $1
UPPERCASE_CONFIG = " $( tr '[:lower:]' '[:upper:]' <<< $1 :0:1) $1 :1 "
# Targets to build on and for darwin
if [ [ $OSNAME = *"darwin" * ] ] ; then
# Xcode Frameworks --- Builds targets from a CMake-generated Xcode project
if true; then
if [ [ $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 = $STAGING_DIR /$CONFIG /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 = $STAGING_DIR /$CONFIG /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
fi
# Android Archive (AAR) --- Executes a Gradle task
if true; then
CMAKE_FLAGS = $CMAKE_FLAGS " -DJNI=1"
CURR_ARCH = "armeabi-v7a"
CURR_TMP_PRODUCT_DIR = $STAGING_DIR /$CONFIG /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 -
fi
# Java Archive (JAR)
if true; then
CMAKE_FLAGS = $CMAKE_FLAGS " -DJNI=1"
CURR_ARCH = $HOSTTYPE
CURR_TMP_PRODUCT_DIR = $STAGING_DIR /$CONFIG /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= $CONFIG "-DJNI=1 -DBUILD_TESTS=0"
cmake --build build
cd $PROJROOT /packages/java
#cp $CURR_BUILD_PRODUCTS_DIR/libzt.dylib .
javac com/zerotier/libzt/*.java
jar cf zt.jar $CURR_BUILD_PRODUCTS_DIR /libzt.dylib com/zerotier/libzt/*.class
mv zt.jar $CURR_TMP_PRODUCT_DIR
cd -
fi
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 }
# Linux targets
if [ [ $OSNAME = *"linux" * ] ] ; then
# Ordinary libraries
if false; then
rm -rf $LIB_PRODUCTS_DIR
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE= $CONFIG "-DBUILD_TESTS=0"
cmake --build build -j $BUILD_CONCURRENCY
CURR_ARCH = $HOSTTYPE
CURR_TMP_PRODUCT_DIR = $STAGING_DIR /$CONFIG /linux-$CURR_ARCH
mv $CURR_BUILD_PRODUCTS_DIR /libzt.* $CURR_TMP_PRODUCT_DIR
fi
# Java JAR file
if true; then
rm -rf $LIB_PRODUCTS_DIR
cmake -H. -Bbuild -DCMAKE_BUILD_TYPE= $CONFIG "-DJNI=1 -DBUILD_TESTS=0"
cmake --build build -j $BUILD_CONCURRENCY
CURR_ARCH = $HOSTTYPE
CURR_TMP_PRODUCT_DIR = $STAGING_DIR /$CONFIG /linux-$CURR_ARCH
mkdir -p $CURR_TMP_PRODUCT_DIR
cd $PROJROOT /packages/java
#cp $CURR_BUILD_PRODUCTS_DIR/libzt.so .
javac com/zerotier/libzt/*.java
jar cf zt.jar $CURR_BUILD_PRODUCTS_DIR /libzt.so com/zerotier/libzt/*.class
mv zt.jar $CURR_TMP_PRODUCT_DIR
cd -
fi
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"
}