Update pi_build.sh
This commit is contained in:
		
							parent
							
								
									d54a91505b
								
							
						
					
					
						commit
						c6b1dfa79e
					
				| @ -1,320 +1,320 @@ | ||||
| #!/bin/sh | ||||
| # | ||||
| # /* ****************************************************************************** | ||||
| #  * | ||||
| #  * | ||||
| #  * 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. | ||||
| #  * | ||||
| #  *  See the NOTICE file distributed with this work for additional | ||||
| #  *  information regarding copyright ownership. | ||||
| #  * 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 | ||||
| #!/bin/sh | ||||
| # | ||||
| # /* ****************************************************************************** | ||||
| #  * | ||||
| #  * | ||||
| #  * 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. | ||||
| #  * | ||||
| #  *  See the NOTICE file distributed with this work for additional | ||||
| #  *  information regarding copyright ownership. | ||||
| #  * 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 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user