frida 16.2.1 → 16.2.3
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,82 @@
|
|
|
1
|
+
if(MESON_PS_LOADED)
|
|
2
|
+
return()
|
|
3
|
+
endif()
|
|
4
|
+
|
|
5
|
+
set(MESON_PS_LOADED ON)
|
|
6
|
+
|
|
7
|
+
cmake_policy(PUSH)
|
|
8
|
+
cmake_policy(SET CMP0054 NEW) # https://cmake.org/cmake/help/latest/policy/CMP0054.html
|
|
9
|
+
|
|
10
|
+
# Dummy macros that have a special meaning in the meson code
|
|
11
|
+
macro(meson_ps_execute_delayed_calls)
|
|
12
|
+
endmacro()
|
|
13
|
+
|
|
14
|
+
macro(meson_ps_reload_vars)
|
|
15
|
+
endmacro()
|
|
16
|
+
|
|
17
|
+
macro(meson_ps_disabled_function)
|
|
18
|
+
message(WARNING "The function '${ARGV0}' is disabled in the context of CMake subprojects.\n"
|
|
19
|
+
"This should not be an issue but may lead to compilation errors.")
|
|
20
|
+
endmacro()
|
|
21
|
+
|
|
22
|
+
# Helper macro to inspect the current CMake state
|
|
23
|
+
macro(meson_ps_inspect_vars)
|
|
24
|
+
set(MESON_PS_CMAKE_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
|
|
25
|
+
set(MESON_PS_CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
26
|
+
meson_ps_execute_delayed_calls()
|
|
27
|
+
endmacro()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Override some system functions with custom code and forward the args
|
|
31
|
+
# to the original function
|
|
32
|
+
macro(add_custom_command)
|
|
33
|
+
meson_ps_inspect_vars()
|
|
34
|
+
_add_custom_command(${ARGV})
|
|
35
|
+
endmacro()
|
|
36
|
+
|
|
37
|
+
macro(add_custom_target)
|
|
38
|
+
meson_ps_inspect_vars()
|
|
39
|
+
_add_custom_target(${ARGV})
|
|
40
|
+
endmacro()
|
|
41
|
+
|
|
42
|
+
macro(set_property)
|
|
43
|
+
meson_ps_inspect_vars()
|
|
44
|
+
_set_property(${ARGV})
|
|
45
|
+
endmacro()
|
|
46
|
+
|
|
47
|
+
function(set_source_files_properties)
|
|
48
|
+
set(FILES)
|
|
49
|
+
set(I 0)
|
|
50
|
+
set(PROPERTIES OFF)
|
|
51
|
+
|
|
52
|
+
while(I LESS ARGC)
|
|
53
|
+
if(NOT PROPERTIES)
|
|
54
|
+
if("${ARGV${I}}" STREQUAL "PROPERTIES")
|
|
55
|
+
set(PROPERTIES ON)
|
|
56
|
+
else()
|
|
57
|
+
list(APPEND FILES "${ARGV${I}}")
|
|
58
|
+
endif()
|
|
59
|
+
|
|
60
|
+
math(EXPR I "${I} + 1")
|
|
61
|
+
else()
|
|
62
|
+
set(ID_IDX ${I})
|
|
63
|
+
math(EXPR PROP_IDX "${ID_IDX} + 1")
|
|
64
|
+
|
|
65
|
+
set(ID "${ARGV${ID_IDX}}")
|
|
66
|
+
set(PROP "${ARGV${PROP_IDX}}")
|
|
67
|
+
|
|
68
|
+
set_property(SOURCE ${FILES} PROPERTY "${ID}" "${PROP}")
|
|
69
|
+
math(EXPR I "${I} + 2")
|
|
70
|
+
endif()
|
|
71
|
+
endwhile()
|
|
72
|
+
endfunction()
|
|
73
|
+
|
|
74
|
+
# Disable some functions that would mess up the CMake meson integration
|
|
75
|
+
macro(target_precompile_headers)
|
|
76
|
+
meson_ps_disabled_function(target_precompile_headers)
|
|
77
|
+
endmacro()
|
|
78
|
+
|
|
79
|
+
set(MESON_PS_DELAYED_CALLS add_custom_command;add_custom_target;set_property)
|
|
80
|
+
meson_ps_reload_vars()
|
|
81
|
+
|
|
82
|
+
cmake_policy(POP)
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2019 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import subprocess as S
|
|
7
|
+
from threading import Thread
|
|
8
|
+
import typing as T
|
|
9
|
+
import re
|
|
10
|
+
import os
|
|
11
|
+
|
|
12
|
+
from .. import mlog
|
|
13
|
+
from ..mesonlib import PerMachine, Popen_safe, version_compare, is_windows, OptionKey
|
|
14
|
+
from ..programs import find_external_program, NonExistingExternalProgram
|
|
15
|
+
|
|
16
|
+
if T.TYPE_CHECKING:
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
from ..environment import Environment
|
|
20
|
+
from ..mesonlib import MachineChoice
|
|
21
|
+
from ..programs import ExternalProgram
|
|
22
|
+
|
|
23
|
+
TYPE_result = T.Tuple[int, T.Optional[str], T.Optional[str]]
|
|
24
|
+
TYPE_cache_key = T.Tuple[str, T.Tuple[str, ...], str, T.FrozenSet[T.Tuple[str, str]]]
|
|
25
|
+
|
|
26
|
+
class CMakeExecutor:
|
|
27
|
+
# The class's copy of the CMake path. Avoids having to search for it
|
|
28
|
+
# multiple times in the same Meson invocation.
|
|
29
|
+
class_cmakebin: PerMachine[T.Optional[ExternalProgram]] = PerMachine(None, None)
|
|
30
|
+
class_cmakevers: PerMachine[T.Optional[str]] = PerMachine(None, None)
|
|
31
|
+
class_cmake_cache: T.Dict[T.Any, TYPE_result] = {}
|
|
32
|
+
|
|
33
|
+
def __init__(self, environment: 'Environment', version: str, for_machine: MachineChoice, silent: bool = False):
|
|
34
|
+
self.min_version = version
|
|
35
|
+
self.environment = environment
|
|
36
|
+
self.for_machine = for_machine
|
|
37
|
+
self.cmakebin, self.cmakevers = self.find_cmake_binary(self.environment, silent=silent)
|
|
38
|
+
self.always_capture_stderr = True
|
|
39
|
+
self.print_cmout = False
|
|
40
|
+
self.prefix_paths: T.List[str] = []
|
|
41
|
+
self.extra_cmake_args: T.List[str] = []
|
|
42
|
+
|
|
43
|
+
if self.cmakebin is None:
|
|
44
|
+
return
|
|
45
|
+
|
|
46
|
+
if not version_compare(self.cmakevers, self.min_version):
|
|
47
|
+
mlog.warning(
|
|
48
|
+
'The version of CMake', mlog.bold(self.cmakebin.get_path()),
|
|
49
|
+
'is', mlog.bold(self.cmakevers), 'but version', mlog.bold(self.min_version),
|
|
50
|
+
'is required')
|
|
51
|
+
self.cmakebin = None
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
self.prefix_paths = self.environment.coredata.options[OptionKey('cmake_prefix_path', machine=self.for_machine)].value
|
|
55
|
+
if self.prefix_paths:
|
|
56
|
+
self.extra_cmake_args += ['-DCMAKE_PREFIX_PATH={}'.format(';'.join(self.prefix_paths))]
|
|
57
|
+
|
|
58
|
+
def find_cmake_binary(self, environment: 'Environment', silent: bool = False) -> T.Tuple[T.Optional['ExternalProgram'], T.Optional[str]]:
|
|
59
|
+
# Only search for CMake the first time and store the result in the class
|
|
60
|
+
# definition
|
|
61
|
+
if isinstance(CMakeExecutor.class_cmakebin[self.for_machine], NonExistingExternalProgram):
|
|
62
|
+
mlog.debug(f'CMake binary for {self.for_machine} is cached as not found')
|
|
63
|
+
return None, None
|
|
64
|
+
elif CMakeExecutor.class_cmakebin[self.for_machine] is not None:
|
|
65
|
+
mlog.debug(f'CMake binary for {self.for_machine} is cached.')
|
|
66
|
+
else:
|
|
67
|
+
assert CMakeExecutor.class_cmakebin[self.for_machine] is None
|
|
68
|
+
|
|
69
|
+
mlog.debug(f'CMake binary for {self.for_machine} is not cached')
|
|
70
|
+
for potential_cmakebin in find_external_program(
|
|
71
|
+
environment, self.for_machine, 'cmake', 'CMake',
|
|
72
|
+
environment.default_cmake, allow_default_for_cross=False):
|
|
73
|
+
version_if_ok = self.check_cmake(potential_cmakebin)
|
|
74
|
+
if not version_if_ok:
|
|
75
|
+
continue
|
|
76
|
+
if not silent:
|
|
77
|
+
mlog.log('Found CMake:', mlog.bold(potential_cmakebin.get_path()),
|
|
78
|
+
f'({version_if_ok})')
|
|
79
|
+
CMakeExecutor.class_cmakebin[self.for_machine] = potential_cmakebin
|
|
80
|
+
CMakeExecutor.class_cmakevers[self.for_machine] = version_if_ok
|
|
81
|
+
break
|
|
82
|
+
else:
|
|
83
|
+
if not silent:
|
|
84
|
+
mlog.log('Found CMake:', mlog.red('NO'))
|
|
85
|
+
# Set to False instead of None to signify that we've already
|
|
86
|
+
# searched for it and not found it
|
|
87
|
+
CMakeExecutor.class_cmakebin[self.for_machine] = NonExistingExternalProgram()
|
|
88
|
+
CMakeExecutor.class_cmakevers[self.for_machine] = None
|
|
89
|
+
return None, None
|
|
90
|
+
|
|
91
|
+
return CMakeExecutor.class_cmakebin[self.for_machine], CMakeExecutor.class_cmakevers[self.for_machine]
|
|
92
|
+
|
|
93
|
+
def check_cmake(self, cmakebin: 'ExternalProgram') -> T.Optional[str]:
|
|
94
|
+
if not cmakebin.found():
|
|
95
|
+
mlog.log(f'Did not find CMake {cmakebin.name!r}')
|
|
96
|
+
return None
|
|
97
|
+
try:
|
|
98
|
+
cmd = cmakebin.get_command()
|
|
99
|
+
p, out = Popen_safe(cmd + ['--version'])[0:2]
|
|
100
|
+
if p.returncode != 0:
|
|
101
|
+
mlog.warning('Found CMake {!r} but couldn\'t run it'
|
|
102
|
+
''.format(' '.join(cmd)))
|
|
103
|
+
return None
|
|
104
|
+
except FileNotFoundError:
|
|
105
|
+
mlog.warning('We thought we found CMake {!r} but now it\'s not there. How odd!'
|
|
106
|
+
''.format(' '.join(cmd)))
|
|
107
|
+
return None
|
|
108
|
+
except PermissionError:
|
|
109
|
+
msg = 'Found CMake {!r} but didn\'t have permissions to run it.'.format(' '.join(cmd))
|
|
110
|
+
if not is_windows():
|
|
111
|
+
msg += '\n\nOn Unix-like systems this is often caused by scripts that are not executable.'
|
|
112
|
+
mlog.warning(msg)
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
cmvers = re.search(r'(cmake|cmake3)\s*version\s*([\d.]+)', out)
|
|
116
|
+
if cmvers is not None:
|
|
117
|
+
return cmvers.group(2)
|
|
118
|
+
mlog.warning(f'We thought we found CMake {cmd!r}, but it was missing the expected '
|
|
119
|
+
'version string in its output.')
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
def set_exec_mode(self, print_cmout: T.Optional[bool] = None, always_capture_stderr: T.Optional[bool] = None) -> None:
|
|
123
|
+
if print_cmout is not None:
|
|
124
|
+
self.print_cmout = print_cmout
|
|
125
|
+
if always_capture_stderr is not None:
|
|
126
|
+
self.always_capture_stderr = always_capture_stderr
|
|
127
|
+
|
|
128
|
+
def _cache_key(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_cache_key:
|
|
129
|
+
fenv = frozenset(env.items()) if env is not None else frozenset()
|
|
130
|
+
targs = tuple(args)
|
|
131
|
+
return (self.cmakebin.get_path(), targs, build_dir.as_posix(), fenv)
|
|
132
|
+
|
|
133
|
+
def _call_cmout_stderr(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_result:
|
|
134
|
+
cmd = self.cmakebin.get_command() + args
|
|
135
|
+
proc = S.Popen(cmd, stdout=S.PIPE, stderr=S.PIPE, cwd=str(build_dir), env=env) # TODO [PYTHON_37]: drop Path conversion
|
|
136
|
+
|
|
137
|
+
# stdout and stderr MUST be read at the same time to avoid pipe
|
|
138
|
+
# blocking issues. The easiest way to do this is with a separate
|
|
139
|
+
# thread for one of the pipes.
|
|
140
|
+
def print_stdout() -> None:
|
|
141
|
+
while True:
|
|
142
|
+
line = proc.stdout.readline()
|
|
143
|
+
if not line:
|
|
144
|
+
break
|
|
145
|
+
mlog.log(line.decode(errors='ignore').strip('\n'))
|
|
146
|
+
proc.stdout.close()
|
|
147
|
+
|
|
148
|
+
t = Thread(target=print_stdout)
|
|
149
|
+
t.start()
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
# Read stderr line by line and log non trace lines
|
|
153
|
+
raw_trace = ''
|
|
154
|
+
tline_start_reg = re.compile(r'^\s*(.*\.(cmake|txt))\(([0-9]+)\):\s*(\w+)\(.*$')
|
|
155
|
+
inside_multiline_trace = False
|
|
156
|
+
while True:
|
|
157
|
+
line_raw = proc.stderr.readline()
|
|
158
|
+
if not line_raw:
|
|
159
|
+
break
|
|
160
|
+
line = line_raw.decode(errors='ignore')
|
|
161
|
+
if tline_start_reg.match(line):
|
|
162
|
+
raw_trace += line
|
|
163
|
+
inside_multiline_trace = not line.endswith(' )\n')
|
|
164
|
+
elif inside_multiline_trace:
|
|
165
|
+
raw_trace += line
|
|
166
|
+
else:
|
|
167
|
+
mlog.warning(line.strip('\n'))
|
|
168
|
+
|
|
169
|
+
finally:
|
|
170
|
+
proc.stderr.close()
|
|
171
|
+
t.join()
|
|
172
|
+
proc.wait()
|
|
173
|
+
|
|
174
|
+
return proc.returncode, None, raw_trace
|
|
175
|
+
|
|
176
|
+
def _call_cmout(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_result:
|
|
177
|
+
cmd = self.cmakebin.get_command() + args
|
|
178
|
+
proc = S.Popen(cmd, stdout=S.PIPE, stderr=S.STDOUT, cwd=str(build_dir), env=env) # TODO [PYTHON_37]: drop Path conversion
|
|
179
|
+
while True:
|
|
180
|
+
line = proc.stdout.readline()
|
|
181
|
+
if not line:
|
|
182
|
+
break
|
|
183
|
+
mlog.log(line.decode(errors='ignore').strip('\n'))
|
|
184
|
+
proc.stdout.close()
|
|
185
|
+
proc.wait()
|
|
186
|
+
return proc.returncode, None, None
|
|
187
|
+
|
|
188
|
+
def _call_quiet(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_result:
|
|
189
|
+
build_dir.mkdir(parents=True, exist_ok=True)
|
|
190
|
+
cmd = self.cmakebin.get_command() + args
|
|
191
|
+
ret = S.run(cmd, env=env, cwd=str(build_dir), close_fds=False,
|
|
192
|
+
stdout=S.PIPE, stderr=S.PIPE, universal_newlines=False) # TODO [PYTHON_37]: drop Path conversion
|
|
193
|
+
rc = ret.returncode
|
|
194
|
+
out = ret.stdout.decode(errors='ignore')
|
|
195
|
+
err = ret.stderr.decode(errors='ignore')
|
|
196
|
+
return rc, out, err
|
|
197
|
+
|
|
198
|
+
def _call_impl(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_result:
|
|
199
|
+
mlog.debug(f'Calling CMake ({self.cmakebin.get_command()}) in {build_dir} with:')
|
|
200
|
+
for i in args:
|
|
201
|
+
mlog.debug(f' - "{i}"')
|
|
202
|
+
if not self.print_cmout:
|
|
203
|
+
return self._call_quiet(args, build_dir, env)
|
|
204
|
+
else:
|
|
205
|
+
if self.always_capture_stderr:
|
|
206
|
+
return self._call_cmout_stderr(args, build_dir, env)
|
|
207
|
+
else:
|
|
208
|
+
return self._call_cmout(args, build_dir, env)
|
|
209
|
+
|
|
210
|
+
def call(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]] = None, disable_cache: bool = False) -> TYPE_result:
|
|
211
|
+
if env is None:
|
|
212
|
+
env = os.environ.copy()
|
|
213
|
+
|
|
214
|
+
args = args + self.extra_cmake_args
|
|
215
|
+
if disable_cache:
|
|
216
|
+
return self._call_impl(args, build_dir, env)
|
|
217
|
+
|
|
218
|
+
# First check if cached, if not call the real cmake function
|
|
219
|
+
cache = CMakeExecutor.class_cmake_cache
|
|
220
|
+
key = self._cache_key(args, build_dir, env)
|
|
221
|
+
if key not in cache:
|
|
222
|
+
cache[key] = self._call_impl(args, build_dir, env)
|
|
223
|
+
return cache[key]
|
|
224
|
+
|
|
225
|
+
def found(self) -> bool:
|
|
226
|
+
return self.cmakebin is not None
|
|
227
|
+
|
|
228
|
+
def version(self) -> str:
|
|
229
|
+
return self.cmakevers
|
|
230
|
+
|
|
231
|
+
def executable_path(self) -> str:
|
|
232
|
+
return self.cmakebin.get_path()
|
|
233
|
+
|
|
234
|
+
def get_command(self) -> T.List[str]:
|
|
235
|
+
return self.cmakebin.get_command()
|
|
236
|
+
|
|
237
|
+
def get_cmake_prefix_paths(self) -> T.List[str]:
|
|
238
|
+
return self.prefix_paths
|
|
239
|
+
|
|
240
|
+
def machine_choice(self) -> MachineChoice:
|
|
241
|
+
return self.for_machine
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2019 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from .common import CMakeException, CMakeBuildFile, CMakeConfiguration
|
|
7
|
+
import typing as T
|
|
8
|
+
from .. import mlog
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
import json
|
|
11
|
+
import re
|
|
12
|
+
|
|
13
|
+
STRIP_KEYS = ['cmake', 'reply', 'backtrace', 'backtraceGraph', 'version']
|
|
14
|
+
|
|
15
|
+
class CMakeFileAPI:
|
|
16
|
+
def __init__(self, build_dir: Path):
|
|
17
|
+
self.build_dir = build_dir
|
|
18
|
+
self.api_base_dir = self.build_dir / '.cmake' / 'api' / 'v1'
|
|
19
|
+
self.request_dir = self.api_base_dir / 'query' / 'client-meson'
|
|
20
|
+
self.reply_dir = self.api_base_dir / 'reply'
|
|
21
|
+
self.cmake_sources: T.List[CMakeBuildFile] = []
|
|
22
|
+
self.cmake_configurations: T.List[CMakeConfiguration] = []
|
|
23
|
+
self.project_version = ''
|
|
24
|
+
self.kind_resolver_map = {
|
|
25
|
+
'codemodel': self._parse_codemodel,
|
|
26
|
+
'cache': self._parse_cache,
|
|
27
|
+
'cmakeFiles': self._parse_cmakeFiles,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
def get_cmake_sources(self) -> T.List[CMakeBuildFile]:
|
|
31
|
+
return self.cmake_sources
|
|
32
|
+
|
|
33
|
+
def get_cmake_configurations(self) -> T.List[CMakeConfiguration]:
|
|
34
|
+
return self.cmake_configurations
|
|
35
|
+
|
|
36
|
+
def get_project_version(self) -> str:
|
|
37
|
+
return self.project_version
|
|
38
|
+
|
|
39
|
+
def setup_request(self) -> None:
|
|
40
|
+
self.request_dir.mkdir(parents=True, exist_ok=True)
|
|
41
|
+
|
|
42
|
+
query = {
|
|
43
|
+
'requests': [
|
|
44
|
+
{'kind': 'codemodel', 'version': {'major': 2, 'minor': 0}},
|
|
45
|
+
{'kind': 'cache', 'version': {'major': 2, 'minor': 0}},
|
|
46
|
+
{'kind': 'cmakeFiles', 'version': {'major': 1, 'minor': 0}},
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
query_file = self.request_dir / 'query.json'
|
|
51
|
+
query_file.write_text(json.dumps(query, indent=2), encoding='utf-8')
|
|
52
|
+
|
|
53
|
+
def load_reply(self) -> None:
|
|
54
|
+
if not self.reply_dir.is_dir():
|
|
55
|
+
raise CMakeException('No response from the CMake file API')
|
|
56
|
+
|
|
57
|
+
root = None
|
|
58
|
+
reg_index = re.compile(r'^index-.*\.json$')
|
|
59
|
+
for i in self.reply_dir.iterdir():
|
|
60
|
+
if reg_index.match(i.name):
|
|
61
|
+
root = i
|
|
62
|
+
break
|
|
63
|
+
|
|
64
|
+
if not root:
|
|
65
|
+
raise CMakeException('Failed to find the CMake file API index')
|
|
66
|
+
|
|
67
|
+
index = self._reply_file_content(root) # Load the root index
|
|
68
|
+
index = self._strip_data(index) # Avoid loading duplicate files
|
|
69
|
+
index = self._resolve_references(index) # Load everything
|
|
70
|
+
index = self._strip_data(index) # Strip unused data (again for loaded files)
|
|
71
|
+
|
|
72
|
+
# Debug output
|
|
73
|
+
debug_json = self.build_dir / '..' / 'fileAPI.json'
|
|
74
|
+
debug_json = debug_json.resolve()
|
|
75
|
+
debug_json.write_text(json.dumps(index, indent=2), encoding='utf-8')
|
|
76
|
+
mlog.cmd_ci_include(debug_json.as_posix())
|
|
77
|
+
|
|
78
|
+
# parse the JSON
|
|
79
|
+
for i in index['objects']:
|
|
80
|
+
assert isinstance(i, dict)
|
|
81
|
+
assert 'kind' in i
|
|
82
|
+
assert i['kind'] in self.kind_resolver_map
|
|
83
|
+
|
|
84
|
+
self.kind_resolver_map[i['kind']](i)
|
|
85
|
+
|
|
86
|
+
def _parse_codemodel(self, data: T.Dict[str, T.Any]) -> None:
|
|
87
|
+
assert 'configurations' in data
|
|
88
|
+
assert 'paths' in data
|
|
89
|
+
|
|
90
|
+
source_dir = data['paths']['source']
|
|
91
|
+
build_dir = data['paths']['build']
|
|
92
|
+
|
|
93
|
+
# The file API output differs quite a bit from the server
|
|
94
|
+
# output. It is more flat than the server output and makes
|
|
95
|
+
# heavy use of references. Here these references are
|
|
96
|
+
# resolved and the resulting data structure is identical
|
|
97
|
+
# to the CMake serve output.
|
|
98
|
+
|
|
99
|
+
def helper_parse_dir(dir_entry: T.Dict[str, T.Any]) -> T.Tuple[Path, Path]:
|
|
100
|
+
src_dir = Path(dir_entry.get('source', '.'))
|
|
101
|
+
bld_dir = Path(dir_entry.get('build', '.'))
|
|
102
|
+
src_dir = src_dir if src_dir.is_absolute() else source_dir / src_dir
|
|
103
|
+
bld_dir = bld_dir if bld_dir.is_absolute() else build_dir / bld_dir
|
|
104
|
+
src_dir = src_dir.resolve()
|
|
105
|
+
bld_dir = bld_dir.resolve()
|
|
106
|
+
|
|
107
|
+
return src_dir, bld_dir
|
|
108
|
+
|
|
109
|
+
def parse_sources(comp_group: T.Dict[str, T.Any], tgt: T.Dict[str, T.Any]) -> T.Tuple[T.List[Path], T.List[Path], T.List[int]]:
|
|
110
|
+
gen = []
|
|
111
|
+
src = []
|
|
112
|
+
idx = []
|
|
113
|
+
|
|
114
|
+
src_list_raw = tgt.get('sources', [])
|
|
115
|
+
for i in comp_group.get('sourceIndexes', []):
|
|
116
|
+
if i >= len(src_list_raw) or 'path' not in src_list_raw[i]:
|
|
117
|
+
continue
|
|
118
|
+
if src_list_raw[i].get('isGenerated', False):
|
|
119
|
+
gen += [Path(src_list_raw[i]['path'])]
|
|
120
|
+
else:
|
|
121
|
+
src += [Path(src_list_raw[i]['path'])]
|
|
122
|
+
idx += [i]
|
|
123
|
+
|
|
124
|
+
return src, gen, idx
|
|
125
|
+
|
|
126
|
+
def parse_target(tgt: T.Dict[str, T.Any]) -> T.Dict[str, T.Any]:
|
|
127
|
+
src_dir, bld_dir = helper_parse_dir(cnf.get('paths', {}))
|
|
128
|
+
|
|
129
|
+
# Parse install paths (if present)
|
|
130
|
+
install_paths = []
|
|
131
|
+
if 'install' in tgt:
|
|
132
|
+
prefix = Path(tgt['install']['prefix']['path'])
|
|
133
|
+
install_paths = [prefix / x['path'] for x in tgt['install']['destinations']]
|
|
134
|
+
install_paths = list(set(install_paths))
|
|
135
|
+
|
|
136
|
+
# On the first look, it looks really nice that the CMake devs have
|
|
137
|
+
# decided to use arrays for the linker flags. However, this feeling
|
|
138
|
+
# soon turns into despair when you realize that there only one entry
|
|
139
|
+
# per type in most cases, and we still have to do manual string splitting.
|
|
140
|
+
link_flags = []
|
|
141
|
+
link_libs = []
|
|
142
|
+
for i in tgt.get('link', {}).get('commandFragments', []):
|
|
143
|
+
if i['role'] == 'flags':
|
|
144
|
+
link_flags += [i['fragment']]
|
|
145
|
+
elif i['role'] == 'libraries':
|
|
146
|
+
link_libs += [i['fragment']]
|
|
147
|
+
elif i['role'] == 'libraryPath':
|
|
148
|
+
link_flags += ['-L{}'.format(i['fragment'])]
|
|
149
|
+
elif i['role'] == 'frameworkPath':
|
|
150
|
+
link_flags += ['-F{}'.format(i['fragment'])]
|
|
151
|
+
for i in tgt.get('archive', {}).get('commandFragments', []):
|
|
152
|
+
if i['role'] == 'flags':
|
|
153
|
+
link_flags += [i['fragment']]
|
|
154
|
+
|
|
155
|
+
# TODO The `dependencies` entry is new in the file API.
|
|
156
|
+
# maybe we can make use of that in addition to the
|
|
157
|
+
# implicit dependency detection
|
|
158
|
+
tgt_data = {
|
|
159
|
+
'artifacts': [Path(x.get('path', '')) for x in tgt.get('artifacts', [])],
|
|
160
|
+
'sourceDirectory': src_dir,
|
|
161
|
+
'buildDirectory': bld_dir,
|
|
162
|
+
'name': tgt.get('name', ''),
|
|
163
|
+
'fullName': tgt.get('nameOnDisk', ''),
|
|
164
|
+
'hasInstallRule': 'install' in tgt,
|
|
165
|
+
'installPaths': install_paths,
|
|
166
|
+
'linkerLanguage': tgt.get('link', {}).get('language', 'CXX'),
|
|
167
|
+
'linkLibraries': ' '.join(link_libs), # See previous comment block why we join the array
|
|
168
|
+
'linkFlags': ' '.join(link_flags), # See previous comment block why we join the array
|
|
169
|
+
'type': tgt.get('type', 'EXECUTABLE'),
|
|
170
|
+
'fileGroups': [],
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
processed_src_idx = []
|
|
174
|
+
for cg in tgt.get('compileGroups', []):
|
|
175
|
+
# Again, why an array, when there is usually only one element
|
|
176
|
+
# and arguments are separated with spaces...
|
|
177
|
+
flags = []
|
|
178
|
+
for i in cg.get('compileCommandFragments', []):
|
|
179
|
+
flags += [i['fragment']]
|
|
180
|
+
|
|
181
|
+
cg_data = {
|
|
182
|
+
'defines': [x.get('define', '') for x in cg.get('defines', [])],
|
|
183
|
+
'compileFlags': ' '.join(flags),
|
|
184
|
+
'language': cg.get('language', 'C'),
|
|
185
|
+
'isGenerated': None, # Set later, flag is stored per source file
|
|
186
|
+
'sources': [],
|
|
187
|
+
'includePath': cg.get('includes', []),
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
normal_src, generated_src, src_idx = parse_sources(cg, tgt)
|
|
191
|
+
if normal_src:
|
|
192
|
+
cg_data = dict(cg_data)
|
|
193
|
+
cg_data['isGenerated'] = False
|
|
194
|
+
cg_data['sources'] = normal_src
|
|
195
|
+
tgt_data['fileGroups'] += [cg_data]
|
|
196
|
+
if generated_src:
|
|
197
|
+
cg_data = dict(cg_data)
|
|
198
|
+
cg_data['isGenerated'] = True
|
|
199
|
+
cg_data['sources'] = generated_src
|
|
200
|
+
tgt_data['fileGroups'] += [cg_data]
|
|
201
|
+
processed_src_idx += src_idx
|
|
202
|
+
|
|
203
|
+
# Object libraries have no compile groups, only source groups.
|
|
204
|
+
# So we add all the source files to a dummy source group that were
|
|
205
|
+
# not found in the previous loop
|
|
206
|
+
normal_src = []
|
|
207
|
+
generated_src = []
|
|
208
|
+
for idx, src in enumerate(tgt.get('sources', [])):
|
|
209
|
+
if idx in processed_src_idx:
|
|
210
|
+
continue
|
|
211
|
+
|
|
212
|
+
if src.get('isGenerated', False):
|
|
213
|
+
generated_src += [src['path']]
|
|
214
|
+
else:
|
|
215
|
+
normal_src += [src['path']]
|
|
216
|
+
|
|
217
|
+
if normal_src:
|
|
218
|
+
tgt_data['fileGroups'] += [{
|
|
219
|
+
'isGenerated': False,
|
|
220
|
+
'sources': normal_src,
|
|
221
|
+
}]
|
|
222
|
+
if generated_src:
|
|
223
|
+
tgt_data['fileGroups'] += [{
|
|
224
|
+
'isGenerated': True,
|
|
225
|
+
'sources': generated_src,
|
|
226
|
+
}]
|
|
227
|
+
return tgt_data
|
|
228
|
+
|
|
229
|
+
def parse_project(pro: T.Dict[str, T.Any]) -> T.Dict[str, T.Any]:
|
|
230
|
+
# Only look at the first directory specified in directoryIndexes
|
|
231
|
+
# TODO Figure out what the other indexes are there for
|
|
232
|
+
p_src_dir = source_dir
|
|
233
|
+
p_bld_dir = build_dir
|
|
234
|
+
try:
|
|
235
|
+
p_src_dir, p_bld_dir = helper_parse_dir(cnf['directories'][pro['directoryIndexes'][0]])
|
|
236
|
+
except (IndexError, KeyError):
|
|
237
|
+
pass
|
|
238
|
+
|
|
239
|
+
pro_data = {
|
|
240
|
+
'name': pro.get('name', ''),
|
|
241
|
+
'sourceDirectory': p_src_dir,
|
|
242
|
+
'buildDirectory': p_bld_dir,
|
|
243
|
+
'targets': [],
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
for ref in pro.get('targetIndexes', []):
|
|
247
|
+
tgt = {}
|
|
248
|
+
try:
|
|
249
|
+
tgt = cnf['targets'][ref]
|
|
250
|
+
except (IndexError, KeyError):
|
|
251
|
+
pass
|
|
252
|
+
pro_data['targets'] += [parse_target(tgt)]
|
|
253
|
+
|
|
254
|
+
return pro_data
|
|
255
|
+
|
|
256
|
+
for cnf in data.get('configurations', []):
|
|
257
|
+
cnf_data = {
|
|
258
|
+
'name': cnf.get('name', ''),
|
|
259
|
+
'projects': [],
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
for pro in cnf.get('projects', []):
|
|
263
|
+
cnf_data['projects'] += [parse_project(pro)]
|
|
264
|
+
|
|
265
|
+
self.cmake_configurations += [CMakeConfiguration(cnf_data)]
|
|
266
|
+
|
|
267
|
+
def _parse_cmakeFiles(self, data: T.Dict[str, T.Any]) -> None:
|
|
268
|
+
assert 'inputs' in data
|
|
269
|
+
assert 'paths' in data
|
|
270
|
+
|
|
271
|
+
src_dir = Path(data['paths']['source'])
|
|
272
|
+
|
|
273
|
+
for i in data['inputs']:
|
|
274
|
+
path = Path(i['path'])
|
|
275
|
+
path = path if path.is_absolute() else src_dir / path
|
|
276
|
+
self.cmake_sources += [CMakeBuildFile(path, i.get('isCMake', False), i.get('isGenerated', False))]
|
|
277
|
+
|
|
278
|
+
def _parse_cache(self, data: T.Dict[str, T.Any]) -> None:
|
|
279
|
+
assert 'entries' in data
|
|
280
|
+
|
|
281
|
+
for e in data['entries']:
|
|
282
|
+
if e['name'] == 'CMAKE_PROJECT_VERSION':
|
|
283
|
+
self.project_version = e['value']
|
|
284
|
+
|
|
285
|
+
def _strip_data(self, data: T.Any) -> T.Any:
|
|
286
|
+
if isinstance(data, list):
|
|
287
|
+
for idx, i in enumerate(data):
|
|
288
|
+
data[idx] = self._strip_data(i)
|
|
289
|
+
|
|
290
|
+
elif isinstance(data, dict):
|
|
291
|
+
new = {}
|
|
292
|
+
for key, val in data.items():
|
|
293
|
+
if key not in STRIP_KEYS:
|
|
294
|
+
new[key] = self._strip_data(val)
|
|
295
|
+
data = new
|
|
296
|
+
|
|
297
|
+
return data
|
|
298
|
+
|
|
299
|
+
def _resolve_references(self, data: T.Any) -> T.Any:
|
|
300
|
+
if isinstance(data, list):
|
|
301
|
+
for idx, i in enumerate(data):
|
|
302
|
+
data[idx] = self._resolve_references(i)
|
|
303
|
+
|
|
304
|
+
elif isinstance(data, dict):
|
|
305
|
+
# Check for the "magic" reference entry and insert
|
|
306
|
+
# it into the root data dict
|
|
307
|
+
if 'jsonFile' in data:
|
|
308
|
+
data.update(self._reply_file_content(data['jsonFile']))
|
|
309
|
+
|
|
310
|
+
for key, val in data.items():
|
|
311
|
+
data[key] = self._resolve_references(val)
|
|
312
|
+
|
|
313
|
+
return data
|
|
314
|
+
|
|
315
|
+
def _reply_file_content(self, filename: Path) -> T.Dict[str, T.Any]:
|
|
316
|
+
real_path = self.reply_dir / filename
|
|
317
|
+
if not real_path.exists():
|
|
318
|
+
raise CMakeException(f'File "{real_path}" does not exist')
|
|
319
|
+
|
|
320
|
+
data = json.loads(real_path.read_text(encoding='utf-8'))
|
|
321
|
+
assert isinstance(data, dict)
|
|
322
|
+
for i in data.keys():
|
|
323
|
+
assert isinstance(i, str)
|
|
324
|
+
return data
|