frida 16.2.1 → 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,424 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2013-2021 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from .base import ExternalDependency, DependencyException, DependencyTypeName
|
|
7
|
+
from .pkgconfig import PkgConfigDependency
|
|
8
|
+
from ..mesonlib import (Popen_safe, OptionKey, join_args, version_compare)
|
|
9
|
+
from ..programs import ExternalProgram
|
|
10
|
+
from .. import mlog
|
|
11
|
+
import re
|
|
12
|
+
import os
|
|
13
|
+
import json
|
|
14
|
+
import typing as T
|
|
15
|
+
|
|
16
|
+
if T.TYPE_CHECKING:
|
|
17
|
+
from ..environment import Environment
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DubDependency(ExternalDependency):
|
|
21
|
+
# dub program and version
|
|
22
|
+
class_dubbin: T.Optional[T.Tuple[ExternalProgram, str]] = None
|
|
23
|
+
class_dubbin_searched = False
|
|
24
|
+
|
|
25
|
+
def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
|
|
26
|
+
super().__init__(DependencyTypeName('dub'), environment, kwargs, language='d')
|
|
27
|
+
self.name = name
|
|
28
|
+
from ..compilers.d import DCompiler, d_feature_args
|
|
29
|
+
|
|
30
|
+
_temp_comp = super().get_compiler()
|
|
31
|
+
assert isinstance(_temp_comp, DCompiler)
|
|
32
|
+
self.compiler = _temp_comp
|
|
33
|
+
|
|
34
|
+
if 'required' in kwargs:
|
|
35
|
+
self.required = kwargs.get('required')
|
|
36
|
+
|
|
37
|
+
if DubDependency.class_dubbin is None and not DubDependency.class_dubbin_searched:
|
|
38
|
+
DubDependency.class_dubbin = self._check_dub()
|
|
39
|
+
DubDependency.class_dubbin_searched = True
|
|
40
|
+
if DubDependency.class_dubbin is None:
|
|
41
|
+
if self.required:
|
|
42
|
+
raise DependencyException('DUB not found.')
|
|
43
|
+
self.is_found = False
|
|
44
|
+
return
|
|
45
|
+
|
|
46
|
+
(self.dubbin, dubver) = DubDependency.class_dubbin # pylint: disable=unpacking-non-sequence
|
|
47
|
+
|
|
48
|
+
assert isinstance(self.dubbin, ExternalProgram)
|
|
49
|
+
|
|
50
|
+
# Check if Dub version is compatible with Meson
|
|
51
|
+
if version_compare(dubver, '>1.31.1'):
|
|
52
|
+
if self.required:
|
|
53
|
+
raise DependencyException(
|
|
54
|
+
f"DUB version {dubver} is not compatible with Meson (can't locate artifacts in Dub cache)")
|
|
55
|
+
self.is_found = False
|
|
56
|
+
return
|
|
57
|
+
|
|
58
|
+
mlog.debug('Determining dependency {!r} with DUB executable '
|
|
59
|
+
'{!r}'.format(name, self.dubbin.get_path()))
|
|
60
|
+
|
|
61
|
+
# if an explicit version spec was stated, use this when querying Dub
|
|
62
|
+
main_pack_spec = name
|
|
63
|
+
if 'version' in kwargs:
|
|
64
|
+
version_spec = kwargs['version']
|
|
65
|
+
if isinstance(version_spec, list):
|
|
66
|
+
version_spec = " ".join(version_spec)
|
|
67
|
+
main_pack_spec = f'{name}@{version_spec}'
|
|
68
|
+
|
|
69
|
+
# we need to know the target architecture
|
|
70
|
+
dub_arch = self.compiler.arch
|
|
71
|
+
|
|
72
|
+
# we need to know the build type as well
|
|
73
|
+
dub_buildtype = str(environment.coredata.get_option(OptionKey('buildtype')))
|
|
74
|
+
# MESON types: choices=['plain', 'debug', 'debugoptimized', 'release', 'minsize', 'custom'])),
|
|
75
|
+
# DUB types: debug (default), plain, release, release-debug, release-nobounds, unittest, profile, profile-gc,
|
|
76
|
+
# docs, ddox, cov, unittest-cov, syntax and custom
|
|
77
|
+
if dub_buildtype == 'debugoptimized':
|
|
78
|
+
dub_buildtype = 'release-debug'
|
|
79
|
+
elif dub_buildtype == 'minsize':
|
|
80
|
+
dub_buildtype = 'release'
|
|
81
|
+
|
|
82
|
+
# Ask dub for the package
|
|
83
|
+
describe_cmd = [
|
|
84
|
+
'describe', main_pack_spec, '--arch=' + dub_arch,
|
|
85
|
+
'--build=' + dub_buildtype, '--compiler=' + self.compiler.get_exelist()[-1]
|
|
86
|
+
]
|
|
87
|
+
ret, res, err = self._call_dubbin(describe_cmd)
|
|
88
|
+
|
|
89
|
+
if ret != 0:
|
|
90
|
+
mlog.debug('DUB describe failed: ' + err)
|
|
91
|
+
if 'locally' in err:
|
|
92
|
+
fetch_cmd = ['dub', 'fetch', main_pack_spec]
|
|
93
|
+
mlog.error(mlog.bold(main_pack_spec), 'is not present locally. You may try the following command:')
|
|
94
|
+
mlog.log(mlog.bold(join_args(fetch_cmd)))
|
|
95
|
+
self.is_found = False
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
# A command that might be useful in case of missing DUB package
|
|
99
|
+
def dub_build_deep_command() -> str:
|
|
100
|
+
cmd = [
|
|
101
|
+
'dub', 'run', 'dub-build-deep', '--yes', '--', main_pack_spec,
|
|
102
|
+
'--arch=' + dub_arch, '--compiler=' + self.compiler.get_exelist()[-1],
|
|
103
|
+
'--build=' + dub_buildtype
|
|
104
|
+
]
|
|
105
|
+
return join_args(cmd)
|
|
106
|
+
|
|
107
|
+
dub_comp_id = self.compiler.get_id().replace('llvm', 'ldc').replace('gcc', 'gdc')
|
|
108
|
+
description = json.loads(res)
|
|
109
|
+
|
|
110
|
+
self.compile_args = []
|
|
111
|
+
self.link_args = self.raw_link_args = []
|
|
112
|
+
|
|
113
|
+
show_buildtype_warning = False
|
|
114
|
+
|
|
115
|
+
def find_package_target(pkg: T.Dict[str, str]) -> bool:
|
|
116
|
+
nonlocal show_buildtype_warning
|
|
117
|
+
# try to find a static library in a DUB folder corresponding to
|
|
118
|
+
# version, configuration, compiler, arch and build-type
|
|
119
|
+
# if can find, add to link_args.
|
|
120
|
+
# link_args order is meaningful, so this function MUST be called in the right order
|
|
121
|
+
pack_id = f'{pkg["name"]}@{pkg["version"]}'
|
|
122
|
+
(tgt_file, compatibilities) = self._find_compatible_package_target(description, pkg, dub_comp_id)
|
|
123
|
+
if tgt_file is None:
|
|
124
|
+
if not compatibilities:
|
|
125
|
+
mlog.error(mlog.bold(pack_id), 'not found')
|
|
126
|
+
elif 'compiler' not in compatibilities:
|
|
127
|
+
mlog.error(mlog.bold(pack_id), 'found but not compiled with ', mlog.bold(dub_comp_id))
|
|
128
|
+
elif dub_comp_id != 'gdc' and 'compiler_version' not in compatibilities:
|
|
129
|
+
mlog.error(mlog.bold(pack_id), 'found but not compiled with',
|
|
130
|
+
mlog.bold(f'{dub_comp_id}-{self.compiler.version}'))
|
|
131
|
+
elif 'arch' not in compatibilities:
|
|
132
|
+
mlog.error(mlog.bold(pack_id), 'found but not compiled for', mlog.bold(dub_arch))
|
|
133
|
+
elif 'platform' not in compatibilities:
|
|
134
|
+
mlog.error(mlog.bold(pack_id), 'found but not compiled for',
|
|
135
|
+
mlog.bold(description['platform'].join('.')))
|
|
136
|
+
elif 'configuration' not in compatibilities:
|
|
137
|
+
mlog.error(mlog.bold(pack_id), 'found but not compiled for the',
|
|
138
|
+
mlog.bold(pkg['configuration']), 'configuration')
|
|
139
|
+
else:
|
|
140
|
+
mlog.error(mlog.bold(pack_id), 'not found')
|
|
141
|
+
|
|
142
|
+
mlog.log('You may try the following command to install the necessary DUB libraries:')
|
|
143
|
+
mlog.log(mlog.bold(dub_build_deep_command()))
|
|
144
|
+
|
|
145
|
+
return False
|
|
146
|
+
|
|
147
|
+
if 'build_type' not in compatibilities:
|
|
148
|
+
mlog.warning(mlog.bold(pack_id), 'found but not compiled as', mlog.bold(dub_buildtype))
|
|
149
|
+
show_buildtype_warning = True
|
|
150
|
+
|
|
151
|
+
self.link_args.append(tgt_file)
|
|
152
|
+
return True
|
|
153
|
+
|
|
154
|
+
# Main algorithm:
|
|
155
|
+
# 1. Ensure that the target is a compatible library type (not dynamic)
|
|
156
|
+
# 2. Find a compatible built library for the main dependency
|
|
157
|
+
# 3. Do the same for each sub-dependency.
|
|
158
|
+
# link_args MUST be in the same order than the "linkDependencies" of the main target
|
|
159
|
+
# 4. Add other build settings (imports, versions etc.)
|
|
160
|
+
|
|
161
|
+
# 1
|
|
162
|
+
self.is_found = False
|
|
163
|
+
packages = {}
|
|
164
|
+
for pkg in description['packages']:
|
|
165
|
+
packages[pkg['name']] = pkg
|
|
166
|
+
|
|
167
|
+
if not pkg['active']:
|
|
168
|
+
continue
|
|
169
|
+
|
|
170
|
+
if pkg['targetType'] == 'dynamicLibrary':
|
|
171
|
+
mlog.error('DUB dynamic library dependencies are not supported.')
|
|
172
|
+
self.is_found = False
|
|
173
|
+
return
|
|
174
|
+
|
|
175
|
+
# check that the main dependency is indeed a library
|
|
176
|
+
if pkg['name'] == name:
|
|
177
|
+
self.is_found = True
|
|
178
|
+
|
|
179
|
+
if pkg['targetType'] not in ['library', 'sourceLibrary', 'staticLibrary']:
|
|
180
|
+
mlog.error(mlog.bold(name), "found but it isn't a library")
|
|
181
|
+
self.is_found = False
|
|
182
|
+
return
|
|
183
|
+
|
|
184
|
+
self.version = pkg['version']
|
|
185
|
+
self.pkg = pkg
|
|
186
|
+
|
|
187
|
+
# collect all targets
|
|
188
|
+
targets = {}
|
|
189
|
+
for tgt in description['targets']:
|
|
190
|
+
targets[tgt['rootPackage']] = tgt
|
|
191
|
+
|
|
192
|
+
if name not in targets:
|
|
193
|
+
self.is_found = False
|
|
194
|
+
if self.pkg['targetType'] == 'sourceLibrary':
|
|
195
|
+
# source libraries have no associated targets,
|
|
196
|
+
# but some build settings like import folders must be found from the package object.
|
|
197
|
+
# Current algo only get these from "buildSettings" in the target object.
|
|
198
|
+
# Let's save this for a future PR.
|
|
199
|
+
# (See openssl DUB package for example of sourceLibrary)
|
|
200
|
+
mlog.error('DUB targets of type', mlog.bold('sourceLibrary'), 'are not supported.')
|
|
201
|
+
else:
|
|
202
|
+
mlog.error('Could not find target description for', mlog.bold(main_pack_spec))
|
|
203
|
+
|
|
204
|
+
if not self.is_found:
|
|
205
|
+
mlog.error(f'Could not find {name} in DUB description')
|
|
206
|
+
return
|
|
207
|
+
|
|
208
|
+
# Current impl only supports static libraries
|
|
209
|
+
self.static = True
|
|
210
|
+
|
|
211
|
+
# 2
|
|
212
|
+
if not find_package_target(self.pkg):
|
|
213
|
+
self.is_found = False
|
|
214
|
+
return
|
|
215
|
+
|
|
216
|
+
# 3
|
|
217
|
+
for link_dep in targets[name]['linkDependencies']:
|
|
218
|
+
pkg = packages[link_dep]
|
|
219
|
+
if not find_package_target(pkg):
|
|
220
|
+
self.is_found = False
|
|
221
|
+
return
|
|
222
|
+
|
|
223
|
+
if show_buildtype_warning:
|
|
224
|
+
mlog.log('If it is not suitable, try the following command and reconfigure Meson with', mlog.bold('--clearcache'))
|
|
225
|
+
mlog.log(mlog.bold(dub_build_deep_command()))
|
|
226
|
+
|
|
227
|
+
# 4
|
|
228
|
+
bs = targets[name]['buildSettings']
|
|
229
|
+
|
|
230
|
+
for flag in bs['dflags']:
|
|
231
|
+
self.compile_args.append(flag)
|
|
232
|
+
|
|
233
|
+
for path in bs['importPaths']:
|
|
234
|
+
self.compile_args.append('-I' + path)
|
|
235
|
+
|
|
236
|
+
for path in bs['stringImportPaths']:
|
|
237
|
+
if 'import_dir' not in d_feature_args[self.compiler.id]:
|
|
238
|
+
break
|
|
239
|
+
flag = d_feature_args[self.compiler.id]['import_dir']
|
|
240
|
+
self.compile_args.append(f'{flag}={path}')
|
|
241
|
+
|
|
242
|
+
for ver in bs['versions']:
|
|
243
|
+
if 'version' not in d_feature_args[self.compiler.id]:
|
|
244
|
+
break
|
|
245
|
+
flag = d_feature_args[self.compiler.id]['version']
|
|
246
|
+
self.compile_args.append(f'{flag}={ver}')
|
|
247
|
+
|
|
248
|
+
if bs['mainSourceFile']:
|
|
249
|
+
self.compile_args.append(bs['mainSourceFile'])
|
|
250
|
+
|
|
251
|
+
# pass static libraries
|
|
252
|
+
# linkerFiles are added during step 3
|
|
253
|
+
# for file in bs['linkerFiles']:
|
|
254
|
+
# self.link_args.append(file)
|
|
255
|
+
|
|
256
|
+
for file in bs['sourceFiles']:
|
|
257
|
+
# sourceFiles may contain static libraries
|
|
258
|
+
if file.endswith('.lib') or file.endswith('.a'):
|
|
259
|
+
self.link_args.append(file)
|
|
260
|
+
|
|
261
|
+
for flag in bs['lflags']:
|
|
262
|
+
self.link_args.append(flag)
|
|
263
|
+
|
|
264
|
+
is_windows = self.env.machines.host.is_windows()
|
|
265
|
+
if is_windows:
|
|
266
|
+
winlibs = ['kernel32', 'user32', 'gdi32', 'winspool', 'shell32', 'ole32',
|
|
267
|
+
'oleaut32', 'uuid', 'comdlg32', 'advapi32', 'ws2_32']
|
|
268
|
+
|
|
269
|
+
for lib in bs['libs']:
|
|
270
|
+
if os.name != 'nt':
|
|
271
|
+
# trying to add system libraries by pkg-config
|
|
272
|
+
pkgdep = PkgConfigDependency(lib, environment, {'required': 'true', 'silent': 'true'})
|
|
273
|
+
if pkgdep.is_found:
|
|
274
|
+
for arg in pkgdep.get_compile_args():
|
|
275
|
+
self.compile_args.append(arg)
|
|
276
|
+
for arg in pkgdep.get_link_args():
|
|
277
|
+
self.link_args.append(arg)
|
|
278
|
+
for arg in pkgdep.get_link_args(raw=True):
|
|
279
|
+
self.raw_link_args.append(arg)
|
|
280
|
+
continue
|
|
281
|
+
|
|
282
|
+
if is_windows and lib in winlibs:
|
|
283
|
+
self.link_args.append(lib + '.lib')
|
|
284
|
+
continue
|
|
285
|
+
|
|
286
|
+
# fallback
|
|
287
|
+
self.link_args.append('-l'+lib)
|
|
288
|
+
|
|
289
|
+
# This function finds the target of the provided JSON package, built for the right
|
|
290
|
+
# compiler, architecture, configuration...
|
|
291
|
+
# It returns (target|None, {compatibilities})
|
|
292
|
+
# If None is returned for target, compatibilities will list what other targets were found without full compatibility
|
|
293
|
+
def _find_compatible_package_target(self, jdesc: T.Dict[str, str], jpack: T.Dict[str, str], dub_comp_id: str) -> T.Tuple[str, T.Set[str]]:
|
|
294
|
+
dub_build_path = os.path.join(jpack['path'], '.dub', 'build')
|
|
295
|
+
|
|
296
|
+
if not os.path.exists(dub_build_path):
|
|
297
|
+
return (None, None)
|
|
298
|
+
|
|
299
|
+
# try to find a dir like library-debug-linux.posix-x86_64-ldc_2081-EF934983A3319F8F8FF2F0E107A363BA
|
|
300
|
+
|
|
301
|
+
# fields are:
|
|
302
|
+
# - configuration
|
|
303
|
+
# - build type
|
|
304
|
+
# - platform
|
|
305
|
+
# - architecture
|
|
306
|
+
# - compiler id (dmd, ldc, gdc)
|
|
307
|
+
# - compiler version or frontend id or frontend version?
|
|
308
|
+
|
|
309
|
+
conf = jpack['configuration']
|
|
310
|
+
build_type = jdesc['buildType']
|
|
311
|
+
platforms = jdesc['platform']
|
|
312
|
+
archs = jdesc['architecture']
|
|
313
|
+
|
|
314
|
+
# Get D frontend version implemented in the compiler, or the compiler version itself
|
|
315
|
+
# gdc doesn't support this
|
|
316
|
+
comp_versions = []
|
|
317
|
+
|
|
318
|
+
if dub_comp_id != 'gdc':
|
|
319
|
+
comp_versions.append(self.compiler.version)
|
|
320
|
+
|
|
321
|
+
ret, res = self._call_compbin(['--version'])[0:2]
|
|
322
|
+
if ret != 0:
|
|
323
|
+
mlog.error('Failed to run {!r}', mlog.bold(dub_comp_id))
|
|
324
|
+
return (None, None)
|
|
325
|
+
d_ver_reg = re.search('v[0-9].[0-9][0-9][0-9].[0-9]', res) # Ex.: v2.081.2
|
|
326
|
+
|
|
327
|
+
if d_ver_reg is not None:
|
|
328
|
+
frontend_version = d_ver_reg.group()
|
|
329
|
+
frontend_id = frontend_version.rsplit('.', 1)[0].replace(
|
|
330
|
+
'v', '').replace('.', '') # Fix structure. Ex.: 2081
|
|
331
|
+
comp_versions.extend([frontend_version, frontend_id])
|
|
332
|
+
|
|
333
|
+
compatibilities: T.Set[str] = set()
|
|
334
|
+
|
|
335
|
+
# build_type is not in check_list because different build types might be compatible.
|
|
336
|
+
# We do show a WARNING that the build type is not the same.
|
|
337
|
+
# It might be critical in release builds, and acceptable otherwise
|
|
338
|
+
check_list = ('configuration', 'platform', 'arch', 'compiler', 'compiler_version')
|
|
339
|
+
|
|
340
|
+
for entry in os.listdir(dub_build_path):
|
|
341
|
+
|
|
342
|
+
target = os.path.join(dub_build_path, entry, jpack['targetFileName'])
|
|
343
|
+
if not os.path.exists(target):
|
|
344
|
+
# unless Dub and Meson are racing, the target file should be present
|
|
345
|
+
# when the directory is present
|
|
346
|
+
mlog.debug("WARNING: Could not find a Dub target: " + target)
|
|
347
|
+
continue
|
|
348
|
+
|
|
349
|
+
# we build a new set for each entry, because if this target is returned
|
|
350
|
+
# we want to return only the compatibilities associated to this target
|
|
351
|
+
# otherwise we could miss the WARNING about build_type
|
|
352
|
+
comps = set()
|
|
353
|
+
|
|
354
|
+
if conf in entry:
|
|
355
|
+
comps.add('configuration')
|
|
356
|
+
|
|
357
|
+
if build_type in entry:
|
|
358
|
+
comps.add('build_type')
|
|
359
|
+
|
|
360
|
+
if all(platform in entry for platform in platforms):
|
|
361
|
+
comps.add('platform')
|
|
362
|
+
|
|
363
|
+
if all(arch in entry for arch in archs):
|
|
364
|
+
comps.add('arch')
|
|
365
|
+
|
|
366
|
+
if dub_comp_id in entry:
|
|
367
|
+
comps.add('compiler')
|
|
368
|
+
|
|
369
|
+
if dub_comp_id == 'gdc' or any(cv in entry for cv in comp_versions):
|
|
370
|
+
comps.add('compiler_version')
|
|
371
|
+
|
|
372
|
+
if all(key in comps for key in check_list):
|
|
373
|
+
return (target, comps)
|
|
374
|
+
else:
|
|
375
|
+
compatibilities = set.union(compatibilities, comps)
|
|
376
|
+
|
|
377
|
+
return (None, compatibilities)
|
|
378
|
+
|
|
379
|
+
def _call_dubbin(self, args: T.List[str], env: T.Optional[T.Dict[str, str]] = None) -> T.Tuple[int, str, str]:
|
|
380
|
+
assert isinstance(self.dubbin, ExternalProgram)
|
|
381
|
+
p, out, err = Popen_safe(self.dubbin.get_command() + args, env=env)
|
|
382
|
+
return p.returncode, out.strip(), err.strip()
|
|
383
|
+
|
|
384
|
+
def _call_compbin(self, args: T.List[str], env: T.Optional[T.Dict[str, str]] = None) -> T.Tuple[int, str, str]:
|
|
385
|
+
p, out, err = Popen_safe(self.compiler.get_exelist() + args, env=env)
|
|
386
|
+
return p.returncode, out.strip(), err.strip()
|
|
387
|
+
|
|
388
|
+
def _check_dub(self) -> T.Optional[T.Tuple[ExternalProgram, str]]:
|
|
389
|
+
|
|
390
|
+
def find() -> T.Optional[T.Tuple[ExternalProgram, str]]:
|
|
391
|
+
dubbin = ExternalProgram('dub', silent=True)
|
|
392
|
+
|
|
393
|
+
if not dubbin.found():
|
|
394
|
+
return None
|
|
395
|
+
|
|
396
|
+
try:
|
|
397
|
+
p, out = Popen_safe(dubbin.get_command() + ['--version'])[0:2]
|
|
398
|
+
if p.returncode != 0:
|
|
399
|
+
mlog.warning('Found dub {!r} but couldn\'t run it'
|
|
400
|
+
''.format(' '.join(dubbin.get_command())))
|
|
401
|
+
return None
|
|
402
|
+
|
|
403
|
+
except (FileNotFoundError, PermissionError):
|
|
404
|
+
return None
|
|
405
|
+
|
|
406
|
+
vermatch = re.search(r'DUB version (\d+\.\d+\.\d+.*), ', out.strip())
|
|
407
|
+
if vermatch:
|
|
408
|
+
dubver = vermatch.group(1)
|
|
409
|
+
else:
|
|
410
|
+
mlog.warning(f"Found dub {' '.join(dubbin.get_command())} but couldn't parse version in {out.strip()}")
|
|
411
|
+
return None
|
|
412
|
+
|
|
413
|
+
return (dubbin, dubver)
|
|
414
|
+
|
|
415
|
+
found = find()
|
|
416
|
+
|
|
417
|
+
if found is None:
|
|
418
|
+
mlog.log('Found DUB:', mlog.red('NO'))
|
|
419
|
+
else:
|
|
420
|
+
(dubbin, dubver) = found
|
|
421
|
+
mlog.log('Found DUB:', mlog.bold(dubbin.get_path()),
|
|
422
|
+
'(version %s)' % dubver)
|
|
423
|
+
|
|
424
|
+
return found
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2013-2021 The Meson development team
|
|
3
|
+
# Copyright © 2021-2023 Intel Corporation
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import functools
|
|
8
|
+
import typing as T
|
|
9
|
+
|
|
10
|
+
from .base import DependencyException, DependencyMethods
|
|
11
|
+
from .base import process_method_kw
|
|
12
|
+
from .base import BuiltinDependency, SystemDependency
|
|
13
|
+
from .cmake import CMakeDependency
|
|
14
|
+
from .framework import ExtraFrameworkDependency
|
|
15
|
+
from .pkgconfig import PkgConfigDependency
|
|
16
|
+
|
|
17
|
+
if T.TYPE_CHECKING:
|
|
18
|
+
from .base import ExternalDependency
|
|
19
|
+
from .configtool import ConfigToolDependency
|
|
20
|
+
from ..environment import Environment
|
|
21
|
+
from ..mesonlib import MachineChoice
|
|
22
|
+
|
|
23
|
+
DependencyGenerator = T.Callable[[], ExternalDependency]
|
|
24
|
+
FactoryFunc = T.Callable[
|
|
25
|
+
[
|
|
26
|
+
'Environment',
|
|
27
|
+
MachineChoice,
|
|
28
|
+
T.Dict[str, T.Any],
|
|
29
|
+
T.List[DependencyMethods]
|
|
30
|
+
],
|
|
31
|
+
T.List[DependencyGenerator]
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
WrappedFactoryFunc = T.Callable[
|
|
35
|
+
[
|
|
36
|
+
'Environment',
|
|
37
|
+
MachineChoice,
|
|
38
|
+
T.Dict[str, T.Any]
|
|
39
|
+
],
|
|
40
|
+
T.List[DependencyGenerator]
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
# This should be str, Environment, T.Dict[str, T.Any], T.Optional[str]
|
|
44
|
+
# But if you try that, you get error: Cannot infer type of lambda
|
|
45
|
+
CmakeDependencyFunc = T.Callable[..., CMakeDependency]
|
|
46
|
+
|
|
47
|
+
class DependencyFactory:
|
|
48
|
+
|
|
49
|
+
"""Factory to get dependencies from multiple sources.
|
|
50
|
+
|
|
51
|
+
This class provides an initializer that takes a set of names and classes
|
|
52
|
+
for various kinds of dependencies. When the initialized object is called
|
|
53
|
+
it returns a list of callables return Dependency objects to try in order.
|
|
54
|
+
|
|
55
|
+
:name: The name of the dependency. This will be passed as the name
|
|
56
|
+
parameter of the each dependency unless it is overridden on a per
|
|
57
|
+
type basis.
|
|
58
|
+
:methods: An ordered list of DependencyMethods. This is the order
|
|
59
|
+
dependencies will be returned in unless they are removed by the
|
|
60
|
+
_process_method function
|
|
61
|
+
:*_name: This will overwrite the name passed to the corresponding class.
|
|
62
|
+
For example, if the name is 'zlib', but cmake calls the dependency
|
|
63
|
+
'Z', then using `cmake_name='Z'` will pass the name as 'Z' to cmake.
|
|
64
|
+
:*_class: A *type* or callable that creates a class, and has the
|
|
65
|
+
signature of an ExternalDependency
|
|
66
|
+
:system_class: If you pass DependencyMethods.SYSTEM in methods, you must
|
|
67
|
+
set this argument.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
def __init__(self, name: str, methods: T.List[DependencyMethods], *,
|
|
71
|
+
extra_kwargs: T.Optional[T.Dict[str, T.Any]] = None,
|
|
72
|
+
pkgconfig_name: T.Optional[str] = None,
|
|
73
|
+
pkgconfig_class: 'T.Type[PkgConfigDependency]' = PkgConfigDependency,
|
|
74
|
+
cmake_name: T.Optional[str] = None,
|
|
75
|
+
cmake_class: 'T.Union[T.Type[CMakeDependency], CmakeDependencyFunc]' = CMakeDependency,
|
|
76
|
+
configtool_class: 'T.Optional[T.Type[ConfigToolDependency]]' = None,
|
|
77
|
+
framework_name: T.Optional[str] = None,
|
|
78
|
+
framework_class: 'T.Type[ExtraFrameworkDependency]' = ExtraFrameworkDependency,
|
|
79
|
+
builtin_class: 'T.Type[BuiltinDependency]' = BuiltinDependency,
|
|
80
|
+
system_class: 'T.Type[SystemDependency]' = SystemDependency):
|
|
81
|
+
|
|
82
|
+
if DependencyMethods.CONFIG_TOOL in methods and not configtool_class:
|
|
83
|
+
raise DependencyException('A configtool must have a custom class')
|
|
84
|
+
|
|
85
|
+
self.extra_kwargs = extra_kwargs or {}
|
|
86
|
+
self.methods = methods
|
|
87
|
+
self.classes: T.Dict[
|
|
88
|
+
DependencyMethods,
|
|
89
|
+
T.Callable[['Environment', T.Dict[str, T.Any]], ExternalDependency]
|
|
90
|
+
] = {
|
|
91
|
+
# Just attach the correct name right now, either the generic name
|
|
92
|
+
# or the method specific name.
|
|
93
|
+
DependencyMethods.EXTRAFRAMEWORK: functools.partial(framework_class, framework_name or name),
|
|
94
|
+
DependencyMethods.PKGCONFIG: functools.partial(pkgconfig_class, pkgconfig_name or name),
|
|
95
|
+
DependencyMethods.CMAKE: functools.partial(cmake_class, cmake_name or name),
|
|
96
|
+
DependencyMethods.SYSTEM: functools.partial(system_class, name),
|
|
97
|
+
DependencyMethods.BUILTIN: functools.partial(builtin_class, name),
|
|
98
|
+
DependencyMethods.CONFIG_TOOL: None,
|
|
99
|
+
}
|
|
100
|
+
if configtool_class is not None:
|
|
101
|
+
self.classes[DependencyMethods.CONFIG_TOOL] = functools.partial(configtool_class, name)
|
|
102
|
+
|
|
103
|
+
@staticmethod
|
|
104
|
+
def _process_method(method: DependencyMethods, env: 'Environment', for_machine: MachineChoice) -> bool:
|
|
105
|
+
"""Report whether a method is valid or not.
|
|
106
|
+
|
|
107
|
+
If the method is valid, return true, otherwise return false. This is
|
|
108
|
+
used in a list comprehension to filter methods that are not possible.
|
|
109
|
+
|
|
110
|
+
By default this only remove EXTRAFRAMEWORK dependencies for non-mac platforms.
|
|
111
|
+
"""
|
|
112
|
+
# Extra frameworks are only valid for macOS and other apple products
|
|
113
|
+
if (method is DependencyMethods.EXTRAFRAMEWORK and
|
|
114
|
+
not env.machines[for_machine].is_darwin()):
|
|
115
|
+
return False
|
|
116
|
+
return True
|
|
117
|
+
|
|
118
|
+
def __call__(self, env: 'Environment', for_machine: MachineChoice,
|
|
119
|
+
kwargs: T.Dict[str, T.Any]) -> T.List['DependencyGenerator']:
|
|
120
|
+
"""Return a list of Dependencies with the arguments already attached."""
|
|
121
|
+
methods = process_method_kw(self.methods, kwargs)
|
|
122
|
+
nwargs = self.extra_kwargs.copy()
|
|
123
|
+
nwargs.update(kwargs)
|
|
124
|
+
|
|
125
|
+
return [functools.partial(self.classes[m], env, nwargs) for m in methods
|
|
126
|
+
if self._process_method(m, env, for_machine)]
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def factory_methods(methods: T.Set[DependencyMethods]) -> T.Callable[['FactoryFunc'], 'WrappedFactoryFunc']:
|
|
130
|
+
"""Decorator for handling methods for dependency factory functions.
|
|
131
|
+
|
|
132
|
+
This helps to make factory functions self documenting
|
|
133
|
+
>>> @factory_methods([DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE])
|
|
134
|
+
>>> def factory(env: Environment, for_machine: MachineChoice, kwargs: T.Dict[str, T.Any], methods: T.List[DependencyMethods]) -> T.List['DependencyGenerator']:
|
|
135
|
+
>>> pass
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
def inner(func: 'FactoryFunc') -> 'WrappedFactoryFunc':
|
|
139
|
+
|
|
140
|
+
@functools.wraps(func)
|
|
141
|
+
def wrapped(env: 'Environment', for_machine: MachineChoice, kwargs: T.Dict[str, T.Any]) -> T.List['DependencyGenerator']:
|
|
142
|
+
return func(env, for_machine, kwargs, process_method_kw(methods, kwargs))
|
|
143
|
+
|
|
144
|
+
return wrapped
|
|
145
|
+
|
|
146
|
+
return inner
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2013-2021 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from .base import DependencyTypeName, ExternalDependency, DependencyException
|
|
7
|
+
from ..mesonlib import MesonException, Version, stringlistify
|
|
8
|
+
from .. import mlog
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
import typing as T
|
|
11
|
+
|
|
12
|
+
if T.TYPE_CHECKING:
|
|
13
|
+
from ..environment import Environment
|
|
14
|
+
|
|
15
|
+
class ExtraFrameworkDependency(ExternalDependency):
|
|
16
|
+
system_framework_paths: T.Optional[T.List[str]] = None
|
|
17
|
+
|
|
18
|
+
def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None) -> None:
|
|
19
|
+
paths = stringlistify(kwargs.get('paths', []))
|
|
20
|
+
super().__init__(DependencyTypeName('extraframeworks'), env, kwargs, language=language)
|
|
21
|
+
self.name = name
|
|
22
|
+
# Full path to framework directory
|
|
23
|
+
self.framework_path: T.Optional[str] = None
|
|
24
|
+
if not self.clib_compiler:
|
|
25
|
+
raise DependencyException('No C-like compilers are available')
|
|
26
|
+
if self.system_framework_paths is None:
|
|
27
|
+
try:
|
|
28
|
+
self.system_framework_paths = self.clib_compiler.find_framework_paths(self.env)
|
|
29
|
+
except MesonException as e:
|
|
30
|
+
if 'non-clang' in str(e):
|
|
31
|
+
# Apple frameworks can only be found (and used) with the
|
|
32
|
+
# system compiler. It is not available so bail immediately.
|
|
33
|
+
self.is_found = False
|
|
34
|
+
return
|
|
35
|
+
raise
|
|
36
|
+
self.detect(name, paths)
|
|
37
|
+
|
|
38
|
+
def detect(self, name: str, paths: T.List[str]) -> None:
|
|
39
|
+
if not paths:
|
|
40
|
+
paths = self.system_framework_paths
|
|
41
|
+
for p in paths:
|
|
42
|
+
mlog.debug(f'Looking for framework {name} in {p}')
|
|
43
|
+
# We need to know the exact framework path because it's used by the
|
|
44
|
+
# Qt5 dependency class, and for setting the include path. We also
|
|
45
|
+
# want to avoid searching in an invalid framework path which wastes
|
|
46
|
+
# time and can cause a false positive.
|
|
47
|
+
framework_path = self._get_framework_path(p, name)
|
|
48
|
+
if framework_path is None:
|
|
49
|
+
continue
|
|
50
|
+
# We want to prefer the specified paths (in order) over the system
|
|
51
|
+
# paths since these are "extra" frameworks.
|
|
52
|
+
# For example, Python2's framework is in /System/Library/Frameworks and
|
|
53
|
+
# Python3's framework is in /Library/Frameworks, but both are called
|
|
54
|
+
# Python.framework. We need to know for sure that the framework was
|
|
55
|
+
# found in the path we expect.
|
|
56
|
+
allow_system = p in self.system_framework_paths
|
|
57
|
+
args = self.clib_compiler.find_framework(name, self.env, [p], allow_system)
|
|
58
|
+
if args is None:
|
|
59
|
+
continue
|
|
60
|
+
self.link_args = args
|
|
61
|
+
self.framework_path = framework_path.as_posix()
|
|
62
|
+
self.compile_args = ['-F' + self.framework_path]
|
|
63
|
+
# We need to also add -I includes to the framework because all
|
|
64
|
+
# cross-platform projects such as OpenGL, Python, Qt, GStreamer,
|
|
65
|
+
# etc do not use "framework includes":
|
|
66
|
+
# https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Tasks/IncludingFrameworks.html
|
|
67
|
+
incdir = self._get_framework_include_path(framework_path)
|
|
68
|
+
if incdir:
|
|
69
|
+
self.compile_args += ['-idirafter' + incdir]
|
|
70
|
+
self.is_found = True
|
|
71
|
+
return
|
|
72
|
+
|
|
73
|
+
def _get_framework_path(self, path: str, name: str) -> T.Optional[Path]:
|
|
74
|
+
p = Path(path)
|
|
75
|
+
lname = name.lower()
|
|
76
|
+
for d in p.glob('*.framework/'):
|
|
77
|
+
if lname == d.name.rsplit('.', 1)[0].lower():
|
|
78
|
+
return d
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
def _get_framework_latest_version(self, path: Path) -> str:
|
|
82
|
+
versions: T.List[Version] = []
|
|
83
|
+
for each in path.glob('Versions/*'):
|
|
84
|
+
# macOS filesystems are usually case-insensitive
|
|
85
|
+
if each.name.lower() == 'current':
|
|
86
|
+
continue
|
|
87
|
+
versions.append(Version(each.name))
|
|
88
|
+
if len(versions) == 0:
|
|
89
|
+
# most system frameworks do not have a 'Versions' directory
|
|
90
|
+
return 'Headers'
|
|
91
|
+
return 'Versions/{}/Headers'.format(sorted(versions)[-1]._s)
|
|
92
|
+
|
|
93
|
+
def _get_framework_include_path(self, path: Path) -> T.Optional[str]:
|
|
94
|
+
# According to the spec, 'Headers' must always be a symlink to the
|
|
95
|
+
# Headers directory inside the currently-selected version of the
|
|
96
|
+
# framework, but sometimes frameworks are broken. Look in 'Versions'
|
|
97
|
+
# for the currently-selected version or pick the latest one.
|
|
98
|
+
trials = ('Headers', 'Versions/Current/Headers',
|
|
99
|
+
self._get_framework_latest_version(path))
|
|
100
|
+
for each in trials:
|
|
101
|
+
trial = path / each
|
|
102
|
+
if trial.is_dir():
|
|
103
|
+
return trial.as_posix()
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
def log_info(self) -> str:
|
|
107
|
+
return self.framework_path or ''
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def log_tried() -> str:
|
|
111
|
+
return 'framework'
|