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,707 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2013-2019 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import glob
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
import pathlib
|
|
10
|
+
import shutil
|
|
11
|
+
import subprocess
|
|
12
|
+
import typing as T
|
|
13
|
+
import functools
|
|
14
|
+
|
|
15
|
+
from mesonbuild.interpreterbase.decorators import FeatureDeprecated
|
|
16
|
+
|
|
17
|
+
from .. import mesonlib, mlog
|
|
18
|
+
from ..environment import get_llvm_tool_names
|
|
19
|
+
from ..mesonlib import version_compare, version_compare_many, search_version, stringlistify, extract_as_list
|
|
20
|
+
from .base import DependencyException, DependencyMethods, detect_compiler, strip_system_includedirs, strip_system_libdirs, SystemDependency, ExternalDependency, DependencyTypeName
|
|
21
|
+
from .cmake import CMakeDependency
|
|
22
|
+
from .configtool import ConfigToolDependency
|
|
23
|
+
from .detect import packages
|
|
24
|
+
from .factory import DependencyFactory
|
|
25
|
+
from .misc import threads_factory
|
|
26
|
+
from .pkgconfig import PkgConfigDependency
|
|
27
|
+
|
|
28
|
+
if T.TYPE_CHECKING:
|
|
29
|
+
from ..envconfig import MachineInfo
|
|
30
|
+
from ..environment import Environment
|
|
31
|
+
from ..mesonlib import MachineChoice
|
|
32
|
+
from typing_extensions import TypedDict
|
|
33
|
+
|
|
34
|
+
class JNISystemDependencyKW(TypedDict):
|
|
35
|
+
modules: T.List[str]
|
|
36
|
+
# FIXME: When dependency() moves to typed Kwargs, this should inherit
|
|
37
|
+
# from its TypedDict type.
|
|
38
|
+
version: T.Optional[str]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def get_shared_library_suffix(environment: 'Environment', for_machine: MachineChoice) -> str:
|
|
42
|
+
"""This is only guaranteed to work for languages that compile to machine
|
|
43
|
+
code, not for languages like C# that use a bytecode and always end in .dll
|
|
44
|
+
"""
|
|
45
|
+
m = environment.machines[for_machine]
|
|
46
|
+
if m.is_windows():
|
|
47
|
+
return '.dll'
|
|
48
|
+
elif m.is_darwin():
|
|
49
|
+
return '.dylib'
|
|
50
|
+
return '.so'
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class GTestDependencySystem(SystemDependency):
|
|
54
|
+
def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
|
|
55
|
+
super().__init__(name, environment, kwargs, language='cpp')
|
|
56
|
+
self.main = kwargs.get('main', False)
|
|
57
|
+
self.src_dirs = ['/usr/src/gtest/src', '/usr/src/googletest/googletest/src']
|
|
58
|
+
if not self._add_sub_dependency(threads_factory(environment, self.for_machine, {})):
|
|
59
|
+
self.is_found = False
|
|
60
|
+
return
|
|
61
|
+
self.detect()
|
|
62
|
+
|
|
63
|
+
def detect(self) -> None:
|
|
64
|
+
gtest_detect = self.clib_compiler.find_library("gtest", self.env, [])
|
|
65
|
+
gtest_main_detect = self.clib_compiler.find_library("gtest_main", self.env, [])
|
|
66
|
+
if gtest_detect and (not self.main or gtest_main_detect):
|
|
67
|
+
self.is_found = True
|
|
68
|
+
self.compile_args = []
|
|
69
|
+
self.link_args = gtest_detect
|
|
70
|
+
if self.main:
|
|
71
|
+
self.link_args += gtest_main_detect
|
|
72
|
+
self.sources = []
|
|
73
|
+
self.prebuilt = True
|
|
74
|
+
elif self.detect_srcdir():
|
|
75
|
+
self.is_found = True
|
|
76
|
+
self.compile_args = ['-I' + d for d in self.src_include_dirs]
|
|
77
|
+
self.link_args = []
|
|
78
|
+
if self.main:
|
|
79
|
+
self.sources = [self.all_src, self.main_src]
|
|
80
|
+
else:
|
|
81
|
+
self.sources = [self.all_src]
|
|
82
|
+
self.prebuilt = False
|
|
83
|
+
else:
|
|
84
|
+
self.is_found = False
|
|
85
|
+
|
|
86
|
+
def detect_srcdir(self) -> bool:
|
|
87
|
+
for s in self.src_dirs:
|
|
88
|
+
if os.path.exists(s):
|
|
89
|
+
self.src_dir = s
|
|
90
|
+
self.all_src = mesonlib.File.from_absolute_file(
|
|
91
|
+
os.path.join(self.src_dir, 'gtest-all.cc'))
|
|
92
|
+
self.main_src = mesonlib.File.from_absolute_file(
|
|
93
|
+
os.path.join(self.src_dir, 'gtest_main.cc'))
|
|
94
|
+
self.src_include_dirs = [os.path.normpath(os.path.join(self.src_dir, '..')),
|
|
95
|
+
os.path.normpath(os.path.join(self.src_dir, '../include')),
|
|
96
|
+
]
|
|
97
|
+
return True
|
|
98
|
+
return False
|
|
99
|
+
|
|
100
|
+
def log_info(self) -> str:
|
|
101
|
+
if self.prebuilt:
|
|
102
|
+
return 'prebuilt'
|
|
103
|
+
else:
|
|
104
|
+
return 'building self'
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class GTestDependencyPC(PkgConfigDependency):
|
|
108
|
+
|
|
109
|
+
def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
|
|
110
|
+
assert name == 'gtest'
|
|
111
|
+
if kwargs.get('main'):
|
|
112
|
+
name = 'gtest_main'
|
|
113
|
+
super().__init__(name, environment, kwargs)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class GMockDependencySystem(SystemDependency):
|
|
117
|
+
def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
|
|
118
|
+
super().__init__(name, environment, kwargs, language='cpp')
|
|
119
|
+
self.main = kwargs.get('main', False)
|
|
120
|
+
if not self._add_sub_dependency(threads_factory(environment, self.for_machine, {})):
|
|
121
|
+
self.is_found = False
|
|
122
|
+
return
|
|
123
|
+
|
|
124
|
+
# If we are getting main() from GMock, we definitely
|
|
125
|
+
# want to avoid linking in main() from GTest
|
|
126
|
+
gtest_kwargs = kwargs.copy()
|
|
127
|
+
if self.main:
|
|
128
|
+
gtest_kwargs['main'] = False
|
|
129
|
+
|
|
130
|
+
# GMock without GTest is pretty much useless
|
|
131
|
+
# this also mimics the structure given in WrapDB,
|
|
132
|
+
# where GMock always pulls in GTest
|
|
133
|
+
found = self._add_sub_dependency(gtest_factory(environment, self.for_machine, gtest_kwargs))
|
|
134
|
+
if not found:
|
|
135
|
+
self.is_found = False
|
|
136
|
+
return
|
|
137
|
+
|
|
138
|
+
# GMock may be a library or just source.
|
|
139
|
+
# Work with both.
|
|
140
|
+
gmock_detect = self.clib_compiler.find_library("gmock", self.env, [])
|
|
141
|
+
gmock_main_detect = self.clib_compiler.find_library("gmock_main", self.env, [])
|
|
142
|
+
if gmock_detect and (not self.main or gmock_main_detect):
|
|
143
|
+
self.is_found = True
|
|
144
|
+
self.link_args += gmock_detect
|
|
145
|
+
if self.main:
|
|
146
|
+
self.link_args += gmock_main_detect
|
|
147
|
+
self.prebuilt = True
|
|
148
|
+
return
|
|
149
|
+
|
|
150
|
+
for d in ['/usr/src/googletest/googlemock/src', '/usr/src/gmock/src', '/usr/src/gmock']:
|
|
151
|
+
if os.path.exists(d):
|
|
152
|
+
self.is_found = True
|
|
153
|
+
# Yes, we need both because there are multiple
|
|
154
|
+
# versions of gmock that do different things.
|
|
155
|
+
d2 = os.path.normpath(os.path.join(d, '..'))
|
|
156
|
+
self.compile_args += ['-I' + d, '-I' + d2, '-I' + os.path.join(d2, 'include')]
|
|
157
|
+
all_src = mesonlib.File.from_absolute_file(os.path.join(d, 'gmock-all.cc'))
|
|
158
|
+
main_src = mesonlib.File.from_absolute_file(os.path.join(d, 'gmock_main.cc'))
|
|
159
|
+
if self.main:
|
|
160
|
+
self.sources += [all_src, main_src]
|
|
161
|
+
else:
|
|
162
|
+
self.sources += [all_src]
|
|
163
|
+
self.prebuilt = False
|
|
164
|
+
return
|
|
165
|
+
|
|
166
|
+
self.is_found = False
|
|
167
|
+
|
|
168
|
+
def log_info(self) -> str:
|
|
169
|
+
if self.prebuilt:
|
|
170
|
+
return 'prebuilt'
|
|
171
|
+
else:
|
|
172
|
+
return 'building self'
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class GMockDependencyPC(PkgConfigDependency):
|
|
176
|
+
|
|
177
|
+
def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
|
|
178
|
+
assert name == 'gmock'
|
|
179
|
+
if kwargs.get('main'):
|
|
180
|
+
name = 'gmock_main'
|
|
181
|
+
super().__init__(name, environment, kwargs)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class LLVMDependencyConfigTool(ConfigToolDependency):
|
|
185
|
+
"""
|
|
186
|
+
LLVM uses a special tool, llvm-config, which has arguments for getting
|
|
187
|
+
c args, cxx args, and ldargs as well as version.
|
|
188
|
+
"""
|
|
189
|
+
tool_name = 'llvm-config'
|
|
190
|
+
__cpp_blacklist = {'-DNDEBUG'}
|
|
191
|
+
|
|
192
|
+
def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
|
|
193
|
+
self.tools = get_llvm_tool_names('llvm-config')
|
|
194
|
+
|
|
195
|
+
# Fedora starting with Fedora 30 adds a suffix of the number
|
|
196
|
+
# of bits in the isa that llvm targets, for example, on x86_64
|
|
197
|
+
# and aarch64 the name will be llvm-config-64, on x86 and arm
|
|
198
|
+
# it will be llvm-config-32.
|
|
199
|
+
if environment.machines[self.get_for_machine_from_kwargs(kwargs)].is_64_bit:
|
|
200
|
+
self.tools.append('llvm-config-64')
|
|
201
|
+
else:
|
|
202
|
+
self.tools.append('llvm-config-32')
|
|
203
|
+
|
|
204
|
+
# It's necessary for LLVM <= 3.8 to use the C++ linker. For 3.9 and 4.0
|
|
205
|
+
# the C linker works fine if only using the C API.
|
|
206
|
+
super().__init__(name, environment, kwargs, language='cpp')
|
|
207
|
+
self.provided_modules: T.List[str] = []
|
|
208
|
+
self.required_modules: mesonlib.OrderedSet[str] = mesonlib.OrderedSet()
|
|
209
|
+
self.module_details: T.List[str] = []
|
|
210
|
+
if not self.is_found:
|
|
211
|
+
return
|
|
212
|
+
|
|
213
|
+
self.provided_modules = self.get_config_value(['--components'], 'modules')
|
|
214
|
+
modules = stringlistify(extract_as_list(kwargs, 'modules'))
|
|
215
|
+
self.check_components(modules)
|
|
216
|
+
opt_modules = stringlistify(extract_as_list(kwargs, 'optional_modules'))
|
|
217
|
+
self.check_components(opt_modules, required=False)
|
|
218
|
+
|
|
219
|
+
cargs = mesonlib.OrderedSet(self.get_config_value(['--cppflags'], 'compile_args'))
|
|
220
|
+
self.compile_args = list(cargs.difference(self.__cpp_blacklist))
|
|
221
|
+
self.compile_args = strip_system_includedirs(environment, self.for_machine, self.compile_args)
|
|
222
|
+
|
|
223
|
+
if version_compare(self.version, '>= 3.9'):
|
|
224
|
+
self._set_new_link_args(environment)
|
|
225
|
+
else:
|
|
226
|
+
self._set_old_link_args()
|
|
227
|
+
self.link_args = strip_system_libdirs(environment, self.for_machine, self.link_args)
|
|
228
|
+
self.link_args = self.__fix_bogus_link_args(self.link_args)
|
|
229
|
+
if not self._add_sub_dependency(threads_factory(environment, self.for_machine, {})):
|
|
230
|
+
self.is_found = False
|
|
231
|
+
return
|
|
232
|
+
|
|
233
|
+
def __fix_bogus_link_args(self, args: T.List[str]) -> T.List[str]:
|
|
234
|
+
"""This function attempts to fix bogus link arguments that llvm-config
|
|
235
|
+
generates.
|
|
236
|
+
|
|
237
|
+
Currently it works around the following:
|
|
238
|
+
- FreeBSD: when statically linking -l/usr/lib/libexecinfo.so will
|
|
239
|
+
be generated, strip the -l in cases like this.
|
|
240
|
+
- Windows: We may get -LIBPATH:... which is later interpreted as
|
|
241
|
+
"-L IBPATH:...", if we're using an msvc like compilers convert
|
|
242
|
+
that to "/LIBPATH", otherwise to "-L ..."
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
new_args = []
|
|
246
|
+
for arg in args:
|
|
247
|
+
if arg.startswith('-l') and arg.endswith('.so'):
|
|
248
|
+
new_args.append(arg.lstrip('-l'))
|
|
249
|
+
elif arg.startswith('-LIBPATH:'):
|
|
250
|
+
cpp = self.env.coredata.compilers[self.for_machine]['cpp']
|
|
251
|
+
new_args.extend(cpp.get_linker_search_args(arg.lstrip('-LIBPATH:')))
|
|
252
|
+
else:
|
|
253
|
+
new_args.append(arg)
|
|
254
|
+
return new_args
|
|
255
|
+
|
|
256
|
+
def __check_libfiles(self, shared: bool) -> None:
|
|
257
|
+
"""Use llvm-config's --libfiles to check if libraries exist."""
|
|
258
|
+
mode = '--link-shared' if shared else '--link-static'
|
|
259
|
+
|
|
260
|
+
# Set self.required to true to force an exception in get_config_value
|
|
261
|
+
# if the returncode != 0
|
|
262
|
+
restore = self.required
|
|
263
|
+
self.required = True
|
|
264
|
+
|
|
265
|
+
try:
|
|
266
|
+
# It doesn't matter what the stage is, the caller needs to catch
|
|
267
|
+
# the exception anyway.
|
|
268
|
+
self.link_args = self.get_config_value(['--libfiles', mode], '')
|
|
269
|
+
finally:
|
|
270
|
+
self.required = restore
|
|
271
|
+
|
|
272
|
+
def _set_new_link_args(self, environment: 'Environment') -> None:
|
|
273
|
+
"""How to set linker args for LLVM versions >= 3.9"""
|
|
274
|
+
try:
|
|
275
|
+
mode = self.get_config_value(['--shared-mode'], 'link_args')[0]
|
|
276
|
+
except IndexError:
|
|
277
|
+
mlog.debug('llvm-config --shared-mode returned an error')
|
|
278
|
+
self.is_found = False
|
|
279
|
+
return
|
|
280
|
+
|
|
281
|
+
if not self.static and mode == 'static':
|
|
282
|
+
# If llvm is configured with LLVM_BUILD_LLVM_DYLIB but not with
|
|
283
|
+
# LLVM_LINK_LLVM_DYLIB and not LLVM_BUILD_SHARED_LIBS (which
|
|
284
|
+
# upstream doesn't recommend using), then llvm-config will lie to
|
|
285
|
+
# you about how to do shared-linking. It wants to link to a a bunch
|
|
286
|
+
# of individual shared libs (which don't exist because llvm wasn't
|
|
287
|
+
# built with LLVM_BUILD_SHARED_LIBS.
|
|
288
|
+
#
|
|
289
|
+
# Therefore, we'll try to get the libfiles, if the return code is 0
|
|
290
|
+
# or we get an empty list, then we'll try to build a working
|
|
291
|
+
# configuration by hand.
|
|
292
|
+
try:
|
|
293
|
+
self.__check_libfiles(True)
|
|
294
|
+
except DependencyException:
|
|
295
|
+
lib_ext = get_shared_library_suffix(environment, self.for_machine)
|
|
296
|
+
libdir = self.get_config_value(['--libdir'], 'link_args')[0]
|
|
297
|
+
# Sort for reproducibility
|
|
298
|
+
matches = sorted(glob.iglob(os.path.join(libdir, f'libLLVM*{lib_ext}')))
|
|
299
|
+
if not matches:
|
|
300
|
+
if self.required:
|
|
301
|
+
raise
|
|
302
|
+
self.is_found = False
|
|
303
|
+
return
|
|
304
|
+
|
|
305
|
+
self.link_args = self.get_config_value(['--ldflags'], 'link_args')
|
|
306
|
+
libname = os.path.basename(matches[0]).rstrip(lib_ext).lstrip('lib')
|
|
307
|
+
self.link_args.append(f'-l{libname}')
|
|
308
|
+
return
|
|
309
|
+
elif self.static and mode == 'shared':
|
|
310
|
+
# If, however LLVM_BUILD_SHARED_LIBS is true # (*cough* gentoo *cough*)
|
|
311
|
+
# then this is correct. Building with LLVM_BUILD_SHARED_LIBS has a side
|
|
312
|
+
# effect, it stops the generation of static archives. Therefore we need
|
|
313
|
+
# to check for that and error out on static if this is the case
|
|
314
|
+
try:
|
|
315
|
+
self.__check_libfiles(False)
|
|
316
|
+
except DependencyException:
|
|
317
|
+
if self.required:
|
|
318
|
+
raise
|
|
319
|
+
self.is_found = False
|
|
320
|
+
return
|
|
321
|
+
|
|
322
|
+
link_args = ['--link-static', '--system-libs'] if self.static else ['--link-shared']
|
|
323
|
+
self.link_args = self.get_config_value(
|
|
324
|
+
['--libs', '--ldflags'] + link_args + list(self.required_modules),
|
|
325
|
+
'link_args')
|
|
326
|
+
|
|
327
|
+
def _set_old_link_args(self) -> None:
|
|
328
|
+
"""Setting linker args for older versions of llvm.
|
|
329
|
+
|
|
330
|
+
Old versions of LLVM bring an extra level of insanity with them.
|
|
331
|
+
llvm-config will provide the correct arguments for static linking, but
|
|
332
|
+
not for shared-linking, we have to figure those out ourselves, because
|
|
333
|
+
of course we do.
|
|
334
|
+
"""
|
|
335
|
+
if self.static:
|
|
336
|
+
self.link_args = self.get_config_value(
|
|
337
|
+
['--libs', '--ldflags', '--system-libs'] + list(self.required_modules),
|
|
338
|
+
'link_args')
|
|
339
|
+
else:
|
|
340
|
+
# llvm-config will provide arguments for static linking, so we get
|
|
341
|
+
# to figure out for ourselves what to link with. We'll do that by
|
|
342
|
+
# checking in the directory provided by --libdir for a library
|
|
343
|
+
# called libLLVM-<ver>.(so|dylib|dll)
|
|
344
|
+
libdir = self.get_config_value(['--libdir'], 'link_args')[0]
|
|
345
|
+
|
|
346
|
+
expected_name = f'libLLVM-{self.version}'
|
|
347
|
+
re_name = re.compile(fr'{expected_name}.(so|dll|dylib)$')
|
|
348
|
+
|
|
349
|
+
for file_ in os.listdir(libdir):
|
|
350
|
+
if re_name.match(file_):
|
|
351
|
+
self.link_args = [f'-L{libdir}',
|
|
352
|
+
'-l{}'.format(os.path.splitext(file_.lstrip('lib'))[0])]
|
|
353
|
+
break
|
|
354
|
+
else:
|
|
355
|
+
raise DependencyException(
|
|
356
|
+
'Could not find a dynamically linkable library for LLVM.')
|
|
357
|
+
|
|
358
|
+
def check_components(self, modules: T.List[str], required: bool = True) -> None:
|
|
359
|
+
"""Check for llvm components (modules in meson terms).
|
|
360
|
+
|
|
361
|
+
The required option is whether the module is required, not whether LLVM
|
|
362
|
+
is required.
|
|
363
|
+
"""
|
|
364
|
+
for mod in sorted(set(modules)):
|
|
365
|
+
status = ''
|
|
366
|
+
|
|
367
|
+
if mod not in self.provided_modules:
|
|
368
|
+
if required:
|
|
369
|
+
self.is_found = False
|
|
370
|
+
if self.required:
|
|
371
|
+
raise DependencyException(
|
|
372
|
+
f'Could not find required LLVM Component: {mod}')
|
|
373
|
+
status = '(missing)'
|
|
374
|
+
else:
|
|
375
|
+
status = '(missing but optional)'
|
|
376
|
+
else:
|
|
377
|
+
self.required_modules.add(mod)
|
|
378
|
+
|
|
379
|
+
self.module_details.append(mod + status)
|
|
380
|
+
|
|
381
|
+
def log_details(self) -> str:
|
|
382
|
+
if self.module_details:
|
|
383
|
+
return 'modules: ' + ', '.join(self.module_details)
|
|
384
|
+
return ''
|
|
385
|
+
|
|
386
|
+
class LLVMDependencyCMake(CMakeDependency):
|
|
387
|
+
def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
|
|
388
|
+
self.llvm_modules = stringlistify(extract_as_list(kwargs, 'modules'))
|
|
389
|
+
self.llvm_opt_modules = stringlistify(extract_as_list(kwargs, 'optional_modules'))
|
|
390
|
+
|
|
391
|
+
compilers = None
|
|
392
|
+
if kwargs.get('native', False):
|
|
393
|
+
compilers = env.coredata.compilers.build
|
|
394
|
+
else:
|
|
395
|
+
compilers = env.coredata.compilers.host
|
|
396
|
+
if not compilers or not all(x in compilers for x in ('c', 'cpp')):
|
|
397
|
+
# Initialize basic variables
|
|
398
|
+
ExternalDependency.__init__(self, DependencyTypeName('cmake'), env, kwargs)
|
|
399
|
+
|
|
400
|
+
# Initialize CMake specific variables
|
|
401
|
+
self.found_modules: T.List[str] = []
|
|
402
|
+
self.name = name
|
|
403
|
+
|
|
404
|
+
# Warn and return
|
|
405
|
+
mlog.warning('The LLVM dependency was not found via CMake since both a C and C++ compiler are required.')
|
|
406
|
+
return
|
|
407
|
+
|
|
408
|
+
super().__init__(name, env, kwargs, language='cpp', force_use_global_compilers=True)
|
|
409
|
+
|
|
410
|
+
if not self.cmakebin.found():
|
|
411
|
+
return
|
|
412
|
+
|
|
413
|
+
if not self.is_found:
|
|
414
|
+
return
|
|
415
|
+
|
|
416
|
+
# CMake will return not found due to not defined LLVM_DYLIB_COMPONENTS
|
|
417
|
+
if not self.static and version_compare(self.version, '< 7.0') and self.llvm_modules:
|
|
418
|
+
mlog.warning('Before version 7.0 cmake does not export modules for dynamic linking, cannot check required modules')
|
|
419
|
+
return
|
|
420
|
+
|
|
421
|
+
# Extract extra include directories and definitions
|
|
422
|
+
inc_dirs = self.traceparser.get_cmake_var('PACKAGE_INCLUDE_DIRS')
|
|
423
|
+
defs = self.traceparser.get_cmake_var('PACKAGE_DEFINITIONS')
|
|
424
|
+
# LLVM explicitly uses space-separated variables rather than semicolon lists
|
|
425
|
+
if len(defs) == 1:
|
|
426
|
+
defs = defs[0].split(' ')
|
|
427
|
+
temp = ['-I' + x for x in inc_dirs] + defs
|
|
428
|
+
self.compile_args += [x for x in temp if x not in self.compile_args]
|
|
429
|
+
self.compile_args = strip_system_includedirs(env, self.for_machine, self.compile_args)
|
|
430
|
+
if not self._add_sub_dependency(threads_factory(env, self.for_machine, {})):
|
|
431
|
+
self.is_found = False
|
|
432
|
+
return
|
|
433
|
+
|
|
434
|
+
def _main_cmake_file(self) -> str:
|
|
435
|
+
# Use a custom CMakeLists.txt for LLVM
|
|
436
|
+
return 'CMakeListsLLVM.txt'
|
|
437
|
+
|
|
438
|
+
# Check version in CMake to return exact version as config tool (latest allowed)
|
|
439
|
+
# It is safe to add .0 to latest argument, it will discarded if we use search_version
|
|
440
|
+
def llvm_cmake_versions(self) -> T.List[str]:
|
|
441
|
+
|
|
442
|
+
def ver_from_suf(req: str) -> str:
|
|
443
|
+
return search_version(req.strip('-')+'.0')
|
|
444
|
+
|
|
445
|
+
def version_sorter(a: str, b: str) -> int:
|
|
446
|
+
if version_compare(a, "="+b):
|
|
447
|
+
return 0
|
|
448
|
+
if version_compare(a, "<"+b):
|
|
449
|
+
return 1
|
|
450
|
+
return -1
|
|
451
|
+
|
|
452
|
+
llvm_requested_versions = [ver_from_suf(x) for x in get_llvm_tool_names('') if version_compare(ver_from_suf(x), '>=0')]
|
|
453
|
+
if self.version_reqs:
|
|
454
|
+
llvm_requested_versions = [ver_from_suf(x) for x in get_llvm_tool_names('') if version_compare_many(ver_from_suf(x), self.version_reqs)]
|
|
455
|
+
# CMake sorting before 3.18 is incorrect, sort it here instead
|
|
456
|
+
return sorted(llvm_requested_versions, key=functools.cmp_to_key(version_sorter))
|
|
457
|
+
|
|
458
|
+
# Split required and optional modules to distinguish it in CMake
|
|
459
|
+
def _extra_cmake_opts(self) -> T.List[str]:
|
|
460
|
+
return ['-DLLVM_MESON_REQUIRED_MODULES={}'.format(';'.join(self.llvm_modules)),
|
|
461
|
+
'-DLLVM_MESON_OPTIONAL_MODULES={}'.format(';'.join(self.llvm_opt_modules)),
|
|
462
|
+
'-DLLVM_MESON_PACKAGE_NAMES={}'.format(';'.join(get_llvm_tool_names(self.name))),
|
|
463
|
+
'-DLLVM_MESON_VERSIONS={}'.format(';'.join(self.llvm_cmake_versions())),
|
|
464
|
+
'-DLLVM_MESON_DYLIB={}'.format('OFF' if self.static else 'ON')]
|
|
465
|
+
|
|
466
|
+
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]]:
|
|
467
|
+
res = []
|
|
468
|
+
for mod, required in modules:
|
|
469
|
+
cm_targets = self.traceparser.get_cmake_var(f'MESON_LLVM_TARGETS_{mod}')
|
|
470
|
+
if not cm_targets:
|
|
471
|
+
if required:
|
|
472
|
+
raise self._gen_exception(f'LLVM module {mod} was not found')
|
|
473
|
+
else:
|
|
474
|
+
mlog.warning('Optional LLVM module', mlog.bold(mod), 'was not found', fatal=False)
|
|
475
|
+
continue
|
|
476
|
+
for i in cm_targets:
|
|
477
|
+
res += [(i, required)]
|
|
478
|
+
return res
|
|
479
|
+
|
|
480
|
+
def _original_module_name(self, module: str) -> str:
|
|
481
|
+
orig_name = self.traceparser.get_cmake_var(f'MESON_TARGET_TO_LLVM_{module}')
|
|
482
|
+
if orig_name:
|
|
483
|
+
return orig_name[0]
|
|
484
|
+
return module
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
class ValgrindDependency(PkgConfigDependency):
|
|
488
|
+
'''
|
|
489
|
+
Consumers of Valgrind usually only need the compile args and do not want to
|
|
490
|
+
link to its (static) libraries.
|
|
491
|
+
'''
|
|
492
|
+
def __init__(self, env: 'Environment', kwargs: T.Dict[str, T.Any]):
|
|
493
|
+
super().__init__('valgrind', env, kwargs)
|
|
494
|
+
|
|
495
|
+
def get_link_args(self, language: T.Optional[str] = None, raw: bool = False) -> T.List[str]:
|
|
496
|
+
return []
|
|
497
|
+
|
|
498
|
+
packages['valgrind'] = ValgrindDependency
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
class ZlibSystemDependency(SystemDependency):
|
|
502
|
+
|
|
503
|
+
def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
|
|
504
|
+
super().__init__(name, environment, kwargs)
|
|
505
|
+
from ..compilers.c import AppleClangCCompiler
|
|
506
|
+
from ..compilers.cpp import AppleClangCPPCompiler
|
|
507
|
+
|
|
508
|
+
m = self.env.machines[self.for_machine]
|
|
509
|
+
|
|
510
|
+
# I'm not sure this is entirely correct. What if we're cross compiling
|
|
511
|
+
# from something to macOS?
|
|
512
|
+
if ((m.is_darwin() and isinstance(self.clib_compiler, (AppleClangCCompiler, AppleClangCPPCompiler))) or
|
|
513
|
+
m.is_freebsd() or m.is_dragonflybsd() or m.is_android()):
|
|
514
|
+
# No need to set includes,
|
|
515
|
+
# on macos xcode/clang will do that for us.
|
|
516
|
+
# on freebsd zlib.h is in /usr/include
|
|
517
|
+
|
|
518
|
+
self.is_found = True
|
|
519
|
+
self.link_args = ['-lz']
|
|
520
|
+
else:
|
|
521
|
+
if self.clib_compiler.get_argument_syntax() == 'msvc':
|
|
522
|
+
libs = ['zlib1', 'zlib']
|
|
523
|
+
else:
|
|
524
|
+
libs = ['z']
|
|
525
|
+
for lib in libs:
|
|
526
|
+
l = self.clib_compiler.find_library(lib, environment, [], self.libtype)
|
|
527
|
+
h = self.clib_compiler.has_header('zlib.h', '', environment, dependencies=[self])
|
|
528
|
+
if l and h[0]:
|
|
529
|
+
self.is_found = True
|
|
530
|
+
self.link_args = l
|
|
531
|
+
break
|
|
532
|
+
else:
|
|
533
|
+
return
|
|
534
|
+
|
|
535
|
+
v, _ = self.clib_compiler.get_define('ZLIB_VERSION', '#include <zlib.h>', self.env, [], [self])
|
|
536
|
+
self.version = v.strip('"')
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
class JNISystemDependency(SystemDependency):
|
|
540
|
+
def __init__(self, environment: 'Environment', kwargs: JNISystemDependencyKW):
|
|
541
|
+
super().__init__('jni', environment, T.cast('T.Dict[str, T.Any]', kwargs))
|
|
542
|
+
|
|
543
|
+
self.feature_since = ('0.62.0', '')
|
|
544
|
+
|
|
545
|
+
m = self.env.machines[self.for_machine]
|
|
546
|
+
|
|
547
|
+
if 'java' not in environment.coredata.compilers[self.for_machine]:
|
|
548
|
+
detect_compiler(self.name, environment, self.for_machine, 'java')
|
|
549
|
+
self.javac = environment.coredata.compilers[self.for_machine]['java']
|
|
550
|
+
self.version = self.javac.version
|
|
551
|
+
|
|
552
|
+
modules: T.List[str] = mesonlib.listify(kwargs.get('modules', []))
|
|
553
|
+
for module in modules:
|
|
554
|
+
if module not in {'jvm', 'awt'}:
|
|
555
|
+
msg = f'Unknown JNI module ({module})'
|
|
556
|
+
if self.required:
|
|
557
|
+
mlog.error(msg)
|
|
558
|
+
else:
|
|
559
|
+
mlog.debug(msg)
|
|
560
|
+
self.is_found = False
|
|
561
|
+
return
|
|
562
|
+
|
|
563
|
+
if 'version' in kwargs and not version_compare(self.version, kwargs['version']):
|
|
564
|
+
mlog.error(f'Incorrect JDK version found ({self.version}), wanted {kwargs["version"]}')
|
|
565
|
+
self.is_found = False
|
|
566
|
+
return
|
|
567
|
+
|
|
568
|
+
self.java_home = environment.properties[self.for_machine].get_java_home()
|
|
569
|
+
if not self.java_home:
|
|
570
|
+
self.java_home = pathlib.Path(shutil.which(self.javac.exelist[0])).resolve().parents[1]
|
|
571
|
+
if m.is_darwin():
|
|
572
|
+
problem_java_prefix = pathlib.Path('/System/Library/Frameworks/JavaVM.framework/Versions')
|
|
573
|
+
if problem_java_prefix in self.java_home.parents:
|
|
574
|
+
res = subprocess.run(['/usr/libexec/java_home', '--failfast', '--arch', m.cpu_family],
|
|
575
|
+
stdout=subprocess.PIPE)
|
|
576
|
+
if res.returncode != 0:
|
|
577
|
+
msg = 'JAVA_HOME could not be discovered on the system. Please set it explicitly.'
|
|
578
|
+
if self.required:
|
|
579
|
+
mlog.error(msg)
|
|
580
|
+
else:
|
|
581
|
+
mlog.debug(msg)
|
|
582
|
+
self.is_found = False
|
|
583
|
+
return
|
|
584
|
+
self.java_home = pathlib.Path(res.stdout.decode().strip())
|
|
585
|
+
|
|
586
|
+
platform_include_dir = self.__machine_info_to_platform_include_dir(m)
|
|
587
|
+
if platform_include_dir is None:
|
|
588
|
+
mlog.error("Could not find a JDK platform include directory for your OS, please open an issue or provide a pull request.")
|
|
589
|
+
self.is_found = False
|
|
590
|
+
return
|
|
591
|
+
|
|
592
|
+
java_home_include = self.java_home / 'include'
|
|
593
|
+
self.compile_args.append(f'-I{java_home_include}')
|
|
594
|
+
self.compile_args.append(f'-I{java_home_include / platform_include_dir}')
|
|
595
|
+
|
|
596
|
+
if modules:
|
|
597
|
+
if m.is_windows():
|
|
598
|
+
java_home_lib = self.java_home / 'lib'
|
|
599
|
+
java_home_lib_server = java_home_lib
|
|
600
|
+
else:
|
|
601
|
+
if version_compare(self.version, '<= 1.8.0'):
|
|
602
|
+
java_home_lib = self.java_home / 'jre' / 'lib' / self.__cpu_translate(m.cpu_family)
|
|
603
|
+
else:
|
|
604
|
+
java_home_lib = self.java_home / 'lib'
|
|
605
|
+
|
|
606
|
+
java_home_lib_server = java_home_lib / 'server'
|
|
607
|
+
|
|
608
|
+
if 'jvm' in modules:
|
|
609
|
+
jvm = self.clib_compiler.find_library('jvm', environment, extra_dirs=[str(java_home_lib_server)])
|
|
610
|
+
if jvm is None:
|
|
611
|
+
mlog.debug('jvm library not found.')
|
|
612
|
+
self.is_found = False
|
|
613
|
+
else:
|
|
614
|
+
self.link_args.extend(jvm)
|
|
615
|
+
if 'awt' in modules:
|
|
616
|
+
jawt = self.clib_compiler.find_library('jawt', environment, extra_dirs=[str(java_home_lib)])
|
|
617
|
+
if jawt is None:
|
|
618
|
+
mlog.debug('jawt library not found.')
|
|
619
|
+
self.is_found = False
|
|
620
|
+
else:
|
|
621
|
+
self.link_args.extend(jawt)
|
|
622
|
+
|
|
623
|
+
self.is_found = True
|
|
624
|
+
|
|
625
|
+
@staticmethod
|
|
626
|
+
def __cpu_translate(cpu: str) -> str:
|
|
627
|
+
'''
|
|
628
|
+
The JDK and Meson have a disagreement here, so translate it over. In the event more
|
|
629
|
+
translation needs to be done, add to following dict.
|
|
630
|
+
'''
|
|
631
|
+
java_cpus = {
|
|
632
|
+
'x86_64': 'amd64',
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
return java_cpus.get(cpu, cpu)
|
|
636
|
+
|
|
637
|
+
@staticmethod
|
|
638
|
+
def __machine_info_to_platform_include_dir(m: 'MachineInfo') -> T.Optional[str]:
|
|
639
|
+
'''Translates the machine information to the platform-dependent include directory
|
|
640
|
+
|
|
641
|
+
When inspecting a JDK release tarball or $JAVA_HOME, inside the `include/` directory is a
|
|
642
|
+
platform-dependent directory that must be on the target's include path in addition to the
|
|
643
|
+
parent `include/` directory.
|
|
644
|
+
'''
|
|
645
|
+
if m.is_linux():
|
|
646
|
+
return 'linux'
|
|
647
|
+
elif m.is_windows():
|
|
648
|
+
return 'win32'
|
|
649
|
+
elif m.is_darwin():
|
|
650
|
+
return 'darwin'
|
|
651
|
+
elif m.is_sunos():
|
|
652
|
+
return 'solaris'
|
|
653
|
+
elif m.is_freebsd():
|
|
654
|
+
return 'freebsd'
|
|
655
|
+
elif m.is_netbsd():
|
|
656
|
+
return 'netbsd'
|
|
657
|
+
elif m.is_openbsd():
|
|
658
|
+
return 'openbsd'
|
|
659
|
+
elif m.is_dragonflybsd():
|
|
660
|
+
return 'dragonfly'
|
|
661
|
+
|
|
662
|
+
return None
|
|
663
|
+
|
|
664
|
+
packages['jni'] = JNISystemDependency
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
class JDKSystemDependency(JNISystemDependency):
|
|
668
|
+
def __init__(self, environment: 'Environment', kwargs: JNISystemDependencyKW):
|
|
669
|
+
super().__init__(environment, kwargs)
|
|
670
|
+
|
|
671
|
+
self.feature_since = ('0.59.0', '')
|
|
672
|
+
self.featurechecks.append(FeatureDeprecated(
|
|
673
|
+
'jdk system dependency',
|
|
674
|
+
'0.62.0',
|
|
675
|
+
'Use the jni system dependency instead'
|
|
676
|
+
))
|
|
677
|
+
|
|
678
|
+
packages['jdk'] = JDKSystemDependency
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
packages['llvm'] = llvm_factory = DependencyFactory(
|
|
682
|
+
'LLVM',
|
|
683
|
+
[DependencyMethods.CMAKE, DependencyMethods.CONFIG_TOOL],
|
|
684
|
+
cmake_class=LLVMDependencyCMake,
|
|
685
|
+
configtool_class=LLVMDependencyConfigTool,
|
|
686
|
+
)
|
|
687
|
+
|
|
688
|
+
packages['gtest'] = gtest_factory = DependencyFactory(
|
|
689
|
+
'gtest',
|
|
690
|
+
[DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM],
|
|
691
|
+
pkgconfig_class=GTestDependencyPC,
|
|
692
|
+
system_class=GTestDependencySystem,
|
|
693
|
+
)
|
|
694
|
+
|
|
695
|
+
packages['gmock'] = gmock_factory = DependencyFactory(
|
|
696
|
+
'gmock',
|
|
697
|
+
[DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM],
|
|
698
|
+
pkgconfig_class=GMockDependencyPC,
|
|
699
|
+
system_class=GMockDependencySystem,
|
|
700
|
+
)
|
|
701
|
+
|
|
702
|
+
packages['zlib'] = zlib_factory = DependencyFactory(
|
|
703
|
+
'zlib',
|
|
704
|
+
[DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE, DependencyMethods.SYSTEM],
|
|
705
|
+
cmake_name='ZLIB',
|
|
706
|
+
system_class=ZlibSystemDependency,
|
|
707
|
+
)
|