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.
- package/BSDmakefile +6 -0
- package/Makefile +16 -0
- package/README.md +14 -11
- package/configure +18 -0
- package/configure.bat +22 -0
- package/dist/native.js +0 -8
- package/lib/application.ts +98 -0
- package/lib/authentication.ts +3 -0
- package/lib/build.py +50 -0
- package/lib/bus.ts +30 -0
- package/lib/cancellable.ts +33 -0
- package/lib/child.ts +15 -0
- package/lib/crash.ts +11 -0
- package/lib/device.ts +329 -0
- package/lib/device_manager.ts +69 -0
- package/lib/endpoint_parameters.ts +56 -0
- package/lib/icon.ts +15 -0
- package/lib/index.ts +311 -0
- package/lib/iostream.ts +78 -0
- package/lib/meson.build +53 -0
- package/lib/native.ts +9 -0
- package/lib/portal_membership.ts +10 -0
- package/lib/portal_service.ts +105 -0
- package/lib/process.ts +57 -0
- package/lib/relay.ts +44 -0
- package/lib/script.ts +352 -0
- package/lib/session.ts +113 -0
- package/lib/signals.ts +45 -0
- package/lib/socket_address.ts +35 -0
- package/lib/spawn.ts +4 -0
- package/lib/system_parameters.ts +78 -0
- package/make.bat +23 -0
- package/meson.build +160 -0
- package/meson.options +11 -0
- package/package.json +27 -6
- package/releng/deps.py +1133 -0
- package/releng/deps.toml +391 -0
- package/releng/devkit-assets/frida-core-example-unix.c +188 -0
- package/releng/devkit-assets/frida-core-example-windows.c +197 -0
- package/releng/devkit-assets/frida-core-example.sln +28 -0
- package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
- package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
- package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
- package/releng/devkit-assets/frida-gum-example.sln +28 -0
- package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
- package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
- package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
- package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
- package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
- package/releng/devkit.py +535 -0
- package/releng/env.py +420 -0
- package/releng/env_android.py +150 -0
- package/releng/env_apple.py +176 -0
- package/releng/env_generic.py +373 -0
- package/releng/frida_version.py +69 -0
- package/releng/machine_file.py +44 -0
- package/releng/machine_spec.py +290 -0
- package/releng/meson/meson.py +27 -0
- package/releng/meson/mesonbuild/__init__.py +0 -0
- package/releng/meson/mesonbuild/_pathlib.py +63 -0
- package/releng/meson/mesonbuild/_typing.py +69 -0
- package/releng/meson/mesonbuild/arglist.py +321 -0
- package/releng/meson/mesonbuild/ast/__init__.py +23 -0
- package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
- package/releng/meson/mesonbuild/ast/introspection.py +374 -0
- package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
- package/releng/meson/mesonbuild/ast/printer.py +620 -0
- package/releng/meson/mesonbuild/ast/visitor.py +161 -0
- package/releng/meson/mesonbuild/backend/__init__.py +0 -0
- package/releng/meson/mesonbuild/backend/backends.py +2047 -0
- package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
- package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
- package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
- package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
- package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
- package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
- package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
- package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
- package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
- package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
- package/releng/meson/mesonbuild/build.py +3249 -0
- package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
- package/releng/meson/mesonbuild/cargo/builder.py +238 -0
- package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
- package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
- package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
- package/releng/meson/mesonbuild/cargo/version.py +95 -0
- package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
- package/releng/meson/mesonbuild/cmake/common.py +331 -0
- package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
- package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
- package/releng/meson/mesonbuild/cmake/executor.py +241 -0
- package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
- package/releng/meson/mesonbuild/cmake/generator.py +186 -0
- package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
- package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
- package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
- package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
- package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
- package/releng/meson/mesonbuild/compilers/asm.py +307 -0
- package/releng/meson/mesonbuild/compilers/c.py +788 -0
- package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
- package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
- package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
- package/releng/meson/mesonbuild/compilers/cs.py +136 -0
- package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
- package/releng/meson/mesonbuild/compilers/cython.py +91 -0
- package/releng/meson/mesonbuild/compilers/d.py +861 -0
- package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
- package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
- package/releng/meson/mesonbuild/compilers/java.py +113 -0
- package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
- package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
- package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
- package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
- package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
- package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
- package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
- package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
- package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
- package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
- package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
- package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
- package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
- package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
- package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
- package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
- package/releng/meson/mesonbuild/compilers/objc.py +120 -0
- package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
- package/releng/meson/mesonbuild/compilers/rust.py +230 -0
- package/releng/meson/mesonbuild/compilers/swift.py +131 -0
- package/releng/meson/mesonbuild/compilers/vala.py +121 -0
- package/releng/meson/mesonbuild/coredata.py +1532 -0
- package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
- package/releng/meson/mesonbuild/dependencies/base.py +663 -0
- package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
- package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
- package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
- package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
- package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
- package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
- package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
- package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
- package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
- package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
- package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
- package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
- package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
- package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
- package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
- package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
- package/releng/meson/mesonbuild/dependencies/python.py +431 -0
- package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
- package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
- package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
- package/releng/meson/mesonbuild/depfile.py +82 -0
- package/releng/meson/mesonbuild/envconfig.py +480 -0
- package/releng/meson/mesonbuild/environment.py +987 -0
- package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
- package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
- package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
- package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
- package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
- package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
- package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
- package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
- package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
- package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
- package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
- package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
- package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
- package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
- package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
- package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
- package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
- package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
- package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
- package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
- package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
- package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
- package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
- package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
- package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
- package/releng/meson/mesonbuild/linkers/base.py +39 -0
- package/releng/meson/mesonbuild/linkers/detect.py +229 -0
- package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
- package/releng/meson/mesonbuild/mcompile.py +380 -0
- package/releng/meson/mesonbuild/mconf.py +368 -0
- package/releng/meson/mesonbuild/mdevenv.py +234 -0
- package/releng/meson/mesonbuild/mdist.py +376 -0
- package/releng/meson/mesonbuild/mesondata.py +38 -0
- package/releng/meson/mesonbuild/mesonlib.py +23 -0
- package/releng/meson/mesonbuild/mesonmain.py +289 -0
- package/releng/meson/mesonbuild/minit.py +204 -0
- package/releng/meson/mesonbuild/minstall.py +864 -0
- package/releng/meson/mesonbuild/mintro.py +667 -0
- package/releng/meson/mesonbuild/mlog.py +542 -0
- package/releng/meson/mesonbuild/modules/__init__.py +270 -0
- package/releng/meson/mesonbuild/modules/cmake.py +442 -0
- package/releng/meson/mesonbuild/modules/cuda.py +377 -0
- package/releng/meson/mesonbuild/modules/dlang.py +117 -0
- package/releng/meson/mesonbuild/modules/external_project.py +306 -0
- package/releng/meson/mesonbuild/modules/fs.py +323 -0
- package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
- package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
- package/releng/meson/mesonbuild/modules/i18n.py +405 -0
- package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
- package/releng/meson/mesonbuild/modules/java.py +112 -0
- package/releng/meson/mesonbuild/modules/keyval.py +65 -0
- package/releng/meson/mesonbuild/modules/modtest.py +33 -0
- package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
- package/releng/meson/mesonbuild/modules/python.py +556 -0
- package/releng/meson/mesonbuild/modules/python3.py +85 -0
- package/releng/meson/mesonbuild/modules/qt.py +621 -0
- package/releng/meson/mesonbuild/modules/qt4.py +23 -0
- package/releng/meson/mesonbuild/modules/qt5.py +23 -0
- package/releng/meson/mesonbuild/modules/qt6.py +22 -0
- package/releng/meson/mesonbuild/modules/rust.py +355 -0
- package/releng/meson/mesonbuild/modules/simd.py +114 -0
- package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
- package/releng/meson/mesonbuild/modules/wayland.py +151 -0
- package/releng/meson/mesonbuild/modules/windows.py +207 -0
- package/releng/meson/mesonbuild/mparser.py +1114 -0
- package/releng/meson/mesonbuild/msetup.py +365 -0
- package/releng/meson/mesonbuild/msubprojects.py +764 -0
- package/releng/meson/mesonbuild/mtest.py +2201 -0
- package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
- package/releng/meson/mesonbuild/optinterpreter.py +276 -0
- package/releng/meson/mesonbuild/programs.py +367 -0
- package/releng/meson/mesonbuild/rewriter.py +1075 -0
- package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
- package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
- package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
- package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
- package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
- package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
- package/releng/meson/mesonbuild/scripts/copy.py +19 -0
- package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
- package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
- package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
- package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
- package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
- package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
- package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
- package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
- package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
- package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
- package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
- package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
- package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
- package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
- package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
- package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
- package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
- package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
- package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
- package/releng/meson/mesonbuild/scripts/tags.py +44 -0
- package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
- package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
- package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
- package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
- package/releng/meson/mesonbuild/templates/__init__.py +0 -0
- package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
- package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
- package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
- package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
- package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
- package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
- package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
- package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
- package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
- package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
- package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
- package/releng/meson/mesonbuild/utils/__init__.py +0 -0
- package/releng/meson/mesonbuild/utils/core.py +166 -0
- package/releng/meson/mesonbuild/utils/platform.py +27 -0
- package/releng/meson/mesonbuild/utils/posix.py +32 -0
- package/releng/meson/mesonbuild/utils/universal.py +2445 -0
- package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
- package/releng/meson/mesonbuild/utils/win32.py +29 -0
- package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
- package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
- package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
- package/releng/meson-scripts/BSDmakefile +6 -0
- package/releng/meson-scripts/Makefile +16 -0
- package/releng/meson-scripts/configure +18 -0
- package/releng/meson-scripts/configure.bat +22 -0
- package/releng/meson-scripts/make.bat +23 -0
- package/releng/meson_configure.py +506 -0
- package/releng/meson_make.py +131 -0
- package/releng/mkdevkit.py +107 -0
- package/releng/mkfatmacho.py +54 -0
- package/releng/post-process-oabi.py +97 -0
- package/releng/progress.py +14 -0
- package/releng/sync-from-upstream.py +185 -0
- package/releng/tomlkit/tomlkit/__init__.py +59 -0
- package/releng/tomlkit/tomlkit/_compat.py +22 -0
- package/releng/tomlkit/tomlkit/_types.py +83 -0
- package/releng/tomlkit/tomlkit/_utils.py +158 -0
- package/releng/tomlkit/tomlkit/api.py +308 -0
- package/releng/tomlkit/tomlkit/container.py +875 -0
- package/releng/tomlkit/tomlkit/exceptions.py +227 -0
- package/releng/tomlkit/tomlkit/items.py +1967 -0
- package/releng/tomlkit/tomlkit/parser.py +1141 -0
- package/releng/tomlkit/tomlkit/py.typed +0 -0
- package/releng/tomlkit/tomlkit/source.py +180 -0
- package/releng/tomlkit/tomlkit/toml_char.py +52 -0
- package/releng/tomlkit/tomlkit/toml_document.py +7 -0
- package/releng/tomlkit/tomlkit/toml_file.py +58 -0
- package/releng/winenv.py +140 -0
- package/scripts/adjust-version.py +19 -0
- package/scripts/detect-version.py +40 -0
- package/scripts/fetch-abi-bits.py +343 -0
- package/scripts/install.js +23 -0
- package/scripts/package.py +15 -0
- package/src/addon.cc +76 -0
- package/src/application.cc +148 -0
- package/src/application.h +31 -0
- package/src/authentication.cc +174 -0
- package/src/authentication.h +24 -0
- package/src/bus.cc +167 -0
- package/src/bus.h +33 -0
- package/src/cancellable.cc +117 -0
- package/src/cancellable.h +31 -0
- package/src/child.cc +150 -0
- package/src/child.h +32 -0
- package/src/crash.cc +122 -0
- package/src/crash.h +30 -0
- package/src/device.cc +1302 -0
- package/src/device.h +55 -0
- package/src/device_manager.cc +362 -0
- package/src/device_manager.h +35 -0
- package/src/endpoint_parameters.cc +171 -0
- package/src/endpoint_parameters.h +28 -0
- package/src/glib_context.cc +62 -0
- package/src/glib_context.h +29 -0
- package/src/glib_object.cc +25 -0
- package/src/glib_object.h +37 -0
- package/src/iostream.cc +247 -0
- package/src/iostream.h +30 -0
- package/src/meson.build +26 -0
- package/src/operation.h +94 -0
- package/src/portal_membership.cc +100 -0
- package/src/portal_membership.h +26 -0
- package/src/portal_service.cc +401 -0
- package/src/portal_service.h +40 -0
- package/src/process.cc +135 -0
- package/src/process.h +30 -0
- package/src/relay.cc +139 -0
- package/src/relay.h +31 -0
- package/src/runtime.cc +443 -0
- package/src/runtime.h +64 -0
- package/src/script.cc +301 -0
- package/src/script.h +36 -0
- package/src/session.cc +860 -0
- package/src/session.h +42 -0
- package/src/signals.cc +334 -0
- package/src/signals.h +47 -0
- package/src/spawn.cc +95 -0
- package/src/spawn.h +27 -0
- package/src/usage_monitor.h +117 -0
- package/src/uv_context.cc +118 -0
- package/src/uv_context.h +40 -0
- package/src/win_delay_load_hook.cc +63 -0
- package/subprojects/frida-core.wrap +8 -0
- package/subprojects/nan.wrap +9 -0
- package/subprojects/packagefiles/nan.patch +13 -0
- package/test/data/index.ts +13 -0
- package/test/data/unixvictim-linux-x86 +0 -0
- package/test/data/unixvictim-linux-x86_64 +0 -0
- package/test/data/unixvictim-macos +0 -0
- package/test/device.ts +27 -0
- package/test/device_manager.ts +16 -0
- package/test/labrat.ts +32 -0
- package/test/script.ts +176 -0
- package/test/session.ts +73 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from .interpreterobjects import extract_required_kwarg
|
|
4
|
+
from .. import mlog
|
|
5
|
+
from .. import dependencies
|
|
6
|
+
from .. import build
|
|
7
|
+
from ..wrap import WrapMode
|
|
8
|
+
from ..mesonlib import OptionKey, extract_as_list, stringlistify, version_compare_many, listify
|
|
9
|
+
from ..dependencies import Dependency, DependencyException, NotFoundDependency
|
|
10
|
+
from ..interpreterbase import (MesonInterpreterObject, FeatureNew,
|
|
11
|
+
InterpreterException, InvalidArguments)
|
|
12
|
+
|
|
13
|
+
import typing as T
|
|
14
|
+
if T.TYPE_CHECKING:
|
|
15
|
+
from .interpreter import Interpreter
|
|
16
|
+
from ..interpreterbase import TYPE_nkwargs, TYPE_nvar
|
|
17
|
+
from .interpreterobjects import SubprojectHolder
|
|
18
|
+
from ..utils.universal import MachineChoice
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class DependencyFallbacksHolder(MesonInterpreterObject):
|
|
22
|
+
def __init__(self, interpreter: 'Interpreter', names: T.List[str], for_machine: MachineChoice,
|
|
23
|
+
allow_fallback: T.Optional[bool] = None,
|
|
24
|
+
default_options: T.Optional[T.Dict[OptionKey, str]] = None) -> None:
|
|
25
|
+
super().__init__(subproject=interpreter.subproject)
|
|
26
|
+
self.interpreter = interpreter
|
|
27
|
+
self.subproject = interpreter.subproject
|
|
28
|
+
self.for_machine = for_machine
|
|
29
|
+
self.coredata = interpreter.coredata
|
|
30
|
+
self.build = interpreter.build
|
|
31
|
+
self.environment = interpreter.environment
|
|
32
|
+
self.wrap_resolver = interpreter.environment.wrap_resolver
|
|
33
|
+
self.allow_fallback = allow_fallback
|
|
34
|
+
self.subproject_name: T.Optional[str] = None
|
|
35
|
+
self.subproject_varname: T.Optional[str] = None
|
|
36
|
+
self.subproject_kwargs = {'default_options': default_options or {}}
|
|
37
|
+
self.names: T.List[str] = []
|
|
38
|
+
self.forcefallback: bool = False
|
|
39
|
+
self.nofallback: bool = False
|
|
40
|
+
for name in names:
|
|
41
|
+
if not name:
|
|
42
|
+
raise InterpreterException('dependency_fallbacks empty name \'\' is not allowed')
|
|
43
|
+
if '<' in name or '>' in name or '=' in name:
|
|
44
|
+
raise InvalidArguments('Characters <, > and = are forbidden in dependency names. To specify'
|
|
45
|
+
'version\n requirements use the \'version\' keyword argument instead.')
|
|
46
|
+
if name in self.names:
|
|
47
|
+
raise InterpreterException(f'dependency_fallbacks name {name!r} is duplicated')
|
|
48
|
+
self.names.append(name)
|
|
49
|
+
self._display_name = self.names[0] if self.names else '(anonymous)'
|
|
50
|
+
|
|
51
|
+
def set_fallback(self, fbinfo: T.Optional[T.Union[T.List[str], str]]) -> None:
|
|
52
|
+
# Legacy: This converts dependency()'s fallback kwargs.
|
|
53
|
+
if fbinfo is None:
|
|
54
|
+
return
|
|
55
|
+
if self.allow_fallback is not None:
|
|
56
|
+
raise InvalidArguments('"fallback" and "allow_fallback" arguments are mutually exclusive')
|
|
57
|
+
fbinfo = stringlistify(fbinfo)
|
|
58
|
+
if len(fbinfo) == 0:
|
|
59
|
+
# dependency('foo', fallback: []) is the same as dependency('foo', allow_fallback: false)
|
|
60
|
+
self.allow_fallback = False
|
|
61
|
+
return
|
|
62
|
+
if len(fbinfo) == 1:
|
|
63
|
+
FeatureNew.single_use('Fallback without variable name', '0.53.0', self.subproject)
|
|
64
|
+
subp_name, varname = fbinfo[0], None
|
|
65
|
+
elif len(fbinfo) == 2:
|
|
66
|
+
subp_name, varname = fbinfo
|
|
67
|
+
else:
|
|
68
|
+
raise InterpreterException('Fallback info must have one or two items.')
|
|
69
|
+
self._subproject_impl(subp_name, varname)
|
|
70
|
+
|
|
71
|
+
def _subproject_impl(self, subp_name: str, varname: str) -> None:
|
|
72
|
+
assert self.subproject_name is None
|
|
73
|
+
self.subproject_name = subp_name
|
|
74
|
+
self.subproject_varname = varname
|
|
75
|
+
|
|
76
|
+
def _do_dependency_cache(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
|
|
77
|
+
name = func_args[0]
|
|
78
|
+
cached_dep = self._get_cached_dep(name, kwargs)
|
|
79
|
+
if cached_dep:
|
|
80
|
+
self._verify_fallback_consistency(cached_dep)
|
|
81
|
+
return cached_dep
|
|
82
|
+
|
|
83
|
+
def _do_dependency(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
|
|
84
|
+
# Note that there is no df.dependency() method, this is called for names
|
|
85
|
+
# given as positional arguments to dependency_fallbacks(name1, ...).
|
|
86
|
+
# We use kwargs from the dependency() function, for things like version,
|
|
87
|
+
# module, etc.
|
|
88
|
+
name = func_args[0]
|
|
89
|
+
self._handle_featurenew_dependencies(name)
|
|
90
|
+
dep = dependencies.find_external_dependency(name, self.environment, kwargs)
|
|
91
|
+
if dep.found():
|
|
92
|
+
identifier = dependencies.get_dep_identifier(name, kwargs)
|
|
93
|
+
self.coredata.deps[self.for_machine].put(identifier, dep)
|
|
94
|
+
return dep
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
def _do_existing_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
|
|
98
|
+
subp_name = func_args[0]
|
|
99
|
+
varname = self.subproject_varname
|
|
100
|
+
if subp_name and self._get_subproject(subp_name):
|
|
101
|
+
return self._get_subproject_dep(subp_name, varname, kwargs)
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
def _do_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
|
|
105
|
+
if self.forcefallback:
|
|
106
|
+
mlog.log('Looking for a fallback subproject for the dependency',
|
|
107
|
+
mlog.bold(self._display_name), 'because:\nUse of fallback dependencies is forced.')
|
|
108
|
+
elif self.nofallback:
|
|
109
|
+
mlog.log('Not looking for a fallback subproject for the dependency',
|
|
110
|
+
mlog.bold(self._display_name), 'because:\nUse of fallback dependencies is disabled.')
|
|
111
|
+
return None
|
|
112
|
+
else:
|
|
113
|
+
mlog.log('Looking for a fallback subproject for the dependency',
|
|
114
|
+
mlog.bold(self._display_name))
|
|
115
|
+
|
|
116
|
+
# dependency('foo', static: true) should implicitly add
|
|
117
|
+
# default_options: ['default_library=static']
|
|
118
|
+
static = kwargs.get('static')
|
|
119
|
+
default_options = func_kwargs.get('default_options', {})
|
|
120
|
+
if static is not None and 'default_library' not in default_options:
|
|
121
|
+
default_library = 'static' if static else 'shared'
|
|
122
|
+
mlog.log(f'Building fallback subproject with default_library={default_library}')
|
|
123
|
+
default_options[OptionKey('default_library')] = default_library
|
|
124
|
+
func_kwargs['default_options'] = default_options
|
|
125
|
+
|
|
126
|
+
# Configure the subproject
|
|
127
|
+
subp_name = self.subproject_name
|
|
128
|
+
varname = self.subproject_varname
|
|
129
|
+
func_kwargs.setdefault('version', [])
|
|
130
|
+
if 'default_options' in kwargs and isinstance(kwargs['default_options'], str):
|
|
131
|
+
func_kwargs['default_options'] = listify(kwargs['default_options'])
|
|
132
|
+
self.interpreter.do_subproject(subp_name, func_kwargs)
|
|
133
|
+
return self._get_subproject_dep(subp_name, varname, kwargs)
|
|
134
|
+
|
|
135
|
+
def _get_subproject(self, subp_name: str) -> T.Optional[SubprojectHolder]:
|
|
136
|
+
sub = self.interpreter.subprojects[self.for_machine].get(subp_name)
|
|
137
|
+
if sub and sub.found():
|
|
138
|
+
return sub
|
|
139
|
+
return None
|
|
140
|
+
|
|
141
|
+
def _get_subproject_dep(self, subp_name: str, varname: str, kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
|
|
142
|
+
# Verify the subproject is found
|
|
143
|
+
subproject = self._get_subproject(subp_name)
|
|
144
|
+
if not subproject:
|
|
145
|
+
self._log_found(False, subproject=subp_name, extra_args=[mlog.blue('(subproject failed to configure)')])
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
# The subproject has been configured. If for any reason the dependency
|
|
149
|
+
# cannot be found in this subproject we have to return not-found object
|
|
150
|
+
# instead of None, because we don't want to continue the lookup on the
|
|
151
|
+
# system.
|
|
152
|
+
|
|
153
|
+
# Check if the subproject overridden at least one of the names we got.
|
|
154
|
+
cached_dep = None
|
|
155
|
+
for name in self.names:
|
|
156
|
+
cached_dep = self._get_cached_dep(name, kwargs)
|
|
157
|
+
if cached_dep:
|
|
158
|
+
break
|
|
159
|
+
|
|
160
|
+
# If we have cached_dep we did all the checks and logging already in
|
|
161
|
+
# self._get_cached_dep().
|
|
162
|
+
if cached_dep:
|
|
163
|
+
self._verify_fallback_consistency(cached_dep)
|
|
164
|
+
return cached_dep
|
|
165
|
+
|
|
166
|
+
# Legacy: Use the variable name if provided instead of relying on the
|
|
167
|
+
# subproject to override one of our dependency names
|
|
168
|
+
if not varname:
|
|
169
|
+
# If no variable name is specified, check if the wrap file has one.
|
|
170
|
+
# If the wrap file has a variable name, better use it because the
|
|
171
|
+
# subproject most probably is not using meson.override_dependency().
|
|
172
|
+
for name in self.names:
|
|
173
|
+
varname = self.wrap_resolver.get_varname(subp_name, name)
|
|
174
|
+
if varname:
|
|
175
|
+
break
|
|
176
|
+
if not varname:
|
|
177
|
+
mlog.warning(f'Subproject {subp_name!r} did not override {self._display_name!r} dependency and no variable name specified')
|
|
178
|
+
self._log_found(False, subproject=subproject.subdir)
|
|
179
|
+
return self._notfound_dependency()
|
|
180
|
+
|
|
181
|
+
var_dep = self._get_subproject_variable(subproject, varname) or self._notfound_dependency()
|
|
182
|
+
if not var_dep.found():
|
|
183
|
+
self._log_found(False, subproject=subproject.subdir)
|
|
184
|
+
return var_dep
|
|
185
|
+
|
|
186
|
+
wanted = stringlistify(kwargs.get('version', []))
|
|
187
|
+
found = var_dep.get_version()
|
|
188
|
+
if not self._check_version(wanted, found):
|
|
189
|
+
self._log_found(False, subproject=subproject.subdir,
|
|
190
|
+
extra_args=['found', mlog.normal_cyan(found), 'but need:',
|
|
191
|
+
mlog.bold(', '.join([f"'{e}'" for e in wanted]))])
|
|
192
|
+
return self._notfound_dependency()
|
|
193
|
+
|
|
194
|
+
self._log_found(True, subproject=subproject.subdir,
|
|
195
|
+
extra_args=[mlog.normal_cyan(found) if found else None])
|
|
196
|
+
return var_dep
|
|
197
|
+
|
|
198
|
+
def _log_found(self, found: bool, extra_args: T.Optional[mlog.TV_LoggableList] = None,
|
|
199
|
+
subproject: T.Optional[str] = None) -> None:
|
|
200
|
+
msg: mlog.TV_LoggableList = [
|
|
201
|
+
'Dependency', mlog.bold(self._display_name),
|
|
202
|
+
'for', mlog.bold(self.for_machine.get_lower_case_name()), 'machine']
|
|
203
|
+
if subproject:
|
|
204
|
+
msg.extend(['from subproject', subproject])
|
|
205
|
+
msg.extend(['found:', mlog.red('NO') if not found else mlog.green('YES')])
|
|
206
|
+
if extra_args:
|
|
207
|
+
msg.extend(extra_args)
|
|
208
|
+
|
|
209
|
+
mlog.log(*msg)
|
|
210
|
+
|
|
211
|
+
def _get_cached_dep(self, name: str, kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
|
|
212
|
+
# Unlike other methods, this one returns not-found dependency instead
|
|
213
|
+
# of None in the case the dependency is cached as not-found, or if cached
|
|
214
|
+
# version does not match. In that case we don't want to continue with
|
|
215
|
+
# other candidates.
|
|
216
|
+
identifier = dependencies.get_dep_identifier(name, kwargs)
|
|
217
|
+
wanted_vers = stringlistify(kwargs.get('version', []))
|
|
218
|
+
|
|
219
|
+
override = self.build.dependency_overrides[self.for_machine].get(identifier)
|
|
220
|
+
if not override and self.subproject_name:
|
|
221
|
+
identifier_without_modules = tuple((k, v) for k, v in identifier if k not in {'modules', 'optional_modules'})
|
|
222
|
+
if identifier_without_modules != identifier:
|
|
223
|
+
override = self.build.dependency_overrides[self.for_machine].get(identifier_without_modules)
|
|
224
|
+
if override:
|
|
225
|
+
info = [mlog.blue('(overridden)' if override.explicit else '(cached)')]
|
|
226
|
+
cached_dep = override.dep
|
|
227
|
+
# We don't implicitly override not-found dependencies, but user could
|
|
228
|
+
# have explicitly called meson.override_dependency() with a not-found
|
|
229
|
+
# dep.
|
|
230
|
+
if not cached_dep.found():
|
|
231
|
+
self._log_found(False, extra_args=info)
|
|
232
|
+
return cached_dep
|
|
233
|
+
elif self.forcefallback and self.subproject_name:
|
|
234
|
+
cached_dep = None
|
|
235
|
+
else:
|
|
236
|
+
info = [mlog.blue('(cached)')]
|
|
237
|
+
cached_dep = self.coredata.deps[self.for_machine].get(identifier)
|
|
238
|
+
|
|
239
|
+
if cached_dep:
|
|
240
|
+
found_vers = cached_dep.get_version()
|
|
241
|
+
if not self._check_version(wanted_vers, found_vers):
|
|
242
|
+
if not override:
|
|
243
|
+
# We cached this dependency on disk from a previous run,
|
|
244
|
+
# but it could got updated on the system in the meantime.
|
|
245
|
+
return None
|
|
246
|
+
self._log_found(
|
|
247
|
+
False, extra_args=[
|
|
248
|
+
'found', mlog.normal_cyan(found_vers), 'but need:',
|
|
249
|
+
mlog.bold(', '.join([f"'{e}'" for e in wanted_vers])),
|
|
250
|
+
*info])
|
|
251
|
+
return self._notfound_dependency()
|
|
252
|
+
if found_vers:
|
|
253
|
+
info = [mlog.normal_cyan(found_vers), *info]
|
|
254
|
+
self._log_found(True, extra_args=info)
|
|
255
|
+
return cached_dep
|
|
256
|
+
return None
|
|
257
|
+
|
|
258
|
+
def _get_subproject_variable(self, subproject: SubprojectHolder, varname: str) -> T.Optional[Dependency]:
|
|
259
|
+
try:
|
|
260
|
+
var_dep = subproject.get_variable_method([varname], {})
|
|
261
|
+
except InvalidArguments:
|
|
262
|
+
var_dep = None
|
|
263
|
+
if not isinstance(var_dep, Dependency):
|
|
264
|
+
mlog.warning(f'Variable {varname!r} in the subproject {subproject.subdir!r} is',
|
|
265
|
+
'not found' if var_dep is None else 'not a dependency object')
|
|
266
|
+
return None
|
|
267
|
+
return var_dep
|
|
268
|
+
|
|
269
|
+
def _verify_fallback_consistency(self, cached_dep: Dependency) -> None:
|
|
270
|
+
subp_name = self.subproject_name
|
|
271
|
+
varname = self.subproject_varname
|
|
272
|
+
subproject = self._get_subproject(subp_name)
|
|
273
|
+
if subproject and varname:
|
|
274
|
+
var_dep = self._get_subproject_variable(subproject, varname)
|
|
275
|
+
if var_dep and cached_dep.found() and var_dep != cached_dep:
|
|
276
|
+
mlog.warning(f'Inconsistency: Subproject has overridden the dependency with another variable than {varname!r}')
|
|
277
|
+
|
|
278
|
+
def _handle_featurenew_dependencies(self, name: str) -> None:
|
|
279
|
+
'Do a feature check on dependencies used by this subproject'
|
|
280
|
+
if name == 'mpi':
|
|
281
|
+
FeatureNew.single_use('MPI Dependency', '0.42.0', self.subproject)
|
|
282
|
+
elif name == 'pcap':
|
|
283
|
+
FeatureNew.single_use('Pcap Dependency', '0.42.0', self.subproject)
|
|
284
|
+
elif name == 'vulkan':
|
|
285
|
+
FeatureNew.single_use('Vulkan Dependency', '0.42.0', self.subproject)
|
|
286
|
+
elif name == 'libwmf':
|
|
287
|
+
FeatureNew.single_use('LibWMF Dependency', '0.44.0', self.subproject)
|
|
288
|
+
elif name == 'openmp':
|
|
289
|
+
FeatureNew.single_use('OpenMP Dependency', '0.46.0', self.subproject)
|
|
290
|
+
|
|
291
|
+
def _notfound_dependency(self) -> NotFoundDependency:
|
|
292
|
+
return NotFoundDependency(self.names[0] if self.names else '', self.environment)
|
|
293
|
+
|
|
294
|
+
@staticmethod
|
|
295
|
+
def _check_version(wanted: T.List[str], found: str) -> bool:
|
|
296
|
+
if not wanted:
|
|
297
|
+
return True
|
|
298
|
+
return not (found == 'undefined' or not version_compare_many(found, wanted)[0])
|
|
299
|
+
|
|
300
|
+
def _get_candidates(self) -> T.List[T.Tuple[T.Callable[[TYPE_nkwargs, TYPE_nvar, TYPE_nkwargs], T.Optional[Dependency]], TYPE_nvar, TYPE_nkwargs]]:
|
|
301
|
+
candidates = []
|
|
302
|
+
# 1. check if any of the names is cached already.
|
|
303
|
+
for name in self.names:
|
|
304
|
+
candidates.append((self._do_dependency_cache, [name], {}))
|
|
305
|
+
# 2. check if the subproject fallback has already been configured.
|
|
306
|
+
if self.subproject_name:
|
|
307
|
+
candidates.append((self._do_existing_subproject, [self.subproject_name], self.subproject_kwargs))
|
|
308
|
+
# 3. check external dependency if we are not forced to use subproject
|
|
309
|
+
if not self.forcefallback or not self.subproject_name:
|
|
310
|
+
for name in self.names:
|
|
311
|
+
candidates.append((self._do_dependency, [name], {}))
|
|
312
|
+
# 4. configure the subproject
|
|
313
|
+
if self.subproject_name:
|
|
314
|
+
candidates.append((self._do_subproject, [self.subproject_name], self.subproject_kwargs))
|
|
315
|
+
return candidates
|
|
316
|
+
|
|
317
|
+
def lookup(self, kwargs: TYPE_nkwargs, force_fallback: bool = False) -> Dependency:
|
|
318
|
+
mods = extract_as_list(kwargs, 'modules')
|
|
319
|
+
if mods:
|
|
320
|
+
self._display_name += ' (modules: {})'.format(', '.join(str(i) for i in mods))
|
|
321
|
+
|
|
322
|
+
disabled, required, feature = extract_required_kwarg(kwargs, self.subproject)
|
|
323
|
+
if disabled:
|
|
324
|
+
mlog.log('Dependency', mlog.bold(self._display_name),
|
|
325
|
+
'for', mlog.bold(self.for_machine.get_lower_case_name()), 'machine',
|
|
326
|
+
'skipped: feature', mlog.bold(feature), 'disabled')
|
|
327
|
+
return self._notfound_dependency()
|
|
328
|
+
|
|
329
|
+
# Check if usage of the subproject fallback is forced
|
|
330
|
+
wrap_mode = self.coredata.get_option(OptionKey('wrap_mode'))
|
|
331
|
+
assert isinstance(wrap_mode, WrapMode), 'for mypy'
|
|
332
|
+
force_fallback_for = self.coredata.get_option(OptionKey('force_fallback_for'))
|
|
333
|
+
assert isinstance(force_fallback_for, list), 'for mypy'
|
|
334
|
+
self.nofallback = wrap_mode == WrapMode.nofallback
|
|
335
|
+
self.forcefallback = (force_fallback or
|
|
336
|
+
wrap_mode == WrapMode.forcefallback or
|
|
337
|
+
any(name in force_fallback_for for name in self.names) or
|
|
338
|
+
self.subproject_name in force_fallback_for)
|
|
339
|
+
|
|
340
|
+
# Add an implicit subproject fallback if none has been set explicitly,
|
|
341
|
+
# unless implicit fallback is not allowed.
|
|
342
|
+
# Legacy: self.allow_fallback can be None when that kwarg is not defined
|
|
343
|
+
# in dependency('name'). In that case we don't want to use implicit
|
|
344
|
+
# fallback when required is false because user will typically fallback
|
|
345
|
+
# manually using cc.find_library() for example.
|
|
346
|
+
if not self.subproject_name and self.allow_fallback is not False:
|
|
347
|
+
for name in self.names:
|
|
348
|
+
subp_name, varname = self.wrap_resolver.find_dep_provider(name)
|
|
349
|
+
if subp_name:
|
|
350
|
+
self.forcefallback |= subp_name in force_fallback_for
|
|
351
|
+
if self.forcefallback or self.allow_fallback is True or required or self._get_subproject(subp_name):
|
|
352
|
+
self._subproject_impl(subp_name, varname)
|
|
353
|
+
break
|
|
354
|
+
|
|
355
|
+
candidates = self._get_candidates()
|
|
356
|
+
|
|
357
|
+
# writing just "dependency('')" is an error, because it can only fail
|
|
358
|
+
if not candidates and required:
|
|
359
|
+
raise InvalidArguments('Dependency is required but has no candidates.')
|
|
360
|
+
|
|
361
|
+
# Try all candidates, only the last one is really required.
|
|
362
|
+
last = len(candidates) - 1
|
|
363
|
+
for i, item in enumerate(candidates):
|
|
364
|
+
func, func_args, func_kwargs = item
|
|
365
|
+
func_kwargs['required'] = required and (i == last)
|
|
366
|
+
func_kwargs['for_machine'] = self.for_machine
|
|
367
|
+
kwargs['required'] = required and (i == last)
|
|
368
|
+
dep = func(kwargs, func_args, func_kwargs)
|
|
369
|
+
if dep and dep.found():
|
|
370
|
+
# Override this dependency to have consistent results in subsequent
|
|
371
|
+
# dependency lookups.
|
|
372
|
+
for name in self.names:
|
|
373
|
+
identifier = dependencies.get_dep_identifier(name, kwargs)
|
|
374
|
+
if identifier not in self.build.dependency_overrides[self.for_machine]:
|
|
375
|
+
self.build.dependency_overrides[self.for_machine][identifier] = \
|
|
376
|
+
build.DependencyOverride(dep, self.interpreter.current_node, explicit=False)
|
|
377
|
+
return dep
|
|
378
|
+
elif required and (dep or i == last):
|
|
379
|
+
# This was the last candidate or the dependency has been cached
|
|
380
|
+
# as not-found, or cached dependency version does not match,
|
|
381
|
+
# otherwise func() would have returned None instead.
|
|
382
|
+
raise DependencyException(f'Dependency {self._display_name!r} is required but not found.')
|
|
383
|
+
elif dep:
|
|
384
|
+
# Same as above, but the dependency is not required.
|
|
385
|
+
return dep
|
|
386
|
+
return self._notfound_dependency()
|