#!/bin/bash -e SRC_DIR=$(readlink -f "`dirname $0`/../../../") cd ${SRC_DIR} source scripts/whl/android/utils.sh ANDROID_WHL_HOME=${SRC_DIR}/scripts/whl/android/ANDROID_WHL_HOME if [ -e "${ANDROID_WHL_HOME}" ]; then echo "remove old android whl file" rm -rf ${ANDROID_WHL_HOME} fi mkdir -p ${ANDROID_WHL_HOME} BUILD_DIR=${SRC_DIR}/build_dir/host/MGE_WITH_CUDA_OFF/MGE_INFERENCE_ONLY_OFF/Release/build/ # We only handle the case where dnn/src/common/conv_bias.cpp is not in the list of incremental build files. INCREMENT_KEY_WORDS="conv_bias.cpp.o is dirty" IS_IN_FIRST_LOOP=TRUE ORG_EXTRA_CMAKE_FLAG=${EXTRA_CMAKE_FLAG} function handle_strip() { echo "now handle strip $1" objcopy --only-keep-debug $1 $1.dbg strip -s $1 objcopy --add-gnu-debuglink=$1.dbg $1 rm $1.dbg } function patch_elf_depend_lib_mgb_mge() { echo "handle common depend lib for mgb or mge" LIBS_DIR=${BUILD_DIR}/staging/megengine/core/lib mkdir -p ${LIBS_DIR} patchelf --remove-rpath ${BUILD_DIR}/staging/megengine/core/_imperative_rt.so patchelf --set-rpath '$ORIGIN/lib' ${BUILD_DIR}/staging/megengine/core/_imperative_rt.so handle_strip ${BUILD_DIR}/staging/megengine/core/_imperative_rt.so cp ${BUILD_DIR}/src/libmegengine_shared.so ${LIBS_DIR} patchelf --remove-rpath ${LIBS_DIR}/libmegengine_shared.so patchelf --set-rpath '$ORIGIN/.' ${LIBS_DIR}/libmegengine_shared.so # FXIME: third_party LLVM need c++_static > 5.1 # but now clang(13) at termux env do not satisfy it # may use -static-libstdc++ at CMakeLists.txt after # upgrade third_party LLVM cp /data/data/com.termux/files/usr/lib/libc++_shared.so ${LIBS_DIR} handle_strip ${LIBS_DIR}/libmegengine_shared.so } function patch_elf_depend_lib_megenginelite() { echo "handle common depend lib for megenginelite" LIBS_DIR=${BUILD_DIR}/staging/megenginelite/libs mkdir -p ${LIBS_DIR} cp ${BUILD_DIR}/lite/liblite_shared_whl.so ${LIBS_DIR}/ patchelf --remove-rpath ${LIBS_DIR}/liblite_shared_whl.so patchelf --set-rpath '$ORIGIN/../../megengine/core/lib' ${LIBS_DIR}/liblite_shared_whl.so handle_strip ${LIBS_DIR}/liblite_shared_whl.so } function do_build() { mge_python_env_root="${HOME}/mge_python_env" for ver in ${ALL_PYTHON} do python_install_dir=${mge_python_env_root}/${ver}/install # we want to run a full clean build in the first loop if [ ${IS_IN_FIRST_LOOP} = "TRUE" ]; then # TODO: can all cmake issues be resolved after removing CMakeCache? # if YES, remove this logic to use old cache and speed up CI echo "warning: remove old build_dir for the first loop" rm -rf ${BUILD_DIR} fi # insert python3_install_dir into head of PATH to enable CMake find it if [ -e ${python_install_dir}/bin/python3 ];then echo "will use ${python_install_dir}/bin/python3 to build mge wheel" export PATH=${python_install_dir}/bin:$PATH else echo "ERROR: can not find python3 in: ${python_install_dir}/bin" echo "please run: %{SRC_DIR}/scripts/whl/android/android_whl_env_prepare.sh to prepare env" exit -1 fi export EXTRA_CMAKE_ARGS="${ORG_EXTRA_CMAKE_FLAG} -DCMAKE_BUILD_TYPE=RelWithDebInfo" export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DMGE_WITH_CUSTOM_OP=ON" if [ -d "${BUILD_DIR}" ]; then # insure rm have args touch ${BUILD_DIR}/empty.so touch ${BUILD_DIR}/CMakeCache.txt find ${BUILD_DIR} -name "*.so" | xargs rm # Force remove CMakeCache.txt to avoid error owing to unknown issue in CMakeLists.txt # which comes from using increment build mode when switching python version find ${BUILD_DIR} -name CMakeCache.txt | xargs rm fi HOST_BUILD_ARGS="-t -s" # call ninja dry run and check increment is invalid or not if [ ${IS_IN_FIRST_LOOP} = "FALSE" ]; then ninja_dry_run_and_check_increment "${SRC_DIR}/scripts/cmake-build/host_build.sh" "${HOST_BUILD_ARGS}" "${INCREMENT_KEY_WORDS}" fi # call real build echo "host_build.sh HOST_BUILD_ARGS: ${HOST_BUILD_ARGS}" bash ${SRC_DIR}/scripts/cmake-build/host_build.sh ${HOST_BUILD_ARGS} # check python api call setup.py cd ${BUILD_DIR} check_build_ninja_python_api ${ver} rm -rf staging mkdir -p staging cp -a imperative/python/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/ cp -a ${SRC_DIR}/src/custom/include staging/megengine/core/include/ patch_elf_depend_lib_mgb_mge # handle megenginelite cd ${BUILD_DIR} mkdir -p staging/megenginelite cp ${SRC_DIR}/lite/pylite/megenginelite/* staging/megenginelite/ patch_elf_depend_lib_megenginelite cd ${BUILD_DIR}/staging python3 setup.py bdist_wheel cd ${BUILD_DIR}/staging/dist/ cp ${BUILD_DIR}/staging/dist/Meg*.whl ${ANDROID_WHL_HOME} cd ${SRC_DIR} echo "" echo "##############################################################################################" echo "android whl package location: ${ANDROID_WHL_HOME}" ls ${ANDROID_WHL_HOME} echo "##############################################################################################" IS_IN_FIRST_LOOP=FALSE done } function third_party_prepare() { echo "init third_party..." bash ${SRC_DIR}/third_party/prepare.sh # fix flatbuffers build at pure LLVM env(not cross link gcc) # TODO: pr to flatbuffers to fix this issue sed -i 's/lc++abi/lc/g' ${SRC_DIR}/third_party/flatbuffers/CMakeLists.txt } function remove_requires() { # do not worry about this, we will provide 'scripts/whl/android/android_opencv_python.sh' # to build opencv-python from opencv src!! This function may be removed after termux fixes # this issue cd ${SRC_DIR} git checkout imperative/python/requires.txt sed -i '/opencv-python/d' imperative/python/requires.txt # FIXME: termux install pyarrow will build error now # remove this logic after pyarrow fix this issue # see imperative/python/megengine/data/dataloader.py # for detail, now will use _SerialStreamDataLoaderIter sed -i '/pyarrow/d' imperative/python/requires.txt cd - } ###################### check_termux_env third_party_prepare remove_requires do_build