frida 16.2.0 → 16.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
@@ -0,0 +1,506 @@
1
+ import argparse
2
+ import os
3
+ from pathlib import Path
4
+ import pickle
5
+ import platform
6
+ import re
7
+ import shlex
8
+ import shutil
9
+ import subprocess
10
+ import sys
11
+ from typing import Any, Callable, Optional
12
+
13
+ RELENG_DIR = Path(__file__).resolve().parent
14
+ SCRIPTS_DIR = RELENG_DIR / "meson-scripts"
15
+
16
+ sys.path.insert(0, str(RELENG_DIR / "meson"))
17
+ import mesonbuild.interpreter
18
+ from mesonbuild.coredata import UserArrayOption, UserBooleanOption, \
19
+ UserComboOption, UserFeatureOption, UserOption, UserStringOption
20
+
21
+ from . import deps, env
22
+ from .machine_spec import MachineSpec
23
+ from .progress import ProgressCallback, print_progress
24
+
25
+
26
+ def main():
27
+ default_sourcedir = Path(sys.argv.pop(1))
28
+ sourcedir = Path(os.environ.get("MESON_SOURCE_ROOT", default_sourcedir)).resolve()
29
+
30
+ workdir = Path(os.getcwd())
31
+ if workdir == sourcedir:
32
+ default_builddir = sourcedir / "build"
33
+ else:
34
+ default_builddir = workdir
35
+ builddir = Path(os.environ.get("MESON_BUILD_ROOT", default_builddir)).resolve()
36
+
37
+ parser = argparse.ArgumentParser(prog="configure",
38
+ add_help=False)
39
+ opts = parser.add_argument_group(title="generic options")
40
+ opts.add_argument("-h", "--help",
41
+ help="show this help message and exit",
42
+ action="help")
43
+ opts.add_argument("--prefix",
44
+ help="install files in PREFIX",
45
+ metavar="PREFIX",
46
+ type=parse_prefix)
47
+ opts.add_argument("--build",
48
+ help="configure for building on BUILD",
49
+ metavar="BUILD",
50
+ type=MachineSpec.parse)
51
+ opts.add_argument("--host",
52
+ help="cross-compile to build binaries to run on HOST",
53
+ metavar="HOST",
54
+ type=MachineSpec.parse)
55
+ opts.add_argument("--enable-symbols",
56
+ help="build binaries with debug symbols included (default: disabled)",
57
+ action="store_true")
58
+ opts.add_argument("--enable-shared",
59
+ help="enable building shared libraries (default: disabled)",
60
+ action="store_true")
61
+ opts.add_argument("--with-meson",
62
+ help="which Meson implementation to use (default: internal)",
63
+ choices=["internal", "system"],
64
+ dest="meson",
65
+ default="internal")
66
+ opts.add_argument(f"--without-prebuilds",
67
+ help="do not make use of prebuilt bundles",
68
+ metavar="{" + ",".join(query_supported_bundle_types(include_wildcards=True)) + "}",
69
+ type=parse_bundle_type_set,
70
+ default=set())
71
+ opts.add_argument("extra_meson_options",
72
+ nargs="*",
73
+ help=argparse.SUPPRESS)
74
+
75
+ meson_options_file = sourcedir / "meson.options"
76
+ if not meson_options_file.exists():
77
+ meson_options_file = sourcedir / "meson_options.txt"
78
+ if meson_options_file.exists():
79
+ meson_group = parser.add_argument_group(title="project-specific options")
80
+ meson_opts = register_meson_options(meson_options_file, meson_group)
81
+
82
+ options = parser.parse_args()
83
+
84
+ if builddir.exists():
85
+ if (builddir / "build.ninja").exists():
86
+ print(f"Already configured. Wipe .{os.sep}{builddir.relative_to(workdir)} to reconfigure.",
87
+ file=sys.stderr)
88
+ sys.exit(1)
89
+
90
+ default_library = "shared" if options.enable_shared else "static"
91
+
92
+ allowed_prebuilds = set(query_supported_bundle_types(include_wildcards=False)) - options.without_prebuilds
93
+
94
+ try:
95
+ configure(sourcedir,
96
+ builddir,
97
+ options.prefix,
98
+ options.build,
99
+ options.host,
100
+ os.environ,
101
+ "included" if options.enable_symbols else "stripped",
102
+ default_library,
103
+ allowed_prebuilds,
104
+ options.meson,
105
+ collect_meson_options(options))
106
+ except Exception as e:
107
+ print(e, file=sys.stderr)
108
+ if isinstance(e, subprocess.CalledProcessError):
109
+ for label, data in [("Output", e.output),
110
+ ("Stderr", e.stderr)]:
111
+ if data:
112
+ print(f"{label}:\n\t| " + "\n\t| ".join(data.strip().split("\n")), file=sys.stderr)
113
+ sys.exit(1)
114
+
115
+
116
+ def configure(sourcedir: Path,
117
+ builddir: Path,
118
+ prefix: Optional[str] = None,
119
+ build_machine: Optional[MachineSpec] = None,
120
+ host_machine: Optional[MachineSpec] = None,
121
+ environ: dict[str, str] = os.environ,
122
+ debug_symbols: str = "stripped",
123
+ default_library: str = "static",
124
+ allowed_prebuilds: set[str] = None,
125
+ meson: str = "internal",
126
+ extra_meson_options: list[str] = [],
127
+ call_meson: Callable = env.call_meson,
128
+ on_progress: ProgressCallback = print_progress):
129
+ if prefix is None:
130
+ prefix = env.detect_default_prefix()
131
+
132
+ project_vscrt = detect_project_vscrt(sourcedir)
133
+
134
+ if build_machine is None:
135
+ build_machine = MachineSpec.make_from_local_system()
136
+ build_machine = build_machine.default_missing(recommended_vscrt=project_vscrt)
137
+
138
+ if host_machine is None:
139
+ host_machine = build_machine
140
+ else:
141
+ host_machine = host_machine.default_missing(recommended_vscrt=project_vscrt)
142
+
143
+ if host_machine.os == "windows":
144
+ vs_arch = environ.get("VSCMD_ARG_TGT_ARCH")
145
+ if vs_arch == "x86":
146
+ host_machine = host_machine.evolve(arch=vs_arch)
147
+
148
+ build_machine = build_machine.maybe_adapt_to_host(host_machine)
149
+
150
+ if allowed_prebuilds is None:
151
+ allowed_prebuilds = set(query_supported_bundle_types(include_wildcards=False))
152
+
153
+ call_selected_meson = lambda argv, *args, **kwargs: call_meson(argv,
154
+ use_submodule=meson == "internal",
155
+ *args,
156
+ **kwargs)
157
+
158
+ meson_options = [
159
+ f"-Dprefix={prefix}",
160
+ f"-Ddefault_library={default_library}",
161
+ *host_machine.meson_optimization_options,
162
+ ]
163
+ if debug_symbols == "stripped" and host_machine.toolchain_can_strip:
164
+ meson_options += ["-Dstrip=true"]
165
+
166
+ deps_dir = deps.detect_cache_dir(sourcedir)
167
+
168
+ allow_prebuilt_toolchain = "toolchain" in allowed_prebuilds
169
+ if allow_prebuilt_toolchain:
170
+ try:
171
+ toolchain_prefix, _ = deps.ensure_toolchain(build_machine, deps_dir, on_progress=on_progress)
172
+ except deps.BundleNotFoundError as e:
173
+ raise_toolchain_not_found(e)
174
+ else:
175
+ if project_depends_on_vala_compiler(sourcedir):
176
+ toolchain_prefix = deps.query_toolchain_prefix(build_machine, deps_dir)
177
+ vala_compiler = env.detect_toolchain_vala_compiler(toolchain_prefix, build_machine)
178
+ if vala_compiler is None:
179
+ build_vala_compiler(toolchain_prefix, deps_dir, call_selected_meson)
180
+ else:
181
+ toolchain_prefix = None
182
+
183
+ is_cross_build = host_machine != build_machine
184
+
185
+ build_sdk_prefix = None
186
+ required = {"sdk:build"}
187
+ if not is_cross_build:
188
+ required.add("sdk:host")
189
+ if allowed_prebuilds.issuperset(required):
190
+ try:
191
+ build_sdk_prefix, _ = deps.ensure_sdk(build_machine, deps_dir, on_progress=on_progress)
192
+ except deps.BundleNotFoundError as e:
193
+ raise_sdk_not_found(e, "build", build_machine)
194
+
195
+ host_sdk_prefix = None
196
+ if is_cross_build and "sdk:host" in allowed_prebuilds:
197
+ try:
198
+ host_sdk_prefix, _ = deps.ensure_sdk(host_machine, deps_dir, on_progress=on_progress)
199
+ except deps.BundleNotFoundError as e:
200
+ raise_sdk_not_found(e, "host", host_machine)
201
+
202
+ build_config, host_config = \
203
+ env.generate_machine_configs(build_machine,
204
+ host_machine,
205
+ environ,
206
+ toolchain_prefix,
207
+ build_sdk_prefix,
208
+ host_sdk_prefix,
209
+ call_selected_meson,
210
+ default_library,
211
+ builddir)
212
+
213
+ meson_options += [f"--native-file={build_config.machine_file}"]
214
+ if host_config is not build_config:
215
+ meson_options += [f"--cross-file={host_config.machine_file}"]
216
+
217
+ setup_env = host_config.make_merged_environment(environ)
218
+ setup_env["FRIDA_ALLOWED_PREBUILDS"] = ",".join(allowed_prebuilds)
219
+
220
+ call_selected_meson(["setup"] + meson_options + extra_meson_options + [builddir],
221
+ cwd=sourcedir,
222
+ env=setup_env,
223
+ check=True)
224
+
225
+ shutil.copy(SCRIPTS_DIR / "BSDmakefile", builddir)
226
+ (builddir / "Makefile").write_text(generate_out_of_tree_makefile(sourcedir), encoding="utf-8")
227
+ if platform.system() == "Windows":
228
+ (builddir / "make.bat").write_text(generate_out_of_tree_make_bat(sourcedir), encoding="utf-8")
229
+
230
+ (builddir / "frida-env.dat").write_bytes(pickle.dumps({
231
+ "meson": meson,
232
+ "build": build_config,
233
+ "host": host_config if host_config is not build_config else None,
234
+ "allowed_prebuilds": allowed_prebuilds,
235
+ "deps": deps_dir,
236
+ }))
237
+
238
+
239
+ def parse_prefix(raw_prefix: str) -> Path:
240
+ prefix = Path(raw_prefix)
241
+ if not prefix.is_absolute():
242
+ prefix = Path(os.getcwd()) / prefix
243
+ return prefix
244
+
245
+
246
+ def query_supported_bundle_types(include_wildcards: bool) -> list[str]:
247
+ for e in deps.Bundle:
248
+ identifier = e.name.lower()
249
+ if e == deps.Bundle.SDK:
250
+ if include_wildcards:
251
+ yield identifier
252
+ yield identifier + ":build"
253
+ yield identifier + ":host"
254
+ else:
255
+ yield identifier
256
+
257
+
258
+ def query_supported_bundle_type_values() -> list[deps.Bundle]:
259
+ return [e for e in deps.Bundle]
260
+
261
+
262
+ def parse_bundle_type_set(raw_array: str) -> list[str]:
263
+ supported_types = list(query_supported_bundle_types(include_wildcards=True))
264
+ result = set()
265
+ for element in raw_array.split(","):
266
+ bundle_type = element.strip()
267
+ if bundle_type not in supported_types:
268
+ pretty_choices = "', '".join(supported_types)
269
+ raise argparse.ArgumentTypeError(f"invalid bundle type: '{bundle_type}' (choose from '{pretty_choices}')")
270
+ if bundle_type == "sdk":
271
+ result.add("sdk:build")
272
+ result.add("sdk:host")
273
+ else:
274
+ result.add(bundle_type)
275
+ return result
276
+
277
+
278
+ def raise_toolchain_not_found(e: Exception):
279
+ raise ToolchainNotFoundError("\n".join([
280
+ f"Unable to download toolchain: {e}",
281
+ "",
282
+ "Specify --without-prebuilds=toolchain to only use tools on your PATH.",
283
+ "",
284
+ "Another option is to do what Frida's CI does:",
285
+ "",
286
+ " ./releng/deps.py build --bundle=toolchain",
287
+ "",
288
+ "This produces a tarball in ./deps which gets picked up if you retry `./configure`.",
289
+ "You may also want to make a backup of it for future reuse.",
290
+ ]))
291
+
292
+
293
+ def raise_sdk_not_found(e: Exception, kind: str, machine: MachineSpec):
294
+ raise SDKNotFoundError("\n".join([
295
+ f"Unable to download SDK: {e}",
296
+ "",
297
+ f"Specify --without-prebuilds=sdk:{kind} to build dependencies from source code.",
298
+ "",
299
+ "Another option is to do what Frida's CI does:",
300
+ "",
301
+ f" ./releng/deps.py build --bundle=sdk --host={machine.identifier}",
302
+ "",
303
+ "This produces a tarball in ./deps which gets picked up if you retry `./configure`.",
304
+ "You may also want to make a backup of it for future reuse.",
305
+ ]))
306
+
307
+
308
+ def generate_out_of_tree_makefile(sourcedir: Path) -> str:
309
+ m = ((SCRIPTS_DIR / "Makefile").read_text(encoding="utf-8")
310
+ .replace("sys.argv[1]", "r'" + str(RELENG_DIR.parent) + "'")
311
+ .replace('"$(shell pwd)"', shlex.quote(str(sourcedir)))
312
+ .replace("./build", "."))
313
+ return re.sub(r"git-submodules:.+?(?=\.PHONY:)", "", m, flags=re.MULTILINE | re.DOTALL)
314
+
315
+
316
+ def generate_out_of_tree_make_bat(sourcedir: Path) -> str:
317
+ m = ((SCRIPTS_DIR / "make.bat").read_text(encoding="utf-8")
318
+ .replace("sys.argv[1]", "r'" + str(RELENG_DIR.parent) + "'")
319
+ .replace('"%dp0%"', '"' + str(sourcedir) + '"')
320
+ .replace('.\\build', "\"%dp0%\""))
321
+ return re.sub(r"if not exist .+?(?=endlocal)", "", m, flags=re.MULTILINE | re.DOTALL)
322
+
323
+
324
+ def register_meson_options(meson_option_file: Path, group: argparse._ArgumentGroup):
325
+ interpreter = mesonbuild.optinterpreter.OptionInterpreter(subproject="")
326
+ interpreter.process(meson_option_file)
327
+
328
+ for key, opt in interpreter.options.items():
329
+ name = key.name
330
+ pretty_name = name.replace("_", "-")
331
+
332
+ if isinstance(opt, UserFeatureOption):
333
+ if opt.value != "enabled":
334
+ action = "enable"
335
+ value_to_set = "enabled"
336
+ else:
337
+ action = "disable"
338
+ value_to_set = "disabled"
339
+ group.add_argument(f"--{action}-{pretty_name}",
340
+ action="append_const",
341
+ const=f"-D{name}={value_to_set}",
342
+ dest="main_meson_options",
343
+ **parse_option_meta(name, action, opt))
344
+ if opt.value == "auto":
345
+ group.add_argument(f"--disable-{pretty_name}",
346
+ action="append_const",
347
+ const=f"-D{name}=disabled",
348
+ dest="main_meson_options",
349
+ **parse_option_meta(name, "disable", opt))
350
+ elif isinstance(opt, UserBooleanOption):
351
+ if not opt.value:
352
+ action = "enable"
353
+ value_to_set = "true"
354
+ else:
355
+ action = "disable"
356
+ value_to_set = "false"
357
+ group.add_argument(f"--{action}-{pretty_name}",
358
+ action="append_const",
359
+ const=f"-D{name}={value_to_set}",
360
+ dest="main_meson_options",
361
+ **parse_option_meta(name, action, opt))
362
+ elif isinstance(opt, UserComboOption):
363
+ group.add_argument(f"--with-{pretty_name}",
364
+ choices=opt.choices,
365
+ dest="meson_option:" + name,
366
+ **parse_option_meta(name, "with", opt))
367
+ elif isinstance(opt, UserArrayOption):
368
+ group.add_argument(f"--with-{pretty_name}",
369
+ dest="meson_option:" + name,
370
+ type=make_array_option_value_parser(opt),
371
+ **parse_option_meta(name, "with", opt))
372
+ else:
373
+ group.add_argument(f"--with-{pretty_name}",
374
+ dest="meson_option:" + name,
375
+ **parse_option_meta(name, "with", opt))
376
+
377
+
378
+ def parse_option_meta(name: str,
379
+ action: str,
380
+ opt: UserOption[Any]):
381
+ params = {}
382
+
383
+ if isinstance(opt, UserStringOption):
384
+ default_value = repr(opt.value)
385
+ metavar = name.upper()
386
+ elif isinstance(opt, UserArrayOption):
387
+ default_value = ",".join(opt.value)
388
+ metavar = "{" + ",".join(opt.choices) + "}"
389
+ elif isinstance(opt, UserComboOption):
390
+ default_value = opt.value
391
+ metavar = "{" + "|".join(opt.choices) + "}"
392
+ else:
393
+ default_value = str(opt.value).lower()
394
+ metavar = name.upper()
395
+
396
+ if not (isinstance(opt, UserFeatureOption) \
397
+ and opt.value == "auto" \
398
+ and action == "disable"):
399
+ text = f"{help_text_from_meson(opt.description)} (default: {default_value})"
400
+ if action == "disable":
401
+ text = "do not " + text
402
+ params["help"] = text
403
+ params["metavar"] = metavar
404
+
405
+ return params
406
+
407
+
408
+ def help_text_from_meson(description: str) -> str:
409
+ if description:
410
+ return description[0].lower() + description[1:]
411
+ return description
412
+
413
+
414
+ def collect_meson_options(options: argparse.Namespace) -> list[str]:
415
+ result = []
416
+
417
+ for raw_name, raw_val in vars(options).items():
418
+ if raw_val is None:
419
+ continue
420
+ if raw_name == "main_meson_options":
421
+ result += raw_val
422
+ if raw_name.startswith("meson_option:"):
423
+ name = raw_name[13:]
424
+ val = raw_val if isinstance(raw_val, str) else ",".join(raw_val)
425
+ result += [f"-D{name}={val}"]
426
+
427
+ result += options.extra_meson_options
428
+
429
+ return result
430
+
431
+
432
+ def make_array_option_value_parser(opt: UserOption[Any]) -> Callable[[str], list[str]]:
433
+ return lambda v: parse_array_option_value(v, opt)
434
+
435
+
436
+ def parse_array_option_value(v: str, opt: UserArrayOption) -> list[str]:
437
+ vals = [v.strip() for v in v.split(",")]
438
+
439
+ choices = opt.choices
440
+ for v in vals:
441
+ if v not in choices:
442
+ pretty_choices = "', '".join(choices)
443
+ raise argparse.ArgumentTypeError(f"invalid array value: '{v}' (choose from '{pretty_choices}')")
444
+
445
+ return vals
446
+
447
+
448
+ def detect_project_vscrt(sourcedir: Path) -> Optional[str]:
449
+ m = next(re.finditer(r"project\(([^)]+\))", read_meson_build(sourcedir)), None)
450
+ if m is not None:
451
+ project_args = m.group(1)
452
+ m = next(re.finditer("'b_vscrt=([^']+)'", project_args), None)
453
+ if m is not None:
454
+ return m.group(1)
455
+ return None
456
+
457
+
458
+ def project_depends_on_vala_compiler(sourcedir: Path) -> bool:
459
+ return "'vala'" in read_meson_build(sourcedir)
460
+
461
+
462
+ def read_meson_build(sourcedir: Path) -> str:
463
+ return (sourcedir / "meson.build").read_text(encoding="utf-8")
464
+
465
+
466
+ def build_vala_compiler(toolchain_prefix: Path, deps_dir: Path, call_selected_meson: Callable):
467
+ print("Building Vala compiler...", flush=True)
468
+
469
+ workdir = deps_dir / "src"
470
+ workdir.mkdir(parents=True, exist_ok=True)
471
+
472
+ git = lambda *args, **kwargs: subprocess.run(["git", *args],
473
+ **kwargs,
474
+ capture_output=True,
475
+ encoding="utf-8")
476
+ vala_checkout = workdir / "vala"
477
+ if vala_checkout.exists():
478
+ shutil.rmtree(vala_checkout)
479
+ vala_pkg = deps.load_dependency_parameters().packages["vala"]
480
+ deps.clone_shallow(vala_pkg, vala_checkout, git)
481
+
482
+ run_kwargs = {
483
+ "stdout": subprocess.PIPE,
484
+ "stderr": subprocess.STDOUT,
485
+ "encoding": "utf-8",
486
+ "check": True,
487
+ }
488
+ call_selected_meson([
489
+ "setup",
490
+ f"--prefix={toolchain_prefix}",
491
+ "-Doptimization=2",
492
+ "build",
493
+ ],
494
+ cwd=vala_checkout,
495
+ **run_kwargs)
496
+ call_selected_meson(["install"],
497
+ cwd=vala_checkout / "build",
498
+ **run_kwargs)
499
+
500
+
501
+ class ToolchainNotFoundError(Exception):
502
+ pass
503
+
504
+
505
+ class SDKNotFoundError(Exception):
506
+ pass
@@ -0,0 +1,131 @@
1
+ import argparse
2
+ import os
3
+ from pathlib import Path
4
+ import pickle
5
+ import shlex
6
+ import shutil
7
+ import sys
8
+ from typing import Callable
9
+
10
+ from . import env
11
+ from .meson_configure import configure
12
+
13
+
14
+ STANDARD_TARGET_NAMES = ["all", "clean", "distclean", "install", "test"]
15
+
16
+
17
+ def main():
18
+ default_sourcedir = Path(sys.argv.pop(1)).resolve()
19
+ sourcedir = Path(os.environ.get("MESON_SOURCE_ROOT", default_sourcedir)).resolve()
20
+
21
+ default_builddir = Path(sys.argv.pop(1)).resolve()
22
+ builddir = Path(os.environ.get("MESON_BUILD_ROOT", default_builddir)).resolve()
23
+
24
+ parser = argparse.ArgumentParser(prog="make")
25
+ parser.add_argument("targets",
26
+ help="Targets to build, e.g.: " + ", ".join(STANDARD_TARGET_NAMES),
27
+ nargs="*",
28
+ default="all")
29
+ options = parser.parse_args()
30
+
31
+ targets = options.targets
32
+ if isinstance(targets, str):
33
+ targets = [targets]
34
+
35
+ try:
36
+ make(sourcedir, builddir, targets)
37
+ except Exception as e:
38
+ print(e, file=sys.stderr)
39
+ sys.exit(1)
40
+
41
+
42
+ def make(sourcedir: Path,
43
+ builddir: Path,
44
+ targets: list[str],
45
+ environ: dict[str, str] = os.environ,
46
+ call_meson: Callable = env.call_meson):
47
+ if not (builddir / "build.ninja").exists():
48
+ configure(sourcedir, builddir, environ=environ)
49
+
50
+ compile_options = []
51
+ if environ.get("V") == "1":
52
+ compile_options += ["-v"]
53
+
54
+ test_options = shlex.split(environ.get("FRIDA_TEST_OPTIONS", "-v"))
55
+
56
+ standard_targets = {
57
+ "all": ["compile"] + compile_options,
58
+ "clean": ["compile", "--clean"] + compile_options,
59
+ "distclean": lambda: distclean(sourcedir, builddir),
60
+ "install": ["install"],
61
+ "test": ["test"] + test_options,
62
+ }
63
+
64
+ env_state = pickle.loads((builddir / "frida-env.dat").read_bytes())
65
+
66
+ machine_config = env_state["host"]
67
+ if machine_config is None:
68
+ machine_config = env_state["build"]
69
+ meson_env = machine_config.make_merged_environment(environ)
70
+ meson_env["FRIDA_ALLOWED_PREBUILDS"] = ",".join(env_state["allowed_prebuilds"])
71
+ meson_env["FRIDA_DEPS"] = str(env_state["deps"])
72
+
73
+ def do_meson_command(args):
74
+ call_meson(args,
75
+ use_submodule=env_state["meson"] == "internal",
76
+ cwd=builddir,
77
+ env=meson_env,
78
+ check=True)
79
+
80
+ pending_targets = targets.copy()
81
+ pending_compile = None
82
+
83
+ while pending_targets:
84
+ target = pending_targets.pop(0)
85
+
86
+ action = standard_targets.get(target, None)
87
+ if action is None:
88
+ meson_command = "compile"
89
+ elif not callable(action):
90
+ meson_command = action[0]
91
+ else:
92
+ meson_command = None
93
+
94
+ if meson_command == "compile":
95
+ if pending_compile is None:
96
+ pending_compile = ["compile"]
97
+ if action is not None:
98
+ pending_compile += action[1:]
99
+ else:
100
+ pending_compile += [target]
101
+ continue
102
+
103
+ if pending_compile is not None:
104
+ do_meson_command(pending_compile)
105
+ pending_compile = None
106
+
107
+ if meson_command is not None:
108
+ do_meson_command(action)
109
+ else:
110
+ action()
111
+
112
+ if pending_compile is not None:
113
+ do_meson_command(pending_compile)
114
+
115
+
116
+ def distclean(sourcedir: Path, builddir: Path):
117
+ items_to_delete = []
118
+
119
+ if not builddir.is_relative_to(sourcedir):
120
+ items_to_delete += list(builddir.iterdir())
121
+
122
+ items_to_delete += [
123
+ sourcedir / "build",
124
+ sourcedir / "deps",
125
+ ]
126
+
127
+ for item in items_to_delete:
128
+ try:
129
+ shutil.rmtree(item)
130
+ except:
131
+ pass