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,121 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
|
|
3
|
+
# ignore all lints for this file, since it is run by python2 as well
|
|
4
|
+
|
|
5
|
+
# type: ignore
|
|
6
|
+
# pylint: disable=deprecated-module
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
# do not inject mesonbuild.scripts
|
|
11
|
+
# python -P would work too, but is exclusive to >=3.11
|
|
12
|
+
if sys.path[0].endswith('scripts'):
|
|
13
|
+
del sys.path[0]
|
|
14
|
+
|
|
15
|
+
import json, os, sysconfig
|
|
16
|
+
|
|
17
|
+
def get_distutils_paths(scheme=None, prefix=None):
|
|
18
|
+
import distutils.dist
|
|
19
|
+
distribution = distutils.dist.Distribution()
|
|
20
|
+
install_cmd = distribution.get_command_obj('install')
|
|
21
|
+
if prefix is not None:
|
|
22
|
+
install_cmd.prefix = prefix
|
|
23
|
+
if scheme:
|
|
24
|
+
install_cmd.select_scheme(scheme)
|
|
25
|
+
install_cmd.finalize_options()
|
|
26
|
+
return {
|
|
27
|
+
'data': install_cmd.install_data,
|
|
28
|
+
'include': os.path.dirname(install_cmd.install_headers),
|
|
29
|
+
'platlib': install_cmd.install_platlib,
|
|
30
|
+
'purelib': install_cmd.install_purelib,
|
|
31
|
+
'scripts': install_cmd.install_scripts,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
# On Debian derivatives, the Python interpreter shipped by the distribution uses
|
|
35
|
+
# a custom install scheme, deb_system, for the system install, and changes the
|
|
36
|
+
# default scheme to a custom one pointing to /usr/local and replacing
|
|
37
|
+
# site-packages with dist-packages.
|
|
38
|
+
# See https://github.com/mesonbuild/meson/issues/8739.
|
|
39
|
+
#
|
|
40
|
+
# We should be using sysconfig, but before 3.10.3, Debian only patches distutils.
|
|
41
|
+
# So we may end up falling back.
|
|
42
|
+
|
|
43
|
+
def get_install_paths():
|
|
44
|
+
if sys.version_info >= (3, 10):
|
|
45
|
+
scheme = sysconfig.get_default_scheme()
|
|
46
|
+
else:
|
|
47
|
+
scheme = sysconfig._get_default_scheme()
|
|
48
|
+
|
|
49
|
+
if sys.version_info >= (3, 10, 3):
|
|
50
|
+
if 'deb_system' in sysconfig.get_scheme_names():
|
|
51
|
+
scheme = 'deb_system'
|
|
52
|
+
else:
|
|
53
|
+
import distutils.command.install
|
|
54
|
+
if 'deb_system' in distutils.command.install.INSTALL_SCHEMES:
|
|
55
|
+
paths = get_distutils_paths(scheme='deb_system')
|
|
56
|
+
install_paths = get_distutils_paths(scheme='deb_system', prefix='')
|
|
57
|
+
return paths, install_paths
|
|
58
|
+
|
|
59
|
+
paths = sysconfig.get_paths(scheme=scheme)
|
|
60
|
+
empty_vars = {'base': '', 'platbase': '', 'installed_base': ''}
|
|
61
|
+
install_paths = sysconfig.get_paths(scheme=scheme, vars=empty_vars)
|
|
62
|
+
return paths, install_paths
|
|
63
|
+
|
|
64
|
+
paths, install_paths = get_install_paths()
|
|
65
|
+
|
|
66
|
+
def links_against_libpython():
|
|
67
|
+
# on versions supporting python-embed.pc, this is the non-embed lib
|
|
68
|
+
#
|
|
69
|
+
# PyPy is not yet up to 3.12 and work is still pending to export the
|
|
70
|
+
# relevant information (it doesn't automatically provide arbitrary
|
|
71
|
+
# Makefile vars)
|
|
72
|
+
if sys.version_info >= (3, 8) and not is_pypy:
|
|
73
|
+
variables = sysconfig.get_config_vars()
|
|
74
|
+
return bool(variables.get('LIBPYTHON', 'yes'))
|
|
75
|
+
else:
|
|
76
|
+
from distutils.core import Distribution, Extension
|
|
77
|
+
cmd = Distribution().get_command_obj('build_ext')
|
|
78
|
+
cmd.ensure_finalized()
|
|
79
|
+
return bool(cmd.get_libraries(Extension('dummy', [])))
|
|
80
|
+
|
|
81
|
+
variables = sysconfig.get_config_vars()
|
|
82
|
+
variables.update({'base_prefix': getattr(sys, 'base_prefix', sys.prefix)})
|
|
83
|
+
|
|
84
|
+
is_pypy = '__pypy__' in sys.builtin_module_names
|
|
85
|
+
|
|
86
|
+
if sys.version_info < (3, 0):
|
|
87
|
+
suffix = variables.get('SO')
|
|
88
|
+
elif sys.version_info < (3, 8, 7):
|
|
89
|
+
# https://bugs.python.org/issue?@action=redirect&bpo=39825
|
|
90
|
+
from distutils.sysconfig import get_config_var
|
|
91
|
+
suffix = get_config_var('EXT_SUFFIX')
|
|
92
|
+
else:
|
|
93
|
+
suffix = variables.get('EXT_SUFFIX')
|
|
94
|
+
|
|
95
|
+
limited_api_suffix = None
|
|
96
|
+
if sys.version_info >= (3, 2):
|
|
97
|
+
try:
|
|
98
|
+
from importlib.machinery import EXTENSION_SUFFIXES
|
|
99
|
+
limited_api_suffix = EXTENSION_SUFFIXES[1]
|
|
100
|
+
except Exception:
|
|
101
|
+
pass
|
|
102
|
+
|
|
103
|
+
# pypy supports modules targetting the limited api but
|
|
104
|
+
# does not use a special suffix to distinguish them:
|
|
105
|
+
# https://doc.pypy.org/en/latest/cpython_differences.html#permitted-abi-tags-in-extensions
|
|
106
|
+
if is_pypy:
|
|
107
|
+
limited_api_suffix = suffix
|
|
108
|
+
|
|
109
|
+
print(json.dumps({
|
|
110
|
+
'variables': variables,
|
|
111
|
+
'paths': paths,
|
|
112
|
+
'sysconfig_paths': sysconfig.get_paths(),
|
|
113
|
+
'install_paths': install_paths,
|
|
114
|
+
'version': sysconfig.get_python_version(),
|
|
115
|
+
'platform': sysconfig.get_platform(),
|
|
116
|
+
'is_pypy': is_pypy,
|
|
117
|
+
'is_venv': sys.prefix != variables['base_prefix'],
|
|
118
|
+
'link_libpython': links_against_libpython(),
|
|
119
|
+
'suffix': suffix,
|
|
120
|
+
'limited_api_suffix': limited_api_suffix,
|
|
121
|
+
}))
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2015-2016 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import sys, os
|
|
7
|
+
import pickle, subprocess
|
|
8
|
+
import typing as T
|
|
9
|
+
from ..coredata import CoreData
|
|
10
|
+
from ..backend.backends import RegenInfo
|
|
11
|
+
from ..mesonlib import OptionKey
|
|
12
|
+
|
|
13
|
+
# This could also be used for XCode.
|
|
14
|
+
|
|
15
|
+
def need_regen(regeninfo: RegenInfo, regen_timestamp: float) -> bool:
|
|
16
|
+
for i in regeninfo.depfiles:
|
|
17
|
+
curfile = os.path.join(regeninfo.build_dir, i)
|
|
18
|
+
curtime = os.stat(curfile).st_mtime
|
|
19
|
+
if curtime > regen_timestamp:
|
|
20
|
+
return True
|
|
21
|
+
# The timestamp file gets automatically deleted by MSBuild during a 'Clean' build.
|
|
22
|
+
# We must make sure to recreate it, even if we do not regenerate the solution.
|
|
23
|
+
# Otherwise, Visual Studio will always consider the REGEN project out of date.
|
|
24
|
+
print("Everything is up-to-date, regeneration of build files is not needed.")
|
|
25
|
+
from ..backend.vs2010backend import Vs2010Backend
|
|
26
|
+
Vs2010Backend.touch_regen_timestamp(regeninfo.build_dir)
|
|
27
|
+
return False
|
|
28
|
+
|
|
29
|
+
def regen(regeninfo: RegenInfo, meson_command: T.List[str], backend: str) -> None:
|
|
30
|
+
cmd = meson_command + ['--internal',
|
|
31
|
+
'regenerate',
|
|
32
|
+
regeninfo.build_dir,
|
|
33
|
+
regeninfo.source_dir,
|
|
34
|
+
'--backend=' + backend]
|
|
35
|
+
subprocess.check_call(cmd)
|
|
36
|
+
|
|
37
|
+
def run(args: T.List[str]) -> int:
|
|
38
|
+
private_dir = args[0]
|
|
39
|
+
dumpfile = os.path.join(private_dir, 'regeninfo.dump')
|
|
40
|
+
coredata_file = os.path.join(private_dir, 'coredata.dat')
|
|
41
|
+
with open(dumpfile, 'rb') as f:
|
|
42
|
+
regeninfo = pickle.load(f)
|
|
43
|
+
assert isinstance(regeninfo, RegenInfo)
|
|
44
|
+
with open(coredata_file, 'rb') as f:
|
|
45
|
+
coredata = pickle.load(f)
|
|
46
|
+
assert isinstance(coredata, CoreData)
|
|
47
|
+
backend = coredata.get_option(OptionKey('backend'))
|
|
48
|
+
assert isinstance(backend, str)
|
|
49
|
+
regen_timestamp = os.stat(dumpfile).st_mtime
|
|
50
|
+
if need_regen(regeninfo, regen_timestamp):
|
|
51
|
+
regen(regeninfo, coredata.meson_command, backend)
|
|
52
|
+
return 0
|
|
53
|
+
|
|
54
|
+
if __name__ == '__main__':
|
|
55
|
+
sys.exit(run(sys.argv[1:]))
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2018 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import itertools
|
|
7
|
+
import fnmatch
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
10
|
+
|
|
11
|
+
from ..compilers import lang_suffixes
|
|
12
|
+
from ..mesonlib import quiet_git
|
|
13
|
+
import typing as T
|
|
14
|
+
|
|
15
|
+
if T.TYPE_CHECKING:
|
|
16
|
+
import subprocess
|
|
17
|
+
|
|
18
|
+
def parse_pattern_file(fname: Path) -> T.List[str]:
|
|
19
|
+
patterns = []
|
|
20
|
+
try:
|
|
21
|
+
with fname.open(encoding='utf-8') as f:
|
|
22
|
+
for line in f:
|
|
23
|
+
pattern = line.strip()
|
|
24
|
+
if pattern and not pattern.startswith('#'):
|
|
25
|
+
patterns.append(pattern)
|
|
26
|
+
except FileNotFoundError:
|
|
27
|
+
pass
|
|
28
|
+
return patterns
|
|
29
|
+
|
|
30
|
+
def run_tool(name: str, srcdir: Path, builddir: Path, fn: T.Callable[..., subprocess.CompletedProcess], *args: T.Any) -> int:
|
|
31
|
+
patterns = parse_pattern_file(srcdir / f'.{name}-include')
|
|
32
|
+
globs: T.Union[T.List[T.List[Path]], T.List[T.Generator[Path, None, None]]]
|
|
33
|
+
if patterns:
|
|
34
|
+
globs = [srcdir.glob(p) for p in patterns]
|
|
35
|
+
else:
|
|
36
|
+
r, o = quiet_git(['ls-files'], srcdir)
|
|
37
|
+
if r:
|
|
38
|
+
globs = [[Path(srcdir, f) for f in o.splitlines()]]
|
|
39
|
+
else:
|
|
40
|
+
globs = [srcdir.glob('**/*')]
|
|
41
|
+
patterns = parse_pattern_file(srcdir / f'.{name}-ignore')
|
|
42
|
+
ignore = [str(builddir / '*')]
|
|
43
|
+
ignore.extend([str(srcdir / p) for p in patterns])
|
|
44
|
+
suffixes = set(lang_suffixes['c']).union(set(lang_suffixes['cpp']))
|
|
45
|
+
suffixes.add('h')
|
|
46
|
+
suffixes = {f'.{s}' for s in suffixes}
|
|
47
|
+
futures = []
|
|
48
|
+
returncode = 0
|
|
49
|
+
with ThreadPoolExecutor() as e:
|
|
50
|
+
for f in itertools.chain(*globs):
|
|
51
|
+
strf = str(f)
|
|
52
|
+
if f.is_dir() or f.suffix not in suffixes or \
|
|
53
|
+
any(fnmatch.fnmatch(strf, i) for i in ignore):
|
|
54
|
+
continue
|
|
55
|
+
futures.append(e.submit(fn, f, *args))
|
|
56
|
+
if futures:
|
|
57
|
+
returncode = max(x.result().returncode for x in futures)
|
|
58
|
+
return returncode
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2016 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import subprocess
|
|
7
|
+
import shutil
|
|
8
|
+
import tempfile
|
|
9
|
+
from ..environment import detect_ninja, detect_scanbuild
|
|
10
|
+
from ..coredata import get_cmd_line_file, CmdLineFileParser
|
|
11
|
+
from ..mesonlib import windows_proof_rmtree
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
import typing as T
|
|
14
|
+
from ast import literal_eval
|
|
15
|
+
import os
|
|
16
|
+
|
|
17
|
+
def scanbuild(exelist: T.List[str], srcdir: Path, blddir: Path, privdir: Path, logdir: Path, subprojdir: Path, args: T.List[str]) -> int:
|
|
18
|
+
# In case of problems leave the temp directory around
|
|
19
|
+
# so it can be debugged.
|
|
20
|
+
scandir = tempfile.mkdtemp(dir=str(privdir))
|
|
21
|
+
meson_cmd = exelist + args
|
|
22
|
+
build_cmd = exelist + ['--exclude', str(subprojdir), '-o', str(logdir)] + detect_ninja() + ['-C', scandir]
|
|
23
|
+
rc = subprocess.call(meson_cmd + [str(srcdir), scandir])
|
|
24
|
+
if rc != 0:
|
|
25
|
+
return rc
|
|
26
|
+
rc = subprocess.call(build_cmd)
|
|
27
|
+
if rc == 0:
|
|
28
|
+
windows_proof_rmtree(scandir)
|
|
29
|
+
return rc
|
|
30
|
+
|
|
31
|
+
def run(args: T.List[str]) -> int:
|
|
32
|
+
srcdir = Path(args[0])
|
|
33
|
+
bldpath = Path(args[1])
|
|
34
|
+
subprojdir = srcdir / Path(args[2])
|
|
35
|
+
blddir = args[1]
|
|
36
|
+
meson_cmd = args[3:]
|
|
37
|
+
privdir = bldpath / 'meson-private'
|
|
38
|
+
logdir = bldpath / 'meson-logs' / 'scanbuild'
|
|
39
|
+
shutil.rmtree(str(logdir), ignore_errors=True)
|
|
40
|
+
|
|
41
|
+
# if any cross or native files are specified we should use them
|
|
42
|
+
cmd = get_cmd_line_file(blddir)
|
|
43
|
+
data = CmdLineFileParser()
|
|
44
|
+
data.read(cmd)
|
|
45
|
+
|
|
46
|
+
if 'cross_file' in data['properties']:
|
|
47
|
+
meson_cmd.extend([f'--cross-file={os.path.abspath(f)}' for f in literal_eval(data['properties']['cross_file'])])
|
|
48
|
+
|
|
49
|
+
if 'native_file' in data['properties']:
|
|
50
|
+
meson_cmd.extend([f'--native-file={os.path.abspath(f)}' for f in literal_eval(data['properties']['native_file'])])
|
|
51
|
+
|
|
52
|
+
exelist = detect_scanbuild()
|
|
53
|
+
if not exelist:
|
|
54
|
+
print('Could not execute scan-build "%s"' % ' '.join(exelist))
|
|
55
|
+
return 1
|
|
56
|
+
|
|
57
|
+
return scanbuild(exelist, srcdir, bldpath, privdir, logdir, subprojdir, meson_cmd)
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2013-2016 The Meson development team
|
|
3
|
+
|
|
4
|
+
# This script extracts the symbols of a given shared library
|
|
5
|
+
# into a file. If the symbols have not changed, the file is not
|
|
6
|
+
# touched. This information is used to skip link steps if the
|
|
7
|
+
# ABI has not changed.
|
|
8
|
+
|
|
9
|
+
# This file is basically a reimplementation of
|
|
10
|
+
# http://cgit.freedesktop.org/libreoffice/core/commit/?id=3213cd54b76bc80a6f0516aac75a48ff3b2ad67c
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import typing as T
|
|
14
|
+
import os, sys
|
|
15
|
+
from .. import mesonlib
|
|
16
|
+
from .. import mlog
|
|
17
|
+
from ..mesonlib import Popen_safe
|
|
18
|
+
import argparse
|
|
19
|
+
|
|
20
|
+
parser = argparse.ArgumentParser()
|
|
21
|
+
|
|
22
|
+
parser.add_argument('--cross-host', default=None, dest='cross_host',
|
|
23
|
+
help='cross compilation host platform')
|
|
24
|
+
parser.add_argument('args', nargs='+')
|
|
25
|
+
|
|
26
|
+
TOOL_WARNING_FILE = None
|
|
27
|
+
RELINKING_WARNING = 'Relinking will always happen on source changes.'
|
|
28
|
+
|
|
29
|
+
def dummy_syms(outfilename: str) -> None:
|
|
30
|
+
"""Just touch it so relinking happens always."""
|
|
31
|
+
with open(outfilename, 'w', encoding='utf-8'):
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
def write_if_changed(text: str, outfilename: str) -> None:
|
|
35
|
+
try:
|
|
36
|
+
with open(outfilename, encoding='utf-8') as f:
|
|
37
|
+
oldtext = f.read()
|
|
38
|
+
if text == oldtext:
|
|
39
|
+
return
|
|
40
|
+
except FileNotFoundError:
|
|
41
|
+
pass
|
|
42
|
+
with open(outfilename, 'w', encoding='utf-8') as f:
|
|
43
|
+
f.write(text)
|
|
44
|
+
|
|
45
|
+
def print_tool_warning(tools: T.List[str], msg: str, stderr: T.Optional[str] = None) -> None:
|
|
46
|
+
if os.path.exists(TOOL_WARNING_FILE):
|
|
47
|
+
return
|
|
48
|
+
m = f'{tools!r} {msg}. {RELINKING_WARNING}'
|
|
49
|
+
if stderr:
|
|
50
|
+
m += '\n' + stderr
|
|
51
|
+
mlog.warning(m)
|
|
52
|
+
# Write it out so we don't warn again
|
|
53
|
+
with open(TOOL_WARNING_FILE, 'w', encoding='utf-8'):
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
def get_tool(name: str) -> T.List[str]:
|
|
57
|
+
evar = name.upper()
|
|
58
|
+
if evar in os.environ:
|
|
59
|
+
import shlex
|
|
60
|
+
return shlex.split(os.environ[evar])
|
|
61
|
+
return [name]
|
|
62
|
+
|
|
63
|
+
def call_tool(name: str, args: T.List[str], **kwargs: T.Any) -> str:
|
|
64
|
+
tool = get_tool(name)
|
|
65
|
+
try:
|
|
66
|
+
p, output, e = Popen_safe(tool + args, **kwargs)
|
|
67
|
+
except FileNotFoundError:
|
|
68
|
+
print_tool_warning(tool, 'not found')
|
|
69
|
+
return None
|
|
70
|
+
except PermissionError:
|
|
71
|
+
print_tool_warning(tool, 'not usable')
|
|
72
|
+
return None
|
|
73
|
+
if p.returncode != 0:
|
|
74
|
+
print_tool_warning(tool, 'does not work', e)
|
|
75
|
+
return None
|
|
76
|
+
return output
|
|
77
|
+
|
|
78
|
+
def call_tool_nowarn(tool: T.List[str], **kwargs: T.Any) -> T.Tuple[str, str]:
|
|
79
|
+
try:
|
|
80
|
+
p, output, e = Popen_safe(tool, **kwargs)
|
|
81
|
+
except FileNotFoundError:
|
|
82
|
+
return None, '{!r} not found\n'.format(tool[0])
|
|
83
|
+
except PermissionError:
|
|
84
|
+
return None, '{!r} not usable\n'.format(tool[0])
|
|
85
|
+
if p.returncode != 0:
|
|
86
|
+
return None, e
|
|
87
|
+
return output, None
|
|
88
|
+
|
|
89
|
+
def gnu_syms(libfilename: str, outfilename: str) -> None:
|
|
90
|
+
# Get the name of the library
|
|
91
|
+
output = call_tool('readelf', ['-d', libfilename])
|
|
92
|
+
if not output:
|
|
93
|
+
dummy_syms(outfilename)
|
|
94
|
+
return
|
|
95
|
+
result = [x for x in output.split('\n') if 'SONAME' in x]
|
|
96
|
+
assert len(result) <= 1
|
|
97
|
+
# Get a list of all symbols exported
|
|
98
|
+
output = call_tool('nm', ['--dynamic', '--extern-only', '--defined-only',
|
|
99
|
+
'--format=posix', libfilename])
|
|
100
|
+
if not output:
|
|
101
|
+
dummy_syms(outfilename)
|
|
102
|
+
return
|
|
103
|
+
for line in output.split('\n'):
|
|
104
|
+
if not line:
|
|
105
|
+
continue
|
|
106
|
+
line_split = line.split()
|
|
107
|
+
entry = line_split[0:2]
|
|
108
|
+
# Store the size of symbols pointing to data objects so we relink
|
|
109
|
+
# when those change, which is needed because of copy relocations
|
|
110
|
+
# https://github.com/mesonbuild/meson/pull/7132#issuecomment-628353702
|
|
111
|
+
if line_split[1].upper() in {'B', 'G', 'D'} and len(line_split) >= 4:
|
|
112
|
+
entry += [line_split[3]]
|
|
113
|
+
result += [' '.join(entry)]
|
|
114
|
+
write_if_changed('\n'.join(result) + '\n', outfilename)
|
|
115
|
+
|
|
116
|
+
def solaris_syms(libfilename: str, outfilename: str) -> None:
|
|
117
|
+
# gnu_syms() works with GNU nm & readelf, not Solaris nm & elfdump
|
|
118
|
+
origpath = os.environ['PATH']
|
|
119
|
+
try:
|
|
120
|
+
os.environ['PATH'] = '/usr/gnu/bin:' + origpath
|
|
121
|
+
gnu_syms(libfilename, outfilename)
|
|
122
|
+
finally:
|
|
123
|
+
os.environ['PATH'] = origpath
|
|
124
|
+
|
|
125
|
+
def osx_syms(libfilename: str, outfilename: str) -> None:
|
|
126
|
+
# Get the name of the library
|
|
127
|
+
output = call_tool('otool', ['-l', libfilename])
|
|
128
|
+
if not output:
|
|
129
|
+
dummy_syms(outfilename)
|
|
130
|
+
return
|
|
131
|
+
arr = output.split('\n')
|
|
132
|
+
for (i, val) in enumerate(arr):
|
|
133
|
+
if 'LC_ID_DYLIB' in val:
|
|
134
|
+
match = i
|
|
135
|
+
break
|
|
136
|
+
result = [arr[match + 2], arr[match + 5]] # Libreoffice stores all 5 lines but the others seem irrelevant.
|
|
137
|
+
# Get a list of all symbols exported
|
|
138
|
+
output = call_tool('nm', ['--extern-only', '--defined-only',
|
|
139
|
+
'--format=posix', libfilename])
|
|
140
|
+
if not output:
|
|
141
|
+
dummy_syms(outfilename)
|
|
142
|
+
return
|
|
143
|
+
result += [' '.join(x.split()[0:2]) for x in output.split('\n')]
|
|
144
|
+
write_if_changed('\n'.join(result) + '\n', outfilename)
|
|
145
|
+
|
|
146
|
+
def openbsd_syms(libfilename: str, outfilename: str) -> None:
|
|
147
|
+
# Get the name of the library
|
|
148
|
+
output = call_tool('readelf', ['-d', libfilename])
|
|
149
|
+
if not output:
|
|
150
|
+
dummy_syms(outfilename)
|
|
151
|
+
return
|
|
152
|
+
result = [x for x in output.split('\n') if 'SONAME' in x]
|
|
153
|
+
assert len(result) <= 1
|
|
154
|
+
# Get a list of all symbols exported
|
|
155
|
+
output = call_tool('nm', ['-D', '-P', '-g', libfilename])
|
|
156
|
+
if not output:
|
|
157
|
+
dummy_syms(outfilename)
|
|
158
|
+
return
|
|
159
|
+
# U = undefined (cope with the lack of --defined-only option)
|
|
160
|
+
result += [' '.join(x.split()[0:2]) for x in output.split('\n') if x and not x.endswith('U ')]
|
|
161
|
+
write_if_changed('\n'.join(result) + '\n', outfilename)
|
|
162
|
+
|
|
163
|
+
def freebsd_syms(libfilename: str, outfilename: str) -> None:
|
|
164
|
+
# Get the name of the library
|
|
165
|
+
output = call_tool('readelf', ['-d', libfilename])
|
|
166
|
+
if not output:
|
|
167
|
+
dummy_syms(outfilename)
|
|
168
|
+
return
|
|
169
|
+
result = [x for x in output.split('\n') if 'SONAME' in x]
|
|
170
|
+
assert len(result) <= 1
|
|
171
|
+
# Get a list of all symbols exported
|
|
172
|
+
output = call_tool('nm', ['--dynamic', '--extern-only', '--defined-only',
|
|
173
|
+
'--format=posix', libfilename])
|
|
174
|
+
if not output:
|
|
175
|
+
dummy_syms(outfilename)
|
|
176
|
+
return
|
|
177
|
+
|
|
178
|
+
result += [' '.join(x.split()[0:2]) for x in output.split('\n')]
|
|
179
|
+
write_if_changed('\n'.join(result) + '\n', outfilename)
|
|
180
|
+
|
|
181
|
+
def cygwin_syms(impfilename: str, outfilename: str) -> None:
|
|
182
|
+
# Get the name of the library
|
|
183
|
+
output = call_tool('dlltool', ['-I', impfilename])
|
|
184
|
+
if not output:
|
|
185
|
+
dummy_syms(outfilename)
|
|
186
|
+
return
|
|
187
|
+
result = [output]
|
|
188
|
+
# Get the list of all symbols exported
|
|
189
|
+
output = call_tool('nm', ['--extern-only', '--defined-only',
|
|
190
|
+
'--format=posix', impfilename])
|
|
191
|
+
if not output:
|
|
192
|
+
dummy_syms(outfilename)
|
|
193
|
+
return
|
|
194
|
+
for line in output.split('\n'):
|
|
195
|
+
if ' T ' not in line:
|
|
196
|
+
continue
|
|
197
|
+
result.append(line.split(maxsplit=1)[0])
|
|
198
|
+
write_if_changed('\n'.join(result) + '\n', outfilename)
|
|
199
|
+
|
|
200
|
+
def _get_implib_dllname(impfilename: str) -> T.Tuple[T.List[str], str]:
|
|
201
|
+
all_stderr = ''
|
|
202
|
+
# First try lib.exe, which is provided by MSVC. Then llvm-lib.exe, by LLVM
|
|
203
|
+
# for clang-cl.
|
|
204
|
+
#
|
|
205
|
+
# We cannot call get_tool on `lib` because it will look at the `LIB` env
|
|
206
|
+
# var which is the list of library paths MSVC will search for import
|
|
207
|
+
# libraries while linking.
|
|
208
|
+
for lib in (['lib'], get_tool('llvm-lib')):
|
|
209
|
+
output, e = call_tool_nowarn(lib + ['-list', impfilename])
|
|
210
|
+
if output:
|
|
211
|
+
# The output is a list of DLLs that each symbol exported by the import
|
|
212
|
+
# library is available in. We only build import libraries that point to
|
|
213
|
+
# a single DLL, so we can pick any of these. Pick the last one for
|
|
214
|
+
# simplicity. Also skip the last line, which is empty.
|
|
215
|
+
return output.split('\n')[-2:-1], None
|
|
216
|
+
all_stderr += e
|
|
217
|
+
# Next, try dlltool.exe which is provided by MinGW
|
|
218
|
+
output, e = call_tool_nowarn(get_tool('dlltool') + ['-I', impfilename])
|
|
219
|
+
if output:
|
|
220
|
+
return [output], None
|
|
221
|
+
all_stderr += e
|
|
222
|
+
return ([], all_stderr)
|
|
223
|
+
|
|
224
|
+
def _get_implib_exports(impfilename: str) -> T.Tuple[T.List[str], str]:
|
|
225
|
+
all_stderr = ''
|
|
226
|
+
# Force dumpbin.exe to use en-US so we can parse its output
|
|
227
|
+
env = os.environ.copy()
|
|
228
|
+
env['VSLANG'] = '1033'
|
|
229
|
+
output, e = call_tool_nowarn(get_tool('dumpbin') + ['-exports', impfilename], env=env)
|
|
230
|
+
if output:
|
|
231
|
+
lines = output.split('\n')
|
|
232
|
+
start = lines.index('File Type: LIBRARY')
|
|
233
|
+
end = lines.index(' Summary')
|
|
234
|
+
return lines[start:end], None
|
|
235
|
+
all_stderr += e
|
|
236
|
+
# Next, try llvm-nm.exe provided by LLVM, then nm.exe provided by MinGW
|
|
237
|
+
for nm in ('llvm-nm', 'nm'):
|
|
238
|
+
output, e = call_tool_nowarn(get_tool(nm) + ['--extern-only', '--defined-only',
|
|
239
|
+
'--format=posix', impfilename])
|
|
240
|
+
if output:
|
|
241
|
+
result = []
|
|
242
|
+
for line in output.split('\n'):
|
|
243
|
+
if ' T ' not in line or line.startswith('.text'):
|
|
244
|
+
continue
|
|
245
|
+
result.append(line.split(maxsplit=1)[0])
|
|
246
|
+
return result, None
|
|
247
|
+
all_stderr += e
|
|
248
|
+
return ([], all_stderr)
|
|
249
|
+
|
|
250
|
+
def windows_syms(impfilename: str, outfilename: str) -> None:
|
|
251
|
+
# Get the name of the library
|
|
252
|
+
result, e = _get_implib_dllname(impfilename)
|
|
253
|
+
if not result:
|
|
254
|
+
print_tool_warning(['lib', 'llvm-lib', 'dlltool'], 'do not work or were not found', e)
|
|
255
|
+
dummy_syms(outfilename)
|
|
256
|
+
return
|
|
257
|
+
# Get a list of all symbols exported
|
|
258
|
+
symbols, e = _get_implib_exports(impfilename)
|
|
259
|
+
if not symbols:
|
|
260
|
+
print_tool_warning(['dumpbin', 'llvm-nm', 'nm'], 'do not work or were not found', e)
|
|
261
|
+
dummy_syms(outfilename)
|
|
262
|
+
return
|
|
263
|
+
result += symbols
|
|
264
|
+
write_if_changed('\n'.join(result) + '\n', outfilename)
|
|
265
|
+
|
|
266
|
+
def gen_symbols(libfilename: str, impfilename: str, outfilename: str, cross_host: str) -> None:
|
|
267
|
+
if cross_host is not None:
|
|
268
|
+
# In case of cross builds just always relink. In theory we could
|
|
269
|
+
# determine the correct toolset, but we would need to use the correct
|
|
270
|
+
# `nm`, `readelf`, etc, from the cross info which requires refactoring.
|
|
271
|
+
dummy_syms(outfilename)
|
|
272
|
+
elif mesonlib.is_linux() or mesonlib.is_hurd():
|
|
273
|
+
gnu_syms(libfilename, outfilename)
|
|
274
|
+
elif mesonlib.is_osx():
|
|
275
|
+
osx_syms(libfilename, outfilename)
|
|
276
|
+
elif mesonlib.is_openbsd():
|
|
277
|
+
openbsd_syms(libfilename, outfilename)
|
|
278
|
+
elif mesonlib.is_freebsd():
|
|
279
|
+
freebsd_syms(libfilename, outfilename)
|
|
280
|
+
elif mesonlib.is_netbsd():
|
|
281
|
+
freebsd_syms(libfilename, outfilename)
|
|
282
|
+
elif mesonlib.is_windows():
|
|
283
|
+
if os.path.isfile(impfilename):
|
|
284
|
+
windows_syms(impfilename, outfilename)
|
|
285
|
+
else:
|
|
286
|
+
# No import library. Not sure how the DLL is being used, so just
|
|
287
|
+
# rebuild everything that links to it every time.
|
|
288
|
+
dummy_syms(outfilename)
|
|
289
|
+
elif mesonlib.is_cygwin():
|
|
290
|
+
if os.path.isfile(impfilename):
|
|
291
|
+
cygwin_syms(impfilename, outfilename)
|
|
292
|
+
else:
|
|
293
|
+
# No import library. Not sure how the DLL is being used, so just
|
|
294
|
+
# rebuild everything that links to it every time.
|
|
295
|
+
dummy_syms(outfilename)
|
|
296
|
+
elif mesonlib.is_sunos():
|
|
297
|
+
solaris_syms(libfilename, outfilename)
|
|
298
|
+
else:
|
|
299
|
+
if not os.path.exists(TOOL_WARNING_FILE):
|
|
300
|
+
mlog.warning('Symbol extracting has not been implemented for this '
|
|
301
|
+
'platform. ' + RELINKING_WARNING)
|
|
302
|
+
# Write it out so we don't warn again
|
|
303
|
+
with open(TOOL_WARNING_FILE, 'w', encoding='utf-8'):
|
|
304
|
+
pass
|
|
305
|
+
dummy_syms(outfilename)
|
|
306
|
+
|
|
307
|
+
def run(args: T.List[str]) -> int:
|
|
308
|
+
global TOOL_WARNING_FILE # pylint: disable=global-statement
|
|
309
|
+
options = parser.parse_args(args)
|
|
310
|
+
if len(options.args) != 4:
|
|
311
|
+
print('symbolextractor.py <shared library file> <import library> <output file>')
|
|
312
|
+
sys.exit(1)
|
|
313
|
+
privdir = os.path.join(options.args[0], 'meson-private')
|
|
314
|
+
TOOL_WARNING_FILE = os.path.join(privdir, 'symbolextractor_tool_warning_printed')
|
|
315
|
+
libfile = options.args[1]
|
|
316
|
+
impfile = options.args[2] # Only used on Windows
|
|
317
|
+
outfile = options.args[3]
|
|
318
|
+
gen_symbols(libfile, impfile, outfile, options.cross_host)
|
|
319
|
+
return 0
|
|
320
|
+
|
|
321
|
+
if __name__ == '__main__':
|
|
322
|
+
sys.exit(run(sys.argv[1:]))
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2019 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import subprocess
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
import typing as T
|
|
10
|
+
|
|
11
|
+
def ls_as_bytestream() -> bytes:
|
|
12
|
+
if os.path.exists('.git'):
|
|
13
|
+
return subprocess.run(['git', 'ls-tree', '-r', '--name-only', 'HEAD'],
|
|
14
|
+
stdout=subprocess.PIPE).stdout
|
|
15
|
+
|
|
16
|
+
files = [str(p) for p in Path('.').glob('**/*')
|
|
17
|
+
if not p.is_dir() and
|
|
18
|
+
not next((x for x in p.parts if x.startswith('.')), None)]
|
|
19
|
+
return '\n'.join(files).encode()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def cscope() -> int:
|
|
23
|
+
ls = b'\n'.join([b'"%s"' % f for f in ls_as_bytestream().split()])
|
|
24
|
+
return subprocess.run(['cscope', '-v', '-b', '-i-'], input=ls).returncode
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def ctags() -> int:
|
|
28
|
+
ls = ls_as_bytestream()
|
|
29
|
+
return subprocess.run(['ctags', '-L-'], input=ls).returncode
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def etags() -> int:
|
|
33
|
+
ls = ls_as_bytestream()
|
|
34
|
+
return subprocess.run(['etags', '-'], input=ls).returncode
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def run(args: T.List[str]) -> int:
|
|
38
|
+
tool_name = args[0]
|
|
39
|
+
srcdir_name = args[1]
|
|
40
|
+
os.chdir(srcdir_name)
|
|
41
|
+
assert tool_name in {'cscope', 'ctags', 'etags'}
|
|
42
|
+
res = globals()[tool_name]()
|
|
43
|
+
assert isinstance(res, int)
|
|
44
|
+
return res
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
import json
|
|
5
|
+
import typing as T
|
|
6
|
+
|
|
7
|
+
from . import meson_exe
|
|
8
|
+
|
|
9
|
+
# This script is used by run_unittests.py to verify we don't load too many
|
|
10
|
+
# modules when executing a wrapped command.
|
|
11
|
+
def run(args: T.List[str]) -> int:
|
|
12
|
+
meson_exe.run(args)
|
|
13
|
+
print(json.dumps(list(sys.modules.keys())))
|
|
14
|
+
return 0
|