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,176 @@
1
+ from configparser import ConfigParser
2
+ from pathlib import Path
3
+ import shlex
4
+ import subprocess
5
+ from typing import Callable, Optional
6
+
7
+ from .machine_file import strv_to_meson
8
+ from .machine_spec import MachineSpec
9
+
10
+
11
+ def init_machine_config(machine: MachineSpec,
12
+ build_machine: MachineSpec,
13
+ is_cross_build: bool,
14
+ environ: dict[str, str],
15
+ toolchain_prefix: Optional[Path],
16
+ sdk_prefix: Optional[Path],
17
+ call_selected_meson: Callable,
18
+ config: ConfigParser,
19
+ outpath: list[str],
20
+ outenv: dict[str, str],
21
+ outdir: Path):
22
+ xcenv = {**environ}
23
+ if machine.arch == "arm64eoabi":
24
+ try:
25
+ xcenv["DEVELOPER_DIR"] = (Path(xcenv["XCODE11"]) / "Contents" / "Developer").as_posix()
26
+ except KeyError:
27
+ raise Xcode11NotFoundError("for arm64eoabi support, XCODE11 must be set to the location of your Xcode 11 app bundle")
28
+
29
+ def xcrun(*args):
30
+ try:
31
+ return subprocess.run(["xcrun"] + list(args),
32
+ env=xcenv,
33
+ capture_output=True,
34
+ encoding="utf-8",
35
+ check=True).stdout.strip()
36
+ except subprocess.CalledProcessError as e:
37
+ raise XCRunError("\n\t| ".join(e.stderr.strip().split("\n")))
38
+
39
+ clang_arch = APPLE_CLANG_ARCHS.get(machine.arch, machine.arch)
40
+
41
+ os_minver = APPLE_MINIMUM_OS_VERSIONS.get(machine.os_dash_arch,
42
+ APPLE_MINIMUM_OS_VERSIONS[machine.os])
43
+
44
+ target = f"{clang_arch}-apple-{machine.os}{os_minver}"
45
+ if machine.config is not None:
46
+ target += "-" + machine.config
47
+
48
+ sdk_name = APPLE_SDKS[machine.os_dash_config]
49
+ sdk_path = xcrun("--sdk", sdk_name, "--show-sdk-path")
50
+
51
+ use_static_libcxx = sdk_prefix is not None \
52
+ and (sdk_prefix / "lib" / "c++" / "libc++.a").exists() \
53
+ and machine.os != "watchos"
54
+
55
+ binaries = config["binaries"]
56
+ clang_path = None
57
+ for (identifier, tool_name, *rest) in APPLE_BINARIES:
58
+ if tool_name.startswith("#"):
59
+ binaries[identifier] = binaries[tool_name[1:]]
60
+ continue
61
+
62
+ path = xcrun("--sdk", sdk_name, "-f", tool_name)
63
+ if tool_name == "clang":
64
+ clang_path = Path(path)
65
+
66
+ argv = [path]
67
+ if len(rest) != 0:
68
+ argv += rest[0]
69
+ if identifier == "cpp" and not use_static_libcxx:
70
+ argv += ["-stdlib=libc++"]
71
+ if identifier == "swift":
72
+ argv += ["-target", target, "-sdk", sdk_path]
73
+
74
+ raw_val = str(argv)
75
+ if identifier in {"c", "cpp"}:
76
+ raw_val += " + common_flags"
77
+
78
+ binaries[identifier] = raw_val
79
+
80
+ read_envflags = lambda name: shlex.split(environ.get(name, ""))
81
+
82
+ c_like_flags = read_envflags("CPPFLAGS")
83
+
84
+ linker_flags = ["-Wl,-dead_strip"]
85
+ if (clang_path.parent / "ld-classic").exists():
86
+ # New linker links with libresolv even if we're not using any symbols from it,
87
+ # at least as of Xcode 15.0 beta 7.
88
+ linker_flags += ["-Wl,-ld_classic"]
89
+ linker_flags += read_envflags("LDFLAGS")
90
+
91
+ constants = config["constants"]
92
+ constants["common_flags"] = strv_to_meson([
93
+ "-target", target,
94
+ "-isysroot", sdk_path,
95
+ ])
96
+ constants["c_like_flags"] = strv_to_meson(c_like_flags)
97
+ constants["linker_flags"] = strv_to_meson(linker_flags)
98
+
99
+ if use_static_libcxx:
100
+ constants["cxx_like_flags"] = strv_to_meson([
101
+ "-nostdinc++",
102
+ "-isystem" + str(sdk_prefix / "include" / "c++"),
103
+ ])
104
+ constants["cxx_link_flags"] = strv_to_meson([
105
+ "-nostdlib++",
106
+ "-L" + str(sdk_prefix / "lib" / "c++"),
107
+ "-lc++",
108
+ "-lc++abi",
109
+ ])
110
+ else:
111
+ constants["cxx_like_flags"] = strv_to_meson([])
112
+ constants["cxx_link_flags"] = strv_to_meson([])
113
+
114
+ options = config["built-in options"]
115
+ options["c_args"] = "c_like_flags + " + strv_to_meson(read_envflags("CFLAGS"))
116
+ options["cpp_args"] = "c_like_flags + cxx_like_flags + " + strv_to_meson(read_envflags("CXXFLAGS"))
117
+ options["objc_args"] = "c_like_flags + " + strv_to_meson(read_envflags("OBJCFLAGS"))
118
+ options["objcpp_args"] = "c_like_flags + cxx_like_flags + " + strv_to_meson(read_envflags("OBJCXXFLAGS"))
119
+ options["c_link_args"] = "linker_flags"
120
+ options["cpp_link_args"] = "linker_flags + cxx_link_flags"
121
+ options["objc_link_args"] = "linker_flags"
122
+ options["objcpp_link_args"] = "linker_flags + cxx_link_flags"
123
+ options["b_lundef"] = "true"
124
+
125
+
126
+ class XCRunError(Exception):
127
+ pass
128
+
129
+
130
+ class Xcode11NotFoundError(Exception):
131
+ pass
132
+
133
+
134
+ APPLE_SDKS = {
135
+ "macos": "macosx",
136
+ "ios": "iphoneos",
137
+ "ios-simulator": "iphonesimulator",
138
+ "watchos": "watchos",
139
+ "watchos-simulator": "watchsimulator",
140
+ "tvos": "appletvos",
141
+ "tvos-simulator": "appletvsimulator",
142
+ }
143
+
144
+ APPLE_CLANG_ARCHS = {
145
+ "x86": "i386",
146
+ "arm": "armv7",
147
+ "arm64eoabi": "arm64e",
148
+ }
149
+
150
+ APPLE_MINIMUM_OS_VERSIONS = {
151
+ "macos": "10.13",
152
+ "macos-arm64": "11.0",
153
+ "macos-arm64e": "11.0",
154
+ "ios": "8.0",
155
+ "watchos": "9.0",
156
+ "tvos": "13.0",
157
+ }
158
+
159
+ APPLE_BINARIES = [
160
+ ("c", "clang"),
161
+ ("cpp", "clang++"),
162
+ ("objc", "#c"),
163
+ ("objcpp", "#cpp"),
164
+ ("swift", "swiftc"),
165
+
166
+ ("ar", "ar"),
167
+ ("nm", "llvm-nm"),
168
+ ("ranlib", "ranlib"),
169
+ ("strip", "strip", ["-Sx"]),
170
+ ("libtool", "libtool"),
171
+
172
+ ("install_name_tool", "install_name_tool"),
173
+ ("otool", "otool"),
174
+ ("codesign", "codesign"),
175
+ ("lipo", "lipo"),
176
+ ]
@@ -0,0 +1,373 @@
1
+ from collections import OrderedDict
2
+ from configparser import ConfigParser
3
+ from pathlib import Path
4
+ import shutil
5
+ import subprocess
6
+ import tempfile
7
+ from typing import Callable, Optional, Mapping, Sequence
8
+
9
+ from . import winenv
10
+ from .machine_file import strv_to_meson
11
+ from .machine_spec import MachineSpec
12
+
13
+
14
+ def init_machine_config(machine: MachineSpec,
15
+ build_machine: MachineSpec,
16
+ is_cross_build: bool,
17
+ environ: dict[str, str],
18
+ toolchain_prefix: Optional[Path],
19
+ sdk_prefix: Optional[Path],
20
+ call_selected_meson: Callable,
21
+ config: ConfigParser,
22
+ outpath: list[str],
23
+ outenv: dict[str, str],
24
+ outdir: Path):
25
+ allow_undefined_symbols = machine.os == "freebsd"
26
+
27
+ options = config["built-in options"]
28
+ options["c_args"] = "c_like_flags"
29
+ options["cpp_args"] = "c_like_flags + cxx_like_flags"
30
+ options["c_link_args"] = "linker_flags"
31
+ options["cpp_link_args"] = "linker_flags + cxx_link_flags"
32
+ options["b_lundef"] = str(not allow_undefined_symbols).lower()
33
+
34
+ binaries = config["binaries"]
35
+ cc = None
36
+ common_flags = []
37
+ c_like_flags = []
38
+ linker_flags = []
39
+ cxx_like_flags = []
40
+ cxx_link_flags = []
41
+
42
+ triplet = machine.triplet
43
+ if triplet is not None:
44
+ try:
45
+ cc, gcc_binaries = resolve_gcc_binaries(toolprefix=triplet + "-")
46
+ binaries.update(gcc_binaries)
47
+ except CompilerNotFoundError:
48
+ pass
49
+
50
+ diagnostics = None
51
+ if cc is None:
52
+ with tempfile.TemporaryDirectory() as raw_prober_dir:
53
+ prober_dir = Path(raw_prober_dir)
54
+ machine_file = prober_dir / "machine.txt"
55
+
56
+ argv = [
57
+ "env2mfile",
58
+ "-o", machine_file,
59
+ "--native" if machine == build_machine else "--cross",
60
+ ]
61
+
62
+ if machine != build_machine:
63
+ argv += [
64
+ "--system", machine.system,
65
+ "--subsystem", machine.subsystem,
66
+ "--kernel", machine.kernel,
67
+ "--cpu-family", machine.cpu_family,
68
+ "--cpu", machine.cpu,
69
+ "--endian", machine.endian,
70
+ ]
71
+
72
+ process = call_selected_meson(argv,
73
+ cwd=raw_prober_dir,
74
+ env=environ,
75
+ stdout=subprocess.PIPE,
76
+ stderr=subprocess.STDOUT,
77
+ encoding="utf-8")
78
+ if process.returncode == 0:
79
+ mcfg = ConfigParser()
80
+ mcfg.read(machine_file)
81
+
82
+ for section in mcfg.sections():
83
+ copy = config[section] if section in config else OrderedDict()
84
+ for key, val in mcfg.items(section):
85
+ if section == "binaries":
86
+ argv = eval(val.replace("\\", "\\\\"))
87
+ if not Path(argv[0]).is_absolute():
88
+ path = shutil.which(argv[0])
89
+ if path is None:
90
+ raise BinaryNotFoundError(f"unable to locate {argv[0]}")
91
+ argv[0] = path
92
+ val = strv_to_meson(argv)
93
+ if key in {"c", "cpp"}:
94
+ val += " + common_flags"
95
+ if key in copy and section == "built-in options" and key.endswith("_args"):
96
+ val = val + " + " + copy[key]
97
+ copy[key] = val
98
+ config[section] = copy
99
+
100
+ raw_cc = binaries.get("c", None)
101
+ if raw_cc is not None:
102
+ cc = eval(raw_cc.replace("\\", "\\\\"), None, {"common_flags": []})
103
+ else:
104
+ diagnostics = process.stdout
105
+
106
+ linker_flavor = None
107
+
108
+ if cc is not None \
109
+ and machine.os == "windows" \
110
+ and machine.toolchain_is_msvc:
111
+ linker_flavor = detect_linker_flavor(cc)
112
+ detected_wrong_toolchain = linker_flavor != "msvc"
113
+ if detected_wrong_toolchain:
114
+ cc = None
115
+ linker_flavor = None
116
+
117
+ if cc is None:
118
+ if machine.os == "windows":
119
+ detect_tool_path = lambda name: winenv.detect_msvs_tool_path(machine, build_machine, name, toolchain_prefix)
120
+
121
+ cc = [str(detect_tool_path("cl.exe"))]
122
+ lib = [str(detect_tool_path("lib.exe"))]
123
+ link = [str(detect_tool_path("link.exe"))]
124
+ assembler_name = MSVC_ASSEMBLER_NAMES[machine.arch]
125
+ assembler_tool = [str(detect_tool_path(assembler_name + ".exe"))]
126
+
127
+ raw_cc = strv_to_meson(cc) + " + common_flags"
128
+ binaries["c"] = raw_cc
129
+ binaries["cpp"] = raw_cc
130
+ binaries["lib"] = strv_to_meson(lib) + " + common_flags"
131
+ binaries["link"] = strv_to_meson(link) + " + common_flags"
132
+ binaries[assembler_name] = strv_to_meson(assembler_tool) + " + common_flags"
133
+
134
+ runtime_dirs = winenv.detect_msvs_runtime_path(machine, build_machine, toolchain_prefix)
135
+ outpath.extend(runtime_dirs)
136
+
137
+ vs_dir = winenv.detect_msvs_installation_dir(toolchain_prefix)
138
+ outenv["VSINSTALLDIR"] = str(vs_dir) + "\\"
139
+ outenv["VCINSTALLDIR"] = str(vs_dir / "VC") + "\\"
140
+ outenv["Platform"] = machine.msvc_platform
141
+ outenv["INCLUDE"] = ";".join([str(path) for path in winenv.detect_msvs_include_path(toolchain_prefix)])
142
+ outenv["LIB"] = ";".join([str(path) for path in winenv.detect_msvs_library_path(machine, toolchain_prefix)])
143
+ elif machine != build_machine \
144
+ and "CC" not in environ \
145
+ and "CFLAGS" not in environ \
146
+ and machine.os == build_machine.os \
147
+ and machine.os == "linux" \
148
+ and machine.pointer_size == 4 \
149
+ and build_machine.pointer_size == 8:
150
+ try:
151
+ cc, gcc_binaries = resolve_gcc_binaries()
152
+ binaries.update(gcc_binaries)
153
+ common_flags += ["-m32"]
154
+ except CompilerNotFoundError:
155
+ pass
156
+
157
+ if cc is None:
158
+ suffix = ":\n" + diagnostics if diagnostics is not None else ""
159
+ raise CompilerNotFoundError("no C compiler found" + suffix)
160
+
161
+ if "cpp" not in binaries:
162
+ raise CompilerNotFoundError("no C++ compiler found")
163
+
164
+ if linker_flavor is None:
165
+ linker_flavor = detect_linker_flavor(cc)
166
+
167
+ strip_binary = binaries.get("strip", None)
168
+ if strip_binary is not None:
169
+ strip_arg = "-Sx" if linker_flavor == "apple" else "--strip-all"
170
+ binaries["strip"] = strip_binary[:-1] + f", '{strip_arg}']"
171
+
172
+ if linker_flavor == "msvc":
173
+ for gnu_tool in ["ar", "as", "ld", "nm", "objcopy", "objdump",
174
+ "ranlib", "readelf", "size", "strip", "windres"]:
175
+ binaries.pop(gnu_tool, None)
176
+
177
+ c_like_flags += [
178
+ "/GS-",
179
+ "/Gy",
180
+ "/Zc:inline",
181
+ "/fp:fast",
182
+ ]
183
+ if machine.arch == "x86":
184
+ c_like_flags += ["/arch:SSE2"]
185
+
186
+ # Relax C++11 compliance for XP compatibility.
187
+ cxx_like_flags += ["/Zc:threadSafeInit-"]
188
+ else:
189
+ if machine.os == "qnx":
190
+ common_flags += ARCH_COMMON_FLAGS_QNX.get(machine.arch, [])
191
+ else:
192
+ common_flags += ARCH_COMMON_FLAGS_UNIX.get(machine.arch, [])
193
+ c_like_flags += ARCH_C_LIKE_FLAGS_UNIX.get(machine.arch, [])
194
+
195
+ c_like_flags += [
196
+ "-ffunction-sections",
197
+ "-fdata-sections",
198
+ ]
199
+
200
+ if linker_flavor.startswith("gnu-"):
201
+ linker_flags += ["-static-libgcc"]
202
+ if machine.os != "windows":
203
+ linker_flags += [
204
+ "-Wl,-z,relro",
205
+ "-Wl,-z,noexecstack",
206
+ ]
207
+ cxx_link_flags += ["-static-libstdc++"]
208
+
209
+ if linker_flavor == "apple":
210
+ linker_flags += ["-Wl,-dead_strip"]
211
+ else:
212
+ linker_flags += ["-Wl,--gc-sections"]
213
+ if linker_flavor == "gnu-gold":
214
+ linker_flags += ["-Wl,--icf=all"]
215
+
216
+ constants = config["constants"]
217
+ constants["common_flags"] = strv_to_meson(common_flags)
218
+ constants["c_like_flags"] = strv_to_meson(c_like_flags)
219
+ constants["linker_flags"] = strv_to_meson(linker_flags)
220
+ constants["cxx_like_flags"] = strv_to_meson(cxx_like_flags)
221
+ constants["cxx_link_flags"] = strv_to_meson(cxx_link_flags)
222
+
223
+
224
+ def resolve_gcc_binaries(toolprefix: str = "") -> tuple[list[str], dict[str, str]]:
225
+ cc = None
226
+ binaries = OrderedDict()
227
+
228
+ for identifier in GCC_TOOL_IDS:
229
+ name = GCC_TOOL_NAMES.get(identifier, identifier)
230
+ full_name = toolprefix + name
231
+
232
+ val = shutil.which(full_name)
233
+ if val is None:
234
+ raise CompilerNotFoundError(f"missing {full_name}")
235
+
236
+ # QNX SDP 6.5 gcc-* tools are broken, erroring out with:
237
+ # > sorry - this program has been built without plugin support
238
+ # We detect this and use the tool without the gcc-* prefix.
239
+ if name.startswith("gcc-"):
240
+ p = subprocess.run([val, "--version"], capture_output=True)
241
+ if p.returncode != 0:
242
+ full_name = toolprefix + name[4:]
243
+ val = shutil.which(full_name)
244
+ if val is None:
245
+ raise CompilerNotFoundError(f"missing {full_name}")
246
+
247
+ if identifier == "c":
248
+ cc = [val]
249
+
250
+ extra = " + common_flags" if identifier in {"c", "cpp"} else ""
251
+
252
+ binaries[identifier] = strv_to_meson([val]) + extra
253
+
254
+ return (cc, binaries)
255
+
256
+
257
+ def detect_linker_flavor(cc: list[str]) -> str:
258
+ linker_version = subprocess.run(cc + ["-Wl,--version"],
259
+ stdout=subprocess.PIPE,
260
+ stderr=subprocess.STDOUT,
261
+ encoding="utf-8").stdout
262
+ if linker_version.startswith("Microsoft "):
263
+ return "msvc"
264
+ if "GNU ld " in linker_version:
265
+ return "gnu-ld"
266
+ if "GNU gold " in linker_version:
267
+ return "gnu-gold"
268
+ if linker_version.startswith("LLD "):
269
+ return "lld"
270
+ if linker_version.startswith("ld: "):
271
+ return "apple"
272
+
273
+ excerpt = linker_version.split("\n")[0].rstrip()
274
+ raise LinkerDetectionError(f"unknown linker: '{excerpt}'")
275
+
276
+
277
+ class CompilerNotFoundError(Exception):
278
+ pass
279
+
280
+
281
+ class BinaryNotFoundError(Exception):
282
+ pass
283
+
284
+
285
+ class LinkerDetectionError(Exception):
286
+ pass
287
+
288
+
289
+ ARCH_COMMON_FLAGS_UNIX = {
290
+ "x86": [
291
+ "-march=pentium4",
292
+ ],
293
+ "arm": [
294
+ "-march=armv5t",
295
+ ],
296
+ "armbe8": [
297
+ "-march=armv6",
298
+ "-mbe8",
299
+ ],
300
+ "armhf": [
301
+ "-march=armv7-a",
302
+ ],
303
+ "arm64": [
304
+ "-march=armv8-a",
305
+ ],
306
+ "mips": [
307
+ "-march=mips1",
308
+ "-mfp32",
309
+ ],
310
+ "mipsel": [
311
+ "-march=mips1",
312
+ "-mfp32",
313
+ ],
314
+ "mips64": [
315
+ "-march=mips64r2",
316
+ "-mabi=64",
317
+ ],
318
+ "mips64el": [
319
+ "-march=mips64r2",
320
+ "-mabi=64",
321
+ ],
322
+ "s390x": [
323
+ "-march=z10",
324
+ "-m64",
325
+ ],
326
+ }
327
+
328
+ ARCH_COMMON_FLAGS_QNX = {
329
+ "x86": [
330
+ "-march=i686",
331
+ ],
332
+ "arm": [
333
+ "-march=armv6",
334
+ "-mno-unaligned-access",
335
+ ],
336
+ "armeabi": [
337
+ "-march=armv7-a",
338
+ "-mno-unaligned-access",
339
+ ],
340
+ }
341
+
342
+ ARCH_C_LIKE_FLAGS_UNIX = {
343
+ "x86": [
344
+ "-mfpmath=sse",
345
+ "-mstackrealign",
346
+ ],
347
+ }
348
+
349
+ GCC_TOOL_IDS = [
350
+ "c",
351
+ "cpp",
352
+ "ar",
353
+ "nm",
354
+ "ranlib",
355
+ "strip",
356
+ "readelf",
357
+ "objcopy",
358
+ "objdump",
359
+ ]
360
+
361
+ GCC_TOOL_NAMES = {
362
+ "c": "gcc",
363
+ "cpp": "g++",
364
+ "ar": "gcc-ar",
365
+ "nm": "gcc-nm",
366
+ "ranlib": "gcc-ranlib",
367
+ }
368
+
369
+ MSVC_ASSEMBLER_NAMES = {
370
+ "x86": "ml",
371
+ "x86_64": "ml64",
372
+ "arm64": "armasm64",
373
+ }
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import argparse
4
+ from dataclasses import dataclass
5
+ import os
6
+ from pathlib import Path
7
+ import subprocess
8
+ import sys
9
+
10
+
11
+ RELENG_DIR = Path(__file__).resolve().parent
12
+ ROOT_DIR = RELENG_DIR.parent
13
+
14
+
15
+ @dataclass
16
+ class FridaVersion:
17
+ name: str
18
+ major: int
19
+ minor: int
20
+ micro: int
21
+ nano: int
22
+ commit: str
23
+
24
+
25
+ def main(argv: list[str]):
26
+ parser = argparse.ArgumentParser()
27
+ parser.add_argument("repo", nargs="?", type=Path, default=ROOT_DIR)
28
+ args = parser.parse_args()
29
+
30
+ version = detect(args.repo)
31
+ print(version.name)
32
+
33
+
34
+ def detect(repo: Path) -> FridaVersion:
35
+ version_name = "0.0.0"
36
+ major = 0
37
+ minor = 0
38
+ micro = 0
39
+ nano = 0
40
+ commit = ""
41
+
42
+ if (repo / ".git").exists():
43
+ description = subprocess.run(["git", "describe", "--tags", "--always", "--long"],
44
+ cwd=repo,
45
+ capture_output=True,
46
+ encoding="utf-8").stdout
47
+
48
+ tokens = description.strip().replace("-", ".").split(".")
49
+ if len(tokens) > 1:
50
+ (raw_major, raw_minor, raw_micro, raw_nano, commit) = tokens
51
+ major = int(raw_major)
52
+ minor = int(raw_minor)
53
+ micro = int(raw_micro)
54
+ nano = int(raw_nano)
55
+ if nano > 0:
56
+ micro += 1
57
+
58
+ if nano == 0:
59
+ version_name = f"{major}.{minor}.{micro}"
60
+ else:
61
+ version_name = f"{major}.{minor}.{micro}-dev.{nano - 1}"
62
+ else:
63
+ commit = tokens[0]
64
+
65
+ return FridaVersion(version_name, major, minor, micro, nano, commit)
66
+
67
+
68
+ if __name__ == "__main__":
69
+ main(sys.argv)
@@ -0,0 +1,44 @@
1
+ from configparser import ConfigParser
2
+ from pathlib import Path
3
+ from typing import Sequence, Union
4
+
5
+
6
+ def load(mfile: Path) -> dict[str, Union[str, list[str]]]:
7
+ config = ConfigParser()
8
+ config.read(mfile)
9
+
10
+ hidden_constants = {
11
+ "true": True,
12
+ "false": False,
13
+ }
14
+
15
+ items = {}
16
+ if config.has_section("constants"):
17
+ for name, raw_value in config.items("constants"):
18
+ items[name] = eval(raw_value, hidden_constants, items)
19
+
20
+ for section_name, section in config.items():
21
+ if section_name in ("DEFAULT", "constants"):
22
+ continue
23
+ for name, raw_value in section.items():
24
+ value = eval(raw_value, hidden_constants, items)
25
+ if section_name == "binaries" and isinstance(value, str):
26
+ value = [value]
27
+ items[name] = value
28
+
29
+ if len(items) == 0:
30
+ return None
31
+
32
+ return items
33
+
34
+
35
+ def bool_to_meson(b: bool) -> str:
36
+ return "true" if b else "false"
37
+
38
+
39
+ def strv_to_meson(strv: Sequence[str]) -> str:
40
+ return "[" + ", ".join(map(str_to_meson, strv)) + "]"
41
+
42
+
43
+ def str_to_meson(s: str) -> str:
44
+ return "'" + s + "'"