frida 16.2.1 → 16.2.3

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,121 @@
1
+ #!/usr/bin/env python
2
+
3
+ # ignore all lints for this file, since it is run by python2 as well
4
+
5
+ # type: ignore
6
+ # pylint: disable=deprecated-module
7
+
8
+ import sys
9
+
10
+ # do not inject mesonbuild.scripts
11
+ # python -P would work too, but is exclusive to >=3.11
12
+ if sys.path[0].endswith('scripts'):
13
+ del sys.path[0]
14
+
15
+ import json, os, sysconfig
16
+
17
+ def get_distutils_paths(scheme=None, prefix=None):
18
+ import distutils.dist
19
+ distribution = distutils.dist.Distribution()
20
+ install_cmd = distribution.get_command_obj('install')
21
+ if prefix is not None:
22
+ install_cmd.prefix = prefix
23
+ if scheme:
24
+ install_cmd.select_scheme(scheme)
25
+ install_cmd.finalize_options()
26
+ return {
27
+ 'data': install_cmd.install_data,
28
+ 'include': os.path.dirname(install_cmd.install_headers),
29
+ 'platlib': install_cmd.install_platlib,
30
+ 'purelib': install_cmd.install_purelib,
31
+ 'scripts': install_cmd.install_scripts,
32
+ }
33
+
34
+ # On Debian derivatives, the Python interpreter shipped by the distribution uses
35
+ # a custom install scheme, deb_system, for the system install, and changes the
36
+ # default scheme to a custom one pointing to /usr/local and replacing
37
+ # site-packages with dist-packages.
38
+ # See https://github.com/mesonbuild/meson/issues/8739.
39
+ #
40
+ # We should be using sysconfig, but before 3.10.3, Debian only patches distutils.
41
+ # So we may end up falling back.
42
+
43
+ def get_install_paths():
44
+ if sys.version_info >= (3, 10):
45
+ scheme = sysconfig.get_default_scheme()
46
+ else:
47
+ scheme = sysconfig._get_default_scheme()
48
+
49
+ if sys.version_info >= (3, 10, 3):
50
+ if 'deb_system' in sysconfig.get_scheme_names():
51
+ scheme = 'deb_system'
52
+ else:
53
+ import distutils.command.install
54
+ if 'deb_system' in distutils.command.install.INSTALL_SCHEMES:
55
+ paths = get_distutils_paths(scheme='deb_system')
56
+ install_paths = get_distutils_paths(scheme='deb_system', prefix='')
57
+ return paths, install_paths
58
+
59
+ paths = sysconfig.get_paths(scheme=scheme)
60
+ empty_vars = {'base': '', 'platbase': '', 'installed_base': ''}
61
+ install_paths = sysconfig.get_paths(scheme=scheme, vars=empty_vars)
62
+ return paths, install_paths
63
+
64
+ paths, install_paths = get_install_paths()
65
+
66
+ def links_against_libpython():
67
+ # on versions supporting python-embed.pc, this is the non-embed lib
68
+ #
69
+ # PyPy is not yet up to 3.12 and work is still pending to export the
70
+ # relevant information (it doesn't automatically provide arbitrary
71
+ # Makefile vars)
72
+ if sys.version_info >= (3, 8) and not is_pypy:
73
+ variables = sysconfig.get_config_vars()
74
+ return bool(variables.get('LIBPYTHON', 'yes'))
75
+ else:
76
+ from distutils.core import Distribution, Extension
77
+ cmd = Distribution().get_command_obj('build_ext')
78
+ cmd.ensure_finalized()
79
+ return bool(cmd.get_libraries(Extension('dummy', [])))
80
+
81
+ variables = sysconfig.get_config_vars()
82
+ variables.update({'base_prefix': getattr(sys, 'base_prefix', sys.prefix)})
83
+
84
+ is_pypy = '__pypy__' in sys.builtin_module_names
85
+
86
+ if sys.version_info < (3, 0):
87
+ suffix = variables.get('SO')
88
+ elif sys.version_info < (3, 8, 7):
89
+ # https://bugs.python.org/issue?@action=redirect&bpo=39825
90
+ from distutils.sysconfig import get_config_var
91
+ suffix = get_config_var('EXT_SUFFIX')
92
+ else:
93
+ suffix = variables.get('EXT_SUFFIX')
94
+
95
+ limited_api_suffix = None
96
+ if sys.version_info >= (3, 2):
97
+ try:
98
+ from importlib.machinery import EXTENSION_SUFFIXES
99
+ limited_api_suffix = EXTENSION_SUFFIXES[1]
100
+ except Exception:
101
+ pass
102
+
103
+ # pypy supports modules targetting the limited api but
104
+ # does not use a special suffix to distinguish them:
105
+ # https://doc.pypy.org/en/latest/cpython_differences.html#permitted-abi-tags-in-extensions
106
+ if is_pypy:
107
+ limited_api_suffix = suffix
108
+
109
+ print(json.dumps({
110
+ 'variables': variables,
111
+ 'paths': paths,
112
+ 'sysconfig_paths': sysconfig.get_paths(),
113
+ 'install_paths': install_paths,
114
+ 'version': sysconfig.get_python_version(),
115
+ 'platform': sysconfig.get_platform(),
116
+ 'is_pypy': is_pypy,
117
+ 'is_venv': sys.prefix != variables['base_prefix'],
118
+ 'link_libpython': links_against_libpython(),
119
+ 'suffix': suffix,
120
+ 'limited_api_suffix': limited_api_suffix,
121
+ }))
@@ -0,0 +1,55 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2015-2016 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import sys, os
7
+ import pickle, subprocess
8
+ import typing as T
9
+ from ..coredata import CoreData
10
+ from ..backend.backends import RegenInfo
11
+ from ..mesonlib import OptionKey
12
+
13
+ # This could also be used for XCode.
14
+
15
+ def need_regen(regeninfo: RegenInfo, regen_timestamp: float) -> bool:
16
+ for i in regeninfo.depfiles:
17
+ curfile = os.path.join(regeninfo.build_dir, i)
18
+ curtime = os.stat(curfile).st_mtime
19
+ if curtime > regen_timestamp:
20
+ return True
21
+ # The timestamp file gets automatically deleted by MSBuild during a 'Clean' build.
22
+ # We must make sure to recreate it, even if we do not regenerate the solution.
23
+ # Otherwise, Visual Studio will always consider the REGEN project out of date.
24
+ print("Everything is up-to-date, regeneration of build files is not needed.")
25
+ from ..backend.vs2010backend import Vs2010Backend
26
+ Vs2010Backend.touch_regen_timestamp(regeninfo.build_dir)
27
+ return False
28
+
29
+ def regen(regeninfo: RegenInfo, meson_command: T.List[str], backend: str) -> None:
30
+ cmd = meson_command + ['--internal',
31
+ 'regenerate',
32
+ regeninfo.build_dir,
33
+ regeninfo.source_dir,
34
+ '--backend=' + backend]
35
+ subprocess.check_call(cmd)
36
+
37
+ def run(args: T.List[str]) -> int:
38
+ private_dir = args[0]
39
+ dumpfile = os.path.join(private_dir, 'regeninfo.dump')
40
+ coredata_file = os.path.join(private_dir, 'coredata.dat')
41
+ with open(dumpfile, 'rb') as f:
42
+ regeninfo = pickle.load(f)
43
+ assert isinstance(regeninfo, RegenInfo)
44
+ with open(coredata_file, 'rb') as f:
45
+ coredata = pickle.load(f)
46
+ assert isinstance(coredata, CoreData)
47
+ backend = coredata.get_option(OptionKey('backend'))
48
+ assert isinstance(backend, str)
49
+ regen_timestamp = os.stat(dumpfile).st_mtime
50
+ if need_regen(regeninfo, regen_timestamp):
51
+ regen(regeninfo, coredata.meson_command, backend)
52
+ return 0
53
+
54
+ if __name__ == '__main__':
55
+ sys.exit(run(sys.argv[1:]))
@@ -0,0 +1,58 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2018 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import itertools
7
+ import fnmatch
8
+ from pathlib import Path
9
+ from concurrent.futures import ThreadPoolExecutor
10
+
11
+ from ..compilers import lang_suffixes
12
+ from ..mesonlib import quiet_git
13
+ import typing as T
14
+
15
+ if T.TYPE_CHECKING:
16
+ import subprocess
17
+
18
+ def parse_pattern_file(fname: Path) -> T.List[str]:
19
+ patterns = []
20
+ try:
21
+ with fname.open(encoding='utf-8') as f:
22
+ for line in f:
23
+ pattern = line.strip()
24
+ if pattern and not pattern.startswith('#'):
25
+ patterns.append(pattern)
26
+ except FileNotFoundError:
27
+ pass
28
+ return patterns
29
+
30
+ def run_tool(name: str, srcdir: Path, builddir: Path, fn: T.Callable[..., subprocess.CompletedProcess], *args: T.Any) -> int:
31
+ patterns = parse_pattern_file(srcdir / f'.{name}-include')
32
+ globs: T.Union[T.List[T.List[Path]], T.List[T.Generator[Path, None, None]]]
33
+ if patterns:
34
+ globs = [srcdir.glob(p) for p in patterns]
35
+ else:
36
+ r, o = quiet_git(['ls-files'], srcdir)
37
+ if r:
38
+ globs = [[Path(srcdir, f) for f in o.splitlines()]]
39
+ else:
40
+ globs = [srcdir.glob('**/*')]
41
+ patterns = parse_pattern_file(srcdir / f'.{name}-ignore')
42
+ ignore = [str(builddir / '*')]
43
+ ignore.extend([str(srcdir / p) for p in patterns])
44
+ suffixes = set(lang_suffixes['c']).union(set(lang_suffixes['cpp']))
45
+ suffixes.add('h')
46
+ suffixes = {f'.{s}' for s in suffixes}
47
+ futures = []
48
+ returncode = 0
49
+ with ThreadPoolExecutor() as e:
50
+ for f in itertools.chain(*globs):
51
+ strf = str(f)
52
+ if f.is_dir() or f.suffix not in suffixes or \
53
+ any(fnmatch.fnmatch(strf, i) for i in ignore):
54
+ continue
55
+ futures.append(e.submit(fn, f, *args))
56
+ if futures:
57
+ returncode = max(x.result().returncode for x in futures)
58
+ return returncode
@@ -0,0 +1,57 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2016 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import subprocess
7
+ import shutil
8
+ import tempfile
9
+ from ..environment import detect_ninja, detect_scanbuild
10
+ from ..coredata import get_cmd_line_file, CmdLineFileParser
11
+ from ..mesonlib import windows_proof_rmtree
12
+ from pathlib import Path
13
+ import typing as T
14
+ from ast import literal_eval
15
+ import os
16
+
17
+ def scanbuild(exelist: T.List[str], srcdir: Path, blddir: Path, privdir: Path, logdir: Path, subprojdir: Path, args: T.List[str]) -> int:
18
+ # In case of problems leave the temp directory around
19
+ # so it can be debugged.
20
+ scandir = tempfile.mkdtemp(dir=str(privdir))
21
+ meson_cmd = exelist + args
22
+ build_cmd = exelist + ['--exclude', str(subprojdir), '-o', str(logdir)] + detect_ninja() + ['-C', scandir]
23
+ rc = subprocess.call(meson_cmd + [str(srcdir), scandir])
24
+ if rc != 0:
25
+ return rc
26
+ rc = subprocess.call(build_cmd)
27
+ if rc == 0:
28
+ windows_proof_rmtree(scandir)
29
+ return rc
30
+
31
+ def run(args: T.List[str]) -> int:
32
+ srcdir = Path(args[0])
33
+ bldpath = Path(args[1])
34
+ subprojdir = srcdir / Path(args[2])
35
+ blddir = args[1]
36
+ meson_cmd = args[3:]
37
+ privdir = bldpath / 'meson-private'
38
+ logdir = bldpath / 'meson-logs' / 'scanbuild'
39
+ shutil.rmtree(str(logdir), ignore_errors=True)
40
+
41
+ # if any cross or native files are specified we should use them
42
+ cmd = get_cmd_line_file(blddir)
43
+ data = CmdLineFileParser()
44
+ data.read(cmd)
45
+
46
+ if 'cross_file' in data['properties']:
47
+ meson_cmd.extend([f'--cross-file={os.path.abspath(f)}' for f in literal_eval(data['properties']['cross_file'])])
48
+
49
+ if 'native_file' in data['properties']:
50
+ meson_cmd.extend([f'--native-file={os.path.abspath(f)}' for f in literal_eval(data['properties']['native_file'])])
51
+
52
+ exelist = detect_scanbuild()
53
+ if not exelist:
54
+ print('Could not execute scan-build "%s"' % ' '.join(exelist))
55
+ return 1
56
+
57
+ return scanbuild(exelist, srcdir, bldpath, privdir, logdir, subprojdir, meson_cmd)
@@ -0,0 +1,322 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2016 The Meson development team
3
+
4
+ # This script extracts the symbols of a given shared library
5
+ # into a file. If the symbols have not changed, the file is not
6
+ # touched. This information is used to skip link steps if the
7
+ # ABI has not changed.
8
+
9
+ # This file is basically a reimplementation of
10
+ # http://cgit.freedesktop.org/libreoffice/core/commit/?id=3213cd54b76bc80a6f0516aac75a48ff3b2ad67c
11
+ from __future__ import annotations
12
+
13
+ import typing as T
14
+ import os, sys
15
+ from .. import mesonlib
16
+ from .. import mlog
17
+ from ..mesonlib import Popen_safe
18
+ import argparse
19
+
20
+ parser = argparse.ArgumentParser()
21
+
22
+ parser.add_argument('--cross-host', default=None, dest='cross_host',
23
+ help='cross compilation host platform')
24
+ parser.add_argument('args', nargs='+')
25
+
26
+ TOOL_WARNING_FILE = None
27
+ RELINKING_WARNING = 'Relinking will always happen on source changes.'
28
+
29
+ def dummy_syms(outfilename: str) -> None:
30
+ """Just touch it so relinking happens always."""
31
+ with open(outfilename, 'w', encoding='utf-8'):
32
+ pass
33
+
34
+ def write_if_changed(text: str, outfilename: str) -> None:
35
+ try:
36
+ with open(outfilename, encoding='utf-8') as f:
37
+ oldtext = f.read()
38
+ if text == oldtext:
39
+ return
40
+ except FileNotFoundError:
41
+ pass
42
+ with open(outfilename, 'w', encoding='utf-8') as f:
43
+ f.write(text)
44
+
45
+ def print_tool_warning(tools: T.List[str], msg: str, stderr: T.Optional[str] = None) -> None:
46
+ if os.path.exists(TOOL_WARNING_FILE):
47
+ return
48
+ m = f'{tools!r} {msg}. {RELINKING_WARNING}'
49
+ if stderr:
50
+ m += '\n' + stderr
51
+ mlog.warning(m)
52
+ # Write it out so we don't warn again
53
+ with open(TOOL_WARNING_FILE, 'w', encoding='utf-8'):
54
+ pass
55
+
56
+ def get_tool(name: str) -> T.List[str]:
57
+ evar = name.upper()
58
+ if evar in os.environ:
59
+ import shlex
60
+ return shlex.split(os.environ[evar])
61
+ return [name]
62
+
63
+ def call_tool(name: str, args: T.List[str], **kwargs: T.Any) -> str:
64
+ tool = get_tool(name)
65
+ try:
66
+ p, output, e = Popen_safe(tool + args, **kwargs)
67
+ except FileNotFoundError:
68
+ print_tool_warning(tool, 'not found')
69
+ return None
70
+ except PermissionError:
71
+ print_tool_warning(tool, 'not usable')
72
+ return None
73
+ if p.returncode != 0:
74
+ print_tool_warning(tool, 'does not work', e)
75
+ return None
76
+ return output
77
+
78
+ def call_tool_nowarn(tool: T.List[str], **kwargs: T.Any) -> T.Tuple[str, str]:
79
+ try:
80
+ p, output, e = Popen_safe(tool, **kwargs)
81
+ except FileNotFoundError:
82
+ return None, '{!r} not found\n'.format(tool[0])
83
+ except PermissionError:
84
+ return None, '{!r} not usable\n'.format(tool[0])
85
+ if p.returncode != 0:
86
+ return None, e
87
+ return output, None
88
+
89
+ def gnu_syms(libfilename: str, outfilename: str) -> None:
90
+ # Get the name of the library
91
+ output = call_tool('readelf', ['-d', libfilename])
92
+ if not output:
93
+ dummy_syms(outfilename)
94
+ return
95
+ result = [x for x in output.split('\n') if 'SONAME' in x]
96
+ assert len(result) <= 1
97
+ # Get a list of all symbols exported
98
+ output = call_tool('nm', ['--dynamic', '--extern-only', '--defined-only',
99
+ '--format=posix', libfilename])
100
+ if not output:
101
+ dummy_syms(outfilename)
102
+ return
103
+ for line in output.split('\n'):
104
+ if not line:
105
+ continue
106
+ line_split = line.split()
107
+ entry = line_split[0:2]
108
+ # Store the size of symbols pointing to data objects so we relink
109
+ # when those change, which is needed because of copy relocations
110
+ # https://github.com/mesonbuild/meson/pull/7132#issuecomment-628353702
111
+ if line_split[1].upper() in {'B', 'G', 'D'} and len(line_split) >= 4:
112
+ entry += [line_split[3]]
113
+ result += [' '.join(entry)]
114
+ write_if_changed('\n'.join(result) + '\n', outfilename)
115
+
116
+ def solaris_syms(libfilename: str, outfilename: str) -> None:
117
+ # gnu_syms() works with GNU nm & readelf, not Solaris nm & elfdump
118
+ origpath = os.environ['PATH']
119
+ try:
120
+ os.environ['PATH'] = '/usr/gnu/bin:' + origpath
121
+ gnu_syms(libfilename, outfilename)
122
+ finally:
123
+ os.environ['PATH'] = origpath
124
+
125
+ def osx_syms(libfilename: str, outfilename: str) -> None:
126
+ # Get the name of the library
127
+ output = call_tool('otool', ['-l', libfilename])
128
+ if not output:
129
+ dummy_syms(outfilename)
130
+ return
131
+ arr = output.split('\n')
132
+ for (i, val) in enumerate(arr):
133
+ if 'LC_ID_DYLIB' in val:
134
+ match = i
135
+ break
136
+ result = [arr[match + 2], arr[match + 5]] # Libreoffice stores all 5 lines but the others seem irrelevant.
137
+ # Get a list of all symbols exported
138
+ output = call_tool('nm', ['--extern-only', '--defined-only',
139
+ '--format=posix', libfilename])
140
+ if not output:
141
+ dummy_syms(outfilename)
142
+ return
143
+ result += [' '.join(x.split()[0:2]) for x in output.split('\n')]
144
+ write_if_changed('\n'.join(result) + '\n', outfilename)
145
+
146
+ def openbsd_syms(libfilename: str, outfilename: str) -> None:
147
+ # Get the name of the library
148
+ output = call_tool('readelf', ['-d', libfilename])
149
+ if not output:
150
+ dummy_syms(outfilename)
151
+ return
152
+ result = [x for x in output.split('\n') if 'SONAME' in x]
153
+ assert len(result) <= 1
154
+ # Get a list of all symbols exported
155
+ output = call_tool('nm', ['-D', '-P', '-g', libfilename])
156
+ if not output:
157
+ dummy_syms(outfilename)
158
+ return
159
+ # U = undefined (cope with the lack of --defined-only option)
160
+ result += [' '.join(x.split()[0:2]) for x in output.split('\n') if x and not x.endswith('U ')]
161
+ write_if_changed('\n'.join(result) + '\n', outfilename)
162
+
163
+ def freebsd_syms(libfilename: str, outfilename: str) -> None:
164
+ # Get the name of the library
165
+ output = call_tool('readelf', ['-d', libfilename])
166
+ if not output:
167
+ dummy_syms(outfilename)
168
+ return
169
+ result = [x for x in output.split('\n') if 'SONAME' in x]
170
+ assert len(result) <= 1
171
+ # Get a list of all symbols exported
172
+ output = call_tool('nm', ['--dynamic', '--extern-only', '--defined-only',
173
+ '--format=posix', libfilename])
174
+ if not output:
175
+ dummy_syms(outfilename)
176
+ return
177
+
178
+ result += [' '.join(x.split()[0:2]) for x in output.split('\n')]
179
+ write_if_changed('\n'.join(result) + '\n', outfilename)
180
+
181
+ def cygwin_syms(impfilename: str, outfilename: str) -> None:
182
+ # Get the name of the library
183
+ output = call_tool('dlltool', ['-I', impfilename])
184
+ if not output:
185
+ dummy_syms(outfilename)
186
+ return
187
+ result = [output]
188
+ # Get the list of all symbols exported
189
+ output = call_tool('nm', ['--extern-only', '--defined-only',
190
+ '--format=posix', impfilename])
191
+ if not output:
192
+ dummy_syms(outfilename)
193
+ return
194
+ for line in output.split('\n'):
195
+ if ' T ' not in line:
196
+ continue
197
+ result.append(line.split(maxsplit=1)[0])
198
+ write_if_changed('\n'.join(result) + '\n', outfilename)
199
+
200
+ def _get_implib_dllname(impfilename: str) -> T.Tuple[T.List[str], str]:
201
+ all_stderr = ''
202
+ # First try lib.exe, which is provided by MSVC. Then llvm-lib.exe, by LLVM
203
+ # for clang-cl.
204
+ #
205
+ # We cannot call get_tool on `lib` because it will look at the `LIB` env
206
+ # var which is the list of library paths MSVC will search for import
207
+ # libraries while linking.
208
+ for lib in (['lib'], get_tool('llvm-lib')):
209
+ output, e = call_tool_nowarn(lib + ['-list', impfilename])
210
+ if output:
211
+ # The output is a list of DLLs that each symbol exported by the import
212
+ # library is available in. We only build import libraries that point to
213
+ # a single DLL, so we can pick any of these. Pick the last one for
214
+ # simplicity. Also skip the last line, which is empty.
215
+ return output.split('\n')[-2:-1], None
216
+ all_stderr += e
217
+ # Next, try dlltool.exe which is provided by MinGW
218
+ output, e = call_tool_nowarn(get_tool('dlltool') + ['-I', impfilename])
219
+ if output:
220
+ return [output], None
221
+ all_stderr += e
222
+ return ([], all_stderr)
223
+
224
+ def _get_implib_exports(impfilename: str) -> T.Tuple[T.List[str], str]:
225
+ all_stderr = ''
226
+ # Force dumpbin.exe to use en-US so we can parse its output
227
+ env = os.environ.copy()
228
+ env['VSLANG'] = '1033'
229
+ output, e = call_tool_nowarn(get_tool('dumpbin') + ['-exports', impfilename], env=env)
230
+ if output:
231
+ lines = output.split('\n')
232
+ start = lines.index('File Type: LIBRARY')
233
+ end = lines.index(' Summary')
234
+ return lines[start:end], None
235
+ all_stderr += e
236
+ # Next, try llvm-nm.exe provided by LLVM, then nm.exe provided by MinGW
237
+ for nm in ('llvm-nm', 'nm'):
238
+ output, e = call_tool_nowarn(get_tool(nm) + ['--extern-only', '--defined-only',
239
+ '--format=posix', impfilename])
240
+ if output:
241
+ result = []
242
+ for line in output.split('\n'):
243
+ if ' T ' not in line or line.startswith('.text'):
244
+ continue
245
+ result.append(line.split(maxsplit=1)[0])
246
+ return result, None
247
+ all_stderr += e
248
+ return ([], all_stderr)
249
+
250
+ def windows_syms(impfilename: str, outfilename: str) -> None:
251
+ # Get the name of the library
252
+ result, e = _get_implib_dllname(impfilename)
253
+ if not result:
254
+ print_tool_warning(['lib', 'llvm-lib', 'dlltool'], 'do not work or were not found', e)
255
+ dummy_syms(outfilename)
256
+ return
257
+ # Get a list of all symbols exported
258
+ symbols, e = _get_implib_exports(impfilename)
259
+ if not symbols:
260
+ print_tool_warning(['dumpbin', 'llvm-nm', 'nm'], 'do not work or were not found', e)
261
+ dummy_syms(outfilename)
262
+ return
263
+ result += symbols
264
+ write_if_changed('\n'.join(result) + '\n', outfilename)
265
+
266
+ def gen_symbols(libfilename: str, impfilename: str, outfilename: str, cross_host: str) -> None:
267
+ if cross_host is not None:
268
+ # In case of cross builds just always relink. In theory we could
269
+ # determine the correct toolset, but we would need to use the correct
270
+ # `nm`, `readelf`, etc, from the cross info which requires refactoring.
271
+ dummy_syms(outfilename)
272
+ elif mesonlib.is_linux() or mesonlib.is_hurd():
273
+ gnu_syms(libfilename, outfilename)
274
+ elif mesonlib.is_osx():
275
+ osx_syms(libfilename, outfilename)
276
+ elif mesonlib.is_openbsd():
277
+ openbsd_syms(libfilename, outfilename)
278
+ elif mesonlib.is_freebsd():
279
+ freebsd_syms(libfilename, outfilename)
280
+ elif mesonlib.is_netbsd():
281
+ freebsd_syms(libfilename, outfilename)
282
+ elif mesonlib.is_windows():
283
+ if os.path.isfile(impfilename):
284
+ windows_syms(impfilename, outfilename)
285
+ else:
286
+ # No import library. Not sure how the DLL is being used, so just
287
+ # rebuild everything that links to it every time.
288
+ dummy_syms(outfilename)
289
+ elif mesonlib.is_cygwin():
290
+ if os.path.isfile(impfilename):
291
+ cygwin_syms(impfilename, outfilename)
292
+ else:
293
+ # No import library. Not sure how the DLL is being used, so just
294
+ # rebuild everything that links to it every time.
295
+ dummy_syms(outfilename)
296
+ elif mesonlib.is_sunos():
297
+ solaris_syms(libfilename, outfilename)
298
+ else:
299
+ if not os.path.exists(TOOL_WARNING_FILE):
300
+ mlog.warning('Symbol extracting has not been implemented for this '
301
+ 'platform. ' + RELINKING_WARNING)
302
+ # Write it out so we don't warn again
303
+ with open(TOOL_WARNING_FILE, 'w', encoding='utf-8'):
304
+ pass
305
+ dummy_syms(outfilename)
306
+
307
+ def run(args: T.List[str]) -> int:
308
+ global TOOL_WARNING_FILE # pylint: disable=global-statement
309
+ options = parser.parse_args(args)
310
+ if len(options.args) != 4:
311
+ print('symbolextractor.py <shared library file> <import library> <output file>')
312
+ sys.exit(1)
313
+ privdir = os.path.join(options.args[0], 'meson-private')
314
+ TOOL_WARNING_FILE = os.path.join(privdir, 'symbolextractor_tool_warning_printed')
315
+ libfile = options.args[1]
316
+ impfile = options.args[2] # Only used on Windows
317
+ outfile = options.args[3]
318
+ gen_symbols(libfile, impfile, outfile, options.cross_host)
319
+ return 0
320
+
321
+ if __name__ == '__main__':
322
+ sys.exit(run(sys.argv[1:]))
@@ -0,0 +1,44 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2019 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import os
7
+ import subprocess
8
+ from pathlib import Path
9
+ import typing as T
10
+
11
+ def ls_as_bytestream() -> bytes:
12
+ if os.path.exists('.git'):
13
+ return subprocess.run(['git', 'ls-tree', '-r', '--name-only', 'HEAD'],
14
+ stdout=subprocess.PIPE).stdout
15
+
16
+ files = [str(p) for p in Path('.').glob('**/*')
17
+ if not p.is_dir() and
18
+ not next((x for x in p.parts if x.startswith('.')), None)]
19
+ return '\n'.join(files).encode()
20
+
21
+
22
+ def cscope() -> int:
23
+ ls = b'\n'.join([b'"%s"' % f for f in ls_as_bytestream().split()])
24
+ return subprocess.run(['cscope', '-v', '-b', '-i-'], input=ls).returncode
25
+
26
+
27
+ def ctags() -> int:
28
+ ls = ls_as_bytestream()
29
+ return subprocess.run(['ctags', '-L-'], input=ls).returncode
30
+
31
+
32
+ def etags() -> int:
33
+ ls = ls_as_bytestream()
34
+ return subprocess.run(['etags', '-'], input=ls).returncode
35
+
36
+
37
+ def run(args: T.List[str]) -> int:
38
+ tool_name = args[0]
39
+ srcdir_name = args[1]
40
+ os.chdir(srcdir_name)
41
+ assert tool_name in {'cscope', 'ctags', 'etags'}
42
+ res = globals()[tool_name]()
43
+ assert isinstance(res, int)
44
+ return res
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ import json
5
+ import typing as T
6
+
7
+ from . import meson_exe
8
+
9
+ # This script is used by run_unittests.py to verify we don't load too many
10
+ # modules when executing a wrapped command.
11
+ def run(args: T.List[str]) -> int:
12
+ meson_exe.run(args)
13
+ print(json.dumps(list(sys.modules.keys())))
14
+ return 0