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,291 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2019 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
import typing as T
|
|
6
|
+
|
|
7
|
+
from . import ExtensionModule, ModuleObject, MutableModuleObject, ModuleInfo
|
|
8
|
+
from .. import build
|
|
9
|
+
from .. import dependencies
|
|
10
|
+
from .. import mesonlib
|
|
11
|
+
from ..interpreterbase import (
|
|
12
|
+
noPosargs, noKwargs,
|
|
13
|
+
InterpreterException, InvalidArguments, InvalidCode, FeatureNew,
|
|
14
|
+
)
|
|
15
|
+
from ..interpreterbase.decorators import ContainerTypeInfo, KwargInfo, typed_kwargs, typed_pos_args
|
|
16
|
+
from ..mesonlib import OrderedSet
|
|
17
|
+
|
|
18
|
+
if T.TYPE_CHECKING:
|
|
19
|
+
from typing_extensions import TypedDict
|
|
20
|
+
|
|
21
|
+
from . import ModuleState
|
|
22
|
+
from ..interpreter import Interpreter
|
|
23
|
+
from ..interpreterbase import TYPE_var, TYPE_kwargs
|
|
24
|
+
|
|
25
|
+
class AddKwargs(TypedDict):
|
|
26
|
+
|
|
27
|
+
when: T.List[T.Union[str, dependencies.Dependency]]
|
|
28
|
+
if_true: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes, dependencies.Dependency]]
|
|
29
|
+
if_false: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]
|
|
30
|
+
|
|
31
|
+
class AddAllKw(TypedDict):
|
|
32
|
+
|
|
33
|
+
when: T.List[T.Union[str, dependencies.Dependency]]
|
|
34
|
+
if_true: T.List[SourceSetImpl]
|
|
35
|
+
|
|
36
|
+
class ApplyKw(TypedDict):
|
|
37
|
+
|
|
38
|
+
strict: bool
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
_WHEN_KW: KwargInfo[T.List[T.Union[str, dependencies.Dependency]]] = KwargInfo(
|
|
42
|
+
'when',
|
|
43
|
+
ContainerTypeInfo(list, (str, dependencies.Dependency)),
|
|
44
|
+
listify=True,
|
|
45
|
+
default=[],
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class SourceSetRule(T.NamedTuple):
|
|
50
|
+
keys: T.List[str]
|
|
51
|
+
"""Configuration keys that enable this rule if true"""
|
|
52
|
+
|
|
53
|
+
deps: T.List[dependencies.Dependency]
|
|
54
|
+
"""Dependencies that enable this rule if true"""
|
|
55
|
+
|
|
56
|
+
sources: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]
|
|
57
|
+
"""Source files added when this rule's conditions are true"""
|
|
58
|
+
|
|
59
|
+
extra_deps: T.List[dependencies.Dependency]
|
|
60
|
+
"""Dependencies added when this rule's conditions are true, but
|
|
61
|
+
that do not make the condition false if they're absent."""
|
|
62
|
+
|
|
63
|
+
sourcesets: T.List[SourceSetImpl]
|
|
64
|
+
"""Other sourcesets added when this rule's conditions are true"""
|
|
65
|
+
|
|
66
|
+
if_false: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]
|
|
67
|
+
"""Source files added when this rule's conditions are false"""
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class SourceFiles(T.NamedTuple):
|
|
71
|
+
sources: OrderedSet[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]
|
|
72
|
+
deps: OrderedSet[dependencies.Dependency]
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class SourceSet:
|
|
76
|
+
"""Base class to avoid circular references.
|
|
77
|
+
|
|
78
|
+
Because of error messages, this class is called SourceSet, and the actual
|
|
79
|
+
implementation is an Impl.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class SourceSetImpl(SourceSet, MutableModuleObject):
|
|
84
|
+
def __init__(self, interpreter: Interpreter):
|
|
85
|
+
super().__init__()
|
|
86
|
+
self.rules: T.List[SourceSetRule] = []
|
|
87
|
+
self.frozen = False
|
|
88
|
+
self.methods.update({
|
|
89
|
+
'add': self.add_method,
|
|
90
|
+
'add_all': self.add_all_method,
|
|
91
|
+
'all_sources': self.all_sources_method,
|
|
92
|
+
'all_dependencies': self.all_dependencies_method,
|
|
93
|
+
'apply': self.apply_method,
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
def check_source_files(self, args: T.Sequence[T.Union[mesonlib.FileOrString, build.GeneratedTypes, dependencies.Dependency]],
|
|
97
|
+
) -> T.Tuple[T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]], T.List[dependencies.Dependency]]:
|
|
98
|
+
sources: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]] = []
|
|
99
|
+
deps: T.List[dependencies.Dependency] = []
|
|
100
|
+
for x in args:
|
|
101
|
+
if isinstance(x, dependencies.Dependency):
|
|
102
|
+
deps.append(x)
|
|
103
|
+
else:
|
|
104
|
+
sources.append(x)
|
|
105
|
+
to_check: T.List[str] = []
|
|
106
|
+
|
|
107
|
+
# Get the actual output names to check
|
|
108
|
+
for s in sources:
|
|
109
|
+
if isinstance(s, str):
|
|
110
|
+
to_check.append(s)
|
|
111
|
+
elif isinstance(s, mesonlib.File):
|
|
112
|
+
to_check.append(s.fname)
|
|
113
|
+
else:
|
|
114
|
+
to_check.extend(s.get_outputs())
|
|
115
|
+
mesonlib.check_direntry_issues(to_check)
|
|
116
|
+
return sources, deps
|
|
117
|
+
|
|
118
|
+
def check_conditions(self, args: T.Sequence[T.Union[str, dependencies.Dependency]]
|
|
119
|
+
) -> T.Tuple[T.List[str], T.List[dependencies.Dependency]]:
|
|
120
|
+
keys: T.List[str] = []
|
|
121
|
+
deps: T.List[dependencies.Dependency] = []
|
|
122
|
+
for x in args:
|
|
123
|
+
if isinstance(x, str):
|
|
124
|
+
keys.append(x)
|
|
125
|
+
else:
|
|
126
|
+
deps.append(x)
|
|
127
|
+
return keys, deps
|
|
128
|
+
|
|
129
|
+
@typed_pos_args('sourceset.add', varargs=(str, mesonlib.File, build.GeneratedList, build.CustomTarget, build.CustomTargetIndex, dependencies.Dependency))
|
|
130
|
+
@typed_kwargs(
|
|
131
|
+
'sourceset.add',
|
|
132
|
+
_WHEN_KW,
|
|
133
|
+
KwargInfo(
|
|
134
|
+
'if_true',
|
|
135
|
+
ContainerTypeInfo(list, (str, mesonlib.File, build.GeneratedList, build.CustomTarget, build.CustomTargetIndex, dependencies.Dependency)),
|
|
136
|
+
listify=True,
|
|
137
|
+
default=[],
|
|
138
|
+
),
|
|
139
|
+
KwargInfo(
|
|
140
|
+
'if_false',
|
|
141
|
+
ContainerTypeInfo(list, (str, mesonlib.File, build.GeneratedList, build.CustomTarget, build.CustomTargetIndex)),
|
|
142
|
+
listify=True,
|
|
143
|
+
default=[],
|
|
144
|
+
),
|
|
145
|
+
)
|
|
146
|
+
def add_method(self, state: ModuleState,
|
|
147
|
+
args: T.Tuple[T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes, dependencies.Dependency]]],
|
|
148
|
+
kwargs: AddKwargs) -> None:
|
|
149
|
+
if self.frozen:
|
|
150
|
+
raise InvalidCode('Tried to use \'add\' after querying the source set')
|
|
151
|
+
when = kwargs['when']
|
|
152
|
+
if_true = kwargs['if_true']
|
|
153
|
+
if_false = kwargs['if_false']
|
|
154
|
+
if not any([when, if_true, if_false]):
|
|
155
|
+
if_true = args[0]
|
|
156
|
+
elif args[0]:
|
|
157
|
+
raise InterpreterException('add called with both positional and keyword arguments')
|
|
158
|
+
keys, dependencies = self.check_conditions(when)
|
|
159
|
+
sources, extra_deps = self.check_source_files(if_true)
|
|
160
|
+
if_false, _ = self.check_source_files(if_false)
|
|
161
|
+
self.rules.append(SourceSetRule(keys, dependencies, sources, extra_deps, [], if_false))
|
|
162
|
+
|
|
163
|
+
@typed_pos_args('sourceset.add_all', varargs=SourceSet)
|
|
164
|
+
@typed_kwargs(
|
|
165
|
+
'sourceset.add_all',
|
|
166
|
+
_WHEN_KW,
|
|
167
|
+
KwargInfo(
|
|
168
|
+
'if_true',
|
|
169
|
+
ContainerTypeInfo(list, SourceSet),
|
|
170
|
+
listify=True,
|
|
171
|
+
default=[],
|
|
172
|
+
)
|
|
173
|
+
)
|
|
174
|
+
def add_all_method(self, state: ModuleState, args: T.Tuple[T.List[SourceSetImpl]],
|
|
175
|
+
kwargs: AddAllKw) -> None:
|
|
176
|
+
if self.frozen:
|
|
177
|
+
raise InvalidCode('Tried to use \'add_all\' after querying the source set')
|
|
178
|
+
when = kwargs['when']
|
|
179
|
+
if_true = kwargs['if_true']
|
|
180
|
+
if not when and not if_true:
|
|
181
|
+
if_true = args[0]
|
|
182
|
+
elif args[0]:
|
|
183
|
+
raise InterpreterException('add_all called with both positional and keyword arguments')
|
|
184
|
+
keys, dependencies = self.check_conditions(when)
|
|
185
|
+
for s in if_true:
|
|
186
|
+
s.frozen = True
|
|
187
|
+
self.rules.append(SourceSetRule(keys, dependencies, [], [], if_true, []))
|
|
188
|
+
|
|
189
|
+
def collect(self, enabled_fn: T.Callable[[str], bool],
|
|
190
|
+
all_sources: bool,
|
|
191
|
+
into: T.Optional['SourceFiles'] = None) -> SourceFiles:
|
|
192
|
+
if not into:
|
|
193
|
+
into = SourceFiles(OrderedSet(), OrderedSet())
|
|
194
|
+
for entry in self.rules:
|
|
195
|
+
if all(x.found() for x in entry.deps) and \
|
|
196
|
+
all(enabled_fn(key) for key in entry.keys):
|
|
197
|
+
into.sources.update(entry.sources)
|
|
198
|
+
into.deps.update(entry.deps)
|
|
199
|
+
into.deps.update(entry.extra_deps)
|
|
200
|
+
for ss in entry.sourcesets:
|
|
201
|
+
ss.collect(enabled_fn, all_sources, into)
|
|
202
|
+
if not all_sources:
|
|
203
|
+
continue
|
|
204
|
+
into.sources.update(entry.if_false)
|
|
205
|
+
return into
|
|
206
|
+
|
|
207
|
+
@noKwargs
|
|
208
|
+
@noPosargs
|
|
209
|
+
def all_sources_method(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs
|
|
210
|
+
) -> T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]:
|
|
211
|
+
self.frozen = True
|
|
212
|
+
files = self.collect(lambda x: True, True)
|
|
213
|
+
return list(files.sources)
|
|
214
|
+
|
|
215
|
+
@noKwargs
|
|
216
|
+
@noPosargs
|
|
217
|
+
@FeatureNew('source_set.all_dependencies() method', '0.52.0')
|
|
218
|
+
def all_dependencies_method(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs
|
|
219
|
+
) -> T.List[dependencies.Dependency]:
|
|
220
|
+
self.frozen = True
|
|
221
|
+
files = self.collect(lambda x: True, True)
|
|
222
|
+
return list(files.deps)
|
|
223
|
+
|
|
224
|
+
@typed_pos_args('sourceset.apply', (build.ConfigurationData, dict))
|
|
225
|
+
@typed_kwargs('sourceset.apply', KwargInfo('strict', bool, default=True))
|
|
226
|
+
def apply_method(self, state: ModuleState, args: T.Tuple[T.Union[build.ConfigurationData, T.Dict[str, TYPE_var]]], kwargs: ApplyKw) -> SourceFilesObject:
|
|
227
|
+
config_data = args[0]
|
|
228
|
+
self.frozen = True
|
|
229
|
+
strict = kwargs['strict']
|
|
230
|
+
if isinstance(config_data, dict):
|
|
231
|
+
def _get_from_config_data(key: str) -> bool:
|
|
232
|
+
assert isinstance(config_data, dict), 'for mypy'
|
|
233
|
+
if strict and key not in config_data:
|
|
234
|
+
raise InterpreterException(f'Entry {key} not in configuration dictionary.')
|
|
235
|
+
return bool(config_data.get(key, False))
|
|
236
|
+
else:
|
|
237
|
+
config_cache: T.Dict[str, bool] = {}
|
|
238
|
+
|
|
239
|
+
def _get_from_config_data(key: str) -> bool:
|
|
240
|
+
assert isinstance(config_data, build.ConfigurationData), 'for mypy'
|
|
241
|
+
if key not in config_cache:
|
|
242
|
+
if key in config_data:
|
|
243
|
+
config_cache[key] = bool(config_data.get(key)[0])
|
|
244
|
+
elif strict:
|
|
245
|
+
raise InvalidArguments(f'sourceset.apply: key "{key}" not in passed configuration, and strict set.')
|
|
246
|
+
else:
|
|
247
|
+
config_cache[key] = False
|
|
248
|
+
return config_cache[key]
|
|
249
|
+
|
|
250
|
+
files = self.collect(_get_from_config_data, False)
|
|
251
|
+
res = SourceFilesObject(files)
|
|
252
|
+
return res
|
|
253
|
+
|
|
254
|
+
class SourceFilesObject(ModuleObject):
|
|
255
|
+
def __init__(self, files: SourceFiles):
|
|
256
|
+
super().__init__()
|
|
257
|
+
self.files = files
|
|
258
|
+
self.methods.update({
|
|
259
|
+
'sources': self.sources_method,
|
|
260
|
+
'dependencies': self.dependencies_method,
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
@noPosargs
|
|
264
|
+
@noKwargs
|
|
265
|
+
def sources_method(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs
|
|
266
|
+
) -> T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]:
|
|
267
|
+
return list(self.files.sources)
|
|
268
|
+
|
|
269
|
+
@noPosargs
|
|
270
|
+
@noKwargs
|
|
271
|
+
def dependencies_method(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs
|
|
272
|
+
) -> T.List[dependencies.Dependency]:
|
|
273
|
+
return list(self.files.deps)
|
|
274
|
+
|
|
275
|
+
class SourceSetModule(ExtensionModule):
|
|
276
|
+
|
|
277
|
+
INFO = ModuleInfo('sourceset', '0.51.0')
|
|
278
|
+
|
|
279
|
+
def __init__(self, interpreter: Interpreter):
|
|
280
|
+
super().__init__(interpreter)
|
|
281
|
+
self.methods.update({
|
|
282
|
+
'source_set': self.source_set,
|
|
283
|
+
})
|
|
284
|
+
|
|
285
|
+
@noKwargs
|
|
286
|
+
@noPosargs
|
|
287
|
+
def source_set(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> SourceSetImpl:
|
|
288
|
+
return SourceSetImpl(self.interpreter)
|
|
289
|
+
|
|
290
|
+
def initialize(interp: Interpreter) -> SourceSetModule:
|
|
291
|
+
return SourceSetModule(interp)
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2022 Mark Bolhuis <mark@bolhuis.dev>
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
import os
|
|
6
|
+
import typing as T
|
|
7
|
+
|
|
8
|
+
from . import ExtensionModule, ModuleReturnValue, ModuleInfo
|
|
9
|
+
from ..build import CustomTarget
|
|
10
|
+
from ..interpreter.type_checking import NoneType, in_set_validator
|
|
11
|
+
from ..interpreterbase import typed_pos_args, typed_kwargs, KwargInfo, FeatureNew
|
|
12
|
+
from ..mesonlib import File, MesonException
|
|
13
|
+
|
|
14
|
+
if T.TYPE_CHECKING:
|
|
15
|
+
from typing_extensions import Literal, TypedDict
|
|
16
|
+
|
|
17
|
+
from . import ModuleState
|
|
18
|
+
from ..build import Executable
|
|
19
|
+
from ..dependencies import Dependency
|
|
20
|
+
from ..interpreter import Interpreter
|
|
21
|
+
from ..programs import ExternalProgram
|
|
22
|
+
from ..mesonlib import FileOrString
|
|
23
|
+
|
|
24
|
+
class ScanXML(TypedDict):
|
|
25
|
+
|
|
26
|
+
public: bool
|
|
27
|
+
client: bool
|
|
28
|
+
server: bool
|
|
29
|
+
include_core_only: bool
|
|
30
|
+
|
|
31
|
+
class FindProtocol(TypedDict):
|
|
32
|
+
|
|
33
|
+
state: Literal['stable', 'staging', 'unstable']
|
|
34
|
+
version: T.Optional[int]
|
|
35
|
+
|
|
36
|
+
class WaylandModule(ExtensionModule):
|
|
37
|
+
|
|
38
|
+
INFO = ModuleInfo('wayland', '0.62.0', unstable=True)
|
|
39
|
+
|
|
40
|
+
def __init__(self, interpreter: Interpreter) -> None:
|
|
41
|
+
super().__init__(interpreter)
|
|
42
|
+
|
|
43
|
+
self.protocols_dep: T.Optional[Dependency] = None
|
|
44
|
+
self.pkgdatadir: T.Optional[str] = None
|
|
45
|
+
self.scanner_bin: T.Optional[T.Union[ExternalProgram, Executable]] = None
|
|
46
|
+
|
|
47
|
+
self.methods.update({
|
|
48
|
+
'scan_xml': self.scan_xml,
|
|
49
|
+
'find_protocol': self.find_protocol,
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
@typed_pos_args('wayland.scan_xml', varargs=(str, File), min_varargs=1)
|
|
53
|
+
@typed_kwargs(
|
|
54
|
+
'wayland.scan_xml',
|
|
55
|
+
KwargInfo('public', bool, default=False),
|
|
56
|
+
KwargInfo('client', bool, default=True),
|
|
57
|
+
KwargInfo('server', bool, default=False),
|
|
58
|
+
KwargInfo('include_core_only', bool, default=True, since='0.64.0'),
|
|
59
|
+
)
|
|
60
|
+
def scan_xml(self, state: ModuleState, args: T.Tuple[T.List[FileOrString]], kwargs: ScanXML) -> ModuleReturnValue:
|
|
61
|
+
if self.scanner_bin is None:
|
|
62
|
+
# wayland-scanner from BUILD machine must have same version as wayland
|
|
63
|
+
# libraries from HOST machine.
|
|
64
|
+
dep = state.dependency('wayland-client')
|
|
65
|
+
self.scanner_bin = state.find_tool('wayland-scanner', 'wayland-scanner', 'wayland_scanner',
|
|
66
|
+
wanted=dep.version)
|
|
67
|
+
|
|
68
|
+
scope = 'public' if kwargs['public'] else 'private'
|
|
69
|
+
# We have to cast because mypy can't deduce these are literals
|
|
70
|
+
sides = [i for i in T.cast("T.List[Literal['client', 'server']]", ['client', 'server']) if kwargs[i]]
|
|
71
|
+
if not sides:
|
|
72
|
+
raise MesonException('At least one of client or server keyword argument must be set to true.')
|
|
73
|
+
|
|
74
|
+
xml_files = self.interpreter.source_strings_to_files(args[0])
|
|
75
|
+
targets: T.List[CustomTarget] = []
|
|
76
|
+
for xml_file in xml_files:
|
|
77
|
+
name = os.path.splitext(os.path.basename(xml_file.fname))[0]
|
|
78
|
+
|
|
79
|
+
code = CustomTarget(
|
|
80
|
+
f'{name}-protocol',
|
|
81
|
+
state.subdir,
|
|
82
|
+
state.subproject,
|
|
83
|
+
state.environment,
|
|
84
|
+
[self.scanner_bin, f'{scope}-code', '@INPUT@', '@OUTPUT@'],
|
|
85
|
+
[xml_file],
|
|
86
|
+
[f'{name}-protocol.c'],
|
|
87
|
+
state.is_build_only_subproject,
|
|
88
|
+
backend=state.backend,
|
|
89
|
+
)
|
|
90
|
+
targets.append(code)
|
|
91
|
+
|
|
92
|
+
for side in sides:
|
|
93
|
+
command = [self.scanner_bin, f'{side}-header', '@INPUT@', '@OUTPUT@']
|
|
94
|
+
if kwargs['include_core_only']:
|
|
95
|
+
command.append('--include-core-only')
|
|
96
|
+
|
|
97
|
+
header = CustomTarget(
|
|
98
|
+
f'{name}-{side}-protocol',
|
|
99
|
+
state.subdir,
|
|
100
|
+
state.subproject,
|
|
101
|
+
state.environment,
|
|
102
|
+
command,
|
|
103
|
+
[xml_file],
|
|
104
|
+
[f'{name}-{side}-protocol.h'],
|
|
105
|
+
state.is_build_only_subproject,
|
|
106
|
+
backend=state.backend,
|
|
107
|
+
)
|
|
108
|
+
targets.append(header)
|
|
109
|
+
|
|
110
|
+
return ModuleReturnValue(targets, targets)
|
|
111
|
+
|
|
112
|
+
@typed_pos_args('wayland.find_protocol', str)
|
|
113
|
+
@typed_kwargs(
|
|
114
|
+
'wayland.find_protocol',
|
|
115
|
+
KwargInfo('state', str, default='stable', validator=in_set_validator({'stable', 'staging', 'unstable'})),
|
|
116
|
+
KwargInfo('version', (int, NoneType)),
|
|
117
|
+
)
|
|
118
|
+
def find_protocol(self, state: ModuleState, args: T.Tuple[str], kwargs: FindProtocol) -> File:
|
|
119
|
+
base_name = args[0]
|
|
120
|
+
xml_state = kwargs['state']
|
|
121
|
+
version = kwargs['version']
|
|
122
|
+
|
|
123
|
+
if xml_state != 'stable' and version is None:
|
|
124
|
+
raise MesonException(f'{xml_state} protocols require a version number.')
|
|
125
|
+
|
|
126
|
+
if xml_state == 'stable' and version is not None:
|
|
127
|
+
FeatureNew.single_use('Version number in stable wayland protocol', '1.5.0', state.subproject, location=state.current_node)
|
|
128
|
+
|
|
129
|
+
if self.protocols_dep is None:
|
|
130
|
+
self.protocols_dep = state.dependency('wayland-protocols')
|
|
131
|
+
|
|
132
|
+
if self.pkgdatadir is None:
|
|
133
|
+
self.pkgdatadir = self.protocols_dep.get_variable(pkgconfig='pkgdatadir', internal='pkgdatadir')
|
|
134
|
+
|
|
135
|
+
xml_name = base_name
|
|
136
|
+
if xml_state == 'unstable':
|
|
137
|
+
xml_name += '-unstable'
|
|
138
|
+
if version is not None:
|
|
139
|
+
xml_name += f'-v{version}'
|
|
140
|
+
xml_name += '.xml'
|
|
141
|
+
|
|
142
|
+
path = os.path.join(self.pkgdatadir, xml_state, base_name, xml_name)
|
|
143
|
+
|
|
144
|
+
if not os.path.exists(path):
|
|
145
|
+
raise MesonException(f'The file {path} does not exist.')
|
|
146
|
+
|
|
147
|
+
return File.from_absolute_file(path)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def initialize(interpreter: Interpreter) -> WaylandModule:
|
|
151
|
+
return WaylandModule(interpreter)
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2015 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import enum
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
import typing as T
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
from . import ExtensionModule, ModuleInfo
|
|
13
|
+
from . import ModuleReturnValue
|
|
14
|
+
from .. import mesonlib, build
|
|
15
|
+
from .. import mlog
|
|
16
|
+
from ..interpreter.type_checking import DEPEND_FILES_KW, DEPENDS_KW, INCLUDE_DIRECTORIES
|
|
17
|
+
from ..interpreterbase.decorators import ContainerTypeInfo, FeatureNew, KwargInfo, typed_kwargs, typed_pos_args
|
|
18
|
+
from ..mesonlib import MachineChoice, MesonException
|
|
19
|
+
from ..programs import ExternalProgram
|
|
20
|
+
|
|
21
|
+
if T.TYPE_CHECKING:
|
|
22
|
+
from . import ModuleState
|
|
23
|
+
from ..compilers import Compiler
|
|
24
|
+
from ..interpreter import Interpreter
|
|
25
|
+
|
|
26
|
+
from typing_extensions import TypedDict
|
|
27
|
+
|
|
28
|
+
class CompileResources(TypedDict):
|
|
29
|
+
|
|
30
|
+
depend_files: T.List[mesonlib.FileOrString]
|
|
31
|
+
depends: T.List[T.Union[build.BuildTarget, build.CustomTarget]]
|
|
32
|
+
include_directories: T.List[T.Union[str, build.IncludeDirs]]
|
|
33
|
+
args: T.List[str]
|
|
34
|
+
|
|
35
|
+
class RcKwargs(TypedDict):
|
|
36
|
+
output: str
|
|
37
|
+
input: T.List[T.Union[mesonlib.FileOrString, build.CustomTargetIndex]]
|
|
38
|
+
depfile: T.Optional[str]
|
|
39
|
+
depend_files: T.List[mesonlib.FileOrString]
|
|
40
|
+
depends: T.List[T.Union[build.BuildTarget, build.CustomTarget]]
|
|
41
|
+
command: T.List[T.Union[str, ExternalProgram]]
|
|
42
|
+
|
|
43
|
+
class ResourceCompilerType(enum.Enum):
|
|
44
|
+
windres = 1
|
|
45
|
+
rc = 2
|
|
46
|
+
wrc = 3
|
|
47
|
+
|
|
48
|
+
class WindowsModule(ExtensionModule):
|
|
49
|
+
|
|
50
|
+
INFO = ModuleInfo('windows')
|
|
51
|
+
|
|
52
|
+
def __init__(self, interpreter: 'Interpreter'):
|
|
53
|
+
super().__init__(interpreter)
|
|
54
|
+
self._rescomp: T.Optional[T.Tuple[ExternalProgram, ResourceCompilerType]] = None
|
|
55
|
+
self.methods.update({
|
|
56
|
+
'compile_resources': self.compile_resources,
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
def detect_compiler(self, compilers: T.Dict[str, 'Compiler']) -> 'Compiler':
|
|
60
|
+
for l in ('c', 'cpp'):
|
|
61
|
+
if l in compilers:
|
|
62
|
+
return compilers[l]
|
|
63
|
+
raise MesonException('Resource compilation requires a C or C++ compiler.')
|
|
64
|
+
|
|
65
|
+
def _find_resource_compiler(self, state: 'ModuleState') -> T.Tuple[ExternalProgram, ResourceCompilerType]:
|
|
66
|
+
# FIXME: Does not handle `native: true` executables, see
|
|
67
|
+
# See https://github.com/mesonbuild/meson/issues/1531
|
|
68
|
+
# Take a parameter instead of the hardcoded definition below
|
|
69
|
+
for_machine = MachineChoice.HOST
|
|
70
|
+
|
|
71
|
+
if self._rescomp:
|
|
72
|
+
return self._rescomp
|
|
73
|
+
|
|
74
|
+
# Will try cross / native file and then env var
|
|
75
|
+
rescomp = ExternalProgram.from_bin_list(state.environment, for_machine, 'windres')
|
|
76
|
+
|
|
77
|
+
if not rescomp or not rescomp.found():
|
|
78
|
+
comp = self.detect_compiler(state.environment.coredata.compilers[for_machine])
|
|
79
|
+
if comp.id in {'msvc', 'clang-cl', 'intel-cl'} or (comp.linker and comp.linker.id in {'link', 'lld-link'}):
|
|
80
|
+
# Microsoft compilers uses rc irrespective of the frontend
|
|
81
|
+
rescomp = ExternalProgram('rc', silent=True)
|
|
82
|
+
else:
|
|
83
|
+
rescomp = ExternalProgram('windres', silent=True)
|
|
84
|
+
|
|
85
|
+
if not rescomp.found():
|
|
86
|
+
raise MesonException('Could not find Windows resource compiler')
|
|
87
|
+
|
|
88
|
+
for (arg, match, rc_type) in [
|
|
89
|
+
('/?', '^.*Microsoft.*Resource Compiler.*$', ResourceCompilerType.rc),
|
|
90
|
+
('/?', 'LLVM Resource Converter.*$', ResourceCompilerType.rc),
|
|
91
|
+
('--version', '^.*GNU windres.*$', ResourceCompilerType.windres),
|
|
92
|
+
('--version', '^.*Wine Resource Compiler.*$', ResourceCompilerType.wrc),
|
|
93
|
+
]:
|
|
94
|
+
p, o, e = mesonlib.Popen_safe(rescomp.get_command() + [arg])
|
|
95
|
+
m = re.search(match, o, re.MULTILINE)
|
|
96
|
+
if m:
|
|
97
|
+
mlog.log('Windows resource compiler: %s' % m.group())
|
|
98
|
+
self._rescomp = (rescomp, rc_type)
|
|
99
|
+
break
|
|
100
|
+
else:
|
|
101
|
+
raise MesonException('Could not determine type of Windows resource compiler')
|
|
102
|
+
|
|
103
|
+
return self._rescomp
|
|
104
|
+
|
|
105
|
+
@typed_pos_args('windows.compile_resources', varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex), min_varargs=1)
|
|
106
|
+
@typed_kwargs(
|
|
107
|
+
'windows.compile_resources',
|
|
108
|
+
DEPEND_FILES_KW.evolve(since='0.47.0'),
|
|
109
|
+
DEPENDS_KW.evolve(since='0.47.0'),
|
|
110
|
+
INCLUDE_DIRECTORIES,
|
|
111
|
+
KwargInfo('args', ContainerTypeInfo(list, str), default=[], listify=True),
|
|
112
|
+
)
|
|
113
|
+
def compile_resources(self, state: 'ModuleState',
|
|
114
|
+
args: T.Tuple[T.List[T.Union[str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex]]],
|
|
115
|
+
kwargs: 'CompileResources') -> ModuleReturnValue:
|
|
116
|
+
extra_args = kwargs['args'].copy()
|
|
117
|
+
wrc_depend_files = kwargs['depend_files']
|
|
118
|
+
wrc_depends = kwargs['depends']
|
|
119
|
+
for d in wrc_depends:
|
|
120
|
+
if isinstance(d, build.CustomTarget):
|
|
121
|
+
extra_args += state.get_include_args([
|
|
122
|
+
build.IncludeDirs('', [], False, [os.path.join('@BUILD_ROOT@', self.interpreter.backend.get_target_dir(d))],
|
|
123
|
+
state.is_build_only_subproject)
|
|
124
|
+
])
|
|
125
|
+
extra_args += state.get_include_args(kwargs['include_directories'])
|
|
126
|
+
|
|
127
|
+
rescomp, rescomp_type = self._find_resource_compiler(state)
|
|
128
|
+
if rescomp_type == ResourceCompilerType.rc:
|
|
129
|
+
# RC is used to generate .res files, a special binary resource
|
|
130
|
+
# format, which can be passed directly to LINK (apparently LINK uses
|
|
131
|
+
# CVTRES internally to convert this to a COFF object)
|
|
132
|
+
suffix = 'res'
|
|
133
|
+
res_args = extra_args + ['/nologo', '/fo@OUTPUT@', '@INPUT@']
|
|
134
|
+
elif rescomp_type == ResourceCompilerType.windres:
|
|
135
|
+
# ld only supports object files, so windres is used to generate a
|
|
136
|
+
# COFF object
|
|
137
|
+
suffix = 'o'
|
|
138
|
+
res_args = extra_args + ['@INPUT@', '@OUTPUT@']
|
|
139
|
+
|
|
140
|
+
m = 'Argument {!r} has a space which may not work with windres due to ' \
|
|
141
|
+
'a MinGW bug: https://sourceware.org/bugzilla/show_bug.cgi?id=4933'
|
|
142
|
+
for arg in extra_args:
|
|
143
|
+
if ' ' in arg:
|
|
144
|
+
mlog.warning(m.format(arg), fatal=False)
|
|
145
|
+
else:
|
|
146
|
+
suffix = 'o'
|
|
147
|
+
res_args = extra_args + ['@INPUT@', '-o', '@OUTPUT@']
|
|
148
|
+
|
|
149
|
+
res_targets: T.List[build.CustomTarget] = []
|
|
150
|
+
|
|
151
|
+
def get_names() -> T.Iterable[T.Tuple[str, str, T.Union[str, mesonlib.File, build.CustomTargetIndex]]]:
|
|
152
|
+
for src in args[0]:
|
|
153
|
+
if isinstance(src, str):
|
|
154
|
+
yield os.path.join(state.subdir, src), src, src
|
|
155
|
+
elif isinstance(src, mesonlib.File):
|
|
156
|
+
yield src.relative_name(), src.fname, src
|
|
157
|
+
elif isinstance(src, build.CustomTargetIndex):
|
|
158
|
+
FeatureNew.single_use('windows.compile_resource CustomTargetIndex in positional arguments', '0.61.0',
|
|
159
|
+
state.subproject, location=state.current_node)
|
|
160
|
+
# This dance avoids a case where two indexes of the same
|
|
161
|
+
# target are given as separate arguments.
|
|
162
|
+
yield (f'{src.get_id()}_{src.target.get_outputs().index(src.output)}',
|
|
163
|
+
f'windows_compile_resources_{src.get_filename()}', src)
|
|
164
|
+
else:
|
|
165
|
+
if len(src.get_outputs()) > 1:
|
|
166
|
+
FeatureNew.single_use('windows.compile_resource CustomTarget with multiple outputs in positional arguments',
|
|
167
|
+
'0.61.0', state.subproject, location=state.current_node)
|
|
168
|
+
for i, out in enumerate(src.get_outputs()):
|
|
169
|
+
# Chances are that src.get_filename() is already the name of that
|
|
170
|
+
# target, add a prefix to avoid name clash.
|
|
171
|
+
yield f'{src.get_id()}_{i}', f'windows_compile_resources_{i}_{out}', src[i]
|
|
172
|
+
|
|
173
|
+
for name, name_formatted, src in get_names():
|
|
174
|
+
# Path separators are not allowed in target names
|
|
175
|
+
name = name.replace('/', '_').replace('\\', '_').replace(':', '_')
|
|
176
|
+
name_formatted = name_formatted.replace('/', '_').replace('\\', '_').replace(':', '_')
|
|
177
|
+
output = f'{name}_@BASENAME@.{suffix}'
|
|
178
|
+
command: T.List[T.Union[str, ExternalProgram]] = []
|
|
179
|
+
command.append(rescomp)
|
|
180
|
+
command.extend(res_args)
|
|
181
|
+
depfile: T.Optional[str] = None
|
|
182
|
+
# instruct binutils windres to generate a preprocessor depfile
|
|
183
|
+
if rescomp_type == ResourceCompilerType.windres:
|
|
184
|
+
depfile = f'{output}.d'
|
|
185
|
+
command.extend(['--preprocessor-arg=-MD',
|
|
186
|
+
'--preprocessor-arg=-MQ@OUTPUT@',
|
|
187
|
+
'--preprocessor-arg=-MF@DEPFILE@'])
|
|
188
|
+
|
|
189
|
+
res_targets.append(build.CustomTarget(
|
|
190
|
+
name_formatted,
|
|
191
|
+
state.subdir,
|
|
192
|
+
state.subproject,
|
|
193
|
+
state.environment,
|
|
194
|
+
command,
|
|
195
|
+
[src],
|
|
196
|
+
[output],
|
|
197
|
+
state.is_build_only_subproject,
|
|
198
|
+
depfile=depfile,
|
|
199
|
+
depend_files=wrc_depend_files,
|
|
200
|
+
extra_depends=wrc_depends,
|
|
201
|
+
description='Compiling Windows resource {}'
|
|
202
|
+
))
|
|
203
|
+
|
|
204
|
+
return ModuleReturnValue(res_targets, [res_targets])
|
|
205
|
+
|
|
206
|
+
def initialize(interp: 'Interpreter') -> WindowsModule:
|
|
207
|
+
return WindowsModule(interp)
|