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,306 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2020 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
import os
|
|
8
|
+
import shlex
|
|
9
|
+
import subprocess
|
|
10
|
+
import typing as T
|
|
11
|
+
|
|
12
|
+
from . import ExtensionModule, ModuleReturnValue, NewExtensionModule, ModuleInfo
|
|
13
|
+
from .. import mlog, build
|
|
14
|
+
from ..compilers.compilers import CFLAGS_MAPPING
|
|
15
|
+
from ..envconfig import ENV_VAR_PROG_MAP
|
|
16
|
+
from ..dependencies import InternalDependency
|
|
17
|
+
from ..dependencies.pkgconfig import PkgConfigInterface
|
|
18
|
+
from ..interpreterbase import FeatureNew
|
|
19
|
+
from ..interpreter.type_checking import ENV_KW, DEPENDS_KW
|
|
20
|
+
from ..interpreterbase.decorators import ContainerTypeInfo, KwargInfo, typed_kwargs, typed_pos_args
|
|
21
|
+
from ..mesonlib import (EnvironmentException, MesonException, Popen_safe, MachineChoice,
|
|
22
|
+
get_variable_regex, do_replacement, join_args, OptionKey)
|
|
23
|
+
|
|
24
|
+
if T.TYPE_CHECKING:
|
|
25
|
+
from typing_extensions import TypedDict
|
|
26
|
+
|
|
27
|
+
from . import ModuleState
|
|
28
|
+
from .._typing import ImmutableListProtocol
|
|
29
|
+
from ..build import BuildTarget, CustomTarget
|
|
30
|
+
from ..interpreter import Interpreter
|
|
31
|
+
from ..interpreterbase import TYPE_var
|
|
32
|
+
from ..mesonlib import EnvironmentVariables
|
|
33
|
+
from ..utils.core import EnvironOrDict
|
|
34
|
+
|
|
35
|
+
class Dependency(TypedDict):
|
|
36
|
+
|
|
37
|
+
subdir: str
|
|
38
|
+
|
|
39
|
+
class AddProject(TypedDict):
|
|
40
|
+
|
|
41
|
+
configure_options: T.List[str]
|
|
42
|
+
cross_configure_options: T.List[str]
|
|
43
|
+
verbose: bool
|
|
44
|
+
env: EnvironmentVariables
|
|
45
|
+
depends: T.List[T.Union[BuildTarget, CustomTarget]]
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class ExternalProject(NewExtensionModule):
|
|
49
|
+
|
|
50
|
+
make: ImmutableListProtocol[str]
|
|
51
|
+
|
|
52
|
+
def __init__(self,
|
|
53
|
+
state: 'ModuleState',
|
|
54
|
+
configure_command: str,
|
|
55
|
+
configure_options: T.List[str],
|
|
56
|
+
cross_configure_options: T.List[str],
|
|
57
|
+
env: EnvironmentVariables,
|
|
58
|
+
verbose: bool,
|
|
59
|
+
extra_depends: T.List[T.Union['BuildTarget', 'CustomTarget']]):
|
|
60
|
+
super().__init__()
|
|
61
|
+
self.methods.update({'dependency': self.dependency_method,
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
self.subdir = Path(state.subdir)
|
|
65
|
+
self.project_version = state.project_version
|
|
66
|
+
self.subproject = state.subproject
|
|
67
|
+
self.env = state.environment
|
|
68
|
+
self.configure_command = configure_command
|
|
69
|
+
self.configure_options = configure_options
|
|
70
|
+
self.cross_configure_options = cross_configure_options
|
|
71
|
+
self.verbose = verbose
|
|
72
|
+
self.user_env = env
|
|
73
|
+
|
|
74
|
+
self.src_dir = Path(self.env.get_source_dir(), self.subdir)
|
|
75
|
+
self.build_dir = Path(self.env.get_build_dir(), self.subdir, 'build')
|
|
76
|
+
self.install_dir = Path(self.env.get_build_dir(), self.subdir, 'dist')
|
|
77
|
+
_p = self.env.coredata.get_option(OptionKey('prefix'))
|
|
78
|
+
assert isinstance(_p, str), 'for mypy'
|
|
79
|
+
self.prefix = Path(_p)
|
|
80
|
+
_l = self.env.coredata.get_option(OptionKey('libdir'))
|
|
81
|
+
assert isinstance(_l, str), 'for mypy'
|
|
82
|
+
self.libdir = Path(_l)
|
|
83
|
+
_i = self.env.coredata.get_option(OptionKey('includedir'))
|
|
84
|
+
assert isinstance(_i, str), 'for mypy'
|
|
85
|
+
self.includedir = Path(_i)
|
|
86
|
+
self.name = self.src_dir.name
|
|
87
|
+
|
|
88
|
+
# On Windows if the prefix is "c:/foo" and DESTDIR is "c:/bar", `make`
|
|
89
|
+
# will install files into "c:/bar/c:/foo" which is an invalid path.
|
|
90
|
+
# Work around that issue by removing the drive from prefix.
|
|
91
|
+
if self.prefix.drive:
|
|
92
|
+
self.prefix = self.prefix.relative_to(self.prefix.drive)
|
|
93
|
+
|
|
94
|
+
# self.prefix is an absolute path, so we cannot append it to another path.
|
|
95
|
+
self.rel_prefix = self.prefix.relative_to(self.prefix.root)
|
|
96
|
+
|
|
97
|
+
self._configure(state)
|
|
98
|
+
|
|
99
|
+
self.targets = self._create_targets(extra_depends, state.is_build_only_subproject)
|
|
100
|
+
|
|
101
|
+
def _configure(self, state: 'ModuleState') -> None:
|
|
102
|
+
if self.configure_command == 'waf':
|
|
103
|
+
FeatureNew('Waf external project', '0.60.0').use(self.subproject, state.current_node)
|
|
104
|
+
waf = state.find_program('waf')
|
|
105
|
+
configure_cmd = waf.get_command()
|
|
106
|
+
configure_cmd += ['configure', '-o', str(self.build_dir)]
|
|
107
|
+
workdir = self.src_dir
|
|
108
|
+
self.make = waf.get_command() + ['build']
|
|
109
|
+
else:
|
|
110
|
+
# Assume it's the name of a script in source dir, like 'configure',
|
|
111
|
+
# 'autogen.sh', etc).
|
|
112
|
+
configure_path = Path(self.src_dir, self.configure_command)
|
|
113
|
+
configure_prog = state.find_program(configure_path.as_posix())
|
|
114
|
+
configure_cmd = configure_prog.get_command()
|
|
115
|
+
workdir = self.build_dir
|
|
116
|
+
self.make = state.find_program('make').get_command()
|
|
117
|
+
|
|
118
|
+
d = [('PREFIX', '--prefix=@PREFIX@', self.prefix.as_posix()),
|
|
119
|
+
('LIBDIR', '--libdir=@PREFIX@/@LIBDIR@', self.libdir.as_posix()),
|
|
120
|
+
('INCLUDEDIR', None, self.includedir.as_posix()),
|
|
121
|
+
]
|
|
122
|
+
self._validate_configure_options(d, state)
|
|
123
|
+
|
|
124
|
+
configure_cmd += self._format_options(self.configure_options, d)
|
|
125
|
+
|
|
126
|
+
if self.env.is_cross_build():
|
|
127
|
+
host = '{}-{}-{}'.format(state.environment.machines.host.cpu,
|
|
128
|
+
'pc' if state.environment.machines.host.cpu_family in {"x86", "x86_64"}
|
|
129
|
+
else 'unknown',
|
|
130
|
+
state.environment.machines.host.system)
|
|
131
|
+
d = [('HOST', None, host)]
|
|
132
|
+
configure_cmd += self._format_options(self.cross_configure_options, d)
|
|
133
|
+
|
|
134
|
+
# Set common env variables like CFLAGS, CC, etc.
|
|
135
|
+
link_exelist: T.List[str] = []
|
|
136
|
+
link_args: T.List[str] = []
|
|
137
|
+
self.run_env: EnvironOrDict = os.environ.copy()
|
|
138
|
+
for lang, compiler in self.env.coredata.compilers[MachineChoice.HOST].items():
|
|
139
|
+
if any(lang not in i for i in (ENV_VAR_PROG_MAP, CFLAGS_MAPPING)):
|
|
140
|
+
continue
|
|
141
|
+
cargs = self.env.coredata.get_external_args(MachineChoice.HOST, lang)
|
|
142
|
+
assert isinstance(cargs, list), 'for mypy'
|
|
143
|
+
self.run_env[ENV_VAR_PROG_MAP[lang]] = self._quote_and_join(compiler.get_exelist())
|
|
144
|
+
self.run_env[CFLAGS_MAPPING[lang]] = self._quote_and_join(cargs)
|
|
145
|
+
if not link_exelist:
|
|
146
|
+
link_exelist = compiler.get_linker_exelist()
|
|
147
|
+
_l = self.env.coredata.get_external_link_args(MachineChoice.HOST, lang)
|
|
148
|
+
assert isinstance(_l, list), 'for mypy'
|
|
149
|
+
link_args = _l
|
|
150
|
+
if link_exelist:
|
|
151
|
+
# FIXME: Do not pass linker because Meson uses CC as linker wrapper,
|
|
152
|
+
# but autotools often expects the real linker (e.h. GNU ld).
|
|
153
|
+
# self.run_env['LD'] = self._quote_and_join(link_exelist)
|
|
154
|
+
pass
|
|
155
|
+
self.run_env['LDFLAGS'] = self._quote_and_join(link_args)
|
|
156
|
+
|
|
157
|
+
self.run_env = self.user_env.get_env(self.run_env)
|
|
158
|
+
self.run_env = PkgConfigInterface.setup_env(self.run_env, self.env, MachineChoice.HOST,
|
|
159
|
+
uninstalled=True)
|
|
160
|
+
|
|
161
|
+
self.build_dir.mkdir(parents=True, exist_ok=True)
|
|
162
|
+
self._run('configure', configure_cmd, workdir)
|
|
163
|
+
|
|
164
|
+
def _quote_and_join(self, array: T.List[str]) -> str:
|
|
165
|
+
return ' '.join([shlex.quote(i) for i in array])
|
|
166
|
+
|
|
167
|
+
def _validate_configure_options(self, variables: T.List[T.Tuple[str, str, str]], state: 'ModuleState') -> None:
|
|
168
|
+
# Ensure the user at least try to pass basic info to the build system,
|
|
169
|
+
# like the prefix, libdir, etc.
|
|
170
|
+
for key, default, val in variables:
|
|
171
|
+
if default is None:
|
|
172
|
+
continue
|
|
173
|
+
key_format = f'@{key}@'
|
|
174
|
+
for option in self.configure_options:
|
|
175
|
+
if key_format in option:
|
|
176
|
+
break
|
|
177
|
+
else:
|
|
178
|
+
FeatureNew('Default configure_option', '0.57.0').use(self.subproject, state.current_node)
|
|
179
|
+
self.configure_options.append(default)
|
|
180
|
+
|
|
181
|
+
def _format_options(self, options: T.List[str], variables: T.List[T.Tuple[str, str, str]]) -> T.List[str]:
|
|
182
|
+
out: T.List[str] = []
|
|
183
|
+
missing = set()
|
|
184
|
+
regex = get_variable_regex('meson')
|
|
185
|
+
confdata: T.Dict[str, T.Tuple[str, T.Optional[str]]] = {k: (v, None) for k, _, v in variables}
|
|
186
|
+
for o in options:
|
|
187
|
+
arg, missing_vars = do_replacement(regex, o, 'meson', confdata)
|
|
188
|
+
missing.update(missing_vars)
|
|
189
|
+
out.append(arg)
|
|
190
|
+
if missing:
|
|
191
|
+
var_list = ", ".join(repr(m) for m in sorted(missing))
|
|
192
|
+
raise EnvironmentException(
|
|
193
|
+
f"Variables {var_list} in configure options are missing.")
|
|
194
|
+
return out
|
|
195
|
+
|
|
196
|
+
def _run(self, step: str, command: T.List[str], workdir: Path) -> None:
|
|
197
|
+
mlog.log(f'External project {self.name}:', mlog.bold(step))
|
|
198
|
+
m = 'Running command ' + str(command) + ' in directory ' + str(workdir) + '\n'
|
|
199
|
+
log_filename = Path(mlog.get_log_dir(), f'{self.name}-{step}.log')
|
|
200
|
+
output = None
|
|
201
|
+
if not self.verbose:
|
|
202
|
+
output = open(log_filename, 'w', encoding='utf-8')
|
|
203
|
+
output.write(m + '\n')
|
|
204
|
+
output.flush()
|
|
205
|
+
else:
|
|
206
|
+
mlog.log(m)
|
|
207
|
+
p, *_ = Popen_safe(command, cwd=workdir, env=self.run_env,
|
|
208
|
+
stderr=subprocess.STDOUT,
|
|
209
|
+
stdout=output)
|
|
210
|
+
if p.returncode != 0:
|
|
211
|
+
m = f'{step} step returned error code {p.returncode}.'
|
|
212
|
+
if not self.verbose:
|
|
213
|
+
m += '\nSee logs: ' + str(log_filename)
|
|
214
|
+
raise MesonException(m)
|
|
215
|
+
|
|
216
|
+
def _create_targets(self, extra_depends: T.List[T.Union['BuildTarget', 'CustomTarget']], is_build_only_subproject: bool) -> T.List['TYPE_var']:
|
|
217
|
+
cmd = self.env.get_build_command()
|
|
218
|
+
cmd += ['--internal', 'externalproject',
|
|
219
|
+
'--name', self.name,
|
|
220
|
+
'--srcdir', self.src_dir.as_posix(),
|
|
221
|
+
'--builddir', self.build_dir.as_posix(),
|
|
222
|
+
'--installdir', self.install_dir.as_posix(),
|
|
223
|
+
'--logdir', mlog.get_log_dir(),
|
|
224
|
+
'--make', join_args(self.make),
|
|
225
|
+
]
|
|
226
|
+
if self.verbose:
|
|
227
|
+
cmd.append('--verbose')
|
|
228
|
+
|
|
229
|
+
self.target = build.CustomTarget(
|
|
230
|
+
self.name,
|
|
231
|
+
self.subdir.as_posix(),
|
|
232
|
+
self.subproject,
|
|
233
|
+
self.env,
|
|
234
|
+
cmd + ['@OUTPUT@', '@DEPFILE@'],
|
|
235
|
+
[],
|
|
236
|
+
[f'{self.name}.stamp'],
|
|
237
|
+
is_build_only_subproject,
|
|
238
|
+
depfile=f'{self.name}.d',
|
|
239
|
+
console=True,
|
|
240
|
+
extra_depends=extra_depends,
|
|
241
|
+
description='Generating external project {}',
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
idir = build.InstallDir(self.subdir.as_posix(),
|
|
245
|
+
Path('dist', self.rel_prefix).as_posix(),
|
|
246
|
+
install_dir='.',
|
|
247
|
+
install_dir_name='.',
|
|
248
|
+
install_mode=None,
|
|
249
|
+
exclude=None,
|
|
250
|
+
strip_directory=True,
|
|
251
|
+
from_source_dir=False,
|
|
252
|
+
subproject=self.subproject)
|
|
253
|
+
|
|
254
|
+
return [self.target, idir]
|
|
255
|
+
|
|
256
|
+
@typed_pos_args('external_project.dependency', str)
|
|
257
|
+
@typed_kwargs('external_project.dependency', KwargInfo('subdir', str, default=''))
|
|
258
|
+
def dependency_method(self, state: 'ModuleState', args: T.Tuple[str], kwargs: 'Dependency') -> InternalDependency:
|
|
259
|
+
libname = args[0]
|
|
260
|
+
|
|
261
|
+
abs_includedir = Path(self.install_dir, self.rel_prefix, self.includedir)
|
|
262
|
+
if kwargs['subdir']:
|
|
263
|
+
abs_includedir = Path(abs_includedir, kwargs['subdir'])
|
|
264
|
+
abs_libdir = Path(self.install_dir, self.rel_prefix, self.libdir)
|
|
265
|
+
|
|
266
|
+
version = self.project_version
|
|
267
|
+
compile_args = [f'-I{abs_includedir}']
|
|
268
|
+
link_args = [f'-L{abs_libdir}', f'-l{libname}']
|
|
269
|
+
sources = self.target
|
|
270
|
+
dep = InternalDependency(version, [], compile_args, link_args, [],
|
|
271
|
+
[], [sources], [], [], {}, [], [], [])
|
|
272
|
+
return dep
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class ExternalProjectModule(ExtensionModule):
|
|
276
|
+
|
|
277
|
+
INFO = ModuleInfo('External build system', '0.56.0', unstable=True)
|
|
278
|
+
|
|
279
|
+
def __init__(self, interpreter: 'Interpreter'):
|
|
280
|
+
super().__init__(interpreter)
|
|
281
|
+
self.methods.update({'add_project': self.add_project,
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
@typed_pos_args('external_project_mod.add_project', str)
|
|
285
|
+
@typed_kwargs(
|
|
286
|
+
'external_project.add_project',
|
|
287
|
+
KwargInfo('configure_options', ContainerTypeInfo(list, str), default=[], listify=True),
|
|
288
|
+
KwargInfo('cross_configure_options', ContainerTypeInfo(list, str), default=['--host=@HOST@'], listify=True),
|
|
289
|
+
KwargInfo('verbose', bool, default=False),
|
|
290
|
+
ENV_KW,
|
|
291
|
+
DEPENDS_KW.evolve(since='0.63.0'),
|
|
292
|
+
)
|
|
293
|
+
def add_project(self, state: 'ModuleState', args: T.Tuple[str], kwargs: 'AddProject') -> ModuleReturnValue:
|
|
294
|
+
configure_command = args[0]
|
|
295
|
+
project = ExternalProject(state,
|
|
296
|
+
configure_command,
|
|
297
|
+
kwargs['configure_options'],
|
|
298
|
+
kwargs['cross_configure_options'],
|
|
299
|
+
kwargs['env'],
|
|
300
|
+
kwargs['verbose'],
|
|
301
|
+
kwargs['depends'])
|
|
302
|
+
return ModuleReturnValue(project, project.targets)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def initialize(interp: 'Interpreter') -> ExternalProjectModule:
|
|
306
|
+
return ExternalProjectModule(interp)
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2019 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
from pathlib import Path, PurePath, PureWindowsPath
|
|
6
|
+
import hashlib
|
|
7
|
+
import os
|
|
8
|
+
import typing as T
|
|
9
|
+
|
|
10
|
+
from . import ExtensionModule, ModuleReturnValue, ModuleInfo
|
|
11
|
+
from .. import mlog
|
|
12
|
+
from ..build import BuildTarget, CustomTarget, CustomTargetIndex, InvalidArguments
|
|
13
|
+
from ..interpreter.type_checking import INSTALL_KW, INSTALL_MODE_KW, INSTALL_TAG_KW, NoneType
|
|
14
|
+
from ..interpreterbase import FeatureNew, KwargInfo, typed_kwargs, typed_pos_args, noKwargs
|
|
15
|
+
from ..mesonlib import File, MesonException, has_path_sep, path_is_in_root, relpath
|
|
16
|
+
|
|
17
|
+
if T.TYPE_CHECKING:
|
|
18
|
+
from . import ModuleState
|
|
19
|
+
from ..build import BuildTargetTypes
|
|
20
|
+
from ..interpreter import Interpreter
|
|
21
|
+
from ..interpreterbase import TYPE_kwargs
|
|
22
|
+
from ..mesonlib import FileOrString, FileMode
|
|
23
|
+
|
|
24
|
+
from typing_extensions import TypedDict
|
|
25
|
+
|
|
26
|
+
class ReadKwArgs(TypedDict):
|
|
27
|
+
"""Keyword Arguments for fs.read."""
|
|
28
|
+
|
|
29
|
+
encoding: str
|
|
30
|
+
|
|
31
|
+
class CopyKw(TypedDict):
|
|
32
|
+
|
|
33
|
+
"""Kwargs for fs.copy"""
|
|
34
|
+
|
|
35
|
+
install: bool
|
|
36
|
+
install_dir: T.Optional[str]
|
|
37
|
+
install_mode: FileMode
|
|
38
|
+
install_tag: T.Optional[str]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class FSModule(ExtensionModule):
|
|
42
|
+
|
|
43
|
+
INFO = ModuleInfo('fs', '0.53.0')
|
|
44
|
+
|
|
45
|
+
def __init__(self, interpreter: 'Interpreter') -> None:
|
|
46
|
+
super().__init__(interpreter)
|
|
47
|
+
self.methods.update({
|
|
48
|
+
'as_posix': self.as_posix,
|
|
49
|
+
'copyfile': self.copyfile,
|
|
50
|
+
'exists': self.exists,
|
|
51
|
+
'expanduser': self.expanduser,
|
|
52
|
+
'hash': self.hash,
|
|
53
|
+
'is_absolute': self.is_absolute,
|
|
54
|
+
'is_dir': self.is_dir,
|
|
55
|
+
'is_file': self.is_file,
|
|
56
|
+
'is_samepath': self.is_samepath,
|
|
57
|
+
'is_symlink': self.is_symlink,
|
|
58
|
+
'name': self.name,
|
|
59
|
+
'parent': self.parent,
|
|
60
|
+
'read': self.read,
|
|
61
|
+
'relative_to': self.relative_to,
|
|
62
|
+
'replace_suffix': self.replace_suffix,
|
|
63
|
+
'size': self.size,
|
|
64
|
+
'stem': self.stem,
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
def _absolute_dir(self, state: 'ModuleState', arg: 'FileOrString') -> Path:
|
|
68
|
+
"""
|
|
69
|
+
make an absolute path from a relative path, WITHOUT resolving symlinks
|
|
70
|
+
"""
|
|
71
|
+
if isinstance(arg, File):
|
|
72
|
+
return Path(arg.absolute_path(state.source_root, state.environment.get_build_dir()))
|
|
73
|
+
return Path(state.source_root) / Path(state.subdir) / Path(arg).expanduser()
|
|
74
|
+
|
|
75
|
+
@staticmethod
|
|
76
|
+
def _obj_to_path(feature_new_prefix: str, obj: T.Union[FileOrString, BuildTargetTypes], state: ModuleState) -> PurePath:
|
|
77
|
+
if isinstance(obj, str):
|
|
78
|
+
return PurePath(obj)
|
|
79
|
+
|
|
80
|
+
if isinstance(obj, File):
|
|
81
|
+
FeatureNew(f'{feature_new_prefix} with file', '0.59.0').use(state.subproject, location=state.current_node)
|
|
82
|
+
return PurePath(str(obj))
|
|
83
|
+
|
|
84
|
+
FeatureNew(f'{feature_new_prefix} with build_tgt, custom_tgt, and custom_idx', '1.4.0').use(state.subproject, location=state.current_node)
|
|
85
|
+
return PurePath(state.backend.get_target_filename(obj))
|
|
86
|
+
|
|
87
|
+
def _resolve_dir(self, state: 'ModuleState', arg: 'FileOrString') -> Path:
|
|
88
|
+
"""
|
|
89
|
+
resolves symlinks and makes absolute a directory relative to calling meson.build,
|
|
90
|
+
if not already absolute
|
|
91
|
+
"""
|
|
92
|
+
path = self._absolute_dir(state, arg)
|
|
93
|
+
try:
|
|
94
|
+
# accommodate unresolvable paths e.g. symlink loops
|
|
95
|
+
path = path.resolve()
|
|
96
|
+
except Exception:
|
|
97
|
+
# return the best we could do
|
|
98
|
+
pass
|
|
99
|
+
return path
|
|
100
|
+
|
|
101
|
+
@noKwargs
|
|
102
|
+
@FeatureNew('fs.expanduser', '0.54.0')
|
|
103
|
+
@typed_pos_args('fs.expanduser', str)
|
|
104
|
+
def expanduser(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> str:
|
|
105
|
+
return str(Path(args[0]).expanduser())
|
|
106
|
+
|
|
107
|
+
@noKwargs
|
|
108
|
+
@FeatureNew('fs.is_absolute', '0.54.0')
|
|
109
|
+
@typed_pos_args('fs.is_absolute', (str, File))
|
|
110
|
+
def is_absolute(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: T.Dict[str, T.Any]) -> bool:
|
|
111
|
+
if isinstance(args[0], File):
|
|
112
|
+
FeatureNew('fs.is_absolute with file', '0.59.0').use(state.subproject, location=state.current_node)
|
|
113
|
+
return PurePath(str(args[0])).is_absolute()
|
|
114
|
+
|
|
115
|
+
@noKwargs
|
|
116
|
+
@FeatureNew('fs.as_posix', '0.54.0')
|
|
117
|
+
@typed_pos_args('fs.as_posix', str)
|
|
118
|
+
def as_posix(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> str:
|
|
119
|
+
r"""
|
|
120
|
+
this function assumes you are passing a Windows path, even if on a Unix-like system
|
|
121
|
+
and so ALL '\' are turned to '/', even if you meant to escape a character
|
|
122
|
+
"""
|
|
123
|
+
return PureWindowsPath(args[0]).as_posix()
|
|
124
|
+
|
|
125
|
+
@noKwargs
|
|
126
|
+
@typed_pos_args('fs.exists', str)
|
|
127
|
+
def exists(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> bool:
|
|
128
|
+
return self._resolve_dir(state, args[0]).exists()
|
|
129
|
+
|
|
130
|
+
@noKwargs
|
|
131
|
+
@typed_pos_args('fs.is_symlink', (str, File))
|
|
132
|
+
def is_symlink(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: T.Dict[str, T.Any]) -> bool:
|
|
133
|
+
if isinstance(args[0], File):
|
|
134
|
+
FeatureNew('fs.is_symlink with file', '0.59.0').use(state.subproject, location=state.current_node)
|
|
135
|
+
return self._absolute_dir(state, args[0]).is_symlink()
|
|
136
|
+
|
|
137
|
+
@noKwargs
|
|
138
|
+
@typed_pos_args('fs.is_file', str)
|
|
139
|
+
def is_file(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> bool:
|
|
140
|
+
return self._resolve_dir(state, args[0]).is_file()
|
|
141
|
+
|
|
142
|
+
@noKwargs
|
|
143
|
+
@typed_pos_args('fs.is_dir', str)
|
|
144
|
+
def is_dir(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> bool:
|
|
145
|
+
return self._resolve_dir(state, args[0]).is_dir()
|
|
146
|
+
|
|
147
|
+
@noKwargs
|
|
148
|
+
@typed_pos_args('fs.hash', (str, File), str)
|
|
149
|
+
def hash(self, state: 'ModuleState', args: T.Tuple['FileOrString', str], kwargs: T.Dict[str, T.Any]) -> str:
|
|
150
|
+
if isinstance(args[0], File):
|
|
151
|
+
FeatureNew('fs.hash with file', '0.59.0').use(state.subproject, location=state.current_node)
|
|
152
|
+
file = self._resolve_dir(state, args[0])
|
|
153
|
+
if not file.is_file():
|
|
154
|
+
raise MesonException(f'{file} is not a file and therefore cannot be hashed')
|
|
155
|
+
try:
|
|
156
|
+
h = hashlib.new(args[1])
|
|
157
|
+
except ValueError:
|
|
158
|
+
raise MesonException('hash algorithm {} is not available'.format(args[1]))
|
|
159
|
+
mlog.debug('computing {} sum of {} size {} bytes'.format(args[1], file, file.stat().st_size))
|
|
160
|
+
h.update(file.read_bytes())
|
|
161
|
+
return h.hexdigest()
|
|
162
|
+
|
|
163
|
+
@noKwargs
|
|
164
|
+
@typed_pos_args('fs.size', (str, File))
|
|
165
|
+
def size(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: T.Dict[str, T.Any]) -> int:
|
|
166
|
+
if isinstance(args[0], File):
|
|
167
|
+
FeatureNew('fs.size with file', '0.59.0').use(state.subproject, location=state.current_node)
|
|
168
|
+
file = self._resolve_dir(state, args[0])
|
|
169
|
+
if not file.is_file():
|
|
170
|
+
raise MesonException(f'{file} is not a file and therefore cannot be sized')
|
|
171
|
+
try:
|
|
172
|
+
return file.stat().st_size
|
|
173
|
+
except ValueError:
|
|
174
|
+
raise MesonException('{} size could not be determined'.format(args[0]))
|
|
175
|
+
|
|
176
|
+
@noKwargs
|
|
177
|
+
@typed_pos_args('fs.is_samepath', (str, File), (str, File))
|
|
178
|
+
def is_samepath(self, state: 'ModuleState', args: T.Tuple['FileOrString', 'FileOrString'], kwargs: T.Dict[str, T.Any]) -> bool:
|
|
179
|
+
if isinstance(args[0], File) or isinstance(args[1], File):
|
|
180
|
+
FeatureNew('fs.is_samepath with file', '0.59.0').use(state.subproject, location=state.current_node)
|
|
181
|
+
file1 = self._resolve_dir(state, args[0])
|
|
182
|
+
file2 = self._resolve_dir(state, args[1])
|
|
183
|
+
if not file1.exists():
|
|
184
|
+
return False
|
|
185
|
+
if not file2.exists():
|
|
186
|
+
return False
|
|
187
|
+
try:
|
|
188
|
+
return file1.samefile(file2)
|
|
189
|
+
except OSError:
|
|
190
|
+
return False
|
|
191
|
+
|
|
192
|
+
@noKwargs
|
|
193
|
+
@typed_pos_args('fs.replace_suffix', (str, File, CustomTarget, CustomTargetIndex, BuildTarget), str)
|
|
194
|
+
def replace_suffix(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes], str], kwargs: T.Dict[str, T.Any]) -> str:
|
|
195
|
+
path = self._obj_to_path('fs.replace_suffix', args[0], state)
|
|
196
|
+
return str(path.with_suffix(args[1]))
|
|
197
|
+
|
|
198
|
+
@noKwargs
|
|
199
|
+
@typed_pos_args('fs.parent', (str, File, CustomTarget, CustomTargetIndex, BuildTarget))
|
|
200
|
+
def parent(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes]], kwargs: T.Dict[str, T.Any]) -> str:
|
|
201
|
+
path = self._obj_to_path('fs.parent', args[0], state)
|
|
202
|
+
return str(path.parent)
|
|
203
|
+
|
|
204
|
+
@noKwargs
|
|
205
|
+
@typed_pos_args('fs.name', (str, File, CustomTarget, CustomTargetIndex, BuildTarget))
|
|
206
|
+
def name(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes]], kwargs: T.Dict[str, T.Any]) -> str:
|
|
207
|
+
path = self._obj_to_path('fs.name', args[0], state)
|
|
208
|
+
return str(path.name)
|
|
209
|
+
|
|
210
|
+
@noKwargs
|
|
211
|
+
@typed_pos_args('fs.stem', (str, File, CustomTarget, CustomTargetIndex, BuildTarget))
|
|
212
|
+
@FeatureNew('fs.stem', '0.54.0')
|
|
213
|
+
def stem(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes]], kwargs: T.Dict[str, T.Any]) -> str:
|
|
214
|
+
path = self._obj_to_path('fs.stem', args[0], state)
|
|
215
|
+
return str(path.stem)
|
|
216
|
+
|
|
217
|
+
@FeatureNew('fs.read', '0.57.0')
|
|
218
|
+
@typed_pos_args('fs.read', (str, File))
|
|
219
|
+
@typed_kwargs('fs.read', KwargInfo('encoding', str, default='utf-8'))
|
|
220
|
+
def read(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: 'ReadKwArgs') -> str:
|
|
221
|
+
"""Read a file from the source tree and return its value as a decoded
|
|
222
|
+
string.
|
|
223
|
+
|
|
224
|
+
If the encoding is not specified, the file is assumed to be utf-8
|
|
225
|
+
encoded. Paths must be relative by default (to prevent accidents) and
|
|
226
|
+
are forbidden to be read from the build directory (to prevent build
|
|
227
|
+
loops)
|
|
228
|
+
"""
|
|
229
|
+
path = args[0]
|
|
230
|
+
encoding = kwargs['encoding']
|
|
231
|
+
src_dir = state.environment.source_dir
|
|
232
|
+
sub_dir = state.subdir
|
|
233
|
+
build_dir = state.environment.get_build_dir()
|
|
234
|
+
|
|
235
|
+
if isinstance(path, File):
|
|
236
|
+
if path.is_built:
|
|
237
|
+
raise MesonException(
|
|
238
|
+
'fs.read does not accept built files() objects')
|
|
239
|
+
path = os.path.join(src_dir, path.relative_name())
|
|
240
|
+
else:
|
|
241
|
+
if sub_dir:
|
|
242
|
+
src_dir = os.path.join(src_dir, sub_dir)
|
|
243
|
+
path = os.path.join(src_dir, path)
|
|
244
|
+
|
|
245
|
+
path = os.path.abspath(path)
|
|
246
|
+
if path_is_in_root(Path(path), Path(build_dir), resolve=True):
|
|
247
|
+
raise MesonException('path must not be in the build tree')
|
|
248
|
+
try:
|
|
249
|
+
with open(path, encoding=encoding) as f:
|
|
250
|
+
data = f.read()
|
|
251
|
+
except FileNotFoundError:
|
|
252
|
+
raise MesonException(f'File {args[0]} does not exist.')
|
|
253
|
+
except UnicodeDecodeError:
|
|
254
|
+
raise MesonException(f'decoding failed for {args[0]}')
|
|
255
|
+
# Reconfigure when this file changes as it can contain data used by any
|
|
256
|
+
# part of the build configuration (e.g. `project(..., version:
|
|
257
|
+
# fs.read_file('VERSION')` or `configure_file(...)`
|
|
258
|
+
self.interpreter.add_build_def_file(path)
|
|
259
|
+
return data
|
|
260
|
+
|
|
261
|
+
@FeatureNew('fs.copyfile', '0.64.0')
|
|
262
|
+
@typed_pos_args('fs.copyfile', (File, str), optargs=[str])
|
|
263
|
+
@typed_kwargs(
|
|
264
|
+
'fs.copyfile',
|
|
265
|
+
INSTALL_KW,
|
|
266
|
+
INSTALL_MODE_KW,
|
|
267
|
+
INSTALL_TAG_KW,
|
|
268
|
+
KwargInfo('install_dir', (str, NoneType)),
|
|
269
|
+
)
|
|
270
|
+
def copyfile(self, state: ModuleState, args: T.Tuple[FileOrString, T.Optional[str]],
|
|
271
|
+
kwargs: CopyKw) -> ModuleReturnValue:
|
|
272
|
+
"""Copy a file into the build directory at build time."""
|
|
273
|
+
if kwargs['install'] and not kwargs['install_dir']:
|
|
274
|
+
raise InvalidArguments('"install_dir" must be specified when "install" is true')
|
|
275
|
+
|
|
276
|
+
src = self.interpreter.source_strings_to_files([args[0]])[0]
|
|
277
|
+
|
|
278
|
+
# The input is allowed to have path separators, but the output may not,
|
|
279
|
+
# so use the basename for the default case
|
|
280
|
+
dest = args[1] if args[1] else os.path.basename(src.fname)
|
|
281
|
+
if has_path_sep(dest):
|
|
282
|
+
raise InvalidArguments('Destination path may not have path separators')
|
|
283
|
+
|
|
284
|
+
ct = CustomTarget(
|
|
285
|
+
dest,
|
|
286
|
+
state.subdir,
|
|
287
|
+
state.subproject,
|
|
288
|
+
state.environment,
|
|
289
|
+
state.environment.get_build_command() + ['--internal', 'copy', '@INPUT@', '@OUTPUT@'],
|
|
290
|
+
[src],
|
|
291
|
+
[dest],
|
|
292
|
+
state.is_build_only_subproject,
|
|
293
|
+
build_by_default=True,
|
|
294
|
+
install=kwargs['install'],
|
|
295
|
+
install_dir=[kwargs['install_dir']],
|
|
296
|
+
install_mode=kwargs['install_mode'],
|
|
297
|
+
install_tag=[kwargs['install_tag']],
|
|
298
|
+
backend=state.backend,
|
|
299
|
+
description='Copying file {}',
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
return ModuleReturnValue(ct, [ct])
|
|
303
|
+
|
|
304
|
+
@FeatureNew('fs.relative_to', '1.3.0')
|
|
305
|
+
@typed_pos_args('fs.relative_to', (str, File, CustomTarget, CustomTargetIndex, BuildTarget), (str, File, CustomTarget, CustomTargetIndex, BuildTarget))
|
|
306
|
+
@noKwargs
|
|
307
|
+
def relative_to(self, state: ModuleState, args: T.Tuple[T.Union[FileOrString, BuildTargetTypes], T.Union[FileOrString, BuildTargetTypes]], kwargs: TYPE_kwargs) -> str:
|
|
308
|
+
def to_path(arg: T.Union[FileOrString, CustomTarget, CustomTargetIndex, BuildTarget]) -> str:
|
|
309
|
+
if isinstance(arg, File):
|
|
310
|
+
return arg.absolute_path(state.environment.source_dir, state.environment.build_dir)
|
|
311
|
+
elif isinstance(arg, (CustomTarget, CustomTargetIndex, BuildTarget)):
|
|
312
|
+
return state.backend.get_target_filename_abs(arg)
|
|
313
|
+
else:
|
|
314
|
+
return os.path.join(state.environment.source_dir, state.subdir, arg)
|
|
315
|
+
|
|
316
|
+
t = to_path(args[0])
|
|
317
|
+
f = to_path(args[1])
|
|
318
|
+
|
|
319
|
+
return relpath(t, f)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def initialize(*args: T.Any, **kwargs: T.Any) -> FSModule:
|
|
323
|
+
return FSModule(*args, **kwargs)
|