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,570 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2021 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ from pathlib import Path
7
+
8
+ from .base import ExternalDependency, DependencyException, sort_libpaths, DependencyTypeName
9
+ from ..mesonlib import EnvironmentVariables, OptionKey, OrderedSet, PerMachine, Popen_safe, Popen_safe_logged, MachineChoice, join_args
10
+ from ..programs import find_external_program, ExternalProgram
11
+ from .. import mlog
12
+ from pathlib import PurePath
13
+ from functools import lru_cache
14
+ import re
15
+ import os
16
+ import shlex
17
+ import typing as T
18
+
19
+ if T.TYPE_CHECKING:
20
+ from typing_extensions import Literal
21
+ from .._typing import ImmutableListProtocol
22
+
23
+ from ..environment import Environment
24
+ from ..utils.core import EnvironOrDict
25
+ from ..interpreter.type_checking import PkgConfigDefineType
26
+
27
+ class PkgConfigInterface:
28
+ '''Base class wrapping a pkg-config implementation'''
29
+
30
+ class_impl: PerMachine[T.Union[Literal[False], T.Optional[PkgConfigInterface]]] = PerMachine(False, False)
31
+ class_cli_impl: PerMachine[T.Union[Literal[False], T.Optional[PkgConfigCLI]]] = PerMachine(False, False)
32
+
33
+ @staticmethod
34
+ def instance(env: Environment, for_machine: MachineChoice, silent: bool) -> T.Optional[PkgConfigInterface]:
35
+ '''Return a pkg-config implementation singleton'''
36
+ for_machine = for_machine if env.is_cross_build() else MachineChoice.HOST
37
+ impl = PkgConfigInterface.class_impl[for_machine]
38
+ if impl is False:
39
+ impl = PkgConfigCLI(env, for_machine, silent)
40
+ if not impl.found():
41
+ impl = None
42
+ if not impl and not silent:
43
+ mlog.log('Found pkg-config:', mlog.red('NO'))
44
+ PkgConfigInterface.class_impl[for_machine] = impl
45
+ return impl
46
+
47
+ @staticmethod
48
+ def _cli(env: Environment, for_machine: MachineChoice, silent: bool = False) -> T.Optional[PkgConfigCLI]:
49
+ '''Return the CLI pkg-config implementation singleton
50
+ Even when we use another implementation internally, external tools might
51
+ still need the CLI implementation.
52
+ '''
53
+ for_machine = for_machine if env.is_cross_build() else MachineChoice.HOST
54
+ impl: T.Union[Literal[False], T.Optional[PkgConfigInterface]] # Help confused mypy
55
+ impl = PkgConfigInterface.instance(env, for_machine, silent)
56
+ if impl and not isinstance(impl, PkgConfigCLI):
57
+ impl = PkgConfigInterface.class_cli_impl[for_machine]
58
+ if impl is False:
59
+ impl = PkgConfigCLI(env, for_machine, silent)
60
+ if not impl.found():
61
+ impl = None
62
+ PkgConfigInterface.class_cli_impl[for_machine] = impl
63
+ return T.cast('T.Optional[PkgConfigCLI]', impl) # Trust me, mypy
64
+
65
+ @staticmethod
66
+ def get_env(env: Environment, for_machine: MachineChoice, uninstalled: bool = False) -> EnvironmentVariables:
67
+ cli = PkgConfigInterface._cli(env, for_machine)
68
+ return cli._get_env(uninstalled) if cli else EnvironmentVariables()
69
+
70
+ @staticmethod
71
+ def setup_env(environ: EnvironOrDict, env: Environment, for_machine: MachineChoice,
72
+ uninstalled: bool = False) -> EnvironOrDict:
73
+ cli = PkgConfigInterface._cli(env, for_machine)
74
+ return cli._setup_env(environ, uninstalled) if cli else environ
75
+
76
+ def __init__(self, env: Environment, for_machine: MachineChoice) -> None:
77
+ self.env = env
78
+ self.for_machine = for_machine
79
+
80
+ def found(self) -> bool:
81
+ '''Return whether pkg-config is supported'''
82
+ raise NotImplementedError
83
+
84
+ def version(self, name: str) -> T.Optional[str]:
85
+ '''Return module version or None if not found'''
86
+ raise NotImplementedError
87
+
88
+ def cflags(self, name: str, allow_system: bool = False,
89
+ define_variable: PkgConfigDefineType = None) -> ImmutableListProtocol[str]:
90
+ '''Return module cflags
91
+ @allow_system: If False, remove default system include paths
92
+ '''
93
+ raise NotImplementedError
94
+
95
+ def libs(self, name: str, static: bool = False, allow_system: bool = False,
96
+ define_variable: PkgConfigDefineType = None) -> ImmutableListProtocol[str]:
97
+ '''Return module libs
98
+ @static: If True, also include private libraries
99
+ @allow_system: If False, remove default system libraries search paths
100
+ '''
101
+ raise NotImplementedError
102
+
103
+ def variable(self, name: str, variable_name: str,
104
+ define_variable: PkgConfigDefineType) -> T.Optional[str]:
105
+ '''Return module variable or None if variable is not defined'''
106
+ raise NotImplementedError
107
+
108
+ def list_all(self) -> ImmutableListProtocol[str]:
109
+ '''Return all available pkg-config modules'''
110
+ raise NotImplementedError
111
+
112
+ class PkgConfigCLI(PkgConfigInterface):
113
+ '''pkg-config CLI implementation'''
114
+
115
+ def __init__(self, env: Environment, for_machine: MachineChoice, silent: bool) -> None:
116
+ super().__init__(env, for_machine)
117
+ self._detect_pkgbin()
118
+ if self.pkgbin and not silent:
119
+ mlog.log('Found pkg-config:', mlog.green('YES'), mlog.bold(f'({self.pkgbin.get_path()})'), mlog.blue(self.pkgbin_version))
120
+
121
+ def found(self) -> bool:
122
+ return bool(self.pkgbin)
123
+
124
+ @lru_cache(maxsize=None)
125
+ def version(self, name: str) -> T.Optional[str]:
126
+ mlog.debug(f'Determining dependency {name!r} with pkg-config executable {self.pkgbin.get_path()!r}')
127
+ ret, version, _ = self._call_pkgbin(['--modversion', name])
128
+ return version if ret == 0 else None
129
+
130
+ @staticmethod
131
+ def _define_variable_args(define_variable: PkgConfigDefineType) -> T.List[str]:
132
+ ret = []
133
+ if define_variable:
134
+ for pair in define_variable:
135
+ ret.append('--define-variable=' + '='.join(pair))
136
+ return ret
137
+
138
+ @lru_cache(maxsize=None)
139
+ def cflags(self, name: str, allow_system: bool = False,
140
+ define_variable: PkgConfigDefineType = None) -> ImmutableListProtocol[str]:
141
+ env = None
142
+ if allow_system:
143
+ env = os.environ.copy()
144
+ env['PKG_CONFIG_ALLOW_SYSTEM_CFLAGS'] = '1'
145
+ args: T.List[str] = []
146
+ args += self._define_variable_args(define_variable)
147
+ args += ['--cflags', name]
148
+ ret, out, err = self._call_pkgbin(args, env=env)
149
+ if ret != 0:
150
+ raise DependencyException(f'Could not generate cflags for {name}:\n{err}\n')
151
+ return self._split_args(out)
152
+
153
+ @lru_cache(maxsize=None)
154
+ def libs(self, name: str, static: bool = False, allow_system: bool = False,
155
+ define_variable: PkgConfigDefineType = None) -> ImmutableListProtocol[str]:
156
+ env = None
157
+ if allow_system:
158
+ env = os.environ.copy()
159
+ env['PKG_CONFIG_ALLOW_SYSTEM_LIBS'] = '1'
160
+ args: T.List[str] = []
161
+ args += self._define_variable_args(define_variable)
162
+ if static:
163
+ args.append('--static')
164
+ args += ['--libs', name]
165
+ ret, out, err = self._call_pkgbin(args, env=env)
166
+ if ret != 0:
167
+ raise DependencyException(f'Could not generate libs for {name}:\n{err}\n')
168
+ return self._split_args(out)
169
+
170
+ @lru_cache(maxsize=None)
171
+ def variable(self, name: str, variable_name: str,
172
+ define_variable: PkgConfigDefineType) -> T.Optional[str]:
173
+ args: T.List[str] = []
174
+ args += self._define_variable_args(define_variable)
175
+ args += ['--variable=' + variable_name, name]
176
+ ret, out, err = self._call_pkgbin(args)
177
+ if ret != 0:
178
+ raise DependencyException(f'Could not get variable for {name}:\n{err}\n')
179
+ variable = out.strip()
180
+ # pkg-config doesn't distinguish between empty and nonexistent variables
181
+ # use the variable list to check for variable existence
182
+ if not variable:
183
+ ret, out, _ = self._call_pkgbin(['--print-variables', name])
184
+ if not re.search(rf'^{variable_name}$', out, re.MULTILINE):
185
+ return None
186
+ mlog.debug(f'Got pkg-config variable {variable_name} : {variable}')
187
+ return variable
188
+
189
+ @lru_cache(maxsize=None)
190
+ def list_all(self) -> ImmutableListProtocol[str]:
191
+ ret, out, err = self._call_pkgbin(['--list-all'])
192
+ if ret != 0:
193
+ raise DependencyException(f'could not list modules:\n{err}\n')
194
+ return [i.split(' ', 1)[0] for i in out.splitlines()]
195
+
196
+ @staticmethod
197
+ def _split_args(cmd: str) -> T.List[str]:
198
+ # pkg-config paths follow Unix conventions, even on Windows; split the
199
+ # output using shlex.split rather than mesonlib.split_args
200
+ return shlex.split(cmd)
201
+
202
+ def _detect_pkgbin(self) -> None:
203
+ for potential_pkgbin in find_external_program(
204
+ self.env, self.for_machine, 'pkg-config', 'Pkg-config',
205
+ self.env.default_pkgconfig, allow_default_for_cross=False):
206
+ version_if_ok = self._check_pkgconfig(potential_pkgbin)
207
+ if version_if_ok:
208
+ self.pkgbin = potential_pkgbin
209
+ self.pkgbin_version = version_if_ok
210
+ return
211
+ self.pkgbin = None
212
+
213
+ def _check_pkgconfig(self, pkgbin: ExternalProgram) -> T.Optional[str]:
214
+ if not pkgbin.found():
215
+ mlog.log(f'Did not find pkg-config by name {pkgbin.name!r}')
216
+ return None
217
+ command_as_string = ' '.join(pkgbin.get_command())
218
+ try:
219
+ helptext = Popen_safe(pkgbin.get_command() + ['--help'])[1]
220
+ if 'Pure-Perl' in helptext:
221
+ mlog.log(f'Found pkg-config {command_as_string!r} but it is Strawberry Perl and thus broken. Ignoring...')
222
+ return None
223
+ p, out = Popen_safe(pkgbin.get_command() + ['--version'])[0:2]
224
+ if p.returncode != 0:
225
+ mlog.warning(f'Found pkg-config {command_as_string!r} but it failed when ran')
226
+ return None
227
+ except FileNotFoundError:
228
+ mlog.warning(f'We thought we found pkg-config {command_as_string!r} but now it\'s not there. How odd!')
229
+ return None
230
+ except PermissionError:
231
+ msg = f'Found pkg-config {command_as_string!r} but didn\'t have permissions to run it.'
232
+ if not self.env.machines.build.is_windows():
233
+ msg += '\n\nOn Unix-like systems this is often caused by scripts that are not executable.'
234
+ mlog.warning(msg)
235
+ return None
236
+ return out.strip()
237
+
238
+ def _get_env(self, uninstalled: bool = False) -> EnvironmentVariables:
239
+ env = EnvironmentVariables()
240
+ key = OptionKey('pkg_config_path', machine=self.for_machine)
241
+ extra_paths: T.List[str] = self.env.coredata.options[key].value[:]
242
+ if uninstalled:
243
+ uninstalled_path = Path(self.env.get_build_dir(), 'meson-uninstalled').as_posix()
244
+ if uninstalled_path not in extra_paths:
245
+ extra_paths.append(uninstalled_path)
246
+ env.set('PKG_CONFIG_PATH', extra_paths)
247
+ sysroot = self.env.properties[self.for_machine].get_sys_root()
248
+ if sysroot:
249
+ env.set('PKG_CONFIG_SYSROOT_DIR', [sysroot])
250
+ pkg_config_libdir_prop = self.env.properties[self.for_machine].get_pkg_config_libdir()
251
+ if pkg_config_libdir_prop:
252
+ env.set('PKG_CONFIG_LIBDIR', pkg_config_libdir_prop)
253
+ env.set('PKG_CONFIG', [join_args(self.pkgbin.get_command())])
254
+ return env
255
+
256
+ def _setup_env(self, env: EnvironOrDict, uninstalled: bool = False) -> T.Dict[str, str]:
257
+ envvars = self._get_env(uninstalled)
258
+ env = envvars.get_env(env)
259
+ # Dump all PKG_CONFIG environment variables
260
+ for key, value in env.items():
261
+ if key.startswith('PKG_'):
262
+ mlog.debug(f'env[{key}]: {value}')
263
+ return env
264
+
265
+ def _call_pkgbin(self, args: T.List[str], env: T.Optional[EnvironOrDict] = None) -> T.Tuple[int, str, str]:
266
+ assert isinstance(self.pkgbin, ExternalProgram)
267
+ env = env or os.environ
268
+ env = self._setup_env(env)
269
+ cmd = self.pkgbin.get_command() + args
270
+ p, out, err = Popen_safe_logged(cmd, env=env)
271
+ return p.returncode, out.strip(), err.strip()
272
+
273
+
274
+ class PkgConfigDependency(ExternalDependency):
275
+
276
+ def __init__(self, name: str, environment: Environment, kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None) -> None:
277
+ super().__init__(DependencyTypeName('pkgconfig'), environment, kwargs, language=language)
278
+ self.name = name
279
+ self.is_libtool = False
280
+ pkgconfig = PkgConfigInterface.instance(self.env, self.for_machine, self.silent)
281
+ if not pkgconfig:
282
+ msg = f'Pkg-config for machine {self.for_machine} not found. Giving up.'
283
+ if self.required:
284
+ raise DependencyException(msg)
285
+ mlog.debug(msg)
286
+ return
287
+ self.pkgconfig = pkgconfig
288
+
289
+ version = self.pkgconfig.version(name)
290
+ if version is None:
291
+ return
292
+
293
+ self.version = version
294
+ self.is_found = True
295
+
296
+ try:
297
+ # Fetch cargs to be used while using this dependency
298
+ self._set_cargs()
299
+ # Fetch the libraries and library paths needed for using this
300
+ self._set_libs()
301
+ except DependencyException as e:
302
+ mlog.debug(f"Pkg-config error with '{name}': {e}")
303
+ if self.required:
304
+ raise
305
+ else:
306
+ self.compile_args = []
307
+ self.link_args = []
308
+ self.is_found = False
309
+ self.reason = e
310
+
311
+ def __repr__(self) -> str:
312
+ s = '<{0} {1}: {2} {3}>'
313
+ return s.format(self.__class__.__name__, self.name, self.is_found,
314
+ self.version_reqs)
315
+
316
+ def _convert_mingw_paths(self, args: ImmutableListProtocol[str]) -> T.List[str]:
317
+ '''
318
+ Both MSVC and native Python on Windows cannot handle MinGW-esque /c/foo
319
+ paths so convert them to C:/foo. We cannot resolve other paths starting
320
+ with / like /home/foo so leave them as-is so that the user gets an
321
+ error/warning from the compiler/linker.
322
+ '''
323
+ if not self.env.machines.build.is_windows():
324
+ return args.copy()
325
+ converted = []
326
+ for arg in args:
327
+ pargs: T.Tuple[str, ...] = tuple()
328
+ # Library search path
329
+ if arg.startswith('-L/'):
330
+ pargs = PurePath(arg[2:]).parts
331
+ tmpl = '-L{}:/{}'
332
+ elif arg.startswith('-I/'):
333
+ pargs = PurePath(arg[2:]).parts
334
+ tmpl = '-I{}:/{}'
335
+ # Full path to library or .la file
336
+ elif arg.startswith('/'):
337
+ pargs = PurePath(arg).parts
338
+ tmpl = '{}:/{}'
339
+ elif arg.startswith(('-L', '-I')) or (len(arg) > 2 and arg[1] == ':'):
340
+ # clean out improper '\\ ' as comes from some Windows pkg-config files
341
+ arg = arg.replace('\\ ', ' ')
342
+ if len(pargs) > 1 and len(pargs[1]) == 1:
343
+ arg = tmpl.format(pargs[1], '/'.join(pargs[2:]))
344
+ converted.append(arg)
345
+ return converted
346
+
347
+ def _set_cargs(self) -> None:
348
+ allow_system = False
349
+ if self.language == 'fortran':
350
+ # gfortran doesn't appear to look in system paths for INCLUDE files,
351
+ # so don't allow pkg-config to suppress -I flags for system paths
352
+ allow_system = True
353
+ cflags = self.pkgconfig.cflags(self.name, allow_system)
354
+ self.compile_args = self._convert_mingw_paths(cflags)
355
+
356
+ def _search_libs(self, libs_in: ImmutableListProtocol[str], raw_libs_in: ImmutableListProtocol[str]) -> T.Tuple[T.List[str], T.List[str]]:
357
+ '''
358
+ @libs_in: PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 pkg-config --libs
359
+ @raw_libs_in: pkg-config --libs
360
+
361
+ We always look for the file ourselves instead of depending on the
362
+ compiler to find it with -lfoo or foo.lib (if possible) because:
363
+ 1. We want to be able to select static or shared
364
+ 2. We need the full path of the library to calculate RPATH values
365
+ 3. De-dup of libraries is easier when we have absolute paths
366
+
367
+ Libraries that are provided by the toolchain or are not found by
368
+ find_library() will be added with -L -l pairs.
369
+ '''
370
+ # Library paths should be safe to de-dup
371
+ #
372
+ # First, figure out what library paths to use. Originally, we were
373
+ # doing this as part of the loop, but due to differences in the order
374
+ # of -L values between pkg-config and pkgconf, we need to do that as
375
+ # a separate step. See:
376
+ # https://github.com/mesonbuild/meson/issues/3951
377
+ # https://github.com/mesonbuild/meson/issues/4023
378
+ #
379
+ # Separate system and prefix paths, and ensure that prefix paths are
380
+ # always searched first.
381
+ prefix_libpaths: OrderedSet[str] = OrderedSet()
382
+ # We also store this raw_link_args on the object later
383
+ raw_link_args = self._convert_mingw_paths(raw_libs_in)
384
+ for arg in raw_link_args:
385
+ if arg.startswith('-L') and not arg.startswith(('-L-l', '-L-L')):
386
+ path = arg[2:]
387
+ if not os.path.isabs(path):
388
+ # Resolve the path as a compiler in the build directory would
389
+ path = os.path.join(self.env.get_build_dir(), path)
390
+ prefix_libpaths.add(path)
391
+ # Library paths are not always ordered in a meaningful way
392
+ #
393
+ # Instead of relying on pkg-config or pkgconf to provide -L flags in a
394
+ # specific order, we reorder library paths ourselves, according to th
395
+ # order specified in PKG_CONFIG_PATH. See:
396
+ # https://github.com/mesonbuild/meson/issues/4271
397
+ #
398
+ # Only prefix_libpaths are reordered here because there should not be
399
+ # too many system_libpaths to cause library version issues.
400
+ pkg_config_path: T.List[str] = self.env.coredata.options[OptionKey('pkg_config_path', machine=self.for_machine)].value
401
+ pkg_config_path = self._convert_mingw_paths(pkg_config_path)
402
+ prefix_libpaths = OrderedSet(sort_libpaths(list(prefix_libpaths), pkg_config_path))
403
+ system_libpaths: OrderedSet[str] = OrderedSet()
404
+ full_args = self._convert_mingw_paths(libs_in)
405
+ for arg in full_args:
406
+ if arg.startswith(('-L-l', '-L-L')):
407
+ # These are D language arguments, not library paths
408
+ continue
409
+ if arg.startswith('-L') and arg[2:] not in prefix_libpaths:
410
+ system_libpaths.add(arg[2:])
411
+ # Use this re-ordered path list for library resolution
412
+ libpaths = list(prefix_libpaths) + list(system_libpaths)
413
+ # Track -lfoo libraries to avoid duplicate work
414
+ libs_found: OrderedSet[str] = OrderedSet()
415
+ # Track not-found libraries to know whether to add library paths
416
+ libs_notfound = []
417
+ # Generate link arguments for this library
418
+ link_args = []
419
+ for lib in full_args:
420
+ if lib.startswith(('-L-l', '-L-L')):
421
+ # These are D language arguments, add them as-is
422
+ pass
423
+ elif lib.startswith('-L'):
424
+ # We already handled library paths above
425
+ continue
426
+ elif lib.startswith('-l:'):
427
+ # see: https://stackoverflow.com/questions/48532868/gcc-library-option-with-a-colon-llibevent-a
428
+ # also : See the documentation of -lnamespec | --library=namespec in the linker manual
429
+ # https://sourceware.org/binutils/docs-2.18/ld/Options.html
430
+
431
+ # Don't resolve the same -l:libfoo.a argument again
432
+ if lib in libs_found:
433
+ continue
434
+ libfilename = lib[3:]
435
+ foundname = None
436
+ for libdir in libpaths:
437
+ target = os.path.join(libdir, libfilename)
438
+ if os.path.exists(target):
439
+ foundname = target
440
+ break
441
+ if foundname is None:
442
+ if lib in libs_notfound:
443
+ continue
444
+ else:
445
+ mlog.warning('Library {!r} not found for dependency {!r}, may '
446
+ 'not be successfully linked'.format(libfilename, self.name))
447
+ libs_notfound.append(lib)
448
+ else:
449
+ lib = foundname
450
+ elif lib.startswith('-l'):
451
+ # Don't resolve the same -lfoo argument again
452
+ if lib in libs_found:
453
+ continue
454
+ if self.clib_compiler:
455
+ args = self.clib_compiler.find_library(lib[2:], self.env,
456
+ libpaths, self.libtype,
457
+ lib_prefix_warning=False)
458
+ # If the project only uses a non-clib language such as D, Rust,
459
+ # C#, Python, etc, all we can do is limp along by adding the
460
+ # arguments as-is and then adding the libpaths at the end.
461
+ else:
462
+ args = None
463
+ if args is not None:
464
+ libs_found.add(lib)
465
+ # Replace -l arg with full path to library if available
466
+ # else, library is either to be ignored, or is provided by
467
+ # the compiler, can't be resolved, and should be used as-is
468
+ if args:
469
+ if not args[0].startswith('-l'):
470
+ lib = args[0]
471
+ else:
472
+ continue
473
+ else:
474
+ # Library wasn't found, maybe we're looking in the wrong
475
+ # places or the library will be provided with LDFLAGS or
476
+ # LIBRARY_PATH from the environment (on macOS), and many
477
+ # other edge cases that we can't account for.
478
+ #
479
+ # Add all -L paths and use it as -lfoo
480
+ if lib in libs_notfound:
481
+ continue
482
+ if self.static:
483
+ mlog.warning('Static library {!r} not found for dependency {!r}, may '
484
+ 'not be statically linked'.format(lib[2:], self.name))
485
+ libs_notfound.append(lib)
486
+ elif lib.endswith(".la"):
487
+ shared_libname = self.extract_libtool_shlib(lib)
488
+ shared_lib = os.path.join(os.path.dirname(lib), shared_libname)
489
+ if not os.path.exists(shared_lib):
490
+ shared_lib = os.path.join(os.path.dirname(lib), ".libs", shared_libname)
491
+
492
+ if not os.path.exists(shared_lib):
493
+ raise DependencyException(f'Got a libtools specific "{lib}" dependencies'
494
+ 'but we could not compute the actual shared'
495
+ 'library path')
496
+ self.is_libtool = True
497
+ lib = shared_lib
498
+ if lib in link_args:
499
+ continue
500
+ link_args.append(lib)
501
+ # Add all -Lbar args if we have -lfoo args in link_args
502
+ if libs_notfound:
503
+ # Order of -L flags doesn't matter with ld, but it might with other
504
+ # linkers such as MSVC, so prepend them.
505
+ link_args = ['-L' + lp for lp in prefix_libpaths] + link_args
506
+ return link_args, raw_link_args
507
+
508
+ def _set_libs(self) -> None:
509
+ # Force pkg-config to output -L fields even if they are system
510
+ # paths so we can do manual searching with cc.find_library() later.
511
+ libs = self.pkgconfig.libs(self.name, self.static, allow_system=True)
512
+ # Also get the 'raw' output without -Lfoo system paths for adding -L
513
+ # args with -lfoo when a library can't be found, and also in
514
+ # gnome.generate_gir + gnome.gtkdoc which need -L -l arguments.
515
+ raw_libs = self.pkgconfig.libs(self.name, self.static, allow_system=False)
516
+ self.link_args, self.raw_link_args = self._search_libs(libs, raw_libs)
517
+
518
+ def extract_field(self, la_file: str, fieldname: str) -> T.Optional[str]:
519
+ with open(la_file, encoding='utf-8') as f:
520
+ for line in f:
521
+ arr = line.strip().split('=')
522
+ if arr[0] == fieldname:
523
+ return arr[1][1:-1]
524
+ return None
525
+
526
+ def extract_dlname_field(self, la_file: str) -> T.Optional[str]:
527
+ return self.extract_field(la_file, 'dlname')
528
+
529
+ def extract_libdir_field(self, la_file: str) -> T.Optional[str]:
530
+ return self.extract_field(la_file, 'libdir')
531
+
532
+ def extract_libtool_shlib(self, la_file: str) -> T.Optional[str]:
533
+ '''
534
+ Returns the path to the shared library
535
+ corresponding to this .la file
536
+ '''
537
+ dlname = self.extract_dlname_field(la_file)
538
+ if dlname is None:
539
+ return None
540
+
541
+ # Darwin uses absolute paths where possible; since the libtool files never
542
+ # contain absolute paths, use the libdir field
543
+ if self.env.machines[self.for_machine].is_darwin():
544
+ dlbasename = os.path.basename(dlname)
545
+ libdir = self.extract_libdir_field(la_file)
546
+ if libdir is None:
547
+ return dlbasename
548
+ return os.path.join(libdir, dlbasename)
549
+ # From the comments in extract_libtool(), older libtools had
550
+ # a path rather than the raw dlname
551
+ return os.path.basename(dlname)
552
+
553
+ @staticmethod
554
+ def log_tried() -> str:
555
+ return 'pkgconfig'
556
+
557
+ def get_variable(self, *, cmake: T.Optional[str] = None, pkgconfig: T.Optional[str] = None,
558
+ configtool: T.Optional[str] = None, internal: T.Optional[str] = None,
559
+ default_value: T.Optional[str] = None,
560
+ pkgconfig_define: PkgConfigDefineType = None) -> str:
561
+ if pkgconfig:
562
+ try:
563
+ variable = self.pkgconfig.variable(self.name, pkgconfig, pkgconfig_define)
564
+ if variable is not None:
565
+ return variable
566
+ except DependencyException:
567
+ pass
568
+ if default_value is not None:
569
+ return default_value
570
+ raise DependencyException(f'Could not get pkg-config variable and no default provided for {self!r}')
@@ -0,0 +1,52 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2017 The Meson development team
3
+
4
+ # This file contains the detection logic for external dependencies that are
5
+ # platform-specific (generally speaking).
6
+ from __future__ import annotations
7
+
8
+ from .base import DependencyTypeName, ExternalDependency, DependencyException
9
+ from .detect import packages
10
+ from ..mesonlib import MesonException
11
+ import typing as T
12
+
13
+ if T.TYPE_CHECKING:
14
+ from ..environment import Environment
15
+
16
+ class AppleFrameworks(ExternalDependency):
17
+ def __init__(self, env: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
18
+ super().__init__(DependencyTypeName('appleframeworks'), env, kwargs)
19
+ modules = kwargs.get('modules', [])
20
+ if isinstance(modules, str):
21
+ modules = [modules]
22
+ if not modules:
23
+ raise DependencyException("AppleFrameworks dependency requires at least one module.")
24
+ self.frameworks = modules
25
+ if not self.clib_compiler:
26
+ raise DependencyException('No C-like compilers are available, cannot find the framework')
27
+ self.is_found = True
28
+ for f in self.frameworks:
29
+ try:
30
+ args = self.clib_compiler.find_framework(f, env, [])
31
+ except MesonException as e:
32
+ if 'non-clang' in str(e):
33
+ self.is_found = False
34
+ self.link_args = []
35
+ self.compile_args = []
36
+ return
37
+ raise
38
+
39
+ if args is not None:
40
+ # No compile args are needed for system frameworks
41
+ self.link_args += args
42
+ else:
43
+ self.is_found = False
44
+
45
+ def log_info(self) -> str:
46
+ return ', '.join(self.frameworks)
47
+
48
+ @staticmethod
49
+ def log_tried() -> str:
50
+ return 'framework'
51
+
52
+ packages['appleframeworks'] = AppleFrameworks