frida 16.2.1 → 16.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
@@ -0,0 +1,900 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2012-2021 The Meson development team
3
+ # Copyright © 2021 Intel Corporation
4
+ from __future__ import annotations
5
+
6
+ import collections
7
+ import enum
8
+ import functools
9
+ import os
10
+ import itertools
11
+ import typing as T
12
+
13
+ from .. import build
14
+ from .. import coredata
15
+ from .. import dependencies
16
+ from .. import mesonlib
17
+ from .. import mlog
18
+ from ..compilers import SUFFIX_TO_LANG
19
+ from ..compilers.compilers import CompileCheckMode
20
+ from ..interpreterbase import (ObjectHolder, noPosargs, noKwargs,
21
+ FeatureNew, FeatureNewKwargs, disablerIfNotFound,
22
+ InterpreterException)
23
+ from ..interpreterbase.decorators import ContainerTypeInfo, typed_kwargs, KwargInfo, typed_pos_args
24
+ from ..mesonlib import OptionKey
25
+ from .interpreterobjects import (extract_required_kwarg, extract_search_dirs)
26
+ from .type_checking import REQUIRED_KW, in_set_validator, NoneType
27
+
28
+ if T.TYPE_CHECKING:
29
+ from ..interpreter import Interpreter
30
+ from ..compilers import Compiler, RunResult
31
+ from ..interpreterbase import TYPE_var, TYPE_kwargs
32
+ from .kwargs import ExtractRequired, ExtractSearchDirs
33
+ from .interpreter import SourceOutputs
34
+ from ..mlog import TV_LoggableList
35
+
36
+ from typing_extensions import TypedDict, Literal
37
+
38
+ class GetSupportedArgumentKw(TypedDict):
39
+
40
+ checked: Literal['warn', 'require', 'off']
41
+
42
+ class AlignmentKw(TypedDict):
43
+
44
+ prefix: str
45
+ args: T.List[str]
46
+ dependencies: T.List[dependencies.Dependency]
47
+
48
+ class BaseCompileKW(TypedDict):
49
+ no_builtin_args: bool
50
+ include_directories: T.List[build.IncludeDirs]
51
+ args: T.List[str]
52
+
53
+ class CompileKW(BaseCompileKW):
54
+
55
+ name: str
56
+ dependencies: T.List[dependencies.Dependency]
57
+ werror: bool
58
+
59
+ class CommonKW(BaseCompileKW):
60
+
61
+ prefix: str
62
+ dependencies: T.List[dependencies.Dependency]
63
+
64
+ class ComputeIntKW(CommonKW):
65
+
66
+ guess: T.Optional[int]
67
+ high: T.Optional[int]
68
+ low: T.Optional[int]
69
+
70
+ class HeaderKW(CommonKW, ExtractRequired):
71
+ pass
72
+
73
+ class HasKW(CommonKW, ExtractRequired):
74
+ pass
75
+
76
+ class HasArgumentKW(ExtractRequired):
77
+ pass
78
+
79
+ class FindLibraryKW(ExtractRequired, ExtractSearchDirs):
80
+
81
+ disabler: bool
82
+ has_headers: T.List[str]
83
+ static: bool
84
+
85
+ # This list must be all of the `HeaderKW` values with `header_`
86
+ # prepended to the key
87
+ header_args: T.List[str]
88
+ header_dependencies: T.List[dependencies.Dependency]
89
+ header_include_directories: T.List[build.IncludeDirs]
90
+ header_no_builtin_args: bool
91
+ header_prefix: str
92
+ header_required: T.Union[bool, coredata.UserFeatureOption]
93
+
94
+ class PreprocessKW(TypedDict):
95
+ output: str
96
+ compile_args: T.List[str]
97
+ include_directories: T.List[build.IncludeDirs]
98
+ dependencies: T.List[dependencies.Dependency]
99
+ depends: T.List[T.Union[build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]]
100
+
101
+
102
+ class _TestMode(enum.Enum):
103
+
104
+ """Whether we're doing a compiler or linker check."""
105
+
106
+ COMPILER = 0
107
+ LINKER = 1
108
+
109
+
110
+ class TryRunResultHolder(ObjectHolder['RunResult']):
111
+ def __init__(self, res: 'RunResult', interpreter: 'Interpreter'):
112
+ super().__init__(res, interpreter)
113
+ self.methods.update({'returncode': self.returncode_method,
114
+ 'compiled': self.compiled_method,
115
+ 'stdout': self.stdout_method,
116
+ 'stderr': self.stderr_method,
117
+ })
118
+
119
+ @noPosargs
120
+ @noKwargs
121
+ def returncode_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> int:
122
+ return self.held_object.returncode
123
+
124
+ @noPosargs
125
+ @noKwargs
126
+ def compiled_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> bool:
127
+ return self.held_object.compiled
128
+
129
+ @noPosargs
130
+ @noKwargs
131
+ def stdout_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
132
+ return self.held_object.stdout
133
+
134
+ @noPosargs
135
+ @noKwargs
136
+ def stderr_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
137
+ return self.held_object.stderr
138
+
139
+
140
+ _ARGS_KW: KwargInfo[T.List[str]] = KwargInfo(
141
+ 'args',
142
+ ContainerTypeInfo(list, str),
143
+ listify=True,
144
+ default=[],
145
+ )
146
+ _DEPENDENCIES_KW: KwargInfo[T.List['dependencies.Dependency']] = KwargInfo(
147
+ 'dependencies',
148
+ ContainerTypeInfo(list, dependencies.Dependency),
149
+ listify=True,
150
+ default=[],
151
+ )
152
+ _DEPENDS_KW: KwargInfo[T.List[T.Union[build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]]] = KwargInfo(
153
+ 'depends',
154
+ ContainerTypeInfo(list, (build.BuildTarget, build.CustomTarget, build.CustomTargetIndex)),
155
+ listify=True,
156
+ default=[],
157
+ )
158
+ _INCLUDE_DIRS_KW: KwargInfo[T.List[build.IncludeDirs]] = KwargInfo(
159
+ 'include_directories',
160
+ ContainerTypeInfo(list, build.IncludeDirs),
161
+ default=[],
162
+ listify=True,
163
+ )
164
+ _PREFIX_KW: KwargInfo[str] = KwargInfo(
165
+ 'prefix',
166
+ (str, ContainerTypeInfo(list, str)),
167
+ default='',
168
+ since_values={list: '1.0.0'},
169
+ convertor=lambda x: '\n'.join(x) if isinstance(x, list) else x)
170
+
171
+ _NO_BUILTIN_ARGS_KW = KwargInfo('no_builtin_args', bool, default=False)
172
+ _NAME_KW = KwargInfo('name', str, default='')
173
+ _WERROR_KW = KwargInfo('werror', bool, default=False, since='1.3.0')
174
+
175
+ # Many of the compiler methods take this kwarg signature exactly, this allows
176
+ # simplifying the `typed_kwargs` calls
177
+ _COMMON_KWS: T.List[KwargInfo] = [_ARGS_KW, _DEPENDENCIES_KW, _INCLUDE_DIRS_KW, _PREFIX_KW, _NO_BUILTIN_ARGS_KW]
178
+
179
+ # Common methods of compiles, links, runs, and similar
180
+ _COMPILES_KWS: T.List[KwargInfo] = [_NAME_KW, _ARGS_KW, _DEPENDENCIES_KW, _INCLUDE_DIRS_KW, _NO_BUILTIN_ARGS_KW,
181
+ _WERROR_KW]
182
+
183
+ _HEADER_KWS: T.List[KwargInfo] = [REQUIRED_KW.evolve(since='0.50.0', default=False), *_COMMON_KWS]
184
+ _HAS_REQUIRED_KW = REQUIRED_KW.evolve(since='1.3.0', default=False)
185
+
186
+ class CompilerHolder(ObjectHolder['Compiler']):
187
+ preprocess_uid: T.Dict[str, itertools.count] = collections.defaultdict(itertools.count)
188
+
189
+ def __init__(self, compiler: 'Compiler', interpreter: 'Interpreter'):
190
+ super().__init__(compiler, interpreter)
191
+ self.environment = self.env
192
+ self.methods.update({'compiles': self.compiles_method,
193
+ 'links': self.links_method,
194
+ 'get_id': self.get_id_method,
195
+ 'get_linker_id': self.get_linker_id_method,
196
+ 'compute_int': self.compute_int_method,
197
+ 'sizeof': self.sizeof_method,
198
+ 'get_define': self.get_define_method,
199
+ 'has_define': self.has_define_method,
200
+ 'check_header': self.check_header_method,
201
+ 'has_header': self.has_header_method,
202
+ 'has_header_symbol': self.has_header_symbol_method,
203
+ 'run': self.run_method,
204
+ 'has_function': self.has_function_method,
205
+ 'has_member': self.has_member_method,
206
+ 'has_members': self.has_members_method,
207
+ 'has_type': self.has_type_method,
208
+ 'alignment': self.alignment_method,
209
+ 'version': self.version_method,
210
+ 'cmd_array': self.cmd_array_method,
211
+ 'find_library': self.find_library_method,
212
+ 'has_argument': self.has_argument_method,
213
+ 'has_function_attribute': self.has_func_attribute_method,
214
+ 'get_supported_function_attributes': self.get_supported_function_attributes_method,
215
+ 'has_multi_arguments': self.has_multi_arguments_method,
216
+ 'get_supported_arguments': self.get_supported_arguments_method,
217
+ 'first_supported_argument': self.first_supported_argument_method,
218
+ 'has_link_argument': self.has_link_argument_method,
219
+ 'has_multi_link_arguments': self.has_multi_link_arguments_method,
220
+ 'get_supported_link_arguments': self.get_supported_link_arguments_method,
221
+ 'first_supported_link_argument': self.first_supported_link_argument_method,
222
+ 'symbols_have_underscore_prefix': self.symbols_have_underscore_prefix_method,
223
+ 'get_argument_syntax': self.get_argument_syntax_method,
224
+ 'preprocess': self.preprocess_method,
225
+ })
226
+
227
+ @property
228
+ def compiler(self) -> 'Compiler':
229
+ return self.held_object
230
+
231
+ def _dep_msg(self, deps: T.List['dependencies.Dependency'], compile_only: bool, endl: str) -> str:
232
+ msg_single = 'with dependency {}'
233
+ msg_many = 'with dependencies {}'
234
+ names = []
235
+ for d in deps:
236
+ if isinstance(d, dependencies.InternalDependency):
237
+ FeatureNew.single_use('compiler method "dependencies" kwarg with internal dep', '0.57.0', self.subproject,
238
+ location=self.current_node)
239
+ continue
240
+ if isinstance(d, dependencies.ExternalLibrary):
241
+ if compile_only:
242
+ continue
243
+ name = '-l' + d.name
244
+ else:
245
+ name = d.name
246
+ names.append(name)
247
+ if not names:
248
+ return endl
249
+ tpl = msg_many if len(names) > 1 else msg_single
250
+ if endl is None:
251
+ endl = ''
252
+ return tpl.format(', '.join(names)) + endl
253
+
254
+ @noPosargs
255
+ @noKwargs
256
+ def version_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
257
+ return self.compiler.version
258
+
259
+ @noPosargs
260
+ @noKwargs
261
+ def cmd_array_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> T.List[str]:
262
+ return self.compiler.exelist
263
+
264
+ def _determine_args(self, kwargs: BaseCompileKW,
265
+ mode: CompileCheckMode = CompileCheckMode.LINK) -> T.List[str]:
266
+ args: T.List[str] = []
267
+ for i in kwargs['include_directories']:
268
+ for idir in i.to_string_list(self.environment.get_source_dir(), self.environment.get_build_dir()):
269
+ args.extend(self.compiler.get_include_args(idir, False))
270
+ if not kwargs['no_builtin_args']:
271
+ opts = coredata.OptionsView(self.environment.coredata.options, self.subproject)
272
+ args += self.compiler.get_option_compile_args(opts)
273
+ if mode is CompileCheckMode.LINK:
274
+ args.extend(self.compiler.get_option_link_args(opts))
275
+ if kwargs.get('werror', False):
276
+ args.extend(self.compiler.get_werror_args())
277
+ args.extend(kwargs['args'])
278
+ return args
279
+
280
+ def _determine_dependencies(self, deps: T.List['dependencies.Dependency'], compile_only: bool = False, endl: str = ':') -> T.Tuple[T.List['dependencies.Dependency'], str]:
281
+ deps = dependencies.get_leaf_external_dependencies(deps)
282
+ return deps, self._dep_msg(deps, compile_only, endl)
283
+
284
+ @typed_pos_args('compiler.alignment', str)
285
+ @typed_kwargs(
286
+ 'compiler.alignment',
287
+ _PREFIX_KW,
288
+ _ARGS_KW,
289
+ _DEPENDENCIES_KW,
290
+ )
291
+ def alignment_method(self, args: T.Tuple[str], kwargs: 'AlignmentKw') -> int:
292
+ typename = args[0]
293
+ deps, msg = self._determine_dependencies(kwargs['dependencies'], compile_only=self.compiler.is_cross)
294
+ result, cached = self.compiler.alignment(typename, kwargs['prefix'], self.environment,
295
+ extra_args=kwargs['args'],
296
+ dependencies=deps)
297
+ cached_msg = mlog.blue('(cached)') if cached else ''
298
+ mlog.log('Checking for alignment of',
299
+ mlog.bold(typename, True), msg, mlog.bold(str(result)), cached_msg)
300
+ return result
301
+
302
+ @typed_pos_args('compiler.run', (str, mesonlib.File))
303
+ @typed_kwargs('compiler.run', *_COMPILES_KWS)
304
+ def run_method(self, args: T.Tuple['mesonlib.FileOrString'], kwargs: 'CompileKW') -> 'RunResult':
305
+ if self.compiler.language not in {'d', 'c', 'cpp', 'objc', 'objcpp'}:
306
+ FeatureNew.single_use(f'compiler.run for {self.compiler.get_display_language()} language',
307
+ '1.5.0', self.subproject, location=self.current_node)
308
+ code = args[0]
309
+ if isinstance(code, mesonlib.File):
310
+ self.interpreter.add_build_def_file(code)
311
+ code = mesonlib.File.from_absolute_file(
312
+ code.rel_to_builddir(self.environment.source_dir))
313
+ testname = kwargs['name']
314
+ extra_args = functools.partial(self._determine_args, kwargs)
315
+ deps, msg = self._determine_dependencies(kwargs['dependencies'], compile_only=False, endl=None)
316
+ result = self.compiler.run(code, self.environment, extra_args=extra_args,
317
+ dependencies=deps)
318
+ if testname:
319
+ if not result.compiled:
320
+ h = mlog.red('DID NOT COMPILE')
321
+ elif result.returncode == 0:
322
+ h = mlog.green('YES')
323
+ else:
324
+ h = mlog.red(f'NO ({result.returncode})')
325
+ mlog.log('Checking if', mlog.bold(testname, True), msg, 'runs:', h)
326
+ return result
327
+
328
+ @noPosargs
329
+ @noKwargs
330
+ def get_id_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
331
+ return self.compiler.get_id()
332
+
333
+ @noPosargs
334
+ @noKwargs
335
+ @FeatureNew('compiler.get_linker_id', '0.53.0')
336
+ def get_linker_id_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
337
+ return self.compiler.get_linker_id()
338
+
339
+ @noPosargs
340
+ @noKwargs
341
+ def symbols_have_underscore_prefix_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> bool:
342
+ '''
343
+ Check if the compiler prefixes _ (underscore) to global C symbols
344
+ See: https://en.wikipedia.org/wiki/Name_mangling#C
345
+ '''
346
+ return self.compiler.symbols_have_underscore_prefix(self.environment)
347
+
348
+ @typed_pos_args('compiler.has_member', str, str)
349
+ @typed_kwargs('compiler.has_member', _HAS_REQUIRED_KW, *_COMMON_KWS)
350
+ def has_member_method(self, args: T.Tuple[str, str], kwargs: 'HasKW') -> bool:
351
+ typename, membername = args
352
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject, default=False)
353
+ if disabled:
354
+ mlog.log('Type', mlog.bold(typename, True), 'has member', mlog.bold(membername, True), 'skipped: feature', mlog.bold(feature), 'disabled')
355
+ return False
356
+ extra_args = functools.partial(self._determine_args, kwargs)
357
+ deps, msg = self._determine_dependencies(kwargs['dependencies'])
358
+ had, cached = self.compiler.has_members(typename, [membername], kwargs['prefix'],
359
+ self.environment,
360
+ extra_args=extra_args,
361
+ dependencies=deps)
362
+ cached_msg = mlog.blue('(cached)') if cached else ''
363
+ if required and not had:
364
+ raise InterpreterException(f'{self.compiler.get_display_language()} member {membername!r} of type {typename!r} not usable')
365
+ elif had:
366
+ hadtxt = mlog.green('YES')
367
+ else:
368
+ hadtxt = mlog.red('NO')
369
+ mlog.log('Checking whether type', mlog.bold(typename, True),
370
+ 'has member', mlog.bold(membername, True), msg, hadtxt, cached_msg)
371
+ return had
372
+
373
+ @typed_pos_args('compiler.has_members', str, varargs=str, min_varargs=1)
374
+ @typed_kwargs('compiler.has_members', _HAS_REQUIRED_KW, *_COMMON_KWS)
375
+ def has_members_method(self, args: T.Tuple[str, T.List[str]], kwargs: 'HasKW') -> bool:
376
+ typename, membernames = args
377
+ members = mlog.bold(', '.join([f'"{m}"' for m in membernames]))
378
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject, default=False)
379
+ if disabled:
380
+ mlog.log('Type', mlog.bold(typename, True), 'has members', members, 'skipped: feature', mlog.bold(feature), 'disabled')
381
+ return False
382
+ extra_args = functools.partial(self._determine_args, kwargs)
383
+ deps, msg = self._determine_dependencies(kwargs['dependencies'])
384
+ had, cached = self.compiler.has_members(typename, membernames, kwargs['prefix'],
385
+ self.environment,
386
+ extra_args=extra_args,
387
+ dependencies=deps)
388
+ cached_msg = mlog.blue('(cached)') if cached else ''
389
+ if required and not had:
390
+ # print members as array: ['member1', 'member2']
391
+ raise InterpreterException(f'{self.compiler.get_display_language()} members {membernames!r} of type {typename!r} not usable')
392
+ elif had:
393
+ hadtxt = mlog.green('YES')
394
+ else:
395
+ hadtxt = mlog.red('NO')
396
+ mlog.log('Checking whether type', mlog.bold(typename, True),
397
+ 'has members', members, msg, hadtxt, cached_msg)
398
+ return had
399
+
400
+ @typed_pos_args('compiler.has_function', str)
401
+ @typed_kwargs('compiler.has_function', _HAS_REQUIRED_KW, *_COMMON_KWS)
402
+ def has_function_method(self, args: T.Tuple[str], kwargs: 'HasKW') -> bool:
403
+ funcname = args[0]
404
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject, default=False)
405
+ if disabled:
406
+ mlog.log('Has function', mlog.bold(funcname, True), 'skipped: feature', mlog.bold(feature), 'disabled')
407
+ return False
408
+ extra_args = self._determine_args(kwargs)
409
+ deps, msg = self._determine_dependencies(kwargs['dependencies'], compile_only=False)
410
+ had, cached = self.compiler.has_function(funcname, kwargs['prefix'], self.environment,
411
+ extra_args=extra_args,
412
+ dependencies=deps)
413
+ cached_msg = mlog.blue('(cached)') if cached else ''
414
+ if required and not had:
415
+ raise InterpreterException(f'{self.compiler.get_display_language()} function {funcname!r} not usable')
416
+ elif had:
417
+ hadtxt = mlog.green('YES')
418
+ else:
419
+ hadtxt = mlog.red('NO')
420
+ mlog.log('Checking for function', mlog.bold(funcname, True), msg, hadtxt, cached_msg)
421
+ return had
422
+
423
+ @typed_pos_args('compiler.has_type', str)
424
+ @typed_kwargs('compiler.has_type', _HAS_REQUIRED_KW, *_COMMON_KWS)
425
+ def has_type_method(self, args: T.Tuple[str], kwargs: 'HasKW') -> bool:
426
+ typename = args[0]
427
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject, default=False)
428
+ if disabled:
429
+ mlog.log('Has type', mlog.bold(typename, True), 'skipped: feature', mlog.bold(feature), 'disabled')
430
+ return False
431
+ extra_args = functools.partial(self._determine_args, kwargs)
432
+ deps, msg = self._determine_dependencies(kwargs['dependencies'])
433
+ had, cached = self.compiler.has_type(typename, kwargs['prefix'], self.environment,
434
+ extra_args=extra_args, dependencies=deps)
435
+ cached_msg = mlog.blue('(cached)') if cached else ''
436
+ if required and not had:
437
+ raise InterpreterException(f'{self.compiler.get_display_language()} type {typename!r} not usable')
438
+ elif had:
439
+ hadtxt = mlog.green('YES')
440
+ else:
441
+ hadtxt = mlog.red('NO')
442
+ mlog.log('Checking for type', mlog.bold(typename, True), msg, hadtxt, cached_msg)
443
+ return had
444
+
445
+ @FeatureNew('compiler.compute_int', '0.40.0')
446
+ @typed_pos_args('compiler.compute_int', str)
447
+ @typed_kwargs(
448
+ 'compiler.compute_int',
449
+ KwargInfo('low', (int, NoneType)),
450
+ KwargInfo('high', (int, NoneType)),
451
+ KwargInfo('guess', (int, NoneType)),
452
+ *_COMMON_KWS,
453
+ )
454
+ def compute_int_method(self, args: T.Tuple[str], kwargs: 'ComputeIntKW') -> int:
455
+ expression = args[0]
456
+ extra_args = functools.partial(self._determine_args, kwargs)
457
+ deps, msg = self._determine_dependencies(kwargs['dependencies'], compile_only=self.compiler.is_cross)
458
+ res = self.compiler.compute_int(expression, kwargs['low'], kwargs['high'],
459
+ kwargs['guess'], kwargs['prefix'],
460
+ self.environment, extra_args=extra_args,
461
+ dependencies=deps)
462
+ mlog.log('Computing int of', mlog.bold(expression, True), msg, res)
463
+ return res
464
+
465
+ @typed_pos_args('compiler.sizeof', str)
466
+ @typed_kwargs('compiler.sizeof', *_COMMON_KWS)
467
+ def sizeof_method(self, args: T.Tuple[str], kwargs: 'CommonKW') -> int:
468
+ element = args[0]
469
+ extra_args = functools.partial(self._determine_args, kwargs)
470
+ deps, msg = self._determine_dependencies(kwargs['dependencies'], compile_only=self.compiler.is_cross)
471
+ esize, cached = self.compiler.sizeof(element, kwargs['prefix'], self.environment,
472
+ extra_args=extra_args, dependencies=deps)
473
+ cached_msg = mlog.blue('(cached)') if cached else ''
474
+ mlog.log('Checking for size of',
475
+ mlog.bold(element, True), msg, mlog.bold(str(esize)), cached_msg)
476
+ return esize
477
+
478
+ @FeatureNew('compiler.get_define', '0.40.0')
479
+ @typed_pos_args('compiler.get_define', str)
480
+ @typed_kwargs('compiler.get_define', *_COMMON_KWS)
481
+ def get_define_method(self, args: T.Tuple[str], kwargs: 'CommonKW') -> str:
482
+ element = args[0]
483
+ extra_args = functools.partial(self._determine_args, kwargs)
484
+ deps, msg = self._determine_dependencies(kwargs['dependencies'])
485
+ value, cached = self.compiler.get_define(element, kwargs['prefix'], self.environment,
486
+ extra_args=extra_args,
487
+ dependencies=deps)
488
+ cached_msg = mlog.blue('(cached)') if cached else ''
489
+ value_msg = '(undefined)' if value is None else value
490
+ mlog.log('Fetching value of define', mlog.bold(element, True), msg, value_msg, cached_msg)
491
+ return value if value is not None else ''
492
+
493
+ @FeatureNew('compiler.has_define', '1.3.0')
494
+ @typed_pos_args('compiler.has_define', str)
495
+ @typed_kwargs('compiler.has_define', *_COMMON_KWS)
496
+ def has_define_method(self, args: T.Tuple[str], kwargs: 'CommonKW') -> bool:
497
+ define_name = args[0]
498
+ extra_args = functools.partial(self._determine_args, kwargs)
499
+ deps, msg = self._determine_dependencies(kwargs['dependencies'], endl=None)
500
+ value, cached = self.compiler.get_define(define_name, kwargs['prefix'], self.environment,
501
+ extra_args=extra_args,
502
+ dependencies=deps)
503
+ cached_msg = mlog.blue('(cached)') if cached else ''
504
+ h = mlog.green('YES') if value is not None else mlog.red('NO')
505
+ mlog.log('Checking if define', mlog.bold(define_name, True), msg, 'exists:', h, cached_msg)
506
+
507
+ return value is not None
508
+
509
+ @typed_pos_args('compiler.compiles', (str, mesonlib.File))
510
+ @typed_kwargs('compiler.compiles', *_COMPILES_KWS)
511
+ def compiles_method(self, args: T.Tuple['mesonlib.FileOrString'], kwargs: 'CompileKW') -> bool:
512
+ code = args[0]
513
+ if isinstance(code, mesonlib.File):
514
+ if code.is_built:
515
+ FeatureNew.single_use('compiler.compiles with file created at setup time', '1.2.0', self.subproject,
516
+ 'It was broken and either errored or returned false.', self.current_node)
517
+ self.interpreter.add_build_def_file(code)
518
+ code = mesonlib.File.from_absolute_file(
519
+ code.absolute_path(self.environment.source_dir, self.environment.build_dir))
520
+ testname = kwargs['name']
521
+ extra_args = functools.partial(self._determine_args, kwargs)
522
+ deps, msg = self._determine_dependencies(kwargs['dependencies'], endl=None)
523
+ result, cached = self.compiler.compiles(code, self.environment,
524
+ extra_args=extra_args,
525
+ dependencies=deps)
526
+ if testname:
527
+ if result:
528
+ h = mlog.green('YES')
529
+ else:
530
+ h = mlog.red('NO')
531
+ cached_msg = mlog.blue('(cached)') if cached else ''
532
+ mlog.log('Checking if', mlog.bold(testname, True), msg, 'compiles:', h, cached_msg)
533
+ return result
534
+
535
+ @typed_pos_args('compiler.links', (str, mesonlib.File))
536
+ @typed_kwargs('compiler.links', *_COMPILES_KWS)
537
+ def links_method(self, args: T.Tuple['mesonlib.FileOrString'], kwargs: 'CompileKW') -> bool:
538
+ code = args[0]
539
+ compiler = None
540
+ if isinstance(code, mesonlib.File):
541
+ if code.is_built:
542
+ FeatureNew.single_use('compiler.links with file created at setup time', '1.2.0', self.subproject,
543
+ 'It was broken and either errored or returned false.', self.current_node)
544
+ self.interpreter.add_build_def_file(code)
545
+ code = mesonlib.File.from_absolute_file(
546
+ code.absolute_path(self.environment.source_dir, self.environment.build_dir))
547
+ suffix = code.suffix
548
+ if suffix not in self.compiler.file_suffixes:
549
+ for_machine = self.compiler.for_machine
550
+ clist = self.interpreter.coredata.compilers[for_machine]
551
+ if suffix not in SUFFIX_TO_LANG:
552
+ # just pass it to the compiler driver
553
+ mlog.warning(f'Unknown suffix for test file {code}')
554
+ elif SUFFIX_TO_LANG[suffix] not in clist:
555
+ mlog.warning(f'Passed {SUFFIX_TO_LANG[suffix]} source to links method, not specified for {for_machine.get_lower_case_name()} machine.')
556
+ else:
557
+ compiler = clist[SUFFIX_TO_LANG[suffix]]
558
+
559
+ testname = kwargs['name']
560
+ extra_args = functools.partial(self._determine_args, kwargs)
561
+ deps, msg = self._determine_dependencies(kwargs['dependencies'], compile_only=False)
562
+ result, cached = self.compiler.links(code, self.environment,
563
+ compiler=compiler,
564
+ extra_args=extra_args,
565
+ dependencies=deps)
566
+ cached_msg = mlog.blue('(cached)') if cached else ''
567
+ if testname:
568
+ if result:
569
+ h = mlog.green('YES')
570
+ else:
571
+ h = mlog.red('NO')
572
+ mlog.log('Checking if', mlog.bold(testname, True), msg, 'links:', h, cached_msg)
573
+ return result
574
+
575
+ @FeatureNew('compiler.check_header', '0.47.0')
576
+ @typed_pos_args('compiler.check_header', str)
577
+ @typed_kwargs('compiler.check_header', *_HEADER_KWS)
578
+ def check_header_method(self, args: T.Tuple[str], kwargs: 'HeaderKW') -> bool:
579
+ hname = args[0]
580
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject, default=False)
581
+ if disabled:
582
+ mlog.log('Check usable header', mlog.bold(hname, True), 'skipped: feature', mlog.bold(feature), 'disabled')
583
+ return False
584
+ extra_args = functools.partial(self._determine_args, kwargs)
585
+ deps, msg = self._determine_dependencies(kwargs['dependencies'])
586
+ haz, cached = self.compiler.check_header(hname, kwargs['prefix'], self.environment,
587
+ extra_args=extra_args,
588
+ dependencies=deps)
589
+ cached_msg = mlog.blue('(cached)') if cached else ''
590
+ if required and not haz:
591
+ raise InterpreterException(f'{self.compiler.get_display_language()} header {hname!r} not usable')
592
+ elif haz:
593
+ h = mlog.green('YES')
594
+ else:
595
+ h = mlog.red('NO')
596
+ mlog.log('Check usable header', mlog.bold(hname, True), msg, h, cached_msg)
597
+ return haz
598
+
599
+ def _has_header_impl(self, hname: str, kwargs: 'HeaderKW') -> bool:
600
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject, default=False)
601
+ if disabled:
602
+ mlog.log('Has header', mlog.bold(hname, True), 'skipped: feature', mlog.bold(feature), 'disabled')
603
+ return False
604
+ extra_args = functools.partial(self._determine_args, kwargs)
605
+ deps, msg = self._determine_dependencies(kwargs['dependencies'])
606
+ haz, cached = self.compiler.has_header(hname, kwargs['prefix'], self.environment,
607
+ extra_args=extra_args, dependencies=deps)
608
+ cached_msg = mlog.blue('(cached)') if cached else ''
609
+ if required and not haz:
610
+ raise InterpreterException(f'{self.compiler.get_display_language()} header {hname!r} not found')
611
+ elif haz:
612
+ h = mlog.green('YES')
613
+ else:
614
+ h = mlog.red('NO')
615
+ mlog.log('Has header', mlog.bold(hname, True), msg, h, cached_msg)
616
+ return haz
617
+
618
+ @typed_pos_args('compiler.has_header', str)
619
+ @typed_kwargs('compiler.has_header', *_HEADER_KWS)
620
+ def has_header_method(self, args: T.Tuple[str], kwargs: 'HeaderKW') -> bool:
621
+ return self._has_header_impl(args[0], kwargs)
622
+
623
+ @typed_pos_args('compiler.has_header_symbol', str, str)
624
+ @typed_kwargs('compiler.has_header_symbol', *_HEADER_KWS)
625
+ def has_header_symbol_method(self, args: T.Tuple[str, str], kwargs: 'HeaderKW') -> bool:
626
+ hname, symbol = args
627
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject, default=False)
628
+ if disabled:
629
+ mlog.log('Header', mlog.bold(hname, True), 'has symbol', mlog.bold(symbol, True), 'skipped: feature', mlog.bold(feature), 'disabled')
630
+ return False
631
+ extra_args = functools.partial(self._determine_args, kwargs)
632
+ deps, msg = self._determine_dependencies(kwargs['dependencies'])
633
+ haz, cached = self.compiler.has_header_symbol(hname, symbol, kwargs['prefix'], self.environment,
634
+ extra_args=extra_args,
635
+ dependencies=deps)
636
+ if required and not haz:
637
+ raise InterpreterException(f'{self.compiler.get_display_language()} symbol {symbol} not found in header {hname}')
638
+ elif haz:
639
+ h = mlog.green('YES')
640
+ else:
641
+ h = mlog.red('NO')
642
+ cached_msg = mlog.blue('(cached)') if cached else ''
643
+ mlog.log('Header', mlog.bold(hname, True), 'has symbol', mlog.bold(symbol, True), msg, h, cached_msg)
644
+ return haz
645
+
646
+ def notfound_library(self, libname: str) -> 'dependencies.ExternalLibrary':
647
+ lib = dependencies.ExternalLibrary(libname, None,
648
+ self.environment,
649
+ self.compiler.language,
650
+ silent=True)
651
+ return lib
652
+
653
+ @disablerIfNotFound
654
+ @typed_pos_args('compiler.find_library', str)
655
+ @typed_kwargs(
656
+ 'compiler.find_library',
657
+ KwargInfo('required', (bool, coredata.UserFeatureOption), default=True),
658
+ KwargInfo('has_headers', ContainerTypeInfo(list, str), listify=True, default=[], since='0.50.0'),
659
+ KwargInfo('static', (bool, NoneType), since='0.51.0'),
660
+ KwargInfo('disabler', bool, default=False, since='0.49.0'),
661
+ KwargInfo('dirs', ContainerTypeInfo(list, str), listify=True, default=[]),
662
+ *(k.evolve(name=f'header_{k.name}') for k in _HEADER_KWS)
663
+ )
664
+ def find_library_method(self, args: T.Tuple[str], kwargs: 'FindLibraryKW') -> 'dependencies.ExternalLibrary':
665
+ # TODO add dependencies support?
666
+ libname = args[0]
667
+
668
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject)
669
+ if disabled:
670
+ mlog.log('Library', mlog.bold(libname), 'skipped: feature', mlog.bold(feature), 'disabled')
671
+ return self.notfound_library(libname)
672
+
673
+ # This could be done with a comprehension, but that confuses the type
674
+ # checker, and having it check this seems valuable
675
+ has_header_kwargs: 'HeaderKW' = {
676
+ 'required': required,
677
+ 'args': kwargs['header_args'],
678
+ 'dependencies': kwargs['header_dependencies'],
679
+ 'include_directories': kwargs['header_include_directories'],
680
+ 'prefix': kwargs['header_prefix'],
681
+ 'no_builtin_args': kwargs['header_no_builtin_args'],
682
+ }
683
+ for h in kwargs['has_headers']:
684
+ if not self._has_header_impl(h, has_header_kwargs):
685
+ return self.notfound_library(libname)
686
+
687
+ search_dirs = extract_search_dirs(kwargs)
688
+
689
+ prefer_static = self.environment.coredata.get_option(OptionKey('prefer_static'))
690
+ if kwargs['static'] is True:
691
+ libtype = mesonlib.LibType.STATIC
692
+ elif kwargs['static'] is False:
693
+ libtype = mesonlib.LibType.SHARED
694
+ elif prefer_static:
695
+ libtype = mesonlib.LibType.PREFER_STATIC
696
+ else:
697
+ libtype = mesonlib.LibType.PREFER_SHARED
698
+ linkargs = self.compiler.find_library(libname, self.environment, search_dirs, libtype)
699
+ if required and not linkargs:
700
+ if libtype == mesonlib.LibType.PREFER_SHARED:
701
+ libtype_s = 'shared or static'
702
+ else:
703
+ libtype_s = libtype.name.lower()
704
+ raise InterpreterException('{} {} library {!r} not found'
705
+ .format(self.compiler.get_display_language(),
706
+ libtype_s, libname))
707
+ lib = dependencies.ExternalLibrary(libname, linkargs, self.environment,
708
+ self.compiler.language)
709
+ return lib
710
+
711
+ def _has_argument_impl(self, arguments: T.Union[str, T.List[str]],
712
+ mode: _TestMode = _TestMode.COMPILER,
713
+ kwargs: T.Optional['ExtractRequired'] = None) -> bool:
714
+ """Shared implementation for methods checking compiler and linker arguments."""
715
+ # This simplifies the callers
716
+ if isinstance(arguments, str):
717
+ arguments = [arguments]
718
+ logargs: TV_LoggableList = [
719
+ 'Compiler for',
720
+ self.compiler.get_display_language(),
721
+ 'supports{}'.format(' link' if mode is _TestMode.LINKER else ''),
722
+ 'arguments {}:'.format(' '.join(arguments)),
723
+ ]
724
+ kwargs = kwargs or {'required': False}
725
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject, default=False)
726
+ if disabled:
727
+ logargs += ['skipped: feature', mlog.bold(feature), 'disabled']
728
+ mlog.log(*logargs)
729
+ return False
730
+ test = self.compiler.has_multi_link_arguments if mode is _TestMode.LINKER else self.compiler.has_multi_arguments
731
+ result, cached = test(arguments, self.environment)
732
+ if required and not result:
733
+ logargs += ['not usable']
734
+ raise InterpreterException(*logargs)
735
+ logargs += [
736
+ mlog.green('YES') if result else mlog.red('NO'),
737
+ mlog.blue('(cached)') if cached else '',
738
+ ]
739
+ mlog.log(*logargs)
740
+ return result
741
+
742
+ @typed_pos_args('compiler.has_argument', str)
743
+ @typed_kwargs('compiler.has_argument', _HAS_REQUIRED_KW)
744
+ def has_argument_method(self, args: T.Tuple[str], kwargs: 'HasArgumentKW') -> bool:
745
+ return self._has_argument_impl([args[0]], kwargs=kwargs)
746
+
747
+ @typed_pos_args('compiler.has_multi_arguments', varargs=str)
748
+ @typed_kwargs('compiler.has_multi_arguments', _HAS_REQUIRED_KW)
749
+ @FeatureNew('compiler.has_multi_arguments', '0.37.0')
750
+ def has_multi_arguments_method(self, args: T.Tuple[T.List[str]], kwargs: 'HasArgumentKW') -> bool:
751
+ return self._has_argument_impl(args[0], kwargs=kwargs)
752
+
753
+ @FeatureNew('compiler.get_supported_arguments', '0.43.0')
754
+ @typed_pos_args('compiler.get_supported_arguments', varargs=str)
755
+ @typed_kwargs(
756
+ 'compiler.get_supported_arguments',
757
+ KwargInfo('checked', str, default='off', since='0.59.0',
758
+ validator=in_set_validator({'warn', 'require', 'off'})),
759
+ )
760
+ def get_supported_arguments_method(self, args: T.Tuple[T.List[str]], kwargs: 'GetSupportedArgumentKw') -> T.List[str]:
761
+ supported_args: T.List[str] = []
762
+ checked = kwargs['checked']
763
+
764
+ for arg in args[0]:
765
+ if not self._has_argument_impl([arg]):
766
+ msg = f'Compiler for {self.compiler.get_display_language()} does not support "{arg}"'
767
+ if checked == 'warn':
768
+ mlog.warning(msg)
769
+ elif checked == 'require':
770
+ raise mesonlib.MesonException(msg)
771
+ else:
772
+ supported_args.append(arg)
773
+ return supported_args
774
+
775
+ @noKwargs
776
+ @typed_pos_args('compiler.first_supported_argument', varargs=str)
777
+ def first_supported_argument_method(self, args: T.Tuple[T.List[str]], kwargs: 'TYPE_kwargs') -> T.List[str]:
778
+ for arg in args[0]:
779
+ if self._has_argument_impl([arg]):
780
+ mlog.log('First supported argument:', mlog.bold(arg))
781
+ return [arg]
782
+ mlog.log('First supported argument:', mlog.red('None'))
783
+ return []
784
+
785
+ @FeatureNew('compiler.has_link_argument', '0.46.0')
786
+ @typed_pos_args('compiler.has_link_argument', str)
787
+ @typed_kwargs('compiler.has_link_argument', _HAS_REQUIRED_KW)
788
+ def has_link_argument_method(self, args: T.Tuple[str], kwargs: 'HasArgumentKW') -> bool:
789
+ return self._has_argument_impl([args[0]], mode=_TestMode.LINKER, kwargs=kwargs)
790
+
791
+ @FeatureNew('compiler.has_multi_link_argument', '0.46.0')
792
+ @typed_pos_args('compiler.has_multi_link_argument', varargs=str)
793
+ @typed_kwargs('compiler.has_multi_link_argument', _HAS_REQUIRED_KW)
794
+ def has_multi_link_arguments_method(self, args: T.Tuple[T.List[str]], kwargs: 'HasArgumentKW') -> bool:
795
+ return self._has_argument_impl(args[0], mode=_TestMode.LINKER, kwargs=kwargs)
796
+
797
+ @FeatureNew('compiler.get_supported_link_arguments', '0.46.0')
798
+ @noKwargs
799
+ @typed_pos_args('compiler.get_supported_link_arguments', varargs=str)
800
+ def get_supported_link_arguments_method(self, args: T.Tuple[T.List[str]], kwargs: 'TYPE_kwargs') -> T.List[str]:
801
+ supported_args: T.List[str] = []
802
+ for arg in args[0]:
803
+ if self._has_argument_impl([arg], mode=_TestMode.LINKER):
804
+ supported_args.append(arg)
805
+ return supported_args
806
+
807
+ @FeatureNew('compiler.first_supported_link_argument_method', '0.46.0')
808
+ @noKwargs
809
+ @typed_pos_args('compiler.first_supported_link_argument', varargs=str)
810
+ def first_supported_link_argument_method(self, args: T.Tuple[T.List[str]], kwargs: 'TYPE_kwargs') -> T.List[str]:
811
+ for arg in args[0]:
812
+ if self._has_argument_impl([arg], mode=_TestMode.LINKER):
813
+ mlog.log('First supported link argument:', mlog.bold(arg))
814
+ return [arg]
815
+ mlog.log('First supported link argument:', mlog.red('None'))
816
+ return []
817
+
818
+ def _has_function_attribute_impl(self, attr: str, kwargs: T.Optional['ExtractRequired'] = None) -> bool:
819
+ """Common helper for function attribute testing."""
820
+ logargs: TV_LoggableList = [
821
+ f'Compiler for {self.compiler.get_display_language()} supports function attribute {attr}:',
822
+ ]
823
+ kwargs = kwargs or {'required': False}
824
+ disabled, required, feature = extract_required_kwarg(kwargs, self.subproject, default=False)
825
+ if disabled:
826
+ logargs += ['skipped: feature', mlog.bold(feature), 'disabled']
827
+ mlog.log(*logargs)
828
+ return False
829
+ had, cached = self.compiler.has_func_attribute(attr, self.environment)
830
+ if required and not had:
831
+ logargs += ['not usable']
832
+ raise InterpreterException(*logargs)
833
+ logargs += [
834
+ mlog.green('YES') if had else mlog.red('NO'),
835
+ mlog.blue('(cached)') if cached else ''
836
+ ]
837
+ mlog.log(*logargs)
838
+ return had
839
+
840
+ @FeatureNew('compiler.has_function_attribute', '0.48.0')
841
+ @typed_pos_args('compiler.has_function_attribute', str)
842
+ @typed_kwargs('compiler.has_function_attribute', _HAS_REQUIRED_KW)
843
+ def has_func_attribute_method(self, args: T.Tuple[str], kwargs: 'HasArgumentKW') -> bool:
844
+ return self._has_function_attribute_impl(args[0], kwargs)
845
+
846
+ @FeatureNew('compiler.get_supported_function_attributes', '0.48.0')
847
+ @noKwargs
848
+ @typed_pos_args('compiler.get_supported_function_attributes', varargs=str)
849
+ def get_supported_function_attributes_method(self, args: T.Tuple[T.List[str]], kwargs: 'TYPE_kwargs') -> T.List[str]:
850
+ return [a for a in args[0] if self._has_function_attribute_impl(a)]
851
+
852
+ @FeatureNew('compiler.get_argument_syntax_method', '0.49.0')
853
+ @noPosargs
854
+ @noKwargs
855
+ def get_argument_syntax_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
856
+ return self.compiler.get_argument_syntax()
857
+
858
+ @FeatureNew('compiler.preprocess', '0.64.0')
859
+ @FeatureNewKwargs('compiler.preprocess', '1.3.2', ['compile_args'], extra_message='compile_args were ignored before this version')
860
+ @typed_pos_args('compiler.preprocess', varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList), min_varargs=1)
861
+ @typed_kwargs(
862
+ 'compiler.preprocess',
863
+ KwargInfo('output', str, default='@PLAINNAME@.i'),
864
+ KwargInfo('compile_args', ContainerTypeInfo(list, str), listify=True, default=[]),
865
+ _INCLUDE_DIRS_KW,
866
+ _DEPENDENCIES_KW.evolve(since='1.1.0'),
867
+ _DEPENDS_KW.evolve(since='1.4.0'),
868
+ )
869
+ def preprocess_method(self, args: T.Tuple[T.List['mesonlib.FileOrString']], kwargs: 'PreprocessKW') -> T.List[build.CustomTargetIndex]:
870
+ compiler = self.compiler.get_preprocessor()
871
+ _sources: T.List[mesonlib.File] = self.interpreter.source_strings_to_files(args[0])
872
+ sources = T.cast('T.List[SourceOutputs]', _sources)
873
+ if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in sources):
874
+ FeatureNew.single_use('compiler.preprocess with generated sources', '1.1.0', self.subproject,
875
+ location=self.current_node)
876
+
877
+ tg_counter = next(self.preprocess_uid[self.interpreter.subdir])
878
+ if tg_counter > 0:
879
+ FeatureNew.single_use('compiler.preprocess used multiple times', '1.1.0', self.subproject,
880
+ location=self.current_node)
881
+ tg_name = f'preprocessor_{tg_counter}'
882
+ tg = build.CompileTarget(
883
+ tg_name,
884
+ self.interpreter.subdir,
885
+ self.subproject,
886
+ self.environment,
887
+ sources,
888
+ kwargs['output'],
889
+ compiler,
890
+ self.interpreter.backend,
891
+ kwargs['compile_args'],
892
+ kwargs['include_directories'],
893
+ kwargs['dependencies'],
894
+ kwargs['depends'],
895
+ self.interpreter.coredata.is_build_only)
896
+ self.interpreter.add_target(tg.name, tg)
897
+ # Expose this target as list of its outputs, so user can pass them to
898
+ # other targets, list outputs, etc.
899
+ private_dir = os.path.relpath(self.interpreter.backend.get_target_private_dir(tg), self.interpreter.subdir)
900
+ return [build.CustomTargetIndex(tg, os.path.join(private_dir, o)) for o in tg.outputs]