2021-02-01 06:31:20 +01:00
#!/usr/bin/env bash
#
# /* ******************************************************************************
# *
# *
# * This program and the accompanying materials are made available under the
# * terms of the Apache License, Version 2.0 which is available at
# * https://www.apache.org/licenses/LICENSE-2.0.
# *
2021-02-01 09:47:29 +01:00
# * See the NOTICE file distributed with this work for additional
# * information regarding copyright ownership.
2021-02-01 06:31:20 +01:00
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# * License for the specific language governing permissions and limitations
# * under the License.
# *
# * SPDX-License-Identifier: Apache-2.0
# ******************************************************************************/
#
function message {
echo " BUILDER:::: ${ @ } "
}
BUILD_USING_MAVEN =
CURRENT_TARGET = arm32
HAS_ARMCOMPUTE = 1
ARMCOMPUTE_DEBUG = 0
ARMCOMPUTE_TAG = v20.05
LIBND4J_BUILD_MODE = Release
export ANDROID_VERSION = 21
OTHER_ARGS = ( )
while [ [ $# -gt 0 ] ]
do
key = " $1 "
case $key in
-a| --arch)
CURRENT_TARGET = " $2 "
shift
shift
; ;
-m| --mvn)
BUILD_USING_MAVEN = "mvn"
shift
; ;
*)
OTHER_ARGS += ( " $1 " )
shift
; ;
esac
done
CC_URL32 = "https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz?revision=e09a1c45-0ed3-4a8e-b06b-db3978fd8d56&la=en&hash=93ED4444B8B3A812B893373B490B90BBB28FD2E3"
CC_URL64 = "https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz?revision=2e88a73f-d233-4f96-b1f4-d8b36e9bb0b9&la=en&hash=167687FADA00B73D20EED2A67D0939A197504ACD"
CC_ANDROID = "https://dl.google.com/android/repository/android-ndk-r21d-linux-x86_64.zip"
TARGET_ARRS = ( arm32 arm64 android-arm android-arm64 )
COMPILER_ARRS = ( " ${ CC_URL32 } " " ${ CC_URL64 } " " ${ CC_ANDROID } " " ${ CC_ANDROID } " )
COMPILER_DOWNLOAD_CMD_LIST = ( download_extract_xz download_extract_xz download_extract_unzip download_extract_unzip )
COMPILER_DESTDIR = ( "arm32" "arm64" "android" "android" )
OPENBLAS_TARGETS = ( ARMV7 ARMV8 ARMV7 ARMV8)
ARMCOMPUTE_TARGETS = ( armv7a arm64-v8a armv7a arm64-v8a)
OS_LIST = ( linux linux android android)
LIBND4J_PLATFORM_EXT_LIST = ( armhf arm64 arm arm64 )
PREFIXES = ( arm-linux-gnueabihf aarch64-linux-gnu arm-linux-androideabi aarch64-linux-android )
TARGET_INDEX = -1
for i in " ${ !TARGET_ARRS[@] } " ; do
if [ [ " ${ TARGET_ARRS [ $i ] } " = " ${ CURRENT_TARGET } " ] ] ; then
TARGET_INDEX = ${ i }
fi
done
if [ ${ TARGET_INDEX } -eq -1 ] ; then
message " could not find ${ CURRENT_TARGET } in ${ TARGET_ARRS [@] } "
exit -1
fi
#BASE_DIR=${HOME}/pi
#https://stackoverflow.com/questions/59895/how-to-get-the-source-directory-of-a-bash-script-from-within-the-script-itself
SOURCE = " ${ BASH_SOURCE [0] } "
while [ -h " $SOURCE " ] ; do # resolve $SOURCE until the file is no longer a symlink
DIR = " $( cd -P " $( dirname " $SOURCE " ) " >/dev/null 2>& 1 && pwd ) "
SOURCE = " $( readlink " $SOURCE " ) "
[ [ $SOURCE != /* ] ] && SOURCE = " $DIR / $SOURCE " # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
BASE_DIR = " $( cd -P " $( dirname " $SOURCE " ) " >/dev/null 2>& 1 && pwd ) "
CROSS_COMPILER_URL = ${ COMPILER_ARRS [ $TARGET_INDEX ] }
CROSS_COMPILER_DIR = ${ BASE_DIR } /compile_tools/cross_compiler_${ COMPILER_DESTDIR [ $TARGET_INDEX ] }
COMPILER_DOWNLOAD_CMD = ${ COMPILER_DOWNLOAD_CMD_LIST [ $TARGET_INDEX ] }
DETECT = ${ DETECT_LIST [ $TARGET_INDEX ] }
LIBND4J_PLATFORM_EXT = ${ LIBND4J_PLATFORM_EXT_LIST [ $TARGET_INDEX ] }
BLAS_TARGET_NAME = ${ OPENBLAS_TARGETS [ $TARGET_INDEX ] }
ARMCOMPUTE_TARGET = ${ ARMCOMPUTE_TARGETS [ $TARGET_INDEX ] }
TARGET_OS = ${ OS_LIST [ $TARGET_INDEX ] }
LIBND4J_PLATFORM = ${ TARGET_OS } -${ LIBND4J_PLATFORM_EXT }
PREFIX = ${ PREFIXES [ $TARGET_INDEX ] }
CMAKE = cmake #/snap/bin/cmake
mkdir -p ${ BASE_DIR } /compile_tools/
SCONS_LOCAL_URL = http://prdownloads.sourceforge.net/scons/scons-local-3.1.1.tar.gz
SCONS_LOCAL_DIR = ${ BASE_DIR } /compile_tools/scons_local
THIRD_PARTY = ${ BASE_DIR } /third_party_libs${ TARGET_INDEX }
ARMCOMPUTE_GIT_URL = https://github.com/ARM-software/ComputeLibrary.git
ARMCOMPUTE_DIR = ${ THIRD_PARTY } /arm_compute_dir
OPENBLAS_GIT_URL = "https://github.com/xianyi/OpenBLAS.git"
OPENBLAS_DIR = ${ THIRD_PARTY } /OpenBLAS
mkdir -p ${ BASE_DIR }
mkdir -p ${ THIRD_PARTY }
#change directory to base
cd $BASE_DIR
function check_requirements {
for i in " ${ @ } "
do
if [ ! -e " $i " ] ; then
message " missing: ${ i } "
exit -2
fi
done
}
function rename_top_folder {
for dir in ${ 1 } /*
do
if [ -d " $dir " ]
then
mv " ${ dir } " " ${ 1 } /folder/ "
message " ${ dir } => ${ 1 } /folder/ "
break
fi
done
}
function download_extract_base {
#$1 is url #2 is dir $3 is extract argument
if [ ! -f ${ 3 } _file ] ; then
message "download"
wget --quiet --show-progress -O ${ 3 } _file ${ 2 }
fi
message " extract $@ "
#extract
mkdir -p ${ 3 }
if [ ${ 1 } = "-unzip" ] ; then
command = " unzip -qq ${ 3 } _file -d ${ 3 } "
else
command = " tar ${ 1 } ${ 3 } _file --directory= ${ 3 } "
fi
message $command
$command
check_requirements " ${ 3 } "
}
function download_extract {
download_extract_base -xzf $@
}
function download_extract_xz {
download_extract_base -xf $@
}
function download_extract_unzip {
download_extract_base -unzip $@
}
function git_check {
#$1 is url #$2 is dir #$3 is tag or branch if optional
command =
if [ -n " $3 " ] ; then
command = " git clone --quiet --depth 1 --branch ${ 3 } ${ 1 } ${ 2 } "
else
command = " git clone --quiet ${ 1 } ${ 2 } "
fi
message " $command "
$command
check_requirements " ${ 2 } "
}
#fix py debug linkage manually and also makes it use gold
function fix_pi_linker {
#$1 BINUTILS folder
if [ ! -f ${ 1 } /ld.original ] ; then
mv ${ 1 } /ld ${ 1 } /ld.original
fi
rm -f ${ 1 } /ld
printf '#!/usr/bin/env bash\n' " ${ 1 } /ld.gold --long-plt \$* " >${ 1 } /ld
chmod +x ${ 1 } /ld
}
if [ ! -d ${ CROSS_COMPILER_DIR } /folder ] ; then
#out file
message "download CROSS_COMPILER"
${ COMPILER_DOWNLOAD_CMD } ${ CROSS_COMPILER_URL } ${ CROSS_COMPILER_DIR }
message "rename top folder (instead of --strip-components=1)"
rename_top_folder ${ CROSS_COMPILER_DIR }
fi
CROSS_COMPILER_DIR = ${ CROSS_COMPILER_DIR } /folder
if [ " ${ TARGET_OS } " = "android" ] ; then
ANDROID_TOOLCHAIN = ${ CROSS_COMPILER_DIR } /toolchains/llvm/prebuilt/linux-x86_64
COMPILER_PREFIX = " ${ ANDROID_TOOLCHAIN } /bin/ ${ PREFIX } ${ ANDROID_VERSION } "
TOOLCHAIN_PREFIX = " ${ ANDROID_TOOLCHAIN } /bin/ ${ PREFIX } "
if [ " $BLAS_TARGET_NAME " = "ARMV7" ] ; then
BLAS_XTRA = "ARM_SOFTFP_ABI=1 "
COMPILER_PREFIX = " ${ ANDROID_TOOLCHAIN } /bin/armv7a-linux-androideabi ${ ANDROID_VERSION } "
fi
CC_EXE = "clang"
CXX_EXE = "clang++"
AR = " ${ TOOLCHAIN_PREFIX } -ar "
RANLIB = " ${ TOOLCHAIN_PREFIX } -ranlib "
BLAS_XTRA = " CC= ${ COMPILER_PREFIX } - ${ CC_EXE } AR= ${ AR } RANLIB= ${ RANLIB } ${ BLAS_XTRA } "
else
BINUTILS_BIN = ${ CROSS_COMPILER_DIR } /${ PREFIX } /bin
COMPILER_PREFIX = ${ CROSS_COMPILER_DIR } /bin/${ PREFIX }
TOOLCHAIN_PREFIX = ${ COMPILER_PREFIX }
SYS_ROOT = ${ CROSS_COMPILER_DIR } /${ PREFIX } /libc
#LD_LIBRARY_PATH=${CROSS_COMPILER_DIR}/lib:$LD_LIBRARY_PATH
CC_EXE = "gcc"
CXX_EXE = "g++"
RANLIB = " ${ BINUTILS_BIN } /ranlib "
export LD = " ${ BINUTILS_BIN } /ld "
AR = " ${ BINUTILS_BIN } /ar "
BLAS_XTRA = " CC= ${ COMPILER_PREFIX } - ${ CC_EXE } AR= ${ AR } RANLIB= ${ RANLIB } CFLAGS=--sysroot= ${ SYS_ROOT } LDFLAGS=\"-L ${ SYS_ROOT } /../lib/ -lm\" "
fi
check_requirements ${ CC }
if [ -z " ${ BUILD_USING_MAVEN } " ] ; then
#lets build OpenBlas
if [ ! -d " ${ OPENBLAS_DIR } " ] ; then
message "download OpenBLAS"
git_check " ${ OPENBLAS_GIT_URL } " " ${ OPENBLAS_DIR } " "v0.3.10"
fi
if [ ! -f " ${ THIRD_PARTY } /lib/libopenblas.so " ] ; then
message "build and install OpenBLAS"
cd ${ OPENBLAS_DIR }
command = " make TARGET= ${ BLAS_TARGET_NAME } HOSTCC=gcc NOFORTRAN=1 ${ BLAS_XTRA } "
message $command
eval $command & >/dev/null
message "install it"
command = " make TARGET= ${ BLAS_TARGET_NAME } PREFIX= ${ THIRD_PARTY } install &>/dev/null "
message $command
$command
cd $BASE_DIR
fi
check_requirements ${ THIRD_PARTY } /lib/libopenblas.so
export OPENBLAS_PATH = ${ THIRD_PARTY }
fi # end if [ -z "${BUILD_USING_MAVEN}"];then
if [ ! -d ${ SCONS_LOCAL_DIR } ] ; then
#out file
message "download Scons local"
download_extract ${ SCONS_LOCAL_URL } ${ SCONS_LOCAL_DIR }
fi
check_requirements ${ SCONS_LOCAL_DIR } /scons.py
if [ ! -d " ${ ARMCOMPUTE_DIR } " ] ; then
message "download ArmCompute Source"
git_check ${ ARMCOMPUTE_GIT_URL } " ${ ARMCOMPUTE_DIR } " " ${ ARMCOMPUTE_TAG } "
fi
#build armcompute
if [ ! -f " ${ ARMCOMPUTE_DIR } /build/libarm_compute-static.a " ] ; then
message "build arm compute"
cd ${ ARMCOMPUTE_DIR }
command = " CC= ${ CC_EXE } CXX= ${ CXX_EXE } python3 ${ SCONS_LOCAL_DIR } /scons.py Werror=1 -j $( nproc) toolchain_prefix= ${ TOOLCHAIN_PREFIX } - compiler_prefix= ${ COMPILER_PREFIX } - debug= ${ ARMCOMPUTE_DEBUG } neon=1 opencl=0 extra_cxx_flags=-fPIC os= ${ TARGET_OS } build=cross_compile arch= ${ ARMCOMPUTE_TARGET } "
message $command
eval $command & >/dev/null
cd ${ BASE_DIR }
fi
check_requirements " ${ ARMCOMPUTE_DIR } /build/libarm_compute-static.a " " ${ ARMCOMPUTE_DIR } /build/libarm_compute_core-static.a "
export ARMCOMPUTE_ROOT = " ${ ARMCOMPUTE_DIR } "
if [ " ${ TARGET_OS } " = "android" ] ; then
export ANDROID_NDK = ${ CROSS_COMPILER_DIR }
else
export RPI_BIN = ${ CROSS_COMPILER_DIR } /bin/${ PREFIX }
export JAVA_LIBRARY_PATH = ${ CROSS_COMPILER_DIR } /${ PREFIX } /lib
fix_pi_linker ${ BINUTILS_BIN }
fi
#because of the toolchain passive detection we have to delete build folder manually
detect = $( cat ${ BASE_DIR } /blasbuild/cpu/CMakeCache.txt | grep -o ${ PREFIX } )
if [ -z " ${ detect } " ] ; then
message "remove blasbuild folder "
rm -rf $BASE_DIR /blasbuild/
else
message "keep blasbuild folder"
fi
if [ -z " ${ BUILD_USING_MAVEN } " ] ; then
message "lets build just library"
DHELPER = " -h armcompute "
bash ./buildnativeoperations.sh -o ${ LIBND4J_PLATFORM } -t ${ DHELPER } -j $( nproc)
else
message " cd $BASE_DIR /.. "
cd $BASE_DIR /..
message "lets build jars"
DHELPER = " -Dlibnd4j.helper=armcompute "
mvn install -Dlibnd4j.platform= ${ LIBND4J_PLATFORM } -Djavacpp.platform= ${ LIBND4J_PLATFORM } -DprotocCommand= protoc -Djavacpp.platform.compiler= ${ COMPILER_PREFIX } -${ CC_EXE } -Djava.library.path= ${ JAVA_LIBRARY_PATH } ${ DHELPER } -Dmaven.test.skip= true -Dmaven.javadoc.skip= true
fi