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,20 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2015-2016 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ '''CD into dir given as first argument and execute
7
+ the command given in the rest of the arguments.'''
8
+
9
+ import os, subprocess, sys
10
+ import typing as T
11
+
12
+ def run(args: T.List[str]) -> int:
13
+ dirname = args[0]
14
+ command = args[1:]
15
+
16
+ os.chdir(dirname)
17
+ return subprocess.call(command)
18
+
19
+ if __name__ == '__main__':
20
+ sys.exit(run(sys.argv[1:]))
@@ -0,0 +1,402 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2022 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import sys, os, subprocess, shutil
7
+ import shlex
8
+ import typing as T
9
+
10
+ from .. import envconfig
11
+ from .. import mlog
12
+ from ..compilers import compilers
13
+ from ..compilers.detect import defaults as compiler_names
14
+
15
+ if T.TYPE_CHECKING:
16
+ import argparse
17
+
18
+ def has_for_build() -> bool:
19
+ for cenv in envconfig.ENV_VAR_COMPILER_MAP.values():
20
+ if os.environ.get(cenv + '_FOR_BUILD'):
21
+ return True
22
+ return False
23
+
24
+ # Note: when adding arguments, please also add them to the completion
25
+ # scripts in $MESONSRC/data/shell-completions/
26
+ def add_arguments(parser: 'argparse.ArgumentParser') -> None:
27
+ parser.add_argument('--debarch', default=None,
28
+ help='The dpkg architecture to generate.')
29
+ parser.add_argument('--gccsuffix', default="",
30
+ help='A particular gcc version suffix if necessary.')
31
+ parser.add_argument('-o', required=True, dest='outfile',
32
+ help='The output file.')
33
+ parser.add_argument('--cross', default=False, action='store_true',
34
+ help='Generate a cross compilation file.')
35
+ parser.add_argument('--native', default=False, action='store_true',
36
+ help='Generate a native compilation file.')
37
+ parser.add_argument('--system', default=None,
38
+ help='Define system for cross compilation.')
39
+ parser.add_argument('--subsystem', default=None,
40
+ help='Define subsystem for cross compilation.')
41
+ parser.add_argument('--kernel', default=None,
42
+ help='Define kernel for cross compilation.')
43
+ parser.add_argument('--cpu', default=None,
44
+ help='Define cpu for cross compilation.')
45
+ parser.add_argument('--cpu-family', default=None,
46
+ help='Define cpu family for cross compilation.')
47
+ parser.add_argument('--endian', default='little', choices=['big', 'little'],
48
+ help='Define endianness for cross compilation.')
49
+
50
+ class MachineInfo:
51
+ def __init__(self) -> None:
52
+ self.compilers: T.Dict[str, T.List[str]] = {}
53
+ self.binaries: T.Dict[str, T.List[str]] = {}
54
+ self.properties: T.Dict[str, T.Union[str, T.List[str]]] = {}
55
+ self.compile_args: T.Dict[str, T.List[str]] = {}
56
+ self.link_args: T.Dict[str, T.List[str]] = {}
57
+ self.cmake: T.Dict[str, T.Union[str, T.List[str]]] = {}
58
+
59
+ self.system: T.Optional[str] = None
60
+ self.subsystem: T.Optional[str] = None
61
+ self.kernel: T.Optional[str] = None
62
+ self.cpu: T.Optional[str] = None
63
+ self.cpu_family: T.Optional[str] = None
64
+ self.endian: T.Optional[str] = None
65
+
66
+ #parser = argparse.ArgumentParser(description='''Generate cross compilation definition file for the Meson build system.
67
+ #
68
+ #If you do not specify the --arch argument, Meson assumes that running
69
+ #plain 'dpkg-architecture' will return correct information for the
70
+ #host system.
71
+ #
72
+ #This script must be run in an environment where CPPFLAGS et al are set to the
73
+ #same values used in the actual compilation.
74
+ #'''
75
+ #)
76
+
77
+ def locate_path(program: str) -> T.List[str]:
78
+ if os.path.isabs(program):
79
+ return [program]
80
+ for d in os.get_exec_path():
81
+ f = os.path.join(d, program)
82
+ if os.access(f, os.X_OK):
83
+ return [f]
84
+ raise ValueError("%s not found on $PATH" % program)
85
+
86
+ def write_args_line(ofile: T.TextIO, name: str, args: T.Union[str, T.List[str]]) -> None:
87
+ if len(args) == 0:
88
+ return
89
+ if isinstance(args, str):
90
+ ostr = name + "= '" + args + "'\n"
91
+ else:
92
+ ostr = name + ' = ['
93
+ ostr += ', '.join("'" + i + "'" for i in args)
94
+ ostr += ']\n'
95
+ ofile.write(ostr)
96
+
97
+ def get_args_from_envvars(infos: MachineInfo) -> None:
98
+ cppflags = shlex.split(os.environ.get('CPPFLAGS', ''))
99
+ cflags = shlex.split(os.environ.get('CFLAGS', ''))
100
+ cxxflags = shlex.split(os.environ.get('CXXFLAGS', ''))
101
+ objcflags = shlex.split(os.environ.get('OBJCFLAGS', ''))
102
+ objcxxflags = shlex.split(os.environ.get('OBJCXXFLAGS', ''))
103
+ ldflags = shlex.split(os.environ.get('LDFLAGS', ''))
104
+
105
+ c_args = cppflags + cflags
106
+ cpp_args = cppflags + cxxflags
107
+ c_link_args = cflags + ldflags
108
+ cpp_link_args = cxxflags + ldflags
109
+
110
+ objc_args = cppflags + objcflags
111
+ objcpp_args = cppflags + objcxxflags
112
+ objc_link_args = objcflags + ldflags
113
+ objcpp_link_args = objcxxflags + ldflags
114
+
115
+ if c_args:
116
+ infos.compile_args['c'] = c_args
117
+ if c_link_args:
118
+ infos.link_args['c'] = c_link_args
119
+ if cpp_args:
120
+ infos.compile_args['cpp'] = cpp_args
121
+ if cpp_link_args:
122
+ infos.link_args['cpp'] = cpp_link_args
123
+ if objc_args:
124
+ infos.compile_args['objc'] = objc_args
125
+ if objc_link_args:
126
+ infos.link_args['objc'] = objc_link_args
127
+ if objcpp_args:
128
+ infos.compile_args['objcpp'] = objcpp_args
129
+ if objcpp_link_args:
130
+ infos.link_args['objcpp'] = objcpp_link_args
131
+
132
+ deb_cpu_family_map = {
133
+ 'mips64el': 'mips64',
134
+ 'i686': 'x86',
135
+ 'powerpc64le': 'ppc64',
136
+ }
137
+
138
+ deb_cpu_map = {
139
+ 'armhf': 'arm7hlf',
140
+ 'mips64el': 'mips64',
141
+ 'powerpc64le': 'ppc64',
142
+ }
143
+
144
+ def deb_detect_cmake(infos: MachineInfo, data: T.Dict[str, str]) -> None:
145
+ system_name_map = {'linux': 'Linux', 'kfreebsd': 'kFreeBSD', 'hurd': 'GNU'}
146
+ system_processor_map = {'arm': 'armv7l', 'mips64el': 'mips64', 'powerpc64le': 'ppc64le'}
147
+
148
+ infos.cmake["CMAKE_C_COMPILER"] = infos.compilers['c']
149
+ try:
150
+ infos.cmake["CMAKE_CXX_COMPILER"] = infos.compilers['cpp']
151
+ except KeyError:
152
+ pass
153
+ infos.cmake["CMAKE_SYSTEM_NAME"] = system_name_map[data['DEB_HOST_ARCH_OS']]
154
+ infos.cmake["CMAKE_SYSTEM_PROCESSOR"] = system_processor_map.get(data['DEB_HOST_GNU_CPU'],
155
+ data['DEB_HOST_GNU_CPU'])
156
+
157
+ def deb_compiler_lookup(infos: MachineInfo, compilerstems: T.List[T.Tuple[str, str]], host_arch: str, gccsuffix: str) -> None:
158
+ for langname, stem in compilerstems:
159
+ compilername = f'{host_arch}-{stem}{gccsuffix}'
160
+ try:
161
+ p = locate_path(compilername)
162
+ infos.compilers[langname] = p
163
+ except ValueError:
164
+ pass
165
+
166
+ def detect_cross_debianlike(options: T.Any) -> MachineInfo:
167
+ if options.debarch == 'auto':
168
+ cmd = ['dpkg-architecture']
169
+ else:
170
+ cmd = ['dpkg-architecture', '-a' + options.debarch]
171
+ output = subprocess.check_output(cmd, universal_newlines=True,
172
+ stderr=subprocess.DEVNULL)
173
+ data = {}
174
+ for line in output.split('\n'):
175
+ line = line.strip()
176
+ if line == '':
177
+ continue
178
+ k, v = line.split('=', 1)
179
+ data[k] = v
180
+ host_arch = data['DEB_HOST_GNU_TYPE']
181
+ host_os = data['DEB_HOST_ARCH_OS']
182
+ host_subsystem = host_os
183
+ host_kernel = 'linux'
184
+ host_cpu_family = deb_cpu_family_map.get(data['DEB_HOST_GNU_CPU'],
185
+ data['DEB_HOST_GNU_CPU'])
186
+ host_cpu = deb_cpu_map.get(data['DEB_HOST_ARCH'],
187
+ data['DEB_HOST_ARCH'])
188
+ host_endian = data['DEB_HOST_ARCH_ENDIAN']
189
+
190
+ compilerstems = [('c', 'gcc'),
191
+ ('cpp', 'g++'),
192
+ ('objc', 'gobjc'),
193
+ ('objcpp', 'gobjc++')]
194
+ infos = MachineInfo()
195
+ deb_compiler_lookup(infos, compilerstems, host_arch, options.gccsuffix)
196
+ if len(infos.compilers) == 0:
197
+ print('Warning: no compilers were detected.')
198
+ infos.binaries['ar'] = locate_path("%s-ar" % host_arch)
199
+ infos.binaries['strip'] = locate_path("%s-strip" % host_arch)
200
+ infos.binaries['objcopy'] = locate_path("%s-objcopy" % host_arch)
201
+ infos.binaries['ld'] = locate_path("%s-ld" % host_arch)
202
+ try:
203
+ infos.binaries['cmake'] = locate_path("cmake")
204
+ deb_detect_cmake(infos, data)
205
+ except ValueError:
206
+ pass
207
+ try:
208
+ infos.binaries['pkg-config'] = locate_path("%s-pkg-config" % host_arch)
209
+ except ValueError:
210
+ pass # pkg-config is optional
211
+ try:
212
+ infos.binaries['cups-config'] = locate_path("cups-config")
213
+ except ValueError:
214
+ pass
215
+ infos.system = host_os
216
+ infos.subsystem = host_subsystem
217
+ infos.kernel = host_kernel
218
+ infos.cpu_family = host_cpu_family
219
+ infos.cpu = host_cpu
220
+ infos.endian = host_endian
221
+
222
+ get_args_from_envvars(infos)
223
+ return infos
224
+
225
+ def write_machine_file(infos: MachineInfo, ofilename: str, write_system_info: bool) -> None:
226
+ tmpfilename = ofilename + '~'
227
+ with open(tmpfilename, 'w', encoding='utf-8') as ofile:
228
+ ofile.write('[binaries]\n')
229
+ ofile.write('# Compilers\n')
230
+ for langname in sorted(infos.compilers.keys()):
231
+ compiler = infos.compilers[langname]
232
+ write_args_line(ofile, langname, compiler)
233
+ ofile.write('\n')
234
+
235
+ ofile.write('# Other binaries\n')
236
+ for exename in sorted(infos.binaries.keys()):
237
+ exe = infos.binaries[exename]
238
+ write_args_line(ofile, exename, exe)
239
+ ofile.write('\n')
240
+
241
+ ofile.write('[built-in options]\n')
242
+ all_langs = list(set(infos.compile_args.keys()).union(set(infos.link_args.keys())))
243
+ all_langs.sort()
244
+ for lang in all_langs:
245
+ if lang in infos.compile_args:
246
+ write_args_line(ofile, lang + '_args', infos.compile_args[lang])
247
+ if lang in infos.link_args:
248
+ write_args_line(ofile, lang + '_link_args', infos.link_args[lang])
249
+ ofile.write('\n')
250
+
251
+ ofile.write('[properties]\n')
252
+ for k, v in infos.properties.items():
253
+ write_args_line(ofile, k, v)
254
+ ofile.write('\n')
255
+
256
+ if infos.cmake:
257
+ ofile.write('[cmake]\n\n')
258
+ for k, v in infos.cmake.items():
259
+ write_args_line(ofile, k, v)
260
+ ofile.write('\n')
261
+
262
+ if write_system_info:
263
+ ofile.write('[host_machine]\n')
264
+ ofile.write(f"cpu = '{infos.cpu}'\n")
265
+ ofile.write(f"cpu_family = '{infos.cpu_family}'\n")
266
+ ofile.write(f"endian = '{infos.endian}'\n")
267
+ ofile.write(f"system = '{infos.system}'\n")
268
+ if infos.subsystem:
269
+ ofile.write(f"subsystem = '{infos.subsystem}'\n")
270
+ if infos.kernel:
271
+ ofile.write(f"kernel = '{infos.kernel}'\n")
272
+
273
+ os.replace(tmpfilename, ofilename)
274
+
275
+ def detect_language_args_from_envvars(langname: str, envvar_suffix: str = '') -> T.Tuple[T.List[str], T.List[str]]:
276
+ compile_args = []
277
+ if langname in compilers.CFLAGS_MAPPING:
278
+ compile_args = shlex.split(os.environ.get(compilers.CFLAGS_MAPPING[langname] + envvar_suffix, ''))
279
+ if langname in compilers.LANGUAGES_USING_CPPFLAGS:
280
+ cppflags = tuple(shlex.split(os.environ.get('CPPFLAGS' + envvar_suffix, '')))
281
+ lang_compile_args = list(cppflags) + compile_args
282
+ else:
283
+ lang_compile_args = compile_args
284
+ lang_link_args = []
285
+ if langname in compilers.LANGUAGES_USING_LDFLAGS:
286
+ lang_link_args += shlex.split(os.environ.get('LDFLAGS' + envvar_suffix, ''))
287
+ lang_link_args += compile_args
288
+ return (lang_compile_args, lang_link_args)
289
+
290
+ def detect_compilers_from_envvars(envvar_suffix: str = '') -> MachineInfo:
291
+ infos = MachineInfo()
292
+ for langname, envvarname in envconfig.ENV_VAR_COMPILER_MAP.items():
293
+ compilerstr = os.environ.get(envvarname + envvar_suffix)
294
+ if not compilerstr:
295
+ continue
296
+ if os.path.exists(compilerstr):
297
+ compiler = [compilerstr]
298
+ else:
299
+ compiler = shlex.split(compilerstr)
300
+ infos.compilers[langname] = compiler
301
+ lang_compile_args, lang_link_args = detect_language_args_from_envvars(langname, envvar_suffix)
302
+ if lang_compile_args:
303
+ infos.compile_args[langname] = lang_compile_args
304
+ if lang_link_args:
305
+ infos.link_args[langname] = lang_link_args
306
+ return infos
307
+
308
+ def detect_binaries_from_envvars(infos: MachineInfo, envvar_suffix: str = '') -> None:
309
+ for binname, envvar_base in envconfig.ENV_VAR_TOOL_MAP.items():
310
+ envvar = envvar_base + envvar_suffix
311
+ binstr = os.environ.get(envvar)
312
+ if binstr:
313
+ infos.binaries[binname] = shlex.split(binstr)
314
+
315
+ def detect_properties_from_envvars(infos: MachineInfo, envvar_suffix: str = '') -> None:
316
+ var = os.environ.get('PKG_CONFIG_LIBDIR' + envvar_suffix)
317
+ if var is not None:
318
+ infos.properties['pkg_config_libdir'] = var
319
+ var = os.environ.get('PKG_CONFIG_SYSROOT_DIR' + envvar_suffix)
320
+ if var is not None:
321
+ infos.properties['sys_root'] = var
322
+
323
+ def detect_cross_system(infos: MachineInfo, options: T.Any) -> None:
324
+ for optname in ('system', 'subsystem', 'kernel', 'cpu', 'cpu_family', 'endian'):
325
+ v = getattr(options, optname)
326
+ if not v:
327
+ mlog.error(f'Cross property "{optname}" missing, set it with --{optname.replace("_", "-")}.')
328
+ sys.exit(1)
329
+ setattr(infos, optname, v)
330
+
331
+ def detect_cross_env(options: T.Any) -> MachineInfo:
332
+ if options.debarch:
333
+ print('Detecting cross environment via dpkg-reconfigure.')
334
+ infos = detect_cross_debianlike(options)
335
+ else:
336
+ print('Detecting cross environment via environment variables.')
337
+ infos = detect_compilers_from_envvars()
338
+ detect_cross_system(infos, options)
339
+ detect_binaries_from_envvars(infos)
340
+ detect_properties_from_envvars(infos)
341
+ return infos
342
+
343
+ def add_compiler_if_missing(infos: MachineInfo, langname: str, exe_names: T.List[str]) -> None:
344
+ if langname in infos.compilers:
345
+ return
346
+ for exe_name in exe_names:
347
+ lookup = shutil.which(exe_name)
348
+ if not lookup:
349
+ continue
350
+ compflags, linkflags = detect_language_args_from_envvars(langname)
351
+ infos.compilers[langname] = [lookup]
352
+ if compflags:
353
+ infos.compile_args[langname] = compflags
354
+ if linkflags:
355
+ infos.link_args[langname] = linkflags
356
+ return
357
+
358
+ def detect_missing_native_compilers(infos: MachineInfo) -> None:
359
+ # T.Any per-platform special detection should go here.
360
+ for langname, exes in compiler_names.items():
361
+ if langname not in envconfig.ENV_VAR_COMPILER_MAP:
362
+ continue
363
+ add_compiler_if_missing(infos, langname, exes)
364
+
365
+ def detect_missing_native_binaries(infos: MachineInfo) -> None:
366
+ # T.Any per-platform special detection should go here.
367
+ for toolname in sorted(envconfig.ENV_VAR_TOOL_MAP.keys()):
368
+ if toolname in infos.binaries:
369
+ continue
370
+ exe = shutil.which(toolname)
371
+ if exe:
372
+ infos.binaries[toolname] = [exe]
373
+
374
+ def detect_native_env(options: T.Any) -> MachineInfo:
375
+ use_for_build = has_for_build()
376
+ if use_for_build:
377
+ mlog.log('Using FOR_BUILD envvars for detection')
378
+ esuffix = '_FOR_BUILD'
379
+ else:
380
+ mlog.log('Using regular envvars for detection.')
381
+ esuffix = ''
382
+ infos = detect_compilers_from_envvars(esuffix)
383
+ detect_missing_native_compilers(infos)
384
+ detect_binaries_from_envvars(infos, esuffix)
385
+ detect_missing_native_binaries(infos)
386
+ detect_properties_from_envvars(infos, esuffix)
387
+ return infos
388
+
389
+ def run(options: T.Any) -> None:
390
+ if options.cross and options.native:
391
+ sys.exit('You can only specify either --cross or --native, not both.')
392
+ if not options.cross and not options.native:
393
+ sys.exit('You must specify --cross or --native.')
394
+ mlog.notice('This functionality is experimental and subject to change.')
395
+ detect_cross = options.cross
396
+ if detect_cross:
397
+ infos = detect_cross_env(options)
398
+ write_system_info = True
399
+ else:
400
+ infos = detect_native_env(options)
401
+ write_system_info = False
402
+ write_machine_file(infos, options.outfile, write_system_info)
@@ -0,0 +1,106 @@
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 argparse
8
+ import multiprocessing
9
+ import subprocess
10
+ from pathlib import Path
11
+ import typing as T
12
+
13
+ from ..mesonlib import Popen_safe, split_args
14
+
15
+ class ExternalProject:
16
+ def __init__(self, options: argparse.Namespace):
17
+ self.name = options.name
18
+ self.src_dir = options.srcdir
19
+ self.build_dir = options.builddir
20
+ self.install_dir = options.installdir
21
+ self.log_dir = options.logdir
22
+ self.verbose = options.verbose
23
+ self.stampfile = options.stampfile
24
+ self.depfile = options.depfile
25
+ self.make = split_args(options.make)
26
+
27
+ def write_depfile(self) -> None:
28
+ with open(self.depfile, 'w', encoding='utf-8') as f:
29
+ f.write(f'{self.stampfile}: \\\n')
30
+ for dirpath, dirnames, filenames in os.walk(self.src_dir):
31
+ dirnames[:] = [d for d in dirnames if not d.startswith('.')]
32
+ for fname in filenames:
33
+ if fname.startswith('.'):
34
+ continue
35
+ path = Path(dirpath, fname)
36
+ f.write(' {} \\\n'.format(path.as_posix().replace(' ', '\\ ')))
37
+
38
+ def write_stampfile(self) -> None:
39
+ with open(self.stampfile, 'w', encoding='utf-8'):
40
+ pass
41
+
42
+ def supports_jobs_flag(self) -> bool:
43
+ p, o, e = Popen_safe(self.make + ['--version'])
44
+ if p.returncode == 0 and ('GNU Make' in o or 'waf' in o):
45
+ return True
46
+ return False
47
+
48
+ def build(self) -> int:
49
+ make_cmd = self.make.copy()
50
+ if self.supports_jobs_flag():
51
+ make_cmd.append(f'-j{multiprocessing.cpu_count()}')
52
+ rc = self._run('build', make_cmd)
53
+ if rc != 0:
54
+ return rc
55
+
56
+ install_cmd = self.make.copy()
57
+ install_env = {}
58
+ install_env['DESTDIR'] = self.install_dir
59
+ install_cmd.append('install')
60
+ rc = self._run('install', install_cmd, install_env)
61
+ if rc != 0:
62
+ return rc
63
+
64
+ self.write_depfile()
65
+ self.write_stampfile()
66
+
67
+ return 0
68
+
69
+ def _run(self, step: str, command: T.List[str], env: T.Optional[T.Dict[str, str]] = None) -> int:
70
+ m = 'Running command ' + str(command) + ' in directory ' + str(self.build_dir) + '\n'
71
+ log_filename = Path(self.log_dir, f'{self.name}-{step}.log')
72
+ output = None
73
+ if not self.verbose:
74
+ output = open(log_filename, 'w', encoding='utf-8')
75
+ output.write(m + '\n')
76
+ output.flush()
77
+ else:
78
+ print(m)
79
+ run_env = os.environ.copy()
80
+ if env:
81
+ run_env.update(env)
82
+ p, o, e = Popen_safe(command, stderr=subprocess.STDOUT, stdout=output,
83
+ cwd=self.build_dir,
84
+ env=run_env)
85
+ if p.returncode != 0:
86
+ m = f'{step} step returned error code {p.returncode}.'
87
+ if not self.verbose:
88
+ m += '\nSee logs: ' + str(log_filename)
89
+ print(m)
90
+ return p.returncode
91
+
92
+ def run(args: T.List[str]) -> int:
93
+ parser = argparse.ArgumentParser()
94
+ parser.add_argument('--name')
95
+ parser.add_argument('--srcdir')
96
+ parser.add_argument('--builddir')
97
+ parser.add_argument('--installdir')
98
+ parser.add_argument('--logdir')
99
+ parser.add_argument('--make')
100
+ parser.add_argument('--verbose', action='store_true')
101
+ parser.add_argument('stampfile')
102
+ parser.add_argument('depfile')
103
+
104
+ options = parser.parse_args(args)
105
+ ep = ExternalProject(options)
106
+ return ep.build()
@@ -0,0 +1,86 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2016 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import os
7
+ import argparse
8
+ import subprocess
9
+ import typing as T
10
+
11
+ parser = argparse.ArgumentParser()
12
+ parser.add_argument('command')
13
+ parser.add_argument('--pkgname', default='')
14
+ parser.add_argument('--datadirs', default='')
15
+ parser.add_argument('--langs', default='')
16
+ parser.add_argument('--localedir', default='')
17
+ parser.add_argument('--source-root', default='')
18
+ parser.add_argument('--subdir', default='')
19
+ parser.add_argument('--xgettext', default='xgettext')
20
+ parser.add_argument('--msgmerge', default='msgmerge')
21
+ parser.add_argument('--msginit', default='msginit')
22
+ parser.add_argument('--extra-args', default='')
23
+
24
+ def read_linguas(src_sub: str) -> T.List[str]:
25
+ # Syntax of this file is documented here:
26
+ # https://www.gnu.org/software/gettext/manual/html_node/po_002fLINGUAS.html
27
+ linguas = os.path.join(src_sub, 'LINGUAS')
28
+ try:
29
+ langs = []
30
+ with open(linguas, encoding='utf-8') as f:
31
+ for line in f:
32
+ line = line.strip()
33
+ if line and not line.startswith('#'):
34
+ langs += line.split()
35
+ return langs
36
+ except (FileNotFoundError, PermissionError):
37
+ print(f'Could not find file LINGUAS in {src_sub}')
38
+ return []
39
+
40
+ def run_potgen(src_sub: str, xgettext: str, pkgname: str, datadirs: str, args: T.List[str], source_root: str) -> int:
41
+ listfile = os.path.join(src_sub, 'POTFILES.in')
42
+ if not os.path.exists(listfile):
43
+ listfile = os.path.join(src_sub, 'POTFILES')
44
+ if not os.path.exists(listfile):
45
+ print('Could not find file POTFILES in %s' % src_sub)
46
+ return 1
47
+
48
+ child_env = os.environ.copy()
49
+ if datadirs:
50
+ child_env['GETTEXTDATADIRS'] = datadirs
51
+
52
+ ofile = os.path.join(src_sub, pkgname + '.pot')
53
+ return subprocess.call([xgettext, '--package-name=' + pkgname, '-p', src_sub, '-f', listfile,
54
+ '-D', source_root, '-k_', '-o', ofile] + args,
55
+ env=child_env)
56
+
57
+ def update_po(src_sub: str, msgmerge: str, msginit: str, pkgname: str, langs: T.List[str]) -> int:
58
+ potfile = os.path.join(src_sub, pkgname + '.pot')
59
+ for l in langs:
60
+ pofile = os.path.join(src_sub, l + '.po')
61
+ if os.path.exists(pofile):
62
+ subprocess.check_call([msgmerge, '-q', '-o', pofile, pofile, potfile])
63
+ else:
64
+ subprocess.check_call([msginit, '--input', potfile, '--output-file', pofile, '--locale', l, '--no-translator'])
65
+ return 0
66
+
67
+ def run(args: T.List[str]) -> int:
68
+ options = parser.parse_args(args)
69
+ subcmd = options.command
70
+ langs = options.langs.split('@@') if options.langs else None
71
+ extra_args = options.extra_args.split('@@') if options.extra_args else []
72
+ subdir = options.subdir
73
+ src_sub = os.path.join(options.source_root, subdir)
74
+
75
+ if not langs:
76
+ langs = read_linguas(src_sub)
77
+
78
+ if subcmd == 'pot':
79
+ return run_potgen(src_sub, options.xgettext, options.pkgname, options.datadirs, extra_args, options.source_root)
80
+ elif subcmd == 'update_po':
81
+ if run_potgen(src_sub, options.xgettext, options.pkgname, options.datadirs, extra_args, options.source_root) != 0:
82
+ return 1
83
+ return update_po(src_sub, options.msgmerge, options.msginit, options.pkgname, langs)
84
+ else:
85
+ print('Unknown subcommand.')
86
+ return 1