frida 16.2.0 → 16.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BSDmakefile +6 -0
- package/Makefile +16 -0
- package/README.md +14 -11
- package/configure +18 -0
- package/configure.bat +22 -0
- package/dist/native.js +0 -8
- package/lib/application.ts +98 -0
- package/lib/authentication.ts +3 -0
- package/lib/build.py +50 -0
- package/lib/bus.ts +30 -0
- package/lib/cancellable.ts +33 -0
- package/lib/child.ts +15 -0
- package/lib/crash.ts +11 -0
- package/lib/device.ts +329 -0
- package/lib/device_manager.ts +69 -0
- package/lib/endpoint_parameters.ts +56 -0
- package/lib/icon.ts +15 -0
- package/lib/index.ts +311 -0
- package/lib/iostream.ts +78 -0
- package/lib/meson.build +53 -0
- package/lib/native.ts +9 -0
- package/lib/portal_membership.ts +10 -0
- package/lib/portal_service.ts +105 -0
- package/lib/process.ts +57 -0
- package/lib/relay.ts +44 -0
- package/lib/script.ts +352 -0
- package/lib/session.ts +113 -0
- package/lib/signals.ts +45 -0
- package/lib/socket_address.ts +35 -0
- package/lib/spawn.ts +4 -0
- package/lib/system_parameters.ts +78 -0
- package/make.bat +23 -0
- package/meson.build +160 -0
- package/meson.options +11 -0
- package/package.json +27 -6
- package/releng/deps.py +1133 -0
- package/releng/deps.toml +391 -0
- package/releng/devkit-assets/frida-core-example-unix.c +188 -0
- package/releng/devkit-assets/frida-core-example-windows.c +197 -0
- package/releng/devkit-assets/frida-core-example.sln +28 -0
- package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
- package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
- package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
- package/releng/devkit-assets/frida-gum-example.sln +28 -0
- package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
- package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
- package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
- package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
- package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
- package/releng/devkit.py +535 -0
- package/releng/env.py +420 -0
- package/releng/env_android.py +150 -0
- package/releng/env_apple.py +176 -0
- package/releng/env_generic.py +373 -0
- package/releng/frida_version.py +69 -0
- package/releng/machine_file.py +44 -0
- package/releng/machine_spec.py +290 -0
- package/releng/meson/meson.py +27 -0
- package/releng/meson/mesonbuild/__init__.py +0 -0
- package/releng/meson/mesonbuild/_pathlib.py +63 -0
- package/releng/meson/mesonbuild/_typing.py +69 -0
- package/releng/meson/mesonbuild/arglist.py +321 -0
- package/releng/meson/mesonbuild/ast/__init__.py +23 -0
- package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
- package/releng/meson/mesonbuild/ast/introspection.py +374 -0
- package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
- package/releng/meson/mesonbuild/ast/printer.py +620 -0
- package/releng/meson/mesonbuild/ast/visitor.py +161 -0
- package/releng/meson/mesonbuild/backend/__init__.py +0 -0
- package/releng/meson/mesonbuild/backend/backends.py +2047 -0
- package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
- package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
- package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
- package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
- package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
- package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
- package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
- package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
- package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
- package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
- package/releng/meson/mesonbuild/build.py +3249 -0
- package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
- package/releng/meson/mesonbuild/cargo/builder.py +238 -0
- package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
- package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
- package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
- package/releng/meson/mesonbuild/cargo/version.py +95 -0
- package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
- package/releng/meson/mesonbuild/cmake/common.py +331 -0
- package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
- package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
- package/releng/meson/mesonbuild/cmake/executor.py +241 -0
- package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
- package/releng/meson/mesonbuild/cmake/generator.py +186 -0
- package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
- package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
- package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
- package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
- package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
- package/releng/meson/mesonbuild/compilers/asm.py +307 -0
- package/releng/meson/mesonbuild/compilers/c.py +788 -0
- package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
- package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
- package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
- package/releng/meson/mesonbuild/compilers/cs.py +136 -0
- package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
- package/releng/meson/mesonbuild/compilers/cython.py +91 -0
- package/releng/meson/mesonbuild/compilers/d.py +861 -0
- package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
- package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
- package/releng/meson/mesonbuild/compilers/java.py +113 -0
- package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
- package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
- package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
- package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
- package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
- package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
- package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
- package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
- package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
- package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
- package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
- package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
- package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
- package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
- package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
- package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
- package/releng/meson/mesonbuild/compilers/objc.py +120 -0
- package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
- package/releng/meson/mesonbuild/compilers/rust.py +230 -0
- package/releng/meson/mesonbuild/compilers/swift.py +131 -0
- package/releng/meson/mesonbuild/compilers/vala.py +121 -0
- package/releng/meson/mesonbuild/coredata.py +1532 -0
- package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
- package/releng/meson/mesonbuild/dependencies/base.py +663 -0
- package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
- package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
- package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
- package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
- package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
- package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
- package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
- package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
- package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
- package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
- package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
- package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
- package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
- package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
- package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
- package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
- package/releng/meson/mesonbuild/dependencies/python.py +431 -0
- package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
- package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
- package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
- package/releng/meson/mesonbuild/depfile.py +82 -0
- package/releng/meson/mesonbuild/envconfig.py +480 -0
- package/releng/meson/mesonbuild/environment.py +987 -0
- package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
- package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
- package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
- package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
- package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
- package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
- package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
- package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
- package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
- package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
- package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
- package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
- package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
- package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
- package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
- package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
- package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
- package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
- package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
- package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
- package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
- package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
- package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
- package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
- package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
- package/releng/meson/mesonbuild/linkers/base.py +39 -0
- package/releng/meson/mesonbuild/linkers/detect.py +229 -0
- package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
- package/releng/meson/mesonbuild/mcompile.py +380 -0
- package/releng/meson/mesonbuild/mconf.py +368 -0
- package/releng/meson/mesonbuild/mdevenv.py +234 -0
- package/releng/meson/mesonbuild/mdist.py +376 -0
- package/releng/meson/mesonbuild/mesondata.py +38 -0
- package/releng/meson/mesonbuild/mesonlib.py +23 -0
- package/releng/meson/mesonbuild/mesonmain.py +289 -0
- package/releng/meson/mesonbuild/minit.py +204 -0
- package/releng/meson/mesonbuild/minstall.py +864 -0
- package/releng/meson/mesonbuild/mintro.py +667 -0
- package/releng/meson/mesonbuild/mlog.py +542 -0
- package/releng/meson/mesonbuild/modules/__init__.py +270 -0
- package/releng/meson/mesonbuild/modules/cmake.py +442 -0
- package/releng/meson/mesonbuild/modules/cuda.py +377 -0
- package/releng/meson/mesonbuild/modules/dlang.py +117 -0
- package/releng/meson/mesonbuild/modules/external_project.py +306 -0
- package/releng/meson/mesonbuild/modules/fs.py +323 -0
- package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
- package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
- package/releng/meson/mesonbuild/modules/i18n.py +405 -0
- package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
- package/releng/meson/mesonbuild/modules/java.py +112 -0
- package/releng/meson/mesonbuild/modules/keyval.py +65 -0
- package/releng/meson/mesonbuild/modules/modtest.py +33 -0
- package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
- package/releng/meson/mesonbuild/modules/python.py +556 -0
- package/releng/meson/mesonbuild/modules/python3.py +85 -0
- package/releng/meson/mesonbuild/modules/qt.py +621 -0
- package/releng/meson/mesonbuild/modules/qt4.py +23 -0
- package/releng/meson/mesonbuild/modules/qt5.py +23 -0
- package/releng/meson/mesonbuild/modules/qt6.py +22 -0
- package/releng/meson/mesonbuild/modules/rust.py +355 -0
- package/releng/meson/mesonbuild/modules/simd.py +114 -0
- package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
- package/releng/meson/mesonbuild/modules/wayland.py +151 -0
- package/releng/meson/mesonbuild/modules/windows.py +207 -0
- package/releng/meson/mesonbuild/mparser.py +1114 -0
- package/releng/meson/mesonbuild/msetup.py +365 -0
- package/releng/meson/mesonbuild/msubprojects.py +764 -0
- package/releng/meson/mesonbuild/mtest.py +2201 -0
- package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
- package/releng/meson/mesonbuild/optinterpreter.py +276 -0
- package/releng/meson/mesonbuild/programs.py +367 -0
- package/releng/meson/mesonbuild/rewriter.py +1075 -0
- package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
- package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
- package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
- package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
- package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
- package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
- package/releng/meson/mesonbuild/scripts/copy.py +19 -0
- package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
- package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
- package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
- package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
- package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
- package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
- package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
- package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
- package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
- package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
- package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
- package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
- package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
- package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
- package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
- package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
- package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
- package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
- package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
- package/releng/meson/mesonbuild/scripts/tags.py +44 -0
- package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
- package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
- package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
- package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
- package/releng/meson/mesonbuild/templates/__init__.py +0 -0
- package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
- package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
- package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
- package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
- package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
- package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
- package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
- package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
- package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
- package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
- package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
- package/releng/meson/mesonbuild/utils/__init__.py +0 -0
- package/releng/meson/mesonbuild/utils/core.py +166 -0
- package/releng/meson/mesonbuild/utils/platform.py +27 -0
- package/releng/meson/mesonbuild/utils/posix.py +32 -0
- package/releng/meson/mesonbuild/utils/universal.py +2445 -0
- package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
- package/releng/meson/mesonbuild/utils/win32.py +29 -0
- package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
- package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
- package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
- package/releng/meson-scripts/BSDmakefile +6 -0
- package/releng/meson-scripts/Makefile +16 -0
- package/releng/meson-scripts/configure +18 -0
- package/releng/meson-scripts/configure.bat +22 -0
- package/releng/meson-scripts/make.bat +23 -0
- package/releng/meson_configure.py +506 -0
- package/releng/meson_make.py +131 -0
- package/releng/mkdevkit.py +107 -0
- package/releng/mkfatmacho.py +54 -0
- package/releng/post-process-oabi.py +97 -0
- package/releng/progress.py +14 -0
- package/releng/sync-from-upstream.py +185 -0
- package/releng/tomlkit/tomlkit/__init__.py +59 -0
- package/releng/tomlkit/tomlkit/_compat.py +22 -0
- package/releng/tomlkit/tomlkit/_types.py +83 -0
- package/releng/tomlkit/tomlkit/_utils.py +158 -0
- package/releng/tomlkit/tomlkit/api.py +308 -0
- package/releng/tomlkit/tomlkit/container.py +875 -0
- package/releng/tomlkit/tomlkit/exceptions.py +227 -0
- package/releng/tomlkit/tomlkit/items.py +1967 -0
- package/releng/tomlkit/tomlkit/parser.py +1141 -0
- package/releng/tomlkit/tomlkit/py.typed +0 -0
- package/releng/tomlkit/tomlkit/source.py +180 -0
- package/releng/tomlkit/tomlkit/toml_char.py +52 -0
- package/releng/tomlkit/tomlkit/toml_document.py +7 -0
- package/releng/tomlkit/tomlkit/toml_file.py +58 -0
- package/releng/winenv.py +140 -0
- package/scripts/adjust-version.py +19 -0
- package/scripts/detect-version.py +40 -0
- package/scripts/fetch-abi-bits.py +343 -0
- package/scripts/install.js +23 -0
- package/scripts/package.py +15 -0
- package/src/addon.cc +76 -0
- package/src/application.cc +148 -0
- package/src/application.h +31 -0
- package/src/authentication.cc +174 -0
- package/src/authentication.h +24 -0
- package/src/bus.cc +167 -0
- package/src/bus.h +33 -0
- package/src/cancellable.cc +117 -0
- package/src/cancellable.h +31 -0
- package/src/child.cc +150 -0
- package/src/child.h +32 -0
- package/src/crash.cc +122 -0
- package/src/crash.h +30 -0
- package/src/device.cc +1302 -0
- package/src/device.h +55 -0
- package/src/device_manager.cc +362 -0
- package/src/device_manager.h +35 -0
- package/src/endpoint_parameters.cc +171 -0
- package/src/endpoint_parameters.h +28 -0
- package/src/glib_context.cc +62 -0
- package/src/glib_context.h +29 -0
- package/src/glib_object.cc +25 -0
- package/src/glib_object.h +37 -0
- package/src/iostream.cc +247 -0
- package/src/iostream.h +30 -0
- package/src/meson.build +26 -0
- package/src/operation.h +94 -0
- package/src/portal_membership.cc +100 -0
- package/src/portal_membership.h +26 -0
- package/src/portal_service.cc +401 -0
- package/src/portal_service.h +40 -0
- package/src/process.cc +135 -0
- package/src/process.h +30 -0
- package/src/relay.cc +139 -0
- package/src/relay.h +31 -0
- package/src/runtime.cc +443 -0
- package/src/runtime.h +64 -0
- package/src/script.cc +301 -0
- package/src/script.h +36 -0
- package/src/session.cc +860 -0
- package/src/session.h +42 -0
- package/src/signals.cc +334 -0
- package/src/signals.h +47 -0
- package/src/spawn.cc +95 -0
- package/src/spawn.h +27 -0
- package/src/usage_monitor.h +117 -0
- package/src/uv_context.cc +118 -0
- package/src/uv_context.h +40 -0
- package/src/win_delay_load_hook.cc +63 -0
- package/subprojects/frida-core.wrap +8 -0
- package/subprojects/nan.wrap +9 -0
- package/subprojects/packagefiles/nan.patch +13 -0
- package/test/data/index.ts +13 -0
- package/test/data/unixvictim-linux-x86 +0 -0
- package/test/data/unixvictim-linux-x86_64 +0 -0
- package/test/data/unixvictim-macos +0 -0
- package/test/device.ts +27 -0
- package/test/device_manager.ts +16 -0
- package/test/labrat.ts +32 -0
- package/test/script.ts +176 -0
- package/test/session.ts +73 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2013-2021 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from .base import ExternalDependency, DependencyException, DependencyTypeName
|
|
7
|
+
from ..mesonlib import is_windows, MesonException, PerMachine, stringlistify, extract_as_list
|
|
8
|
+
from ..cmake import CMakeExecutor, CMakeTraceParser, CMakeException, CMakeToolchain, CMakeExecScope, check_cmake_args, resolve_cmake_trace_targets, cmake_is_debug
|
|
9
|
+
from .. import mlog
|
|
10
|
+
import importlib.resources
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
import functools
|
|
13
|
+
import re
|
|
14
|
+
import os
|
|
15
|
+
import shutil
|
|
16
|
+
import textwrap
|
|
17
|
+
import typing as T
|
|
18
|
+
|
|
19
|
+
if T.TYPE_CHECKING:
|
|
20
|
+
from ..cmake import CMakeTarget
|
|
21
|
+
from ..environment import Environment
|
|
22
|
+
from ..envconfig import MachineInfo
|
|
23
|
+
from ..interpreter.type_checking import PkgConfigDefineType
|
|
24
|
+
|
|
25
|
+
class CMakeInfo(T.NamedTuple):
|
|
26
|
+
module_paths: T.List[str]
|
|
27
|
+
cmake_root: str
|
|
28
|
+
archs: T.List[str]
|
|
29
|
+
common_paths: T.List[str]
|
|
30
|
+
|
|
31
|
+
class CMakeDependency(ExternalDependency):
|
|
32
|
+
# The class's copy of the CMake path. Avoids having to search for it
|
|
33
|
+
# multiple times in the same Meson invocation.
|
|
34
|
+
class_cmakeinfo: PerMachine[T.Optional[CMakeInfo]] = PerMachine(None, None)
|
|
35
|
+
# Version string for the minimum CMake version
|
|
36
|
+
class_cmake_version = '>=3.4'
|
|
37
|
+
# CMake generators to try (empty for no generator)
|
|
38
|
+
class_cmake_generators = ['', 'Ninja', 'Unix Makefiles', 'Visual Studio 10 2010']
|
|
39
|
+
class_working_generator: T.Optional[str] = None
|
|
40
|
+
|
|
41
|
+
def _gen_exception(self, msg: str) -> DependencyException:
|
|
42
|
+
return DependencyException(f'Dependency {self.name} not found: {msg}')
|
|
43
|
+
|
|
44
|
+
def _main_cmake_file(self) -> str:
|
|
45
|
+
return 'CMakeLists.txt'
|
|
46
|
+
|
|
47
|
+
def _extra_cmake_opts(self) -> T.List[str]:
|
|
48
|
+
return []
|
|
49
|
+
|
|
50
|
+
def _map_module_list(self, modules: T.List[T.Tuple[str, bool]], components: T.List[T.Tuple[str, bool]]) -> T.List[T.Tuple[str, bool]]:
|
|
51
|
+
# Map the input module list to something else
|
|
52
|
+
# This function will only be executed AFTER the initial CMake
|
|
53
|
+
# interpreter pass has completed. Thus variables defined in the
|
|
54
|
+
# CMakeLists.txt can be accessed here.
|
|
55
|
+
#
|
|
56
|
+
# Both the modules and components inputs contain the original lists.
|
|
57
|
+
return modules
|
|
58
|
+
|
|
59
|
+
def _map_component_list(self, modules: T.List[T.Tuple[str, bool]], components: T.List[T.Tuple[str, bool]]) -> T.List[T.Tuple[str, bool]]:
|
|
60
|
+
# Map the input components list to something else. This
|
|
61
|
+
# function will be executed BEFORE the initial CMake interpreter
|
|
62
|
+
# pass. Thus variables from the CMakeLists.txt can NOT be accessed.
|
|
63
|
+
#
|
|
64
|
+
# Both the modules and components inputs contain the original lists.
|
|
65
|
+
return components
|
|
66
|
+
|
|
67
|
+
def _original_module_name(self, module: str) -> str:
|
|
68
|
+
# Reverse the module mapping done by _map_module_list for
|
|
69
|
+
# one module
|
|
70
|
+
return module
|
|
71
|
+
|
|
72
|
+
def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None, force_use_global_compilers: bool = False) -> None:
|
|
73
|
+
# Gather a list of all languages to support
|
|
74
|
+
self.language_list: T.List[str] = []
|
|
75
|
+
if language is None or force_use_global_compilers:
|
|
76
|
+
compilers = None
|
|
77
|
+
if kwargs.get('native', False):
|
|
78
|
+
compilers = environment.coredata.compilers.build
|
|
79
|
+
else:
|
|
80
|
+
compilers = environment.coredata.compilers.host
|
|
81
|
+
|
|
82
|
+
candidates = ['c', 'cpp', 'fortran', 'objc', 'objcxx']
|
|
83
|
+
self.language_list += [x for x in candidates if x in compilers]
|
|
84
|
+
else:
|
|
85
|
+
self.language_list += [language]
|
|
86
|
+
|
|
87
|
+
# Add additional languages if required
|
|
88
|
+
if 'fortran' in self.language_list:
|
|
89
|
+
self.language_list += ['c']
|
|
90
|
+
|
|
91
|
+
# Ensure that the list is unique
|
|
92
|
+
self.language_list = list(set(self.language_list))
|
|
93
|
+
|
|
94
|
+
super().__init__(DependencyTypeName('cmake'), environment, kwargs, language=language)
|
|
95
|
+
self.name = name
|
|
96
|
+
self.is_libtool = False
|
|
97
|
+
|
|
98
|
+
# Where all CMake "build dirs" are located
|
|
99
|
+
self.cmake_root_dir = environment.scratch_dir
|
|
100
|
+
|
|
101
|
+
# T.List of successfully found modules
|
|
102
|
+
self.found_modules: T.List[str] = []
|
|
103
|
+
|
|
104
|
+
# Store a copy of the CMake path on the object itself so it is
|
|
105
|
+
# stored in the pickled coredata and recovered.
|
|
106
|
+
#
|
|
107
|
+
# TODO further evaluate always using MachineChoice.BUILD
|
|
108
|
+
self.cmakebin = CMakeExecutor(environment, CMakeDependency.class_cmake_version, self.for_machine, silent=self.silent)
|
|
109
|
+
if not self.cmakebin.found():
|
|
110
|
+
msg = f'CMake binary for machine {self.for_machine} not found. Giving up.'
|
|
111
|
+
if self.required:
|
|
112
|
+
raise DependencyException(msg)
|
|
113
|
+
mlog.debug(msg)
|
|
114
|
+
return
|
|
115
|
+
|
|
116
|
+
# Setup the trace parser
|
|
117
|
+
self.traceparser = CMakeTraceParser(self.cmakebin.version(), self._get_build_dir(), self.env)
|
|
118
|
+
|
|
119
|
+
cm_args = stringlistify(extract_as_list(kwargs, 'cmake_args'))
|
|
120
|
+
cm_args = check_cmake_args(cm_args)
|
|
121
|
+
if CMakeDependency.class_cmakeinfo[self.for_machine] is None:
|
|
122
|
+
CMakeDependency.class_cmakeinfo[self.for_machine] = self._get_cmake_info(cm_args)
|
|
123
|
+
cmakeinfo = CMakeDependency.class_cmakeinfo[self.for_machine]
|
|
124
|
+
if cmakeinfo is None:
|
|
125
|
+
raise self._gen_exception('Unable to obtain CMake system information')
|
|
126
|
+
self.cmakeinfo = cmakeinfo
|
|
127
|
+
|
|
128
|
+
package_version = kwargs.get('cmake_package_version', '')
|
|
129
|
+
if not isinstance(package_version, str):
|
|
130
|
+
raise DependencyException('Keyword "cmake_package_version" must be a string.')
|
|
131
|
+
components = [(x, True) for x in stringlistify(extract_as_list(kwargs, 'components'))]
|
|
132
|
+
modules = [(x, True) for x in stringlistify(extract_as_list(kwargs, 'modules'))]
|
|
133
|
+
modules += [(x, False) for x in stringlistify(extract_as_list(kwargs, 'optional_modules'))]
|
|
134
|
+
cm_path = stringlistify(extract_as_list(kwargs, 'cmake_module_path'))
|
|
135
|
+
cm_path = [x if os.path.isabs(x) else os.path.join(environment.get_source_dir(), x) for x in cm_path]
|
|
136
|
+
if cm_path:
|
|
137
|
+
cm_args.append('-DCMAKE_MODULE_PATH=' + ';'.join(cm_path))
|
|
138
|
+
if not self._preliminary_find_check(name, cm_path, self.cmakebin.get_cmake_prefix_paths(), environment.machines[self.for_machine]):
|
|
139
|
+
mlog.debug('Preliminary CMake check failed. Aborting.')
|
|
140
|
+
return
|
|
141
|
+
self._detect_dep(name, package_version, modules, components, cm_args)
|
|
142
|
+
|
|
143
|
+
def __repr__(self) -> str:
|
|
144
|
+
return f'<{self.__class__.__name__} {self.name}: {self.is_found} {self.version_reqs}>'
|
|
145
|
+
|
|
146
|
+
def _get_cmake_info(self, cm_args: T.List[str]) -> T.Optional[CMakeInfo]:
|
|
147
|
+
mlog.debug("Extracting basic cmake information")
|
|
148
|
+
|
|
149
|
+
# Try different CMake generators since specifying no generator may fail
|
|
150
|
+
# in cygwin for some reason
|
|
151
|
+
gen_list = []
|
|
152
|
+
# First try the last working generator
|
|
153
|
+
if CMakeDependency.class_working_generator is not None:
|
|
154
|
+
gen_list += [CMakeDependency.class_working_generator]
|
|
155
|
+
gen_list += CMakeDependency.class_cmake_generators
|
|
156
|
+
|
|
157
|
+
temp_parser = CMakeTraceParser(self.cmakebin.version(), self._get_build_dir(), self.env)
|
|
158
|
+
toolchain = CMakeToolchain(self.cmakebin, self.env, self.for_machine, CMakeExecScope.DEPENDENCY, self._get_build_dir())
|
|
159
|
+
toolchain.write()
|
|
160
|
+
|
|
161
|
+
for i in gen_list:
|
|
162
|
+
mlog.debug('Try CMake generator: {}'.format(i if len(i) > 0 else 'auto'))
|
|
163
|
+
|
|
164
|
+
# Prepare options
|
|
165
|
+
cmake_opts = temp_parser.trace_args() + toolchain.get_cmake_args() + ['.']
|
|
166
|
+
cmake_opts += cm_args
|
|
167
|
+
if len(i) > 0:
|
|
168
|
+
cmake_opts = ['-G', i] + cmake_opts
|
|
169
|
+
|
|
170
|
+
# Run CMake
|
|
171
|
+
ret1, out1, err1 = self._call_cmake(cmake_opts, 'CMakePathInfo.txt')
|
|
172
|
+
|
|
173
|
+
# Current generator was successful
|
|
174
|
+
if ret1 == 0:
|
|
175
|
+
CMakeDependency.class_working_generator = i
|
|
176
|
+
break
|
|
177
|
+
|
|
178
|
+
mlog.debug(f'CMake failed to gather system information for generator {i} with error code {ret1}')
|
|
179
|
+
mlog.debug(f'OUT:\n{out1}\n\n\nERR:\n{err1}\n\n')
|
|
180
|
+
|
|
181
|
+
# Check if any generator succeeded
|
|
182
|
+
if ret1 != 0:
|
|
183
|
+
return None
|
|
184
|
+
|
|
185
|
+
try:
|
|
186
|
+
temp_parser.parse(err1)
|
|
187
|
+
except MesonException:
|
|
188
|
+
return None
|
|
189
|
+
|
|
190
|
+
def process_paths(l: T.List[str]) -> T.Set[str]:
|
|
191
|
+
if is_windows():
|
|
192
|
+
# Cannot split on ':' on Windows because its in the drive letter
|
|
193
|
+
tmp = [x.split(os.pathsep) for x in l]
|
|
194
|
+
else:
|
|
195
|
+
# https://github.com/mesonbuild/meson/issues/7294
|
|
196
|
+
tmp = [re.split(r':|;', x) for x in l]
|
|
197
|
+
flattened = [x for sublist in tmp for x in sublist]
|
|
198
|
+
return set(flattened)
|
|
199
|
+
|
|
200
|
+
# Extract the variables and sanity check them
|
|
201
|
+
root_paths_set = process_paths(temp_parser.get_cmake_var('MESON_FIND_ROOT_PATH'))
|
|
202
|
+
root_paths_set.update(process_paths(temp_parser.get_cmake_var('MESON_CMAKE_SYSROOT')))
|
|
203
|
+
root_paths = sorted(root_paths_set)
|
|
204
|
+
root_paths = [x for x in root_paths if os.path.isdir(x)]
|
|
205
|
+
module_paths_set = process_paths(temp_parser.get_cmake_var('MESON_PATHS_LIST'))
|
|
206
|
+
rooted_paths: T.List[str] = []
|
|
207
|
+
for j in [Path(x) for x in root_paths]:
|
|
208
|
+
for p in [Path(x) for x in module_paths_set]:
|
|
209
|
+
rooted_paths.append(str(j / p.relative_to(p.anchor)))
|
|
210
|
+
module_paths = sorted(module_paths_set.union(rooted_paths))
|
|
211
|
+
module_paths = [x for x in module_paths if os.path.isdir(x)]
|
|
212
|
+
archs = temp_parser.get_cmake_var('MESON_ARCH_LIST')
|
|
213
|
+
|
|
214
|
+
common_paths = ['lib', 'lib32', 'lib64', 'libx32', 'share', '']
|
|
215
|
+
for i in archs:
|
|
216
|
+
common_paths += [os.path.join('lib', i)]
|
|
217
|
+
|
|
218
|
+
res = CMakeInfo(
|
|
219
|
+
module_paths=module_paths,
|
|
220
|
+
cmake_root=temp_parser.get_cmake_var('MESON_CMAKE_ROOT')[0],
|
|
221
|
+
archs=archs,
|
|
222
|
+
common_paths=common_paths,
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
mlog.debug(f' -- Module search paths: {res.module_paths}')
|
|
226
|
+
mlog.debug(f' -- CMake root: {res.cmake_root}')
|
|
227
|
+
mlog.debug(f' -- CMake architectures: {res.archs}')
|
|
228
|
+
mlog.debug(f' -- CMake lib search paths: {res.common_paths}')
|
|
229
|
+
|
|
230
|
+
return res
|
|
231
|
+
|
|
232
|
+
@staticmethod
|
|
233
|
+
@functools.lru_cache(maxsize=None)
|
|
234
|
+
def _cached_listdir(path: str) -> T.Tuple[T.Tuple[str, str], ...]:
|
|
235
|
+
try:
|
|
236
|
+
return tuple((x, str(x).lower()) for x in os.listdir(path))
|
|
237
|
+
except OSError:
|
|
238
|
+
return tuple()
|
|
239
|
+
|
|
240
|
+
@staticmethod
|
|
241
|
+
@functools.lru_cache(maxsize=None)
|
|
242
|
+
def _cached_isdir(path: str) -> bool:
|
|
243
|
+
try:
|
|
244
|
+
return os.path.isdir(path)
|
|
245
|
+
except OSError:
|
|
246
|
+
return False
|
|
247
|
+
|
|
248
|
+
def _preliminary_find_check(self, name: str, module_path: T.List[str], prefix_path: T.List[str], machine: 'MachineInfo') -> bool:
|
|
249
|
+
lname = str(name).lower()
|
|
250
|
+
|
|
251
|
+
# Checks <path>, <path>/cmake, <path>/CMake
|
|
252
|
+
def find_module(path: str) -> bool:
|
|
253
|
+
for i in [path, os.path.join(path, 'cmake'), os.path.join(path, 'CMake')]:
|
|
254
|
+
if not self._cached_isdir(i):
|
|
255
|
+
continue
|
|
256
|
+
|
|
257
|
+
# Check the directory case insensitive
|
|
258
|
+
content = self._cached_listdir(i)
|
|
259
|
+
candidates = ['Find{}.cmake', '{}Config.cmake', '{}-config.cmake']
|
|
260
|
+
candidates = [x.format(name).lower() for x in candidates]
|
|
261
|
+
if any(x[1] in candidates for x in content):
|
|
262
|
+
return True
|
|
263
|
+
return False
|
|
264
|
+
|
|
265
|
+
# Search in <path>/(lib/<arch>|lib*|share) for cmake files
|
|
266
|
+
def search_lib_dirs(path: str) -> bool:
|
|
267
|
+
for i in [os.path.join(path, x) for x in self.cmakeinfo.common_paths]:
|
|
268
|
+
if not self._cached_isdir(i):
|
|
269
|
+
continue
|
|
270
|
+
|
|
271
|
+
# Check <path>/(lib/<arch>|lib*|share)/cmake/<name>*/
|
|
272
|
+
cm_dir = os.path.join(i, 'cmake')
|
|
273
|
+
if self._cached_isdir(cm_dir):
|
|
274
|
+
content = self._cached_listdir(cm_dir)
|
|
275
|
+
content = tuple(x for x in content if x[1].startswith(lname))
|
|
276
|
+
for k in content:
|
|
277
|
+
if find_module(os.path.join(cm_dir, k[0])):
|
|
278
|
+
return True
|
|
279
|
+
|
|
280
|
+
# <path>/(lib/<arch>|lib*|share)/<name>*/
|
|
281
|
+
# <path>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/
|
|
282
|
+
content = self._cached_listdir(i)
|
|
283
|
+
content = tuple(x for x in content if x[1].startswith(lname))
|
|
284
|
+
for k in content:
|
|
285
|
+
if find_module(os.path.join(i, k[0])):
|
|
286
|
+
return True
|
|
287
|
+
|
|
288
|
+
return False
|
|
289
|
+
|
|
290
|
+
# Check the user provided and system module paths
|
|
291
|
+
for i in module_path + [os.path.join(self.cmakeinfo.cmake_root, 'Modules')]:
|
|
292
|
+
if find_module(i):
|
|
293
|
+
return True
|
|
294
|
+
|
|
295
|
+
# Check the user provided prefix paths
|
|
296
|
+
for i in prefix_path:
|
|
297
|
+
if search_lib_dirs(i):
|
|
298
|
+
return True
|
|
299
|
+
|
|
300
|
+
# Check PATH
|
|
301
|
+
system_env: T.List[str] = []
|
|
302
|
+
for i in os.environ.get('PATH', '').split(os.pathsep):
|
|
303
|
+
if i.endswith('/bin') or i.endswith('\\bin'):
|
|
304
|
+
i = i[:-4]
|
|
305
|
+
if i.endswith('/sbin') or i.endswith('\\sbin'):
|
|
306
|
+
i = i[:-5]
|
|
307
|
+
system_env += [i]
|
|
308
|
+
|
|
309
|
+
# Check the system paths
|
|
310
|
+
for i in self.cmakeinfo.module_paths + system_env:
|
|
311
|
+
if find_module(i):
|
|
312
|
+
return True
|
|
313
|
+
|
|
314
|
+
if search_lib_dirs(i):
|
|
315
|
+
return True
|
|
316
|
+
|
|
317
|
+
content = self._cached_listdir(i)
|
|
318
|
+
content = tuple(x for x in content if x[1].startswith(lname))
|
|
319
|
+
for k in content:
|
|
320
|
+
if search_lib_dirs(os.path.join(i, k[0])):
|
|
321
|
+
return True
|
|
322
|
+
|
|
323
|
+
# Mac framework support
|
|
324
|
+
if machine.is_darwin():
|
|
325
|
+
for j in [f'{lname}.framework', f'{lname}.app']:
|
|
326
|
+
for k in content:
|
|
327
|
+
if k[1] != j:
|
|
328
|
+
continue
|
|
329
|
+
if find_module(os.path.join(i, k[0], 'Resources')) or find_module(os.path.join(i, k[0], 'Version')):
|
|
330
|
+
return True
|
|
331
|
+
|
|
332
|
+
# Check the environment path
|
|
333
|
+
env_path = os.environ.get(f'{name}_DIR')
|
|
334
|
+
if env_path and find_module(env_path):
|
|
335
|
+
return True
|
|
336
|
+
|
|
337
|
+
# Check the Linux CMake registry
|
|
338
|
+
linux_reg = Path.home() / '.cmake' / 'packages'
|
|
339
|
+
for p in [linux_reg / name, linux_reg / lname]:
|
|
340
|
+
if p.exists():
|
|
341
|
+
return True
|
|
342
|
+
|
|
343
|
+
return False
|
|
344
|
+
|
|
345
|
+
def _detect_dep(self, name: str, package_version: str, modules: T.List[T.Tuple[str, bool]], components: T.List[T.Tuple[str, bool]], args: T.List[str]) -> None:
|
|
346
|
+
# Detect a dependency with CMake using the '--find-package' mode
|
|
347
|
+
# and the trace output (stderr)
|
|
348
|
+
#
|
|
349
|
+
# When the trace output is enabled CMake prints all functions with
|
|
350
|
+
# parameters to stderr as they are executed. Since CMake 3.4.0
|
|
351
|
+
# variables ("${VAR}") are also replaced in the trace output.
|
|
352
|
+
mlog.debug('\nDetermining dependency {!r} with CMake executable '
|
|
353
|
+
'{!r}'.format(name, self.cmakebin.executable_path()))
|
|
354
|
+
|
|
355
|
+
# Try different CMake generators since specifying no generator may fail
|
|
356
|
+
# in cygwin for some reason
|
|
357
|
+
gen_list = []
|
|
358
|
+
# First try the last working generator
|
|
359
|
+
if CMakeDependency.class_working_generator is not None:
|
|
360
|
+
gen_list += [CMakeDependency.class_working_generator]
|
|
361
|
+
gen_list += CMakeDependency.class_cmake_generators
|
|
362
|
+
|
|
363
|
+
# Map the components
|
|
364
|
+
comp_mapped = self._map_component_list(modules, components)
|
|
365
|
+
toolchain = CMakeToolchain(self.cmakebin, self.env, self.for_machine, CMakeExecScope.DEPENDENCY, self._get_build_dir())
|
|
366
|
+
toolchain.write()
|
|
367
|
+
|
|
368
|
+
for i in gen_list:
|
|
369
|
+
mlog.debug('Try CMake generator: {}'.format(i if len(i) > 0 else 'auto'))
|
|
370
|
+
|
|
371
|
+
# Prepare options
|
|
372
|
+
cmake_opts = []
|
|
373
|
+
cmake_opts += [f'-DNAME={name}']
|
|
374
|
+
cmake_opts += ['-DARCHS={}'.format(';'.join(self.cmakeinfo.archs))]
|
|
375
|
+
cmake_opts += [f'-DVERSION={package_version}']
|
|
376
|
+
cmake_opts += ['-DCOMPS={}'.format(';'.join([x[0] for x in comp_mapped]))]
|
|
377
|
+
cmake_opts += ['-DSTATIC={}'.format('ON' if self.static else 'OFF')]
|
|
378
|
+
cmake_opts += args
|
|
379
|
+
cmake_opts += self.traceparser.trace_args()
|
|
380
|
+
cmake_opts += toolchain.get_cmake_args()
|
|
381
|
+
cmake_opts += self._extra_cmake_opts()
|
|
382
|
+
cmake_opts += ['.']
|
|
383
|
+
if len(i) > 0:
|
|
384
|
+
cmake_opts = ['-G', i] + cmake_opts
|
|
385
|
+
|
|
386
|
+
# Run CMake
|
|
387
|
+
ret1, out1, err1 = self._call_cmake(cmake_opts, self._main_cmake_file())
|
|
388
|
+
|
|
389
|
+
# Current generator was successful
|
|
390
|
+
if ret1 == 0:
|
|
391
|
+
CMakeDependency.class_working_generator = i
|
|
392
|
+
break
|
|
393
|
+
|
|
394
|
+
mlog.debug(f'CMake failed for generator {i} and package {name} with error code {ret1}')
|
|
395
|
+
mlog.debug(f'OUT:\n{out1}\n\n\nERR:\n{err1}\n\n')
|
|
396
|
+
|
|
397
|
+
# Check if any generator succeeded
|
|
398
|
+
if ret1 != 0:
|
|
399
|
+
return
|
|
400
|
+
|
|
401
|
+
try:
|
|
402
|
+
self.traceparser.parse(err1)
|
|
403
|
+
except CMakeException as e:
|
|
404
|
+
e2 = self._gen_exception(str(e))
|
|
405
|
+
if self.required:
|
|
406
|
+
raise
|
|
407
|
+
else:
|
|
408
|
+
self.compile_args = []
|
|
409
|
+
self.link_args = []
|
|
410
|
+
self.is_found = False
|
|
411
|
+
self.reason = e2
|
|
412
|
+
return
|
|
413
|
+
|
|
414
|
+
# Whether the package is found or not is always stored in PACKAGE_FOUND
|
|
415
|
+
self.is_found = self.traceparser.var_to_bool('PACKAGE_FOUND')
|
|
416
|
+
if not self.is_found:
|
|
417
|
+
return
|
|
418
|
+
|
|
419
|
+
# Try to detect the version
|
|
420
|
+
vers_raw = self.traceparser.get_cmake_var('PACKAGE_VERSION')
|
|
421
|
+
|
|
422
|
+
if len(vers_raw) > 0:
|
|
423
|
+
self.version = vers_raw[0]
|
|
424
|
+
self.version.strip('"\' ')
|
|
425
|
+
|
|
426
|
+
# Post-process module list. Used in derived classes to modify the
|
|
427
|
+
# module list (append prepend a string, etc.).
|
|
428
|
+
modules = self._map_module_list(modules, components)
|
|
429
|
+
autodetected_module_list = False
|
|
430
|
+
|
|
431
|
+
# Try guessing a CMake target if none is provided
|
|
432
|
+
if len(modules) == 0:
|
|
433
|
+
for i in self.traceparser.targets:
|
|
434
|
+
tg = i.lower()
|
|
435
|
+
lname = name.lower()
|
|
436
|
+
if f'{lname}::{lname}' == tg or lname == tg.replace('::', ''):
|
|
437
|
+
mlog.debug(f'Guessed CMake target \'{i}\'')
|
|
438
|
+
modules = [(i, True)]
|
|
439
|
+
autodetected_module_list = True
|
|
440
|
+
break
|
|
441
|
+
|
|
442
|
+
# Failed to guess a target --> try the old-style method
|
|
443
|
+
if len(modules) == 0:
|
|
444
|
+
# Warn when there might be matching imported targets but no automatic match was used
|
|
445
|
+
partial_modules: T.List[CMakeTarget] = []
|
|
446
|
+
for k, v in self.traceparser.targets.items():
|
|
447
|
+
tg = k.lower()
|
|
448
|
+
lname = name.lower()
|
|
449
|
+
if tg.startswith(f'{lname}::'):
|
|
450
|
+
partial_modules += [v]
|
|
451
|
+
if partial_modules:
|
|
452
|
+
mlog.warning(textwrap.dedent(f'''\
|
|
453
|
+
Could not find and exact match for the CMake dependency {name}.
|
|
454
|
+
|
|
455
|
+
However, Meson found the following partial matches:
|
|
456
|
+
|
|
457
|
+
{[x.name for x in partial_modules]}
|
|
458
|
+
|
|
459
|
+
Using imported is recommended, since this approach is less error prone
|
|
460
|
+
and better supported by Meson. Consider explicitly specifying one of
|
|
461
|
+
these in the dependency call with:
|
|
462
|
+
|
|
463
|
+
dependency('{name}', modules: ['{name}::<name>', ...])
|
|
464
|
+
|
|
465
|
+
Meson will now continue to use the old-style {name}_LIBRARIES CMake
|
|
466
|
+
variables to extract the dependency information since no explicit
|
|
467
|
+
target is currently specified.
|
|
468
|
+
|
|
469
|
+
'''))
|
|
470
|
+
mlog.debug('More info for the partial match targets:')
|
|
471
|
+
for tgt in partial_modules:
|
|
472
|
+
mlog.debug(tgt)
|
|
473
|
+
|
|
474
|
+
incDirs = [x for x in self.traceparser.get_cmake_var('PACKAGE_INCLUDE_DIRS') if x]
|
|
475
|
+
defs = [x for x in self.traceparser.get_cmake_var('PACKAGE_DEFINITIONS') if x]
|
|
476
|
+
libs_raw = [x for x in self.traceparser.get_cmake_var('PACKAGE_LIBRARIES') if x]
|
|
477
|
+
|
|
478
|
+
# CMake has a "fun" API, where certain keywords describing
|
|
479
|
+
# configurations can be in the *_LIBRARIES variables. See:
|
|
480
|
+
# - https://github.com/mesonbuild/meson/issues/9197
|
|
481
|
+
# - https://gitlab.freedesktop.org/libnice/libnice/-/issues/140
|
|
482
|
+
# - https://cmake.org/cmake/help/latest/command/target_link_libraries.html#overview (the last point in the section)
|
|
483
|
+
libs: T.List[str] = []
|
|
484
|
+
cfg_matches = True
|
|
485
|
+
is_debug = cmake_is_debug(self.env)
|
|
486
|
+
cm_tag_map = {'debug': is_debug, 'optimized': not is_debug, 'general': True}
|
|
487
|
+
for i in libs_raw:
|
|
488
|
+
if i.lower() in cm_tag_map:
|
|
489
|
+
cfg_matches = cm_tag_map[i.lower()]
|
|
490
|
+
continue
|
|
491
|
+
if cfg_matches:
|
|
492
|
+
libs += [i]
|
|
493
|
+
# According to the CMake docs, a keyword only works for the
|
|
494
|
+
# directly the following item and all items without a keyword
|
|
495
|
+
# are implicitly `general`
|
|
496
|
+
cfg_matches = True
|
|
497
|
+
|
|
498
|
+
# Try to use old style variables if no module is specified
|
|
499
|
+
if len(libs) > 0:
|
|
500
|
+
self.compile_args = [f'-I{x}' for x in incDirs] + defs
|
|
501
|
+
self.link_args = []
|
|
502
|
+
for j in libs:
|
|
503
|
+
rtgt = resolve_cmake_trace_targets(j, self.traceparser, self.env, clib_compiler=self.clib_compiler)
|
|
504
|
+
self.link_args += rtgt.libraries
|
|
505
|
+
self.compile_args += [f'-I{x}' for x in rtgt.include_directories]
|
|
506
|
+
self.compile_args += rtgt.public_compile_opts
|
|
507
|
+
mlog.debug(f'using old-style CMake variables for dependency {name}')
|
|
508
|
+
mlog.debug(f'Include Dirs: {incDirs}')
|
|
509
|
+
mlog.debug(f'Compiler Definitions: {defs}')
|
|
510
|
+
mlog.debug(f'Libraries: {libs}')
|
|
511
|
+
return
|
|
512
|
+
|
|
513
|
+
# Even the old-style approach failed. Nothing else we can do here
|
|
514
|
+
self.is_found = False
|
|
515
|
+
raise self._gen_exception('CMake: failed to guess a CMake target for {}.\n'
|
|
516
|
+
'Try to explicitly specify one or more targets with the "modules" property.\n'
|
|
517
|
+
'Valid targets are:\n{}'.format(name, list(self.traceparser.targets.keys())))
|
|
518
|
+
|
|
519
|
+
# Set dependencies with CMake targets
|
|
520
|
+
# recognise arguments we should pass directly to the linker
|
|
521
|
+
incDirs = []
|
|
522
|
+
compileOptions = []
|
|
523
|
+
libraries = []
|
|
524
|
+
|
|
525
|
+
for i, required in modules:
|
|
526
|
+
if i not in self.traceparser.targets:
|
|
527
|
+
if not required:
|
|
528
|
+
mlog.warning('CMake: T.Optional module', mlog.bold(self._original_module_name(i)), 'for', mlog.bold(name), 'was not found')
|
|
529
|
+
continue
|
|
530
|
+
raise self._gen_exception('CMake: invalid module {} for {}.\n'
|
|
531
|
+
'Try to explicitly specify one or more targets with the "modules" property.\n'
|
|
532
|
+
'Valid targets are:\n{}'.format(self._original_module_name(i), name, list(self.traceparser.targets.keys())))
|
|
533
|
+
|
|
534
|
+
if not autodetected_module_list:
|
|
535
|
+
self.found_modules += [i]
|
|
536
|
+
|
|
537
|
+
rtgt = resolve_cmake_trace_targets(i, self.traceparser, self.env,
|
|
538
|
+
clib_compiler=self.clib_compiler,
|
|
539
|
+
not_found_warning=lambda x:
|
|
540
|
+
mlog.warning('CMake: Dependency', mlog.bold(x), 'for', mlog.bold(name), 'was not found')
|
|
541
|
+
)
|
|
542
|
+
incDirs += rtgt.include_directories
|
|
543
|
+
compileOptions += rtgt.public_compile_opts
|
|
544
|
+
libraries += rtgt.libraries + rtgt.link_flags
|
|
545
|
+
|
|
546
|
+
# Make sure all elements in the lists are unique and sorted
|
|
547
|
+
incDirs = sorted(set(incDirs))
|
|
548
|
+
compileOptions = sorted(set(compileOptions))
|
|
549
|
+
libraries = sorted(set(libraries))
|
|
550
|
+
|
|
551
|
+
mlog.debug(f'Include Dirs: {incDirs}')
|
|
552
|
+
mlog.debug(f'Compiler Options: {compileOptions}')
|
|
553
|
+
mlog.debug(f'Libraries: {libraries}')
|
|
554
|
+
|
|
555
|
+
self.compile_args = compileOptions + [f'-I{x}' for x in incDirs]
|
|
556
|
+
self.link_args = libraries
|
|
557
|
+
|
|
558
|
+
def _get_build_dir(self) -> Path:
|
|
559
|
+
build_dir = Path(self.cmake_root_dir) / f'cmake_{self.name}'
|
|
560
|
+
build_dir.mkdir(parents=True, exist_ok=True)
|
|
561
|
+
return build_dir
|
|
562
|
+
|
|
563
|
+
def _setup_cmake_dir(self, cmake_file: str) -> Path:
|
|
564
|
+
# Setup the CMake build environment and return the "build" directory
|
|
565
|
+
build_dir = self._get_build_dir()
|
|
566
|
+
|
|
567
|
+
# Remove old CMake cache so we can try out multiple generators
|
|
568
|
+
cmake_cache = build_dir / 'CMakeCache.txt'
|
|
569
|
+
cmake_files = build_dir / 'CMakeFiles'
|
|
570
|
+
if cmake_cache.exists():
|
|
571
|
+
cmake_cache.unlink()
|
|
572
|
+
shutil.rmtree(cmake_files.as_posix(), ignore_errors=True)
|
|
573
|
+
|
|
574
|
+
# Insert language parameters into the CMakeLists.txt and write new CMakeLists.txt
|
|
575
|
+
cmake_txt = importlib.resources.read_text('mesonbuild.dependencies.data', cmake_file, encoding = 'utf-8')
|
|
576
|
+
|
|
577
|
+
# In general, some Fortran CMake find_package() also require C language enabled,
|
|
578
|
+
# even if nothing from C is directly used. An easy Fortran example that fails
|
|
579
|
+
# without C language is
|
|
580
|
+
# find_package(Threads)
|
|
581
|
+
# To make this general to
|
|
582
|
+
# any other language that might need this, we use a list for all
|
|
583
|
+
# languages and expand in the cmake Project(... LANGUAGES ...) statement.
|
|
584
|
+
from ..cmake import language_map
|
|
585
|
+
cmake_language = [language_map[x] for x in self.language_list if x in language_map]
|
|
586
|
+
if not cmake_language:
|
|
587
|
+
cmake_language += ['NONE']
|
|
588
|
+
|
|
589
|
+
cmake_txt = textwrap.dedent("""
|
|
590
|
+
cmake_minimum_required(VERSION ${{CMAKE_VERSION}})
|
|
591
|
+
project(MesonTemp LANGUAGES {})
|
|
592
|
+
""").format(' '.join(cmake_language)) + cmake_txt
|
|
593
|
+
|
|
594
|
+
cm_file = build_dir / 'CMakeLists.txt'
|
|
595
|
+
cm_file.write_text(cmake_txt, encoding='utf-8')
|
|
596
|
+
mlog.cmd_ci_include(cm_file.absolute().as_posix())
|
|
597
|
+
|
|
598
|
+
return build_dir
|
|
599
|
+
|
|
600
|
+
def _call_cmake(self,
|
|
601
|
+
args: T.List[str],
|
|
602
|
+
cmake_file: str,
|
|
603
|
+
env: T.Optional[T.Dict[str, str]] = None) -> T.Tuple[int, T.Optional[str], T.Optional[str]]:
|
|
604
|
+
build_dir = self._setup_cmake_dir(cmake_file)
|
|
605
|
+
return self.cmakebin.call(args, build_dir, env=env)
|
|
606
|
+
|
|
607
|
+
@staticmethod
|
|
608
|
+
def log_tried() -> str:
|
|
609
|
+
return 'cmake'
|
|
610
|
+
|
|
611
|
+
def log_details(self) -> str:
|
|
612
|
+
modules = [self._original_module_name(x) for x in self.found_modules]
|
|
613
|
+
modules = sorted(set(modules))
|
|
614
|
+
if modules:
|
|
615
|
+
return 'modules: ' + ', '.join(modules)
|
|
616
|
+
return ''
|
|
617
|
+
|
|
618
|
+
def get_variable(self, *, cmake: T.Optional[str] = None, pkgconfig: T.Optional[str] = None,
|
|
619
|
+
configtool: T.Optional[str] = None, internal: T.Optional[str] = None,
|
|
620
|
+
default_value: T.Optional[str] = None,
|
|
621
|
+
pkgconfig_define: PkgConfigDefineType = None) -> str:
|
|
622
|
+
if cmake and self.traceparser is not None:
|
|
623
|
+
try:
|
|
624
|
+
v = self.traceparser.vars[cmake]
|
|
625
|
+
except KeyError:
|
|
626
|
+
pass
|
|
627
|
+
else:
|
|
628
|
+
# CMake does NOT have a list datatype. We have no idea whether
|
|
629
|
+
# anything is a string or a string-separated-by-; Internally,
|
|
630
|
+
# we treat them as the latter and represent everything as a
|
|
631
|
+
# list, because it is convenient when we are mostly handling
|
|
632
|
+
# imported targets, which have various properties that are
|
|
633
|
+
# actually lists.
|
|
634
|
+
#
|
|
635
|
+
# As a result we need to convert them back to strings when grabbing
|
|
636
|
+
# raw variables the user requested.
|
|
637
|
+
return ';'.join(v)
|
|
638
|
+
if default_value is not None:
|
|
639
|
+
return default_value
|
|
640
|
+
raise DependencyException(f'Could not get cmake variable and no default provided for {self!r}')
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
class CMakeDependencyFactory:
|
|
644
|
+
|
|
645
|
+
def __init__(self, name: T.Optional[str] = None, modules: T.Optional[T.List[str]] = None):
|
|
646
|
+
self.name = name
|
|
647
|
+
self.modules = modules
|
|
648
|
+
|
|
649
|
+
def __call__(self, name: str, env: Environment, kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None, force_use_global_compilers: bool = False) -> CMakeDependency:
|
|
650
|
+
if self.modules:
|
|
651
|
+
kwargs['modules'] = self.modules
|
|
652
|
+
return CMakeDependency(self.name or name, env, kwargs, language, force_use_global_compilers)
|
|
653
|
+
|
|
654
|
+
@staticmethod
|
|
655
|
+
def log_tried() -> str:
|
|
656
|
+
return CMakeDependency.log_tried()
|