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,744 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2015-2022 The Meson development team
3
+
4
+ from __future__ import annotations
5
+ from collections import defaultdict
6
+ from dataclasses import dataclass
7
+ from pathlib import PurePath
8
+ import os
9
+ import typing as T
10
+
11
+ from . import NewExtensionModule, ModuleInfo
12
+ from . import ModuleReturnValue
13
+ from .. import build
14
+ from .. import dependencies
15
+ from .. import mesonlib
16
+ from .. import mlog
17
+ from ..coredata import BUILTIN_DIR_OPTIONS
18
+ from ..dependencies.pkgconfig import PkgConfigDependency, PkgConfigInterface
19
+ from ..interpreter.type_checking import D_MODULE_VERSIONS_KW, INSTALL_DIR_KW, VARIABLES_KW, NoneType
20
+ from ..interpreterbase import FeatureNew, FeatureDeprecated
21
+ from ..interpreterbase.decorators import ContainerTypeInfo, KwargInfo, typed_kwargs, typed_pos_args
22
+
23
+ if T.TYPE_CHECKING:
24
+ from typing_extensions import TypedDict
25
+
26
+ from . import ModuleState
27
+ from .. import mparser
28
+ from ..interpreter import Interpreter
29
+
30
+ ANY_DEP = T.Union[dependencies.Dependency, build.BuildTargetTypes, str]
31
+ LIBS = T.Union[build.LibTypes, str]
32
+
33
+ class GenerateKw(TypedDict):
34
+
35
+ version: T.Optional[str]
36
+ name: T.Optional[str]
37
+ filebase: T.Optional[str]
38
+ description: T.Optional[str]
39
+ url: str
40
+ subdirs: T.List[str]
41
+ conflicts: T.List[str]
42
+ dataonly: bool
43
+ libraries: T.List[ANY_DEP]
44
+ libraries_private: T.List[ANY_DEP]
45
+ requires: T.List[T.Union[str, build.StaticLibrary, build.SharedLibrary, dependencies.Dependency]]
46
+ requires_private: T.List[T.Union[str, build.StaticLibrary, build.SharedLibrary, dependencies.Dependency]]
47
+ install_dir: T.Optional[str]
48
+ d_module_versions: T.List[T.Union[str, int]]
49
+ extra_cflags: T.List[str]
50
+ variables: T.Dict[str, str]
51
+ uninstalled_variables: T.Dict[str, str]
52
+ unescaped_variables: T.Dict[str, str]
53
+ unescaped_uninstalled_variables: T.Dict[str, str]
54
+
55
+
56
+ _PKG_LIBRARIES: KwargInfo[T.List[T.Union[str, dependencies.Dependency, build.SharedLibrary, build.StaticLibrary, build.CustomTarget, build.CustomTargetIndex]]] = KwargInfo(
57
+ 'libraries',
58
+ ContainerTypeInfo(list, (str, dependencies.Dependency,
59
+ build.SharedLibrary, build.StaticLibrary,
60
+ build.CustomTarget, build.CustomTargetIndex)),
61
+ default=[],
62
+ listify=True,
63
+ )
64
+
65
+ _PKG_REQUIRES: KwargInfo[T.List[T.Union[str, build.SharedLibrary, build.StaticLibrary, dependencies.Dependency]]] = KwargInfo(
66
+ 'requires',
67
+ ContainerTypeInfo(list, (str, build.SharedLibrary, build.StaticLibrary, dependencies.Dependency)),
68
+ default=[],
69
+ listify=True,
70
+ )
71
+
72
+
73
+ def _as_str(obj: object) -> str:
74
+ assert isinstance(obj, str)
75
+ return obj
76
+
77
+
78
+ @dataclass
79
+ class MetaData:
80
+
81
+ filebase: str
82
+ display_name: str
83
+ location: mparser.BaseNode
84
+ warned: bool = False
85
+
86
+
87
+ class DependenciesHelper:
88
+ def __init__(self, state: ModuleState, name: str, metadata: T.Dict[str, MetaData]) -> None:
89
+ self.state = state
90
+ self.name = name
91
+ self.metadata = metadata
92
+ self.pub_libs: T.List[LIBS] = []
93
+ self.pub_reqs: T.List[str] = []
94
+ self.priv_libs: T.List[LIBS] = []
95
+ self.priv_reqs: T.List[str] = []
96
+ self.cflags: T.List[str] = []
97
+ self.version_reqs: T.DefaultDict[str, T.Set[str]] = defaultdict(set)
98
+ self.link_whole_targets: T.List[T.Union[build.CustomTarget, build.CustomTargetIndex, build.StaticLibrary]] = []
99
+ self.uninstalled_incdirs: mesonlib.OrderedSet[str] = mesonlib.OrderedSet()
100
+
101
+ def add_pub_libs(self, libs: T.List[ANY_DEP]) -> None:
102
+ p_libs, reqs, cflags = self._process_libs(libs, True)
103
+ self.pub_libs = p_libs + self.pub_libs # prepend to preserve dependencies
104
+ self.pub_reqs += reqs
105
+ self.cflags += cflags
106
+
107
+ def add_priv_libs(self, libs: T.List[ANY_DEP]) -> None:
108
+ p_libs, reqs, _ = self._process_libs(libs, False)
109
+ self.priv_libs = p_libs + self.priv_libs
110
+ self.priv_reqs += reqs
111
+
112
+ def add_pub_reqs(self, reqs: T.List[T.Union[str, build.StaticLibrary, build.SharedLibrary, dependencies.Dependency]]) -> None:
113
+ self.pub_reqs += self._process_reqs(reqs)
114
+
115
+ def add_priv_reqs(self, reqs: T.List[T.Union[str, build.StaticLibrary, build.SharedLibrary, dependencies.Dependency]]) -> None:
116
+ self.priv_reqs += self._process_reqs(reqs)
117
+
118
+ def _check_generated_pc_deprecation(self, obj: T.Union[build.CustomTarget, build.CustomTargetIndex, build.StaticLibrary, build.SharedLibrary]) -> None:
119
+ if obj.get_id() in self.metadata:
120
+ return
121
+ data = self.metadata[obj.get_id()]
122
+ if data.warned:
123
+ return
124
+ mlog.deprecation('Library', mlog.bold(obj.name), 'was passed to the '
125
+ '"libraries" keyword argument of a previous call '
126
+ 'to generate() method instead of first positional '
127
+ 'argument.', 'Adding', mlog.bold(data.display_name),
128
+ 'to "Requires" field, but this is a deprecated '
129
+ 'behaviour that will change in a future version '
130
+ 'of Meson. Please report the issue if this '
131
+ 'warning cannot be avoided in your case.',
132
+ location=data.location)
133
+ data.warned = True
134
+
135
+ def _process_reqs(self, reqs: T.Sequence[T.Union[str, build.StaticLibrary, build.SharedLibrary, dependencies.Dependency]]) -> T.List[str]:
136
+ '''Returns string names of requirements'''
137
+ processed_reqs: T.List[str] = []
138
+ for obj in mesonlib.listify(reqs):
139
+ if not isinstance(obj, str):
140
+ FeatureNew.single_use('pkgconfig.generate requirement from non-string object', '0.46.0', self.state.subproject)
141
+ if (isinstance(obj, (build.CustomTarget, build.CustomTargetIndex, build.SharedLibrary, build.StaticLibrary))
142
+ and obj.get_id() in self.metadata):
143
+ self._check_generated_pc_deprecation(obj)
144
+ processed_reqs.append(self.metadata[obj.get_id()].filebase)
145
+ elif isinstance(obj, PkgConfigDependency):
146
+ if obj.found():
147
+ processed_reqs.append(obj.name)
148
+ self.add_version_reqs(obj.name, obj.version_reqs)
149
+ elif isinstance(obj, str):
150
+ name, version_req = self.split_version_req(obj)
151
+ processed_reqs.append(name)
152
+ self.add_version_reqs(name, [version_req] if version_req is not None else None)
153
+ elif isinstance(obj, dependencies.Dependency) and not obj.found():
154
+ pass
155
+ elif isinstance(obj, dependencies.ExternalDependency) and obj.name == 'threads':
156
+ pass
157
+ else:
158
+ raise mesonlib.MesonException('requires argument not a string, '
159
+ 'library with pkgconfig-generated file '
160
+ f'or pkgconfig-dependency object, got {obj!r}')
161
+ return processed_reqs
162
+
163
+ def add_cflags(self, cflags: T.List[str]) -> None:
164
+ self.cflags += mesonlib.stringlistify(cflags)
165
+
166
+ def _add_uninstalled_incdirs(self, incdirs: T.List[build.IncludeDirs], subdir: T.Optional[str] = None) -> None:
167
+ for i in incdirs:
168
+ curdir = i.get_curdir()
169
+ for d in i.get_incdirs():
170
+ path = os.path.join(curdir, d)
171
+ self.uninstalled_incdirs.add(path)
172
+ if subdir is not None:
173
+ self.uninstalled_incdirs.add(subdir)
174
+
175
+ def _process_libs(
176
+ self, libs: T.List[ANY_DEP], public: bool
177
+ ) -> T.Tuple[T.List[T.Union[str, build.SharedLibrary, build.StaticLibrary, build.CustomTarget, build.CustomTargetIndex]], T.List[str], T.List[str]]:
178
+ libs = mesonlib.listify(libs)
179
+ processed_libs: T.List[T.Union[str, build.SharedLibrary, build.StaticLibrary, build.CustomTarget, build.CustomTargetIndex]] = []
180
+ processed_reqs: T.List[str] = []
181
+ processed_cflags: T.List[str] = []
182
+ for obj in libs:
183
+ if (isinstance(obj, (build.CustomTarget, build.CustomTargetIndex, build.SharedLibrary, build.StaticLibrary))
184
+ and obj.get_id() in self.metadata):
185
+ self._check_generated_pc_deprecation(obj)
186
+ processed_reqs.append(self.metadata[obj.get_id()].filebase)
187
+ elif isinstance(obj, dependencies.ExternalDependency) and obj.name == 'valgrind':
188
+ pass
189
+ elif isinstance(obj, PkgConfigDependency):
190
+ if obj.found():
191
+ processed_reqs.append(obj.name)
192
+ self.add_version_reqs(obj.name, obj.version_reqs)
193
+ elif isinstance(obj, dependencies.InternalDependency):
194
+ if obj.found():
195
+ if obj.objects:
196
+ raise mesonlib.MesonException('.pc file cannot refer to individual object files.')
197
+ processed_libs += obj.get_link_args()
198
+ processed_cflags += obj.get_compile_args()
199
+ self._add_lib_dependencies(obj.libraries, obj.whole_libraries, obj.ext_deps, public, private_external_deps=True)
200
+ self._add_uninstalled_incdirs(obj.get_include_dirs())
201
+ elif isinstance(obj, dependencies.Dependency):
202
+ if obj.found():
203
+ processed_libs += obj.get_link_args()
204
+ processed_cflags += obj.get_compile_args()
205
+ elif isinstance(obj, build.SharedLibrary) and obj.shared_library_only:
206
+ # Do not pull dependencies for shared libraries because they are
207
+ # only required for static linking. Adding private requires has
208
+ # the side effect of exposing their cflags, which is the
209
+ # intended behaviour of pkg-config but force Debian to add more
210
+ # than needed build deps.
211
+ # See https://bugs.freedesktop.org/show_bug.cgi?id=105572
212
+ processed_libs.append(obj)
213
+ self._add_uninstalled_incdirs(obj.get_include_dirs(), obj.get_source_subdir())
214
+ elif isinstance(obj, (build.SharedLibrary, build.StaticLibrary)):
215
+ processed_libs.append(obj)
216
+ self._add_uninstalled_incdirs(obj.get_include_dirs(), obj.get_source_subdir())
217
+ # If there is a static library in `Libs:` all its deps must be
218
+ # public too, otherwise the generated pc file will never be
219
+ # usable without --static.
220
+ self._add_lib_dependencies(obj.link_targets,
221
+ obj.link_whole_targets,
222
+ obj.external_deps,
223
+ isinstance(obj, build.StaticLibrary) and public)
224
+ elif isinstance(obj, (build.CustomTarget, build.CustomTargetIndex)):
225
+ if not obj.is_linkable_target():
226
+ raise mesonlib.MesonException('library argument contains a not linkable custom_target.')
227
+ FeatureNew.single_use('custom_target in pkgconfig.generate libraries', '0.58.0', self.state.subproject)
228
+ processed_libs.append(obj)
229
+ elif isinstance(obj, str):
230
+ processed_libs.append(obj)
231
+ else:
232
+ raise mesonlib.MesonException(f'library argument of type {type(obj).__name__} not a string, library or dependency object.')
233
+
234
+ return processed_libs, processed_reqs, processed_cflags
235
+
236
+ def _add_lib_dependencies(
237
+ self, link_targets: T.Sequence[build.BuildTargetTypes],
238
+ link_whole_targets: T.Sequence[T.Union[build.StaticLibrary, build.CustomTarget, build.CustomTargetIndex]],
239
+ external_deps: T.List[dependencies.Dependency],
240
+ public: bool,
241
+ private_external_deps: bool = False) -> None:
242
+ add_libs = self.add_pub_libs if public else self.add_priv_libs
243
+ # Recursively add all linked libraries
244
+ for t in link_targets:
245
+ # Internal libraries (uninstalled static library) will be promoted
246
+ # to link_whole, treat them as such here.
247
+ if t.is_internal():
248
+ # `is_internal` shouldn't return True for anything but a
249
+ # StaticLibrary, or a CustomTarget that is a StaticLibrary
250
+ assert isinstance(t, (build.StaticLibrary, build.CustomTarget, build.CustomTargetIndex)), 'for mypy'
251
+ self._add_link_whole(t, public)
252
+ else:
253
+ add_libs([t])
254
+ for t in link_whole_targets:
255
+ self._add_link_whole(t, public)
256
+ # And finally its external dependencies
257
+ if private_external_deps:
258
+ self.add_priv_libs(T.cast('T.List[ANY_DEP]', external_deps))
259
+ else:
260
+ add_libs(T.cast('T.List[ANY_DEP]', external_deps))
261
+
262
+ def _add_link_whole(self, t: T.Union[build.CustomTarget, build.CustomTargetIndex, build.StaticLibrary], public: bool) -> None:
263
+ # Don't include static libraries that we link_whole. But we still need to
264
+ # include their dependencies: a static library we link_whole
265
+ # could itself link to a shared library or an installed static library.
266
+ # Keep track of link_whole_targets so we can remove them from our
267
+ # lists in case a library is link_with and link_whole at the same time.
268
+ # See remove_dups() below.
269
+ self.link_whole_targets.append(t)
270
+ if isinstance(t, build.BuildTarget):
271
+ self._add_lib_dependencies(t.link_targets, t.link_whole_targets, t.external_deps, public)
272
+
273
+ def add_version_reqs(self, name: str, version_reqs: T.Optional[T.List[str]]) -> None:
274
+ if version_reqs:
275
+ # Note that pkg-config is picky about whitespace.
276
+ # 'foo > 1.2' is ok but 'foo>1.2' is not.
277
+ # foo, bar' is ok, but 'foo,bar' is not.
278
+ self.version_reqs[name].update(version_reqs)
279
+
280
+ def split_version_req(self, s: str) -> T.Tuple[str, T.Optional[str]]:
281
+ for op in ['>=', '<=', '!=', '==', '=', '>', '<']:
282
+ pos = s.find(op)
283
+ if pos > 0:
284
+ return s[0:pos].strip(), s[pos:].strip()
285
+ return s, None
286
+
287
+ def format_vreq(self, vreq: str) -> str:
288
+ # vreq are '>=1.0' and pkgconfig wants '>= 1.0'
289
+ for op in ['>=', '<=', '!=', '==', '=', '>', '<']:
290
+ if vreq.startswith(op):
291
+ return op + ' ' + vreq[len(op):]
292
+ return vreq
293
+
294
+ def format_reqs(self, reqs: T.List[str]) -> str:
295
+ result: T.List[str] = []
296
+ for name in reqs:
297
+ vreqs = self.version_reqs.get(name, None)
298
+ if vreqs:
299
+ result += [name + ' ' + self.format_vreq(vreq) for vreq in sorted(vreqs)]
300
+ else:
301
+ result += [name]
302
+ return ', '.join(result)
303
+
304
+ def remove_dups(self) -> None:
305
+ # Set of ids that have already been handled and should not be added any more
306
+ exclude: T.Set[str] = set()
307
+
308
+ # We can't just check if 'x' is excluded because we could have copies of
309
+ # the same SharedLibrary object for example.
310
+ def _ids(x: T.Union[str, build.CustomTarget, build.CustomTargetIndex, build.StaticLibrary, build.SharedLibrary]) -> T.Iterable[str]:
311
+ if isinstance(x, str):
312
+ yield x
313
+ else:
314
+ if x.get_id() in self.metadata:
315
+ yield self.metadata[x.get_id()].display_name
316
+ yield x.get_id()
317
+
318
+ # Exclude 'x' in all its forms and return if it was already excluded
319
+ def _add_exclude(x: T.Union[str, build.CustomTarget, build.CustomTargetIndex, build.StaticLibrary, build.SharedLibrary]) -> bool:
320
+ was_excluded = False
321
+ for i in _ids(x):
322
+ if i in exclude:
323
+ was_excluded = True
324
+ else:
325
+ exclude.add(i)
326
+ return was_excluded
327
+
328
+ # link_whole targets are already part of other targets, exclude them all.
329
+ for t in self.link_whole_targets:
330
+ _add_exclude(t)
331
+
332
+ # Mypy thinks these overlap, but since List is invariant they don't,
333
+ # `List[str]`` is not a valid input to `List[str | BuildTarget]`.
334
+ # pylance/pyright gets this right, but for mypy we have to ignore the
335
+ # error
336
+ @T.overload
337
+ def _fn(xs: T.List[str], libs: bool = False) -> T.List[str]: ... # type: ignore
338
+
339
+ @T.overload
340
+ def _fn(xs: T.List[LIBS], libs: bool = False) -> T.List[LIBS]: ...
341
+
342
+ def _fn(xs: T.Union[T.List[str], T.List[LIBS]], libs: bool = False) -> T.Union[T.List[str], T.List[LIBS]]:
343
+ # Remove duplicates whilst preserving original order
344
+ result = []
345
+ for x in xs:
346
+ # Don't de-dup unknown strings to avoid messing up arguments like:
347
+ # ['-framework', 'CoreAudio', '-framework', 'CoreMedia']
348
+ known_flags = ['-pthread']
349
+ cannot_dedup = libs and isinstance(x, str) and \
350
+ not x.startswith(('-l', '-L')) and \
351
+ x not in known_flags
352
+ if not cannot_dedup and _add_exclude(x):
353
+ continue
354
+ result.append(x)
355
+ return result
356
+
357
+ # Handle lists in priority order: public items can be excluded from
358
+ # private and Requires can excluded from Libs.
359
+ self.pub_reqs = _fn(self.pub_reqs)
360
+ self.pub_libs = _fn(self.pub_libs, True)
361
+ self.priv_reqs = _fn(self.priv_reqs)
362
+ self.priv_libs = _fn(self.priv_libs, True)
363
+ # Reset exclude list just in case some values can be both cflags and libs.
364
+ exclude = set()
365
+ self.cflags = _fn(self.cflags)
366
+
367
+ class PkgConfigModule(NewExtensionModule):
368
+
369
+ INFO = ModuleInfo('pkgconfig')
370
+
371
+ # Track already generated pkg-config files This is stored as a class
372
+ # variable so that multiple `import()`s share metadata
373
+ devenv: T.Optional[mesonlib.EnvironmentVariables] = None
374
+ _metadata: T.ClassVar[T.Dict[str, MetaData]] = {}
375
+
376
+ def __init__(self) -> None:
377
+ super().__init__()
378
+ self.methods.update({
379
+ 'generate': self.generate,
380
+ })
381
+
382
+ def postconf_hook(self, b: build.Build) -> None:
383
+ if self.devenv is not None:
384
+ b.devenv.append(self.devenv)
385
+
386
+ def _get_lname(self, l: T.Union[build.SharedLibrary, build.StaticLibrary, build.CustomTarget, build.CustomTargetIndex],
387
+ msg: str, pcfile: str) -> str:
388
+ if isinstance(l, (build.CustomTargetIndex, build.CustomTarget)):
389
+ basename = os.path.basename(l.get_filename())
390
+ name = os.path.splitext(basename)[0]
391
+ if name.startswith('lib'):
392
+ name = name[3:]
393
+ return name
394
+ # Nothing special
395
+ if not l.name_prefix_set:
396
+ return l.name
397
+ # Sometimes people want the library to start with 'lib' everywhere,
398
+ # which is achieved by setting name_prefix to '' and the target name to
399
+ # 'libfoo'. In that case, try to get the pkg-config '-lfoo' arg correct.
400
+ if l.prefix == '' and l.name.startswith('lib'):
401
+ return l.name[3:]
402
+ # If the library is imported via an import library which is always
403
+ # named after the target name, '-lfoo' is correct.
404
+ if isinstance(l, build.SharedLibrary) and l.import_filename:
405
+ return l.name
406
+ # In other cases, we can't guarantee that the compiler will be able to
407
+ # find the library via '-lfoo', so tell the user that.
408
+ mlog.warning(msg.format(l.name, 'name_prefix', l.name, pcfile))
409
+ return l.name
410
+
411
+ def _escape(self, value: T.Union[str, PurePath]) -> str:
412
+ '''
413
+ We cannot use quote_arg because it quotes with ' and " which does not
414
+ work with pkg-config and pkgconf at all.
415
+ '''
416
+ # We should always write out paths with / because pkg-config requires
417
+ # spaces to be quoted with \ and that messes up on Windows:
418
+ # https://bugs.freedesktop.org/show_bug.cgi?id=103203
419
+ if isinstance(value, PurePath):
420
+ value = value.as_posix()
421
+ return value.replace(' ', r'\ ')
422
+
423
+ def _make_relative(self, prefix: T.Union[PurePath, str], subdir: T.Union[PurePath, str]) -> str:
424
+ prefix = PurePath(prefix)
425
+ subdir = PurePath(subdir)
426
+ try:
427
+ libdir = subdir.relative_to(prefix)
428
+ except ValueError:
429
+ libdir = subdir
430
+ # pathlib joining makes sure absolute libdir is not appended to '${prefix}'
431
+ return ('${prefix}' / libdir).as_posix()
432
+
433
+ def _generate_pkgconfig_file(self, state: ModuleState, deps: DependenciesHelper,
434
+ subdirs: T.List[str], name: str,
435
+ description: str, url: str, version: str,
436
+ pcfile: str, conflicts: T.List[str],
437
+ variables: T.List[T.Tuple[str, str]],
438
+ unescaped_variables: T.List[T.Tuple[str, str]],
439
+ uninstalled: bool = False, dataonly: bool = False,
440
+ pkgroot: T.Optional[str] = None) -> None:
441
+ coredata = state.environment.get_coredata()
442
+ referenced_vars = set()
443
+ optnames = [x.name for x in BUILTIN_DIR_OPTIONS.keys()]
444
+
445
+ if not dataonly:
446
+ # includedir is always implied, although libdir may not be
447
+ # needed for header-only libraries
448
+ referenced_vars |= {'prefix', 'includedir'}
449
+ if deps.pub_libs or deps.priv_libs:
450
+ referenced_vars |= {'libdir'}
451
+ # also automatically infer variables referenced in other variables
452
+ implicit_vars_warning = False
453
+ redundant_vars_warning = False
454
+ varnames = set()
455
+ varstrings = set()
456
+ for k, v in variables + unescaped_variables:
457
+ varnames |= {k}
458
+ varstrings |= {v}
459
+ for optname in optnames:
460
+ optvar = f'${{{optname}}}'
461
+ if any(x.startswith(optvar) for x in varstrings):
462
+ if optname in varnames:
463
+ redundant_vars_warning = True
464
+ else:
465
+ # these 3 vars were always "implicit"
466
+ if dataonly or optname not in {'prefix', 'includedir', 'libdir'}:
467
+ implicit_vars_warning = True
468
+ referenced_vars |= {'prefix', optname}
469
+ if redundant_vars_warning:
470
+ FeatureDeprecated.single_use('pkgconfig.generate variable for builtin directories', '0.62.0',
471
+ state.subproject, 'They will be automatically included when referenced',
472
+ state.current_node)
473
+ if implicit_vars_warning:
474
+ FeatureNew.single_use('pkgconfig.generate implicit variable for builtin directories', '0.62.0',
475
+ state.subproject, location=state.current_node)
476
+
477
+ if uninstalled:
478
+ outdir = os.path.join(state.environment.build_dir, 'meson-uninstalled')
479
+ if not os.path.exists(outdir):
480
+ os.mkdir(outdir)
481
+ prefix = PurePath(state.environment.get_build_dir())
482
+ srcdir = PurePath(state.environment.get_source_dir())
483
+ else:
484
+ outdir = state.environment.scratch_dir
485
+ prefix = PurePath(_as_str(coredata.get_option(mesonlib.OptionKey('prefix'))))
486
+ if pkgroot:
487
+ pkgroot_ = PurePath(pkgroot)
488
+ if not pkgroot_.is_absolute():
489
+ pkgroot_ = prefix / pkgroot
490
+ elif prefix not in pkgroot_.parents:
491
+ raise mesonlib.MesonException('Pkgconfig prefix cannot be outside of the prefix '
492
+ 'when pkgconfig.relocatable=true. '
493
+ f'Pkgconfig prefix is {pkgroot_.as_posix()}.')
494
+ prefix = PurePath('${pcfiledir}', os.path.relpath(prefix, pkgroot_))
495
+ fname = os.path.join(outdir, pcfile)
496
+ with open(fname, 'w', encoding='utf-8') as ofile:
497
+ for optname in optnames:
498
+ if optname in referenced_vars - varnames:
499
+ if optname == 'prefix':
500
+ ofile.write('prefix={}\n'.format(self._escape(prefix)))
501
+ else:
502
+ dirpath = PurePath(_as_str(coredata.get_option(mesonlib.OptionKey(optname))))
503
+ ofile.write('{}={}\n'.format(optname, self._escape('${prefix}' / dirpath)))
504
+ if uninstalled and not dataonly:
505
+ ofile.write('srcdir={}\n'.format(self._escape(srcdir)))
506
+ if variables or unescaped_variables:
507
+ ofile.write('\n')
508
+ for k, v in variables:
509
+ ofile.write('{}={}\n'.format(k, self._escape(v)))
510
+ for k, v in unescaped_variables:
511
+ ofile.write(f'{k}={v}\n')
512
+ ofile.write('\n')
513
+ ofile.write(f'Name: {name}\n')
514
+ if len(description) > 0:
515
+ ofile.write(f'Description: {description}\n')
516
+ if len(url) > 0:
517
+ ofile.write(f'URL: {url}\n')
518
+ ofile.write(f'Version: {version}\n')
519
+ reqs_str = deps.format_reqs(deps.pub_reqs)
520
+ if len(reqs_str) > 0:
521
+ ofile.write(f'Requires: {reqs_str}\n')
522
+ reqs_str = deps.format_reqs(deps.priv_reqs)
523
+ if len(reqs_str) > 0:
524
+ ofile.write(f'Requires.private: {reqs_str}\n')
525
+ if len(conflicts) > 0:
526
+ ofile.write('Conflicts: {}\n'.format(' '.join(conflicts)))
527
+
528
+ def generate_libs_flags(libs: T.List[LIBS]) -> T.Iterable[str]:
529
+ msg = 'Library target {0!r} has {1!r} set. Compilers ' \
530
+ 'may not find it from its \'-l{2}\' linker flag in the ' \
531
+ '{3!r} pkg-config file.'
532
+ Lflags = []
533
+ for l in libs:
534
+ if isinstance(l, str):
535
+ yield l
536
+ else:
537
+ install_dir: T.Union[str, bool]
538
+ if uninstalled:
539
+ install_dir = os.path.dirname(state.backend.get_target_filename_abs(l))
540
+ else:
541
+ _i = l.get_custom_install_dir()
542
+ install_dir = _i[0] if _i else None
543
+ if install_dir is False:
544
+ continue
545
+ if isinstance(l, build.BuildTarget) and 'cs' in l.compilers:
546
+ if isinstance(install_dir, str):
547
+ Lflag = '-r{}/{}'.format(self._escape(self._make_relative(prefix, install_dir)), l.filename)
548
+ else: # install_dir is True
549
+ Lflag = '-r${libdir}/%s' % l.filename
550
+ else:
551
+ if isinstance(install_dir, str):
552
+ Lflag = '-L{}'.format(self._escape(self._make_relative(prefix, install_dir)))
553
+ else: # install_dir is True
554
+ Lflag = '-L${libdir}'
555
+ if Lflag not in Lflags:
556
+ Lflags.append(Lflag)
557
+ yield Lflag
558
+ lname = self._get_lname(l, msg, pcfile)
559
+ # If using a custom suffix, the compiler may not be able to
560
+ # find the library
561
+ if isinstance(l, build.BuildTarget) and l.name_suffix_set:
562
+ mlog.warning(msg.format(l.name, 'name_suffix', lname, pcfile))
563
+ if isinstance(l, (build.CustomTarget, build.CustomTargetIndex)) or 'cs' not in l.compilers:
564
+ yield f'-l{lname}'
565
+
566
+ if len(deps.pub_libs) > 0:
567
+ ofile.write('Libs: {}\n'.format(' '.join(generate_libs_flags(deps.pub_libs))))
568
+ if len(deps.priv_libs) > 0:
569
+ ofile.write('Libs.private: {}\n'.format(' '.join(generate_libs_flags(deps.priv_libs))))
570
+
571
+ cflags: T.List[str] = []
572
+ if uninstalled:
573
+ for d in deps.uninstalled_incdirs:
574
+ for basedir in ['${prefix}', '${srcdir}']:
575
+ path = self._escape(PurePath(basedir, d).as_posix())
576
+ cflags.append(f'-I{path}')
577
+ else:
578
+ for d in subdirs:
579
+ if d == '.':
580
+ cflags.append('-I${includedir}')
581
+ else:
582
+ cflags.append(self._escape(PurePath('-I${includedir}') / d))
583
+ cflags += [self._escape(f) for f in deps.cflags]
584
+ if cflags and not dataonly:
585
+ ofile.write('Cflags: {}\n'.format(' '.join(cflags)))
586
+
587
+ @typed_pos_args('pkgconfig.generate', optargs=[(build.SharedLibrary, build.StaticLibrary)])
588
+ @typed_kwargs(
589
+ 'pkgconfig.generate',
590
+ D_MODULE_VERSIONS_KW.evolve(since='0.43.0'),
591
+ INSTALL_DIR_KW,
592
+ KwargInfo('conflicts', ContainerTypeInfo(list, str), default=[], listify=True),
593
+ KwargInfo('dataonly', bool, default=False, since='0.54.0'),
594
+ KwargInfo('description', (str, NoneType)),
595
+ KwargInfo('extra_cflags', ContainerTypeInfo(list, str), default=[], listify=True, since='0.42.0'),
596
+ KwargInfo('filebase', (str, NoneType), validator=lambda x: 'must not be an empty string' if x == '' else None),
597
+ KwargInfo('name', (str, NoneType), validator=lambda x: 'must not be an empty string' if x == '' else None),
598
+ KwargInfo('subdirs', ContainerTypeInfo(list, str), default=[], listify=True),
599
+ KwargInfo('url', str, default=''),
600
+ KwargInfo('version', (str, NoneType)),
601
+ VARIABLES_KW.evolve(name="unescaped_uninstalled_variables", since='0.59.0'),
602
+ VARIABLES_KW.evolve(name="unescaped_variables", since='0.59.0'),
603
+ VARIABLES_KW.evolve(name="uninstalled_variables", since='0.54.0', since_values={dict: '0.56.0'}),
604
+ VARIABLES_KW.evolve(since='0.41.0', since_values={dict: '0.56.0'}),
605
+ _PKG_LIBRARIES,
606
+ _PKG_LIBRARIES.evolve(name='libraries_private'),
607
+ _PKG_REQUIRES,
608
+ _PKG_REQUIRES.evolve(name='requires_private'),
609
+ )
610
+ def generate(self, state: ModuleState,
611
+ args: T.Tuple[T.Optional[T.Union[build.SharedLibrary, build.StaticLibrary]]],
612
+ kwargs: GenerateKw) -> ModuleReturnValue:
613
+ if state.is_build_only_subproject:
614
+ return ModuleReturnValue(None, [])
615
+
616
+ default_version = state.project_version
617
+ default_install_dir: T.Optional[str] = None
618
+ default_description: T.Optional[str] = None
619
+ default_name: T.Optional[str] = None
620
+ mainlib: T.Optional[T.Union[build.SharedLibrary, build.StaticLibrary]] = None
621
+ default_subdirs = ['.']
622
+ if args[0]:
623
+ FeatureNew.single_use('pkgconfig.generate optional positional argument', '0.46.0', state.subproject)
624
+ mainlib = args[0]
625
+ default_name = mainlib.name
626
+ default_description = state.project_name + ': ' + mainlib.name
627
+ install_dir = mainlib.get_custom_install_dir()
628
+ if install_dir and isinstance(install_dir[0], str):
629
+ default_install_dir = os.path.join(install_dir[0], 'pkgconfig')
630
+ else:
631
+ if kwargs['version'] is None:
632
+ FeatureNew.single_use('pkgconfig.generate implicit version keyword', '0.46.0', state.subproject)
633
+ msg = ('pkgconfig.generate: if a library is not passed as a '
634
+ 'positional argument, the {!r} keyword argument is '
635
+ 'required.')
636
+ if kwargs['name'] is None:
637
+ raise build.InvalidArguments(msg.format('name'))
638
+ if kwargs['description'] is None:
639
+ raise build.InvalidArguments(msg.format('description'))
640
+
641
+ dataonly = kwargs['dataonly']
642
+ if dataonly:
643
+ default_subdirs = []
644
+ blocked_vars = ['libraries', 'libraries_private', 'requires_private', 'extra_cflags', 'subdirs']
645
+ # Mypy can't figure out that this TypedDict index is correct, without repeating T.Literal for the entire list
646
+ if any(kwargs[k] for k in blocked_vars): # type: ignore
647
+ raise mesonlib.MesonException(f'Cannot combine dataonly with any of {blocked_vars}')
648
+ default_install_dir = os.path.join(state.environment.get_datadir(), 'pkgconfig')
649
+
650
+ subdirs = kwargs['subdirs'] or default_subdirs
651
+ version = kwargs['version'] if kwargs['version'] is not None else default_version
652
+ name = kwargs['name'] if kwargs['name'] is not None else default_name
653
+ assert isinstance(name, str), 'for mypy'
654
+ filebase = kwargs['filebase'] if kwargs['filebase'] is not None else name
655
+ description = kwargs['description'] if kwargs['description'] is not None else default_description
656
+ url = kwargs['url']
657
+ conflicts = kwargs['conflicts']
658
+
659
+ # Prepend the main library to public libraries list. This is required
660
+ # so dep.add_pub_libs() can handle dependency ordering correctly and put
661
+ # extra libraries after the main library.
662
+ libraries = kwargs['libraries'].copy()
663
+ if mainlib:
664
+ libraries.insert(0, mainlib)
665
+
666
+ deps = DependenciesHelper(state, filebase, self._metadata)
667
+ deps.add_pub_libs(libraries)
668
+ deps.add_priv_libs(kwargs['libraries_private'])
669
+ deps.add_pub_reqs(kwargs['requires'])
670
+ deps.add_priv_reqs(kwargs['requires_private'])
671
+ deps.add_cflags(kwargs['extra_cflags'])
672
+
673
+ dversions = kwargs['d_module_versions']
674
+ if dversions:
675
+ compiler = state.environment.coredata.compilers.host.get('d')
676
+ if compiler:
677
+ deps.add_cflags(compiler.get_feature_args(
678
+ {'versions': dversions, 'import_dirs': [], 'debug': [], 'unittest': False}, None))
679
+
680
+ deps.remove_dups()
681
+
682
+ def parse_variable_list(vardict: T.Dict[str, str]) -> T.List[T.Tuple[str, str]]:
683
+ reserved = ['prefix', 'libdir', 'includedir']
684
+ variables = []
685
+ for name, value in vardict.items():
686
+ if not value:
687
+ FeatureNew.single_use('empty variable value in pkg.generate', '1.4.0', state.subproject, location=state.current_node)
688
+ if not dataonly and name in reserved:
689
+ raise mesonlib.MesonException(f'Variable "{name}" is reserved')
690
+ variables.append((name, value))
691
+ return variables
692
+
693
+ variables = parse_variable_list(kwargs['variables'])
694
+ unescaped_variables = parse_variable_list(kwargs['unescaped_variables'])
695
+
696
+ pcfile = filebase + '.pc'
697
+ pkgroot = pkgroot_name = kwargs['install_dir'] or default_install_dir
698
+ if pkgroot is None:
699
+ if mesonlib.is_freebsd():
700
+ pkgroot = os.path.join(_as_str(state.environment.coredata.get_option(mesonlib.OptionKey('prefix'))), 'libdata', 'pkgconfig')
701
+ pkgroot_name = os.path.join('{prefix}', 'libdata', 'pkgconfig')
702
+ elif mesonlib.is_haiku():
703
+ pkgroot = os.path.join(_as_str(state.environment.coredata.get_option(mesonlib.OptionKey('prefix'))), 'develop', 'lib', 'pkgconfig')
704
+ pkgroot_name = os.path.join('{prefix}', 'develop', 'lib', 'pkgconfig')
705
+ else:
706
+ pkgroot = os.path.join(_as_str(state.environment.coredata.get_option(mesonlib.OptionKey('libdir'))), 'pkgconfig')
707
+ pkgroot_name = os.path.join('{libdir}', 'pkgconfig')
708
+ relocatable = state.get_option('relocatable', module='pkgconfig')
709
+ self._generate_pkgconfig_file(state, deps, subdirs, name, description, url,
710
+ version, pcfile, conflicts, variables,
711
+ unescaped_variables, False, dataonly,
712
+ pkgroot=pkgroot if relocatable else None)
713
+ res = build.Data([mesonlib.File(True, state.environment.get_scratch_dir(), pcfile)], pkgroot, pkgroot_name, None, state.subproject, install_tag='devel')
714
+ variables = parse_variable_list(kwargs['uninstalled_variables'])
715
+ unescaped_variables = parse_variable_list(kwargs['unescaped_uninstalled_variables'])
716
+
717
+ pcfile = filebase + '-uninstalled.pc'
718
+ self._generate_pkgconfig_file(state, deps, subdirs, name, description, url,
719
+ version, pcfile, conflicts, variables,
720
+ unescaped_variables, uninstalled=True, dataonly=dataonly)
721
+ # Associate the main library with this generated pc file. If the library
722
+ # is used in any subsequent call to the generated, it will generate a
723
+ # 'Requires:' or 'Requires.private:'.
724
+ # Backward compatibility: We used to set 'generated_pc' on all public
725
+ # libraries instead of just the main one. Keep doing that but warn if
726
+ # anyone is relying on that deprecated behaviour.
727
+ if mainlib:
728
+ if mainlib.get_id() not in self._metadata:
729
+ self._metadata[mainlib.get_id()] = MetaData(
730
+ filebase, name, state.current_node)
731
+ else:
732
+ mlog.warning('Already generated a pkg-config file for', mlog.bold(mainlib.name))
733
+ else:
734
+ for lib in deps.pub_libs:
735
+ if not isinstance(lib, str) and lib.get_id() not in self._metadata:
736
+ self._metadata[lib.get_id()] = MetaData(
737
+ filebase, name, state.current_node)
738
+ if self.devenv is None:
739
+ self.devenv = PkgConfigInterface.get_env(state.environment, mesonlib.MachineChoice.HOST, uninstalled=True)
740
+ return ModuleReturnValue(res, [res])
741
+
742
+
743
+ def initialize(interp: Interpreter) -> PkgConfigModule:
744
+ return PkgConfigModule()