build_wamr_lldb.yml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. # Copyright (C) 2019 Intel Corporation. All rights reserved.
  2. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  3. name: build wamr lldb
  4. on:
  5. workflow_call:
  6. inputs:
  7. arch:
  8. description: arch of the release
  9. type: string
  10. required: false
  11. default: x86_64
  12. runner:
  13. description: OS of compilation
  14. type: string
  15. required: true
  16. upload_url:
  17. description: upload binary assets to the URL of release
  18. type: string
  19. required: true
  20. ver_num:
  21. description: a semantic version number
  22. type: string
  23. required: true
  24. wasi_sdk_url:
  25. description: download WASI_SDK from this URL
  26. type: string
  27. required: false
  28. default: "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz"
  29. permissions:
  30. contents: read
  31. jobs:
  32. try_reuse:
  33. permissions:
  34. contents: write # for uploading release artifacts
  35. uses: ./.github/workflows/reuse_latest_release_binaries.yml
  36. with:
  37. binary_name_stem: "wamr-lldb-${{ inputs.ver_num }}-${{ inputs.arch }}-${{ inputs.runner }}"
  38. last_commit: "ea63ba4bd010c2285623ad4acc0262a4d63bcfea"
  39. the_path: "./build-scripts/lldb_wasm.patch"
  40. upload_url: ${{ inputs.upload_url }}
  41. build:
  42. needs: try_reuse
  43. if: needs.try_reuse.outputs.result != 'hit'
  44. runs-on: ${{ inputs.runner }}
  45. env:
  46. PYTHON_VERSION: '3.10'
  47. PYTHON_UBUNTU_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-unknown-linux-gnu-install_only.tar.gz
  48. PYTHON_MACOS_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-apple-darwin-install_only.tar.gz
  49. permissions:
  50. contents: write # for uploading release artifacts
  51. steps:
  52. - uses: actions/checkout@v5
  53. - name: download and install wasi-sdk
  54. run: |
  55. cd /opt
  56. basename=$(basename ${{ inputs.wasi_sdk_url }})
  57. sudo wget --progress=dot:giga ${{ inputs.wasi_sdk_url }}
  58. sudo tar -xzf ${basename}
  59. sudo rm ${basename}
  60. sudo mv wasi-sdk-* wasi-sdk
  61. - name: Cache build
  62. id: lldb_build_cache
  63. uses: actions/cache@v4
  64. with:
  65. path: |
  66. ./core/deps/llvm-project/build/bin
  67. ./core/deps/llvm-project/build/include
  68. ./core/deps/llvm-project/build/lib
  69. ./core/deps/llvm-project/build/libexec
  70. ./core/deps/llvm-project/build/share
  71. ./core/deps/llvm-project/lldb/tools/
  72. ./core/deps/llvm-project/wamr-lldb/
  73. key: ${{inputs.arch}}-${{ inputs.runner }}-lldb_build
  74. - name: setup xcode macos
  75. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'macos')
  76. uses: maxim-lobanov/setup-xcode@v1
  77. with:
  78. xcode-version: latest-stable
  79. # Remove xCode command line tools, to prevent duplicate symbol compilation failures
  80. - name: install utils macos
  81. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'macos')
  82. run: |
  83. brew install swig cmake ninja libedit
  84. sudo rm -rf /Library/Developer/CommandLineTools
  85. - name: install utils ubuntu
  86. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'ubuntu')
  87. run: sudo apt update && sudo apt-get install -y lld ninja-build
  88. # `git clone` takes ~7m
  89. - name: download llvm
  90. if: steps.lldb_build_cache.outputs.cache-hit != 'true'
  91. run: |
  92. wget https://github.com/llvm/llvm-project/archive/1f27fe6128769f00197925c3b8f6abb9d0e5cd2e.zip
  93. unzip -q 1f27fe6128769f00197925c3b8f6abb9d0e5cd2e.zip
  94. mv llvm-project-1f27fe6128769f00197925c3b8f6abb9d0e5cd2e llvm-project
  95. working-directory: core/deps/
  96. - name: apply wamr patch
  97. if: steps.lldb_build_cache.outputs.cache-hit != 'true'
  98. run: |
  99. git init
  100. git config user.email "action@github.com"
  101. git config user.name "github action"
  102. git apply ../../../build-scripts/lldb_wasm.patch
  103. working-directory: core/deps/llvm-project
  104. - name: get stand-alone python ubuntu
  105. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'ubuntu')
  106. run: |
  107. wget ${{ env.PYTHON_UBUNTU_STANDALONE_BUILD }} -O python.tar.gz
  108. tar -xvf python.tar.gz
  109. working-directory: core/deps
  110. - name: get stand-alone python macos
  111. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'macos')
  112. run: |
  113. wget ${{ env.PYTHON_MACOS_STANDALONE_BUILD }} -O python.tar.gz
  114. tar -xvf python.tar.gz
  115. working-directory: core/deps
  116. - name: build lldb ubuntu
  117. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'ubuntu')
  118. run: |
  119. echo "start to build lldb..."
  120. mkdir -p wamr-lldb
  121. cmake -S ./llvm -B build \
  122. -G Ninja \
  123. -DCMAKE_INSTALL_PREFIX=../wamr-lldb \
  124. -DCMAKE_BUILD_TYPE:STRING="Release" \
  125. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
  126. -DLLVM_ENABLE_PROJECTS="clang;lldb" \
  127. -DLLVM_TARGETS_TO_BUILD:STRING="X86;WebAssembly" \
  128. -DLLVM_BUILD_BENCHMARKS:BOOL=OFF \
  129. -DLLVM_BUILD_DOCS:BOOL=OFF \
  130. -DLLVM_BUILD_EXAMPLES:BOOL=OFF \
  131. -DLLVM_BUILD_LLVM_DYLIB:BOOL=OFF \
  132. -DLLVM_BUILD_TESTS:BOOL=OFF \
  133. -DLLVM_INCLUDE_BENCHMARKS:BOOL=OFF \
  134. -DLLVM_INCLUDE_DOCS:BOOL=OFF \
  135. -DLLVM_INCLUDE_EXAMPLES:BOOL=OFF \
  136. -DLLVM_INCLUDE_TESTS:BOOL=OFF \
  137. -DLLVM_ENABLE_BINDINGS:BOOL=OFF \
  138. -DLLVM_ENABLE_LIBXML2:BOOL=ON \
  139. -DLLVM_ENABLE_LLD:BOOL=ON \
  140. -DLLDB_ENABLE_PYTHON:BOOL=ON \
  141. -DLLDB_EMBED_PYTHON_HOME=ON \
  142. -DLLDB_PYTHON_HOME=.. \
  143. -DLLDB_PYTHON_RELATIVE_PATH=lib/lldb-python \
  144. -DPython3_EXECUTABLE="$(pwd)/../python/bin/python${{ env.PYTHON_VERSION }}"
  145. cmake --build build --target lldb install --parallel $(nproc)
  146. working-directory: core/deps/llvm-project
  147. - name: validate lldb ubuntu
  148. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'ubuntu')
  149. run: |
  150. echo "start to validate lldb..."
  151. mkdir -p wamr-debug
  152. cmake -S product-mini/platforms/linux -B wamr-debug -DWAMR_BUILD_DEBUG_INTERP=1
  153. cmake --build wamr-debug --parallel $(nproc)
  154. export LD_LIBRARY_PATH=$(pwd)/core/deps/python/lib:${LD_LIBRARY_PATH}
  155. python3 ci/validate_lldb.py --port 1239 --lldb core/deps/wamr-lldb/bin/lldb --wamr wamr-debug/iwasm --verbose
  156. working-directory: .
  157. # Define CMAKE_OSX_SYSROOT to avoid the error:
  158. # no such file or directory: 'llvm-project/build/tools/lldb/tools/debugserver/source/mach_excServer.c'
  159. # no such file or directory: 'llvm-project/build/tools/lldb/tools/debugserver/source/mach_excUser.c'
  160. #
  161. # This workaround should be removed when the issue is fixed in llvm-project:
  162. # - https://github.com/llvm/llvm-project/pull/138020/
  163. - name: build lldb macos
  164. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'macos')
  165. run: |
  166. echo "start to build lldb..."
  167. mkdir -p wamr-lldb
  168. cmake -S ./llvm -B build \
  169. -G Ninja \
  170. -DCMAKE_OSX_SYSROOT=$(xcrun --show-sdk-path) \
  171. -DCMAKE_INSTALL_PREFIX=../wamr-lldb \
  172. -DCMAKE_BUILD_TYPE:STRING="Release" \
  173. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
  174. -DLLVM_ENABLE_PROJECTS="clang;lldb" \
  175. -DLLVM_TARGETS_TO_BUILD:STRING="X86;WebAssembly" \
  176. -DLLVM_BUILD_BENCHMARKS:BOOL=OFF \
  177. -DLLVM_BUILD_DOCS:BOOL=OFF \
  178. -DLLVM_BUILD_EXAMPLES:BOOL=OFF \
  179. -DLLVM_BUILD_LLVM_DYLIB:BOOL=OFF \
  180. -DLLVM_BUILD_TESTS:BOOL=OFF \
  181. -DLLVM_INCLUDE_BENCHMARKS:BOOL=OFF \
  182. -DLLVM_INCLUDE_DOCS:BOOL=OFF \
  183. -DLLVM_INCLUDE_EXAMPLES:BOOL=OFF \
  184. -DLLVM_INCLUDE_TESTS:BOOL=OFF \
  185. -DLLVM_ENABLE_BINDINGS:BOOL=OFF \
  186. -DLLVM_ENABLE_LIBXML2:BOOL=ON \
  187. -DLLDB_BUILD_FRAMEWORK:BOOL=OFF \
  188. -DLLDB_ENABLE_PYTHON:BOOL=ON \
  189. -DLLDB_EMBED_PYTHON_HOME=ON \
  190. -DLLDB_PYTHON_HOME=.. \
  191. -DLLDB_PYTHON_RELATIVE_PATH=lib/lldb-python \
  192. -DPython3_EXECUTABLE="$(pwd)/../python/bin/python${{ env.PYTHON_VERSION }}"
  193. cmake --build build --target lldb install --parallel $(nproc)
  194. working-directory: core/deps/llvm-project
  195. - name: pack a distribution
  196. if: steps.lldb_build_cache.outputs.cache-hit != 'true'
  197. run: |
  198. mkdir -p wamr-lldb/bin
  199. mkdir -p wamr-lldb/lib
  200. cp build/bin/lldb* wamr-lldb/bin
  201. cp lldb/tools/lldb-vscode/package.json wamr-lldb
  202. cp -r lldb/tools/lldb-vscode/syntaxes/ wamr-lldb
  203. working-directory: core/deps/llvm-project
  204. - name: pack ubuntu specific libraries
  205. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'ubuntu')
  206. run: |
  207. cp build/lib/liblldb*.so wamr-lldb/lib
  208. cp build/lib/liblldb*.so.* wamr-lldb/lib
  209. cp -R build/lib/lldb-python wamr-lldb/lib
  210. cp -R ../python/lib/python* wamr-lldb/lib
  211. cp ../python/lib/libpython${{ env.PYTHON_VERSION }}.so.1.0 wamr-lldb/lib
  212. working-directory: core/deps/llvm-project
  213. - name: pack macos specific libraries
  214. if: steps.lldb_build_cache.outputs.cache-hit != 'true' && contains(inputs.runner, 'macos')
  215. run: |
  216. cp build/lib/liblldb*.dylib wamr-lldb/lib
  217. cp -R build/lib/lldb-python wamr-lldb/lib
  218. cp -R ../python/lib/python* wamr-lldb/lib
  219. cp ../python/lib/libpython*.dylib wamr-lldb/lib
  220. install_name_tool -change /install/lib/libpython${{ env.PYTHON_VERSION }}.dylib @rpath/libpython${{ env.PYTHON_VERSION }}.dylib wamr-lldb/lib/liblldb.*.dylib
  221. # Patch path of python library -> https://github.com/indygreg/python-build-standalone/blob/85923ca3911784e6978b85d56e06e9ae75cb2dc4/docs/quirks.rst?plain=1#L412-L446
  222. working-directory: core/deps/llvm-project
  223. - name: compress the binary
  224. run: |
  225. tar czf wamr-lldb-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz wamr-lldb
  226. zip -r wamr-lldb-${{ inputs.ver_num }}-${{ inputs.runner }}.zip wamr-lldb
  227. working-directory: core/deps/llvm-project
  228. - name: upload release tar.gz
  229. uses: actions/upload-release-asset@v1
  230. env:
  231. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  232. with:
  233. upload_url: ${{ inputs.upload_url }}
  234. asset_path: core/deps/llvm-project/wamr-lldb-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz
  235. asset_name: wamr-lldb-${{ inputs.ver_num }}-${{ inputs.arch }}-${{ inputs.runner }}.tar.gz
  236. asset_content_type: application/x-gzip
  237. - name: upload release zip
  238. uses: actions/upload-release-asset@v1
  239. env:
  240. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  241. with:
  242. upload_url: ${{ inputs.upload_url }}
  243. asset_path: core/deps/llvm-project/wamr-lldb-${{ inputs.ver_num }}-${{ inputs.runner }}.zip
  244. asset_name: wamr-lldb-${{ inputs.ver_num }}-${{ inputs.arch }}-${{ inputs.runner }}.zip
  245. asset_content_type: application/zip