You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

do_build_common.sh 6.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #!/bin/bash -e
  2. function handle_strip() {
  3. echo "now handle strip $1"
  4. objcopy --only-keep-debug $1 $1.dbg
  5. strip -s $1
  6. objcopy --add-gnu-debuglink=$1.dbg $1
  7. rm $1.dbg
  8. }
  9. function full_copy_so(){
  10. lib_path=$1
  11. dst_dir=$2
  12. append_rpath=$3
  13. lib_name=$(basename $lib_path)
  14. cp $lib_path $dst_dir/$lib_name
  15. if [ "$append_rpath" != "" ];then
  16. ori_rpath=$(patchelf --print-rpath $dst_dir/$lib_name)
  17. if [ "$ori_rpath" != "" ];then
  18. patchelf --set-rpath "$ori_rpath:$append_rpath" $dst_dir/$lib_name
  19. else
  20. patchelf --set-rpath "$append_rpath" $dst_dir/$lib_name
  21. fi
  22. fi
  23. }
  24. function handle_copy_cuda_libs() {
  25. TO_DIR=$1
  26. if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then
  27. echo "handle cuda lib to ${TO_DIR}"
  28. cp ${BUILD_DIR}/dnn/cuda-stub/libcuda_stub.so ${TO_DIR}
  29. handle_strip ${TO_DIR}/libcuda_stub.so
  30. cp /usr/local/cuda/lib64/libnvToolsExt.so.1 ${TO_DIR}
  31. IFS=: read -a lib_name_array <<<"$CUDA_COPY_LIB_LIST"
  32. append_rpath='$ORIGIN'
  33. for lib_name in ${lib_name_array[@]};do
  34. echo "cuda copy detail: ${lib_name} to ${TO_DIR}"
  35. full_copy_so $lib_name ${TO_DIR} $append_rpath
  36. done
  37. fi
  38. }
  39. function patch_elf_depend_lib_mgb_mge() {
  40. echo "handle common depend lib for mgb or mge"
  41. LIBS_DIR=${BUILD_DIR}/staging/megengine/core/lib
  42. mkdir -p ${LIBS_DIR}
  43. cp /usr/lib64/libatomic.so.1 ${LIBS_DIR}
  44. patchelf --remove-rpath ${BUILD_DIR}/staging/megengine/core/_imperative_rt.so
  45. patchelf --force-rpath --set-rpath '$ORIGIN/lib' ${BUILD_DIR}/staging/megengine/core/_imperative_rt.so
  46. handle_strip ${BUILD_DIR}/staging/megengine/core/_imperative_rt.so
  47. cp ${BUILD_DIR}/src/libmegengine_shared.so ${LIBS_DIR}
  48. patchelf --remove-rpath ${LIBS_DIR}/libmegengine_shared.so
  49. patchelf --force-rpath --set-rpath '$ORIGIN/.' ${LIBS_DIR}/libmegengine_shared.so
  50. handle_strip ${LIBS_DIR}/libmegengine_shared.so
  51. # as some version of cudnn/trt libs have dlopen libs, so we can not use auditwheel
  52. # TODO: PR for auditwheel to support args for dlopen libs
  53. handle_copy_cuda_libs ${LIBS_DIR}
  54. }
  55. function patch_elf_depend_lib_megenginelite() {
  56. echo "handle common depend lib for megenginelite"
  57. LIBS_DIR=${BUILD_DIR}/staging/megenginelite/libs
  58. mkdir -p ${LIBS_DIR}
  59. cp ${BUILD_DIR}/lite/liblite_shared_whl.so ${LIBS_DIR}/
  60. patchelf --remove-rpath ${LIBS_DIR}/liblite_shared_whl.so
  61. patchelf --force-rpath --set-rpath '$ORIGIN/../../megengine/core/lib' ${LIBS_DIR}/liblite_shared_whl.so
  62. handle_strip ${LIBS_DIR}/liblite_shared_whl.so
  63. }
  64. SRC_DIR=$(readlink -f "`dirname $0`/../../../")
  65. source ${SRC_DIR}/scripts/whl/utils/utils.sh
  66. SUPPORT_ALL_VERSION="35m 36m 37m 38"
  67. ALL_PYTHON=${ALL_PYTHON}
  68. if [[ -z ${ALL_PYTHON} ]]
  69. then
  70. ALL_PYTHON=${SUPPORT_ALL_VERSION}
  71. else
  72. check_python_version_is_valid "${ALL_PYTHON}" "${SUPPORT_ALL_VERSION}"
  73. fi
  74. BUILD_WHL_CPU_ONLY=${BUILD_WHL_CPU_ONLY}
  75. if [[ -z ${BUILD_WHL_CPU_ONLY} ]]
  76. then
  77. BUILD_WHL_CPU_ONLY="OFF"
  78. fi
  79. BUILD_DIR=${SRC_DIR}/build_dir/host/MGE_WITH_CUDA_OFF/MGE_INFERENCE_ONLY_OFF/Release/build/
  80. if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then
  81. BUILD_DIR=${SRC_DIR}/build_dir/host/MGE_WITH_CUDA_ON/MGE_INFERENCE_ONLY_OFF/Release/build/
  82. fi
  83. # here we just treat cu file should not in the increment build file list
  84. INCREMENT_KEY_WORDS=".cu.o is dirty"
  85. IS_IN_FIRST_LOOP=TRUE
  86. ORG_EXTRA_CMAKE_FLAG=${EXTRA_CMAKE_FLAG}
  87. for ver in ${ALL_PYTHON}
  88. do
  89. # we want run a full clean build at the first loop
  90. if [ ${IS_IN_FIRST_LOOP} = "TRUE" ]; then
  91. # TODO: may all cmake issue can be resolved after rm CMakeCache?
  92. # if YES, remove this to use old cache and speed up CI
  93. echo "warning: remove old build_dir for the first loop"
  94. rm -rf ${BUILD_DIR}
  95. fi
  96. python_ver=${ver:0:2}
  97. MAJOR=${python_ver:0:1}
  98. MINOR=${ver:1}
  99. PYTHON_DIR=/opt/python/cp${python_ver}-cp${ver}/
  100. export EXTRA_CMAKE_ARGS="${ORG_EXTRA_CMAKE_FLAG} -DCMAKE_BUILD_TYPE=RelWithDebInfo"
  101. export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DMGE_WITH_CUSTOM_OP=ON"
  102. export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DPYTHON_EXECUTABLE=${PYTHON_DIR}/bin/python3"
  103. export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DPYTHON_LIBRARY=${PYTHON_DIR}lib/"
  104. export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DPYTHON_INCLUDE_DIR=${PYTHON_DIR}include/python${MAJOR}.${MINOR}"
  105. export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DMGE_WITH_ATLAS=ON"
  106. if [ -d "${BUILD_DIR}" ]; then
  107. # insure rm have args
  108. touch ${BUILD_DIR}/empty.so
  109. touch ${BUILD_DIR}/CMakeCache.txt
  110. find ${BUILD_DIR} -name "*.so" | xargs rm
  111. # as we now use increment build mode when switch python
  112. # But I do not known any more issue at CMakeLists.txt or not
  113. # so Force remove CMakeCache.txt
  114. find ${BUILD_DIR} -name CMakeCache.txt | xargs rm
  115. fi
  116. HOST_BUILD_ARGS="-t -s"
  117. if [ ${BUILD_WHL_CPU_ONLY} = "OFF" ]; then
  118. HOST_BUILD_ARGS="${HOST_BUILD_ARGS} -c"
  119. fi
  120. # call ninja dry run and check increment is invalid or not
  121. if [ ${IS_IN_FIRST_LOOP} = "FALSE" ]; then
  122. ninja_dry_run_and_check_increment "${SRC_DIR}/scripts/cmake-build/host_build.sh" "${HOST_BUILD_ARGS}" "${INCREMENT_KEY_WORDS}"
  123. fi
  124. # call real build
  125. echo "host_build.sh HOST_BUILD_ARGS: ${HOST_BUILD_ARGS}"
  126. ${SRC_DIR}/scripts/cmake-build/host_build.sh ${HOST_BUILD_ARGS}
  127. # check python api call setup.py
  128. cd ${BUILD_DIR}
  129. check_build_ninja_python_api ${ver}
  130. rm -rf staging
  131. mkdir -p staging
  132. cp -a imperative/python/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/
  133. cp -a ${SRC_DIR}/src/custom/include/megbrain staging/megengine/core/include
  134. cd ${BUILD_DIR}/staging/megengine/core
  135. mkdir -p lib/ucx
  136. patch_elf_depend_lib_mgb_mge
  137. # handle megenginelite
  138. cd ${BUILD_DIR}
  139. mkdir -p staging/megenginelite
  140. cp ${SRC_DIR}/lite/pylite/megenginelite/* staging/megenginelite/
  141. patch_elf_depend_lib_megenginelite
  142. cd ${BUILD_DIR}/staging/
  143. ${PYTHON_DIR}/bin/python setup.py bdist_wheel
  144. cd /home/output
  145. mkdir -p ${SRC_DIR}/scripts/whl/manylinux2014/output/wheelhouse/${SDK_NAME}
  146. cd ${BUILD_DIR}/staging/dist/
  147. org_whl_name=`ls Meg*${ver}*.whl`
  148. compat_whl_name=`echo ${org_whl_name} | sed 's/linux/manylinux2014/'`
  149. echo "org whl name: ${org_whl_name}"
  150. echo "comapt whl name: ${compat_whl_name}"
  151. mv ${org_whl_name} ${SRC_DIR}/scripts/whl/manylinux2014/output/wheelhouse/${SDK_NAME}/${compat_whl_name}
  152. cd /home/output
  153. chown -R ${UID}.${UID} .
  154. # compat for root-less docker env to remove output at host side
  155. chmod -R 777 .
  156. echo "python $ver done"
  157. IS_IN_FIRST_LOOP=FALSE
  158. done