build_all.sh 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #!/bin/bash
  2. set -x -e
  3. ################################################################################
  4. # Usage example:
  5. # ./build_all.sh PKG_LVERSION=4.0.0-123
  6. ################################################################################
  7. OPENOCD_REPO="${CI_PROJECT_URL:-https://github.com/cypresssemiconductorco/openocd.git}"
  8. OPENOCD_BRANCH="${CI_COMMIT_BRANCH:-cypress}"
  9. for cmd in "${@}"; do
  10. eval "${cmd}"
  11. done
  12. ################################################################################
  13. STATIC="${STATIC:-0}"
  14. OPENOCD_BRANCH="${OPENOCD_BRANCH:-develop}"
  15. PKG_LVERSION="${PKG_LVERSION:-${OPENOCD_BRANCH}-latest}"
  16. LIBUSB_BRANCH=master
  17. LIBUSB_COMMIT=HEAD
  18. HIDAPI_BRANCH=master
  19. HIDAPI_COMMIT=HEAD
  20. CAPSTONE_BRANCH=master
  21. CAPSTONE_COMMIT=tags/4.0.2
  22. ################################################################################
  23. HIDAPI_REPO="https://github.com/libusb/hidapi.git"
  24. LIBUSB_REPO="https://github.com/libusb/libusb.git"
  25. CAPSTONE_REPO="https://github.com/aquynh/capstone.git"
  26. SOURCE_PREFIX="$(pwd)/build/_src"
  27. BUILD_PREFIX="$(pwd)/build/_libs"
  28. INSTALL_PREFIX="$(pwd)/install"
  29. BIN_PREFIX="${INSTALL_PREFIX}/openocd/bin"
  30. CONTRIB_PREFIX="${INSTALL_PREFIX}/openocd/contrib"
  31. #-------------------------------------------------------------------------------
  32. export MAKEFLAGS=${MAKEFLAGS:=-j8}
  33. XTRA_CFLAGS+=" -O2 -URELSTR -DRELSTR=\\\"-${PKG_LVERSION}\\\""
  34. case "$OSTYPE" in
  35. darwin*)
  36. if [ ${STATIC} -eq 1 ]; then
  37. echo "Static build is not supported on Mac OS"
  38. STATIC=0
  39. fi
  40. export XTRA_CFLAGS+=" -Qunused-arguments"
  41. ;;
  42. linux*)
  43. XTRA_CFLAGS+=" -Wl,-rpath,XORIGIN"
  44. ;;
  45. msys*)
  46. if [ ${STATIC} -eq 1 ]; then
  47. XTRA_CFLAGS+=" -Wl,-static"
  48. fi
  49. ;;
  50. *) echo "Unknown operating system: $OSTYPE"
  51. exit 1
  52. ;;
  53. esac
  54. if [ ${STATIC} -eq 1 ]; then
  55. XTRA_CFLAGS+=" -static -static-libgcc"
  56. XTRA_LDFLAGS+=" -static"
  57. LIBUSB_BUILD_TYPE="--enable-shared=no"
  58. else
  59. LIBUSB_BUILD_TYPE="--enable-static=no"
  60. fi
  61. if [ "$CONFIG" == "Coverage" ]; then
  62. XTRA_CFLAGS+=" --coverage -finstrument-functions-exclude-file-list=msys64,jimtcl,src/jtag,src/helper,src/pld,src/rtos,src/server,src/svf,src/target,src/transport,src/xsvf,src/flash/hand"
  63. fi
  64. function maybe_fetch_package {
  65. if [ ! -d "${SOURCE_PREFIX}/${1}" ]; then
  66. git clone --branch "${3}" "${2}" "${SOURCE_PREFIX}/${1}"
  67. fi
  68. (cd "${SOURCE_PREFIX}/${1}" && {
  69. git reset --hard "origin/${3}"
  70. git clean -fd
  71. [ -z "$4" ] || git checkout --quiet "$4"
  72. git show --oneline -s
  73. })
  74. }
  75. function maybe_build_library {
  76. (cd "${SOURCE_PREFIX}/${1}" && {
  77. if [ ! -f Makefile ]; then
  78. ./bootstrap || ./autogen.sh
  79. ./configure --prefix="${BUILD_PREFIX}" --enable-silent-rules "${@:2}"
  80. fi
  81. make
  82. make install
  83. })
  84. }
  85. ############################
  86. # change dynamic shared library install names
  87. #
  88. function patch_macos_lib_path {
  89. local victim=$1
  90. local lib_name=$2
  91. local rel_lib_path="${3:-@executable_path}"
  92. local path_regex="^(.*[\/]?)($lib_name.*\.dylib)"
  93. otool -L "$victim" | grep "$lib_name" | while read -r line ; do
  94. if [[ ${line} =~ ${path_regex} ]]; then
  95. lib_dir=${BASH_REMATCH[1]}
  96. lib=${BASH_REMATCH[2]}
  97. install_name_tool -change "${lib_dir}${lib}" "$rel_lib_path/${lib}" "$victim"
  98. fi
  99. done
  100. }
  101. # fetch and build hidapi
  102. maybe_fetch_package "hidapi" "${HIDAPI_REPO}" "${HIDAPI_BRANCH}" "${HIDAPI_COMMIT}"
  103. maybe_build_library "hidapi" "--enable-shared=no" \
  104. LD_LIBRARY_PATH=":${BUILD_PREFIX}/lib" \
  105. PKG_CONFIG_PATH="${BUILD_PREFIX}/lib/pkgconfig"
  106. # fetch and build libusb
  107. libusb_exists=$(find "${BUILD_PREFIX}/lib/" -maxdepth 1 -type f -name "libusb-*" -print -quit)
  108. if [ -z "$libusb_exists" ]; then
  109. maybe_fetch_package "libusb" "${LIBUSB_REPO}" "${LIBUSB_BRANCH}" "${LIBUSB_COMMIT}"
  110. maybe_build_library "libusb" "${LIBUSB_BUILD_TYPE}"
  111. fi
  112. maybe_fetch_package "capstone" "${CAPSTONE_REPO}" "${CAPSTONE_BRANCH}" "${CAPSTONE_COMMIT}"
  113. cd "${SOURCE_PREFIX}/capstone"
  114. make CAPSTONE_ARCHS="arm" CAPSTONE_BUILD_CORE_ONLY=yes CAPSTONE_SHARED=no PREFIX=${BUILD_PREFIX} install
  115. # fetch openocd
  116. maybe_fetch_package "openocd" "${OPENOCD_REPO}" "${OPENOCD_BRANCH}"
  117. rm -rf "${INSTALL_PREFIX}"
  118. (cd "${SOURCE_PREFIX}/openocd" && {
  119. if [ -f Makefile ]; then
  120. make distclean
  121. fi
  122. ./bootstrap
  123. ./configure --enable-internal-libjaylink --enable-jtag_vpi --enable-silent-rules --disable-werror --enable-remote-bitbang \
  124. --disable-ulink --disable-usbprog --disable-rlink --disable-armjtagew --disable-angie \
  125. CFLAGS="${CFLAGS} ${XTRA_CFLAGS}" LDFLAGS="${LDFLAGS} ${XTRA_LDFLAGS}" \
  126. LD_LIBRARY_PATH=":${BUILD_PREFIX}/lib:${BUILD_PREFIX}/bin:${LD_LIBRARY_PATH}" \
  127. PKG_CONFIG_PATH="${BUILD_PREFIX}/lib/pkgconfig" \
  128. CC="gcc" \
  129. --prefix="${BUILD_PREFIX}" \
  130. --mandir="${BUILD_PREFIX}/share/man" \
  131. --infodir="${BUILD_PREFIX}/share/info" \
  132. --bindir="${BIN_PREFIX}" \
  133. --datarootdir="${INSTALL_PREFIX}"
  134. make
  135. make install-strip
  136. })
  137. mkdir -p "${INSTALL_PREFIX}/openocd/source"
  138. cp -av "${SOURCE_PREFIX}/openocd/build"/*.sh "${INSTALL_PREFIX}/openocd/source/"
  139. mkdir -p "${INSTALL_PREFIX}/openocd/docs"
  140. cp -av "${SOURCE_PREFIX}/openocd/doc/third_party_licenses" "${INSTALL_PREFIX}/openocd/docs/"
  141. cp -av "${SOURCE_PREFIX}/openocd/doc"/*.pdf "${INSTALL_PREFIX}/openocd/docs/" || true
  142. rm -rf "${CONTRIB_PREFIX}"
  143. case "$OSTYPE" in
  144. darwin*)
  145. if [ ${STATIC} -eq 0 ]; then
  146. cp "${BUILD_PREFIX}/lib/libusb-1.0.0.dylib" "${BIN_PREFIX}/"
  147. patch_macos_lib_path "${BIN_PREFIX}/openocd" "libusb-"
  148. fi
  149. ;;
  150. msys*)
  151. if [ ${STATIC} -eq 0 ]; then
  152. # cp /mingw64/bin/libwinpthread-1.dll ${BIN_PREFIX}/
  153. # cp -a "/c/msys64/mingw32/bin/libgcc_s_dw2-1.dll" "${BIN_PREFIX}/"
  154. # cp -a "/c/msys64/mingw32/bin/libwinpthread-1.dll" "${BIN_PREFIX}/"
  155. cp -a "${BUILD_PREFIX}/bin/libusb-1.0.dll" "${BIN_PREFIX}/"
  156. strip "${BIN_PREFIX}"/*.dll
  157. fi
  158. ;;
  159. linux*)
  160. cp -av "${SOURCE_PREFIX}/openocd/udev_rules" "${INSTALL_PREFIX}/openocd/"
  161. if [ ${STATIC} -eq 0 ]; then
  162. find "${BUILD_PREFIX}/lib/" -maxdepth 1 -type f -name "libusb*.so.*" \
  163. -exec cp -av {} "${BIN_PREFIX}/libusb-1.0.so.0" \;
  164. strip "${BIN_PREFIX}/libusb-1.0.so.0"
  165. chrpath -r '$ORIGIN' "${BIN_PREFIX}/openocd"
  166. fi
  167. ;;
  168. esac