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,80 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2013-2019 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import functools
|
|
7
|
+
import typing as T
|
|
8
|
+
|
|
9
|
+
from .base import DependencyMethods, detect_compiler, SystemDependency
|
|
10
|
+
from .cmake import CMakeDependency
|
|
11
|
+
from .detect import packages
|
|
12
|
+
from .pkgconfig import PkgConfigDependency
|
|
13
|
+
from .factory import factory_methods
|
|
14
|
+
|
|
15
|
+
if T.TYPE_CHECKING:
|
|
16
|
+
from . factory import DependencyGenerator
|
|
17
|
+
from ..environment import Environment
|
|
18
|
+
from ..mesonlib import MachineChoice
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@factory_methods({DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE, DependencyMethods.SYSTEM})
|
|
22
|
+
def coarray_factory(env: 'Environment',
|
|
23
|
+
for_machine: 'MachineChoice',
|
|
24
|
+
kwargs: T.Dict[str, T.Any],
|
|
25
|
+
methods: T.List[DependencyMethods]) -> T.List['DependencyGenerator']:
|
|
26
|
+
fcid = detect_compiler('coarray', env, for_machine, 'fortran').get_id()
|
|
27
|
+
candidates: T.List['DependencyGenerator'] = []
|
|
28
|
+
|
|
29
|
+
if fcid == 'gcc':
|
|
30
|
+
# OpenCoarrays is the most commonly used method for Fortran Coarray with GCC
|
|
31
|
+
if DependencyMethods.PKGCONFIG in methods:
|
|
32
|
+
for pkg in ['caf-openmpi', 'caf']:
|
|
33
|
+
candidates.append(functools.partial(
|
|
34
|
+
PkgConfigDependency, pkg, env, kwargs, language='fortran'))
|
|
35
|
+
|
|
36
|
+
if DependencyMethods.CMAKE in methods:
|
|
37
|
+
if 'modules' not in kwargs:
|
|
38
|
+
kwargs['modules'] = 'OpenCoarrays::caf_mpi'
|
|
39
|
+
candidates.append(functools.partial(
|
|
40
|
+
CMakeDependency, 'OpenCoarrays', env, kwargs, language='fortran'))
|
|
41
|
+
|
|
42
|
+
if DependencyMethods.SYSTEM in methods:
|
|
43
|
+
candidates.append(functools.partial(CoarrayDependency, env, kwargs))
|
|
44
|
+
|
|
45
|
+
return candidates
|
|
46
|
+
packages['coarray'] = coarray_factory
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class CoarrayDependency(SystemDependency):
|
|
50
|
+
"""
|
|
51
|
+
Coarrays are a Fortran 2008 feature.
|
|
52
|
+
|
|
53
|
+
Coarrays are sometimes implemented via external library (GCC+OpenCoarrays),
|
|
54
|
+
while other compilers just build in support (Cray, IBM, Intel, NAG).
|
|
55
|
+
Coarrays may be thought of as a high-level language abstraction of
|
|
56
|
+
low-level MPI calls.
|
|
57
|
+
"""
|
|
58
|
+
def __init__(self, environment: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
|
|
59
|
+
super().__init__('coarray', environment, kwargs, language='fortran')
|
|
60
|
+
kwargs['required'] = False
|
|
61
|
+
kwargs['silent'] = True
|
|
62
|
+
|
|
63
|
+
cid = self.get_compiler().get_id()
|
|
64
|
+
if cid == 'gcc':
|
|
65
|
+
# Fallback to single image
|
|
66
|
+
self.compile_args = ['-fcoarray=single']
|
|
67
|
+
self.version = 'single image (fallback)'
|
|
68
|
+
self.is_found = True
|
|
69
|
+
elif cid == 'intel':
|
|
70
|
+
# Coarrays are built into Intel compilers, no external library needed
|
|
71
|
+
self.is_found = True
|
|
72
|
+
self.link_args = ['-coarray=shared']
|
|
73
|
+
self.compile_args = self.link_args
|
|
74
|
+
elif cid == 'intel-cl':
|
|
75
|
+
# Coarrays are built into Intel compilers, no external library needed
|
|
76
|
+
self.is_found = True
|
|
77
|
+
self.compile_args = ['/Qcoarray:shared']
|
|
78
|
+
elif cid == 'nagfor':
|
|
79
|
+
# NAG doesn't require any special arguments for Coarray
|
|
80
|
+
self.is_found = True
|
|
@@ -0,0 +1,163 @@
|
|
|
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 listify, Popen_safe, Popen_safe_logged, split_args, version_compare, version_compare_many
|
|
8
|
+
from ..programs import find_external_program
|
|
9
|
+
from .. import mlog
|
|
10
|
+
import re
|
|
11
|
+
import typing as T
|
|
12
|
+
|
|
13
|
+
from mesonbuild import mesonlib
|
|
14
|
+
|
|
15
|
+
if T.TYPE_CHECKING:
|
|
16
|
+
from ..environment import Environment
|
|
17
|
+
from ..interpreter.type_checking import PkgConfigDefineType
|
|
18
|
+
|
|
19
|
+
class ConfigToolDependency(ExternalDependency):
|
|
20
|
+
|
|
21
|
+
"""Class representing dependencies found using a config tool.
|
|
22
|
+
|
|
23
|
+
Takes the following extra keys in kwargs that it uses internally:
|
|
24
|
+
:tools List[str]: A list of tool names to use
|
|
25
|
+
:version_arg str: The argument to pass to the tool to get it's version
|
|
26
|
+
:skip_version str: The argument to pass to the tool to ignore its version
|
|
27
|
+
(if ``version_arg`` fails, but it may start accepting it in the future)
|
|
28
|
+
Because some tools are stupid and don't accept --version
|
|
29
|
+
:returncode_value int: The value of the correct returncode
|
|
30
|
+
Because some tools are stupid and don't return 0
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
tools: T.Optional[T.List[str]] = None
|
|
34
|
+
tool_name: T.Optional[str] = None
|
|
35
|
+
version_arg = '--version'
|
|
36
|
+
skip_version: T.Optional[str] = None
|
|
37
|
+
allow_default_for_cross = False
|
|
38
|
+
__strip_version = re.compile(r'^[0-9][0-9.]+')
|
|
39
|
+
|
|
40
|
+
def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None):
|
|
41
|
+
super().__init__(DependencyTypeName('config-tool'), environment, kwargs, language=language)
|
|
42
|
+
self.name = name
|
|
43
|
+
# You may want to overwrite the class version in some cases
|
|
44
|
+
self.tools = listify(kwargs.get('tools', self.tools))
|
|
45
|
+
if not self.tool_name:
|
|
46
|
+
self.tool_name = self.tools[0]
|
|
47
|
+
if 'version_arg' in kwargs:
|
|
48
|
+
self.version_arg = kwargs['version_arg']
|
|
49
|
+
|
|
50
|
+
req_version_raw = kwargs.get('version', None)
|
|
51
|
+
if req_version_raw is not None:
|
|
52
|
+
req_version = mesonlib.stringlistify(req_version_raw)
|
|
53
|
+
else:
|
|
54
|
+
req_version = []
|
|
55
|
+
tool, version = self.find_config(req_version, kwargs.get('returncode_value', 0))
|
|
56
|
+
self.config = tool
|
|
57
|
+
self.is_found = self.report_config(version, req_version)
|
|
58
|
+
if not self.is_found:
|
|
59
|
+
self.config = None
|
|
60
|
+
return
|
|
61
|
+
self.version = version
|
|
62
|
+
|
|
63
|
+
def _sanitize_version(self, version: str) -> str:
|
|
64
|
+
"""Remove any non-numeric, non-point version suffixes."""
|
|
65
|
+
m = self.__strip_version.match(version)
|
|
66
|
+
if m:
|
|
67
|
+
# Ensure that there isn't a trailing '.', such as an input like
|
|
68
|
+
# `1.2.3.git-1234`
|
|
69
|
+
return m.group(0).rstrip('.')
|
|
70
|
+
return version
|
|
71
|
+
|
|
72
|
+
def find_config(self, versions: T.List[str], returncode: int = 0) \
|
|
73
|
+
-> T.Tuple[T.Optional[T.List[str]], T.Optional[str]]:
|
|
74
|
+
"""Helper method that searches for config tool binaries in PATH and
|
|
75
|
+
returns the one that best matches the given version requirements.
|
|
76
|
+
"""
|
|
77
|
+
best_match: T.Tuple[T.Optional[T.List[str]], T.Optional[str]] = (None, None)
|
|
78
|
+
for potential_bin in find_external_program(
|
|
79
|
+
self.env, self.for_machine, self.tool_name,
|
|
80
|
+
self.tool_name, self.tools, allow_default_for_cross=self.allow_default_for_cross):
|
|
81
|
+
if not potential_bin.found():
|
|
82
|
+
continue
|
|
83
|
+
tool = potential_bin.get_command()
|
|
84
|
+
try:
|
|
85
|
+
p, out = Popen_safe(tool + [self.version_arg])[:2]
|
|
86
|
+
except (FileNotFoundError, PermissionError):
|
|
87
|
+
continue
|
|
88
|
+
if p.returncode != returncode:
|
|
89
|
+
if self.skip_version:
|
|
90
|
+
# maybe the executable is valid even if it doesn't support --version
|
|
91
|
+
p = Popen_safe(tool + [self.skip_version])[0]
|
|
92
|
+
if p.returncode != returncode:
|
|
93
|
+
continue
|
|
94
|
+
else:
|
|
95
|
+
continue
|
|
96
|
+
|
|
97
|
+
out = self._sanitize_version(out.strip())
|
|
98
|
+
# Some tools, like pcap-config don't supply a version, but also
|
|
99
|
+
# don't fail with --version, in that case just assume that there is
|
|
100
|
+
# only one version and return it.
|
|
101
|
+
if not out:
|
|
102
|
+
return (tool, None)
|
|
103
|
+
if versions:
|
|
104
|
+
is_found = version_compare_many(out, versions)[0]
|
|
105
|
+
# This allows returning a found version without a config tool,
|
|
106
|
+
# which is useful to inform the user that you found version x,
|
|
107
|
+
# but y was required.
|
|
108
|
+
if not is_found:
|
|
109
|
+
tool = None
|
|
110
|
+
if best_match[1]:
|
|
111
|
+
if version_compare(out, '> {}'.format(best_match[1])):
|
|
112
|
+
best_match = (tool, out)
|
|
113
|
+
else:
|
|
114
|
+
best_match = (tool, out)
|
|
115
|
+
|
|
116
|
+
return best_match
|
|
117
|
+
|
|
118
|
+
def report_config(self, version: T.Optional[str], req_version: T.List[str]) -> bool:
|
|
119
|
+
"""Helper method to print messages about the tool."""
|
|
120
|
+
|
|
121
|
+
found_msg: T.List[T.Union[str, mlog.AnsiDecorator]] = [mlog.bold(self.tool_name), 'found:']
|
|
122
|
+
|
|
123
|
+
if self.config is None:
|
|
124
|
+
found_msg.append(mlog.red('NO'))
|
|
125
|
+
if version is not None and req_version:
|
|
126
|
+
found_msg.append(f'found {version!r} but need {req_version!r}')
|
|
127
|
+
elif req_version:
|
|
128
|
+
found_msg.append(f'need {req_version!r}')
|
|
129
|
+
else:
|
|
130
|
+
found_msg += [mlog.green('YES'), '({})'.format(' '.join(self.config)), version]
|
|
131
|
+
|
|
132
|
+
mlog.log(*found_msg)
|
|
133
|
+
|
|
134
|
+
return self.config is not None
|
|
135
|
+
|
|
136
|
+
def get_config_value(self, args: T.List[str], stage: str) -> T.List[str]:
|
|
137
|
+
p, out, err = Popen_safe_logged(self.config + args)
|
|
138
|
+
if p.returncode != 0:
|
|
139
|
+
if self.required:
|
|
140
|
+
raise DependencyException(f'Could not generate {stage} for {self.name}.\n{err}')
|
|
141
|
+
return []
|
|
142
|
+
return split_args(out)
|
|
143
|
+
|
|
144
|
+
def get_variable_args(self, variable_name: str) -> T.List[str]:
|
|
145
|
+
return [f'--{variable_name}']
|
|
146
|
+
|
|
147
|
+
@staticmethod
|
|
148
|
+
def log_tried() -> str:
|
|
149
|
+
return 'config-tool'
|
|
150
|
+
|
|
151
|
+
def get_variable(self, *, cmake: T.Optional[str] = None, pkgconfig: T.Optional[str] = None,
|
|
152
|
+
configtool: T.Optional[str] = None, internal: T.Optional[str] = None,
|
|
153
|
+
default_value: T.Optional[str] = None,
|
|
154
|
+
pkgconfig_define: PkgConfigDefineType = None) -> str:
|
|
155
|
+
if configtool:
|
|
156
|
+
p, out, _ = Popen_safe(self.config + self.get_variable_args(configtool))
|
|
157
|
+
if p.returncode == 0:
|
|
158
|
+
variable = out.strip()
|
|
159
|
+
mlog.debug(f'Got config-tool variable {configtool} : {variable}')
|
|
160
|
+
return variable
|
|
161
|
+
if default_value is not None:
|
|
162
|
+
return default_value
|
|
163
|
+
raise DependencyException(f'Could not get config-tool variable and no default provided for {self!r}')
|
|
@@ -0,0 +1,295 @@
|
|
|
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 re
|
|
8
|
+
import os
|
|
9
|
+
import typing as T
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from .. import mesonlib
|
|
13
|
+
from .. import mlog
|
|
14
|
+
from ..environment import detect_cpu_family
|
|
15
|
+
from .base import DependencyException, SystemDependency
|
|
16
|
+
from .detect import packages
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
if T.TYPE_CHECKING:
|
|
20
|
+
from ..environment import Environment
|
|
21
|
+
from ..compilers import Compiler
|
|
22
|
+
|
|
23
|
+
TV_ResultTuple = T.Tuple[T.Optional[str], T.Optional[str], bool]
|
|
24
|
+
|
|
25
|
+
class CudaDependency(SystemDependency):
|
|
26
|
+
|
|
27
|
+
supported_languages = ['cuda', 'cpp', 'c'] # see also _default_language
|
|
28
|
+
|
|
29
|
+
def __init__(self, environment: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
|
|
30
|
+
compilers = environment.coredata.compilers[self.get_for_machine_from_kwargs(kwargs)]
|
|
31
|
+
language = self._detect_language(compilers)
|
|
32
|
+
if language not in self.supported_languages:
|
|
33
|
+
raise DependencyException(f'Language \'{language}\' is not supported by the CUDA Toolkit. Supported languages are {self.supported_languages}.')
|
|
34
|
+
|
|
35
|
+
super().__init__('cuda', environment, kwargs, language=language)
|
|
36
|
+
self.lib_modules: T.Dict[str, T.List[str]] = {}
|
|
37
|
+
self.requested_modules = self.get_requested(kwargs)
|
|
38
|
+
if not any(runtime in self.requested_modules for runtime in ['cudart', 'cudart_static']):
|
|
39
|
+
# By default, we prefer to link the static CUDA runtime, since this is what nvcc also does by default:
|
|
40
|
+
# https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#cudart-none-shared-static-cudart
|
|
41
|
+
req_modules = ['cudart']
|
|
42
|
+
if kwargs.get('static', True):
|
|
43
|
+
req_modules = ['cudart_static']
|
|
44
|
+
machine = self.env.machines[self.for_machine]
|
|
45
|
+
if machine.is_linux():
|
|
46
|
+
# extracted by running
|
|
47
|
+
# nvcc -v foo.o
|
|
48
|
+
req_modules += ['rt', 'pthread', 'dl']
|
|
49
|
+
self.requested_modules = req_modules + self.requested_modules
|
|
50
|
+
|
|
51
|
+
(self.cuda_path, self.version, self.is_found) = self._detect_cuda_path_and_version()
|
|
52
|
+
if not self.is_found:
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
if not os.path.isabs(self.cuda_path):
|
|
56
|
+
raise DependencyException(f'CUDA Toolkit path must be absolute, got \'{self.cuda_path}\'.')
|
|
57
|
+
|
|
58
|
+
# nvcc already knows where to find the CUDA Toolkit, but if we're compiling
|
|
59
|
+
# a mixed C/C++/CUDA project, we still need to make the include dir searchable
|
|
60
|
+
if self.language != 'cuda' or len(compilers) > 1:
|
|
61
|
+
self.incdir = os.path.join(self.cuda_path, 'include')
|
|
62
|
+
self.compile_args += [f'-I{self.incdir}']
|
|
63
|
+
|
|
64
|
+
if self.language != 'cuda':
|
|
65
|
+
arch_libdir = self._detect_arch_libdir()
|
|
66
|
+
self.libdir = os.path.join(self.cuda_path, arch_libdir)
|
|
67
|
+
mlog.debug('CUDA library directory is', mlog.bold(self.libdir))
|
|
68
|
+
else:
|
|
69
|
+
self.libdir = None
|
|
70
|
+
|
|
71
|
+
self.is_found = self._find_requested_libraries()
|
|
72
|
+
|
|
73
|
+
@classmethod
|
|
74
|
+
def _detect_language(cls, compilers: T.Dict[str, 'Compiler']) -> str:
|
|
75
|
+
for lang in cls.supported_languages:
|
|
76
|
+
if lang in compilers:
|
|
77
|
+
return lang
|
|
78
|
+
return list(compilers.keys())[0]
|
|
79
|
+
|
|
80
|
+
def _detect_cuda_path_and_version(self) -> TV_ResultTuple:
|
|
81
|
+
self.env_var = self._default_path_env_var()
|
|
82
|
+
mlog.debug('Default path env var:', mlog.bold(self.env_var))
|
|
83
|
+
|
|
84
|
+
version_reqs = self.version_reqs
|
|
85
|
+
if self.language == 'cuda':
|
|
86
|
+
nvcc_version = self._strip_patch_version(self.get_compiler().version)
|
|
87
|
+
mlog.debug('nvcc version:', mlog.bold(nvcc_version))
|
|
88
|
+
if version_reqs:
|
|
89
|
+
# make sure nvcc version satisfies specified version requirements
|
|
90
|
+
(found_some, not_found, found) = mesonlib.version_compare_many(nvcc_version, version_reqs)
|
|
91
|
+
if not_found:
|
|
92
|
+
msg = f'The current nvcc version {nvcc_version} does not satisfy the specified CUDA Toolkit version requirements {version_reqs}.'
|
|
93
|
+
return self._report_dependency_error(msg, (None, None, False))
|
|
94
|
+
|
|
95
|
+
# use nvcc version to find a matching CUDA Toolkit
|
|
96
|
+
version_reqs = [f'={nvcc_version}']
|
|
97
|
+
else:
|
|
98
|
+
nvcc_version = None
|
|
99
|
+
|
|
100
|
+
paths = [(path, self._cuda_toolkit_version(path), default) for (path, default) in self._cuda_paths()]
|
|
101
|
+
if version_reqs:
|
|
102
|
+
return self._find_matching_toolkit(paths, version_reqs, nvcc_version)
|
|
103
|
+
|
|
104
|
+
defaults = [(path, version) for (path, version, default) in paths if default]
|
|
105
|
+
if defaults:
|
|
106
|
+
return (defaults[0][0], defaults[0][1], True)
|
|
107
|
+
|
|
108
|
+
platform_msg = 'set the CUDA_PATH environment variable' if self._is_windows() \
|
|
109
|
+
else 'set the CUDA_PATH environment variable/create the \'/usr/local/cuda\' symbolic link'
|
|
110
|
+
msg = f'Please specify the desired CUDA Toolkit version (e.g. dependency(\'cuda\', version : \'>=10.1\')) or {platform_msg} to point to the location of your desired version.'
|
|
111
|
+
return self._report_dependency_error(msg, (None, None, False))
|
|
112
|
+
|
|
113
|
+
def _find_matching_toolkit(self, paths: T.List[TV_ResultTuple], version_reqs: T.List[str], nvcc_version: T.Optional[str]) -> TV_ResultTuple:
|
|
114
|
+
# keep the default paths order intact, sort the rest in the descending order
|
|
115
|
+
# according to the toolkit version
|
|
116
|
+
part_func: T.Callable[[TV_ResultTuple], bool] = lambda t: not t[2]
|
|
117
|
+
defaults_it, rest_it = mesonlib.partition(part_func, paths)
|
|
118
|
+
defaults = list(defaults_it)
|
|
119
|
+
paths = defaults + sorted(rest_it, key=lambda t: mesonlib.Version(t[1]), reverse=True)
|
|
120
|
+
mlog.debug(f'Search paths: {paths}')
|
|
121
|
+
|
|
122
|
+
if nvcc_version and defaults:
|
|
123
|
+
default_src = f"the {self.env_var} environment variable" if self.env_var else "the \'/usr/local/cuda\' symbolic link"
|
|
124
|
+
nvcc_warning = 'The default CUDA Toolkit as designated by {} ({}) doesn\'t match the current nvcc version {} and will be ignored.'.format(default_src, os.path.realpath(defaults[0][0]), nvcc_version)
|
|
125
|
+
else:
|
|
126
|
+
nvcc_warning = None
|
|
127
|
+
|
|
128
|
+
for (path, version, default) in paths:
|
|
129
|
+
(found_some, not_found, found) = mesonlib.version_compare_many(version, version_reqs)
|
|
130
|
+
if not not_found:
|
|
131
|
+
if not default and nvcc_warning:
|
|
132
|
+
mlog.warning(nvcc_warning)
|
|
133
|
+
return (path, version, True)
|
|
134
|
+
|
|
135
|
+
if nvcc_warning:
|
|
136
|
+
mlog.warning(nvcc_warning)
|
|
137
|
+
return (None, None, False)
|
|
138
|
+
|
|
139
|
+
def _default_path_env_var(self) -> T.Optional[str]:
|
|
140
|
+
env_vars = ['CUDA_PATH'] if self._is_windows() else ['CUDA_PATH', 'CUDA_HOME', 'CUDA_ROOT']
|
|
141
|
+
env_vars = [var for var in env_vars if var in os.environ]
|
|
142
|
+
user_defaults = {os.environ[var] for var in env_vars}
|
|
143
|
+
if len(user_defaults) > 1:
|
|
144
|
+
mlog.warning('Environment variables {} point to conflicting toolkit locations ({}). Toolkit selection might produce unexpected results.'.format(', '.join(env_vars), ', '.join(user_defaults)))
|
|
145
|
+
return env_vars[0] if env_vars else None
|
|
146
|
+
|
|
147
|
+
def _cuda_paths(self) -> T.List[T.Tuple[str, bool]]:
|
|
148
|
+
return ([(os.environ[self.env_var], True)] if self.env_var else []) \
|
|
149
|
+
+ (self._cuda_paths_win() if self._is_windows() else self._cuda_paths_nix())
|
|
150
|
+
|
|
151
|
+
def _cuda_paths_win(self) -> T.List[T.Tuple[str, bool]]:
|
|
152
|
+
env_vars = os.environ.keys()
|
|
153
|
+
return [(os.environ[var], False) for var in env_vars if var.startswith('CUDA_PATH_')]
|
|
154
|
+
|
|
155
|
+
def _cuda_paths_nix(self) -> T.List[T.Tuple[str, bool]]:
|
|
156
|
+
# include /usr/local/cuda default only if no env_var was found
|
|
157
|
+
pattern = '/usr/local/cuda-*' if self.env_var else '/usr/local/cuda*'
|
|
158
|
+
return [(path, os.path.basename(path) == 'cuda') for path in glob.iglob(pattern)]
|
|
159
|
+
|
|
160
|
+
toolkit_version_regex = re.compile(r'^CUDA Version\s+(.*)$')
|
|
161
|
+
path_version_win_regex = re.compile(r'^v(.*)$')
|
|
162
|
+
path_version_nix_regex = re.compile(r'^cuda-(.*)$')
|
|
163
|
+
cudart_version_regex = re.compile(r'#define\s+CUDART_VERSION\s+([0-9]+)')
|
|
164
|
+
|
|
165
|
+
def _cuda_toolkit_version(self, path: str) -> str:
|
|
166
|
+
version = self._read_toolkit_version_txt(path)
|
|
167
|
+
if version:
|
|
168
|
+
return version
|
|
169
|
+
version = self._read_cuda_runtime_api_version(path)
|
|
170
|
+
if version:
|
|
171
|
+
return version
|
|
172
|
+
|
|
173
|
+
mlog.debug('Falling back to extracting version from path')
|
|
174
|
+
path_version_regex = self.path_version_win_regex if self._is_windows() else self.path_version_nix_regex
|
|
175
|
+
try:
|
|
176
|
+
m = path_version_regex.match(os.path.basename(path))
|
|
177
|
+
if m:
|
|
178
|
+
return m.group(1)
|
|
179
|
+
else:
|
|
180
|
+
mlog.warning(f'Could not detect CUDA Toolkit version for {path}')
|
|
181
|
+
except Exception as e:
|
|
182
|
+
mlog.warning(f'Could not detect CUDA Toolkit version for {path}: {e!s}')
|
|
183
|
+
|
|
184
|
+
return '0.0'
|
|
185
|
+
|
|
186
|
+
def _read_cuda_runtime_api_version(self, path_str: str) -> T.Optional[str]:
|
|
187
|
+
path = Path(path_str)
|
|
188
|
+
for i in path.rglob('cuda_runtime_api.h'):
|
|
189
|
+
raw = i.read_text(encoding='utf-8')
|
|
190
|
+
m = self.cudart_version_regex.search(raw)
|
|
191
|
+
if not m:
|
|
192
|
+
continue
|
|
193
|
+
try:
|
|
194
|
+
vers_int = int(m.group(1))
|
|
195
|
+
except ValueError:
|
|
196
|
+
continue
|
|
197
|
+
# use // for floor instead of / which produces a float
|
|
198
|
+
major = vers_int // 1000
|
|
199
|
+
minor = (vers_int - major * 1000) // 10
|
|
200
|
+
return f'{major}.{minor}'
|
|
201
|
+
return None
|
|
202
|
+
|
|
203
|
+
def _read_toolkit_version_txt(self, path: str) -> T.Optional[str]:
|
|
204
|
+
# Read 'version.txt' at the root of the CUDA Toolkit directory to determine the toolkit version
|
|
205
|
+
version_file_path = os.path.join(path, 'version.txt')
|
|
206
|
+
try:
|
|
207
|
+
with open(version_file_path, encoding='utf-8') as version_file:
|
|
208
|
+
version_str = version_file.readline() # e.g. 'CUDA Version 10.1.168'
|
|
209
|
+
m = self.toolkit_version_regex.match(version_str)
|
|
210
|
+
if m:
|
|
211
|
+
return self._strip_patch_version(m.group(1))
|
|
212
|
+
except Exception as e:
|
|
213
|
+
mlog.debug(f'Could not read CUDA Toolkit\'s version file {version_file_path}: {e!s}')
|
|
214
|
+
|
|
215
|
+
return None
|
|
216
|
+
|
|
217
|
+
@classmethod
|
|
218
|
+
def _strip_patch_version(cls, version: str) -> str:
|
|
219
|
+
return '.'.join(version.split('.')[:2])
|
|
220
|
+
|
|
221
|
+
def _detect_arch_libdir(self) -> str:
|
|
222
|
+
arch = detect_cpu_family(self.env.coredata.compilers.host)
|
|
223
|
+
machine = self.env.machines[self.for_machine]
|
|
224
|
+
msg = '{} architecture is not supported in {} version of the CUDA Toolkit.'
|
|
225
|
+
if machine.is_windows():
|
|
226
|
+
libdirs = {'x86': 'Win32', 'x86_64': 'x64'}
|
|
227
|
+
if arch not in libdirs:
|
|
228
|
+
raise DependencyException(msg.format(arch, 'Windows'))
|
|
229
|
+
return os.path.join('lib', libdirs[arch])
|
|
230
|
+
elif machine.is_linux():
|
|
231
|
+
libdirs = {'x86_64': 'lib64', 'ppc64': 'lib', 'aarch64': 'lib64', 'loongarch64': 'lib64'}
|
|
232
|
+
if arch not in libdirs:
|
|
233
|
+
raise DependencyException(msg.format(arch, 'Linux'))
|
|
234
|
+
return libdirs[arch]
|
|
235
|
+
elif machine.is_darwin():
|
|
236
|
+
libdirs = {'x86_64': 'lib64'}
|
|
237
|
+
if arch not in libdirs:
|
|
238
|
+
raise DependencyException(msg.format(arch, 'macOS'))
|
|
239
|
+
return libdirs[arch]
|
|
240
|
+
else:
|
|
241
|
+
raise DependencyException('CUDA Toolkit: unsupported platform.')
|
|
242
|
+
|
|
243
|
+
def _find_requested_libraries(self) -> bool:
|
|
244
|
+
all_found = True
|
|
245
|
+
|
|
246
|
+
for module in self.requested_modules:
|
|
247
|
+
args = self.clib_compiler.find_library(module, self.env, [self.libdir] if self.libdir else [])
|
|
248
|
+
if args is None:
|
|
249
|
+
self._report_dependency_error(f'Couldn\'t find requested CUDA module \'{module}\'')
|
|
250
|
+
all_found = False
|
|
251
|
+
else:
|
|
252
|
+
mlog.debug(f'Link args for CUDA module \'{module}\' are {args}')
|
|
253
|
+
self.lib_modules[module] = args
|
|
254
|
+
|
|
255
|
+
return all_found
|
|
256
|
+
|
|
257
|
+
def _is_windows(self) -> bool:
|
|
258
|
+
return self.env.machines[self.for_machine].is_windows()
|
|
259
|
+
|
|
260
|
+
@T.overload
|
|
261
|
+
def _report_dependency_error(self, msg: str) -> None: ...
|
|
262
|
+
|
|
263
|
+
@T.overload
|
|
264
|
+
def _report_dependency_error(self, msg: str, ret_val: TV_ResultTuple) -> TV_ResultTuple: ... # noqa: F811
|
|
265
|
+
|
|
266
|
+
def _report_dependency_error(self, msg: str, ret_val: T.Optional[TV_ResultTuple] = None) -> T.Optional[TV_ResultTuple]: # noqa: F811
|
|
267
|
+
if self.required:
|
|
268
|
+
raise DependencyException(msg)
|
|
269
|
+
|
|
270
|
+
mlog.debug(msg)
|
|
271
|
+
return ret_val
|
|
272
|
+
|
|
273
|
+
def log_details(self) -> str:
|
|
274
|
+
module_str = ', '.join(self.requested_modules)
|
|
275
|
+
return 'modules: ' + module_str
|
|
276
|
+
|
|
277
|
+
def log_info(self) -> str:
|
|
278
|
+
return self.cuda_path if self.cuda_path else ''
|
|
279
|
+
|
|
280
|
+
def get_requested(self, kwargs: T.Dict[str, T.Any]) -> T.List[str]:
|
|
281
|
+
candidates = mesonlib.extract_as_list(kwargs, 'modules')
|
|
282
|
+
for c in candidates:
|
|
283
|
+
if not isinstance(c, str):
|
|
284
|
+
raise DependencyException('CUDA module argument is not a string.')
|
|
285
|
+
return candidates
|
|
286
|
+
|
|
287
|
+
def get_link_args(self, language: T.Optional[str] = None, raw: bool = False) -> T.List[str]:
|
|
288
|
+
args: T.List[str] = []
|
|
289
|
+
if self.libdir:
|
|
290
|
+
args += self.clib_compiler.get_linker_search_args(self.libdir)
|
|
291
|
+
for lib in self.requested_modules:
|
|
292
|
+
args += self.lib_modules[lib]
|
|
293
|
+
return args
|
|
294
|
+
|
|
295
|
+
packages['cuda'] = CudaDependency
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# fail noisily if attempt to use this file without setting:
|
|
2
|
+
# cmake_minimum_required(VERSION ${CMAKE_VERSION})
|
|
3
|
+
# project(... LANGUAGES ...)
|
|
4
|
+
|
|
5
|
+
cmake_policy(SET CMP0000 NEW)
|
|
6
|
+
|
|
7
|
+
set(PACKAGE_FOUND FALSE)
|
|
8
|
+
set(_packageName "${NAME}")
|
|
9
|
+
string(TOUPPER "${_packageName}" PACKAGE_NAME)
|
|
10
|
+
|
|
11
|
+
if("${STATIC}" STREQUAL "True")
|
|
12
|
+
set("${NAME}_USE_STATIC_LIBS" "ON")
|
|
13
|
+
endif()
|
|
14
|
+
|
|
15
|
+
while(TRUE)
|
|
16
|
+
if ("${VERSION}" STREQUAL "")
|
|
17
|
+
find_package("${NAME}" QUIET COMPONENTS ${COMPS})
|
|
18
|
+
else()
|
|
19
|
+
find_package("${NAME}" "${VERSION}" QUIET COMPONENTS ${COMPS})
|
|
20
|
+
endif()
|
|
21
|
+
|
|
22
|
+
# ARCHS has to be set via the CMD interface
|
|
23
|
+
if(${_packageName}_FOUND OR ${PACKAGE_NAME}_FOUND OR "${ARCHS}" STREQUAL "")
|
|
24
|
+
break()
|
|
25
|
+
endif()
|
|
26
|
+
|
|
27
|
+
list(GET ARCHS 0 CMAKE_LIBRARY_ARCHITECTURE)
|
|
28
|
+
list(REMOVE_AT ARCHS 0)
|
|
29
|
+
endwhile()
|
|
30
|
+
|
|
31
|
+
if(${_packageName}_FOUND OR ${PACKAGE_NAME}_FOUND)
|
|
32
|
+
set(PACKAGE_FOUND TRUE)
|
|
33
|
+
|
|
34
|
+
# Check the following variables:
|
|
35
|
+
# FOO_VERSION
|
|
36
|
+
# Foo_VERSION
|
|
37
|
+
# FOO_VERSION_STRING
|
|
38
|
+
# Foo_VERSION_STRING
|
|
39
|
+
if(NOT DEFINED PACKAGE_VERSION)
|
|
40
|
+
if(DEFINED ${_packageName}_VERSION)
|
|
41
|
+
set(PACKAGE_VERSION "${${_packageName}_VERSION}")
|
|
42
|
+
elseif(DEFINED ${PACKAGE_NAME}_VERSION)
|
|
43
|
+
set(PACKAGE_VERSION "${${PACKAGE_NAME}_VERSION}")
|
|
44
|
+
elseif(DEFINED ${_packageName}_VERSION_STRING)
|
|
45
|
+
set(PACKAGE_VERSION "${${_packageName}_VERSION_STRING}")
|
|
46
|
+
elseif(DEFINED ${PACKAGE_NAME}_VERSION_STRING)
|
|
47
|
+
set(PACKAGE_VERSION "${${PACKAGE_NAME}_VERSION_STRING}")
|
|
48
|
+
endif()
|
|
49
|
+
endif()
|
|
50
|
+
|
|
51
|
+
# Check the following variables:
|
|
52
|
+
# FOO_LIBRARIES
|
|
53
|
+
# Foo_LIBRARIES
|
|
54
|
+
# FOO_LIBS
|
|
55
|
+
# Foo_LIBS
|
|
56
|
+
set(libs)
|
|
57
|
+
if(DEFINED ${_packageName}_LIBRARIES)
|
|
58
|
+
set(libs ${_packageName}_LIBRARIES)
|
|
59
|
+
elseif(DEFINED ${PACKAGE_NAME}_LIBRARIES)
|
|
60
|
+
set(libs ${PACKAGE_NAME}_LIBRARIES)
|
|
61
|
+
elseif(DEFINED ${_packageName}_LIBS)
|
|
62
|
+
set(libs ${_packageName}_LIBS)
|
|
63
|
+
elseif(DEFINED ${PACKAGE_NAME}_LIBS)
|
|
64
|
+
set(libs ${PACKAGE_NAME}_LIBS)
|
|
65
|
+
endif()
|
|
66
|
+
|
|
67
|
+
# Check the following variables:
|
|
68
|
+
# FOO_INCLUDE_DIRS
|
|
69
|
+
# Foo_INCLUDE_DIRS
|
|
70
|
+
# FOO_INCLUDES
|
|
71
|
+
# Foo_INCLUDES
|
|
72
|
+
# FOO_INCLUDE_DIR
|
|
73
|
+
# Foo_INCLUDE_DIR
|
|
74
|
+
set(includes)
|
|
75
|
+
if(DEFINED ${_packageName}_INCLUDE_DIRS)
|
|
76
|
+
set(includes ${_packageName}_INCLUDE_DIRS)
|
|
77
|
+
elseif(DEFINED ${PACKAGE_NAME}_INCLUDE_DIRS)
|
|
78
|
+
set(includes ${PACKAGE_NAME}_INCLUDE_DIRS)
|
|
79
|
+
elseif(DEFINED ${_packageName}_INCLUDES)
|
|
80
|
+
set(includes ${_packageName}_INCLUDES)
|
|
81
|
+
elseif(DEFINED ${PACKAGE_NAME}_INCLUDES)
|
|
82
|
+
set(includes ${PACKAGE_NAME}_INCLUDES)
|
|
83
|
+
elseif(DEFINED ${_packageName}_INCLUDE_DIR)
|
|
84
|
+
set(includes ${_packageName}_INCLUDE_DIR)
|
|
85
|
+
elseif(DEFINED ${PACKAGE_NAME}_INCLUDE_DIR)
|
|
86
|
+
set(includes ${PACKAGE_NAME}_INCLUDE_DIR)
|
|
87
|
+
endif()
|
|
88
|
+
|
|
89
|
+
# Check the following variables:
|
|
90
|
+
# FOO_DEFINITIONS
|
|
91
|
+
# Foo_DEFINITIONS
|
|
92
|
+
set(definitions)
|
|
93
|
+
if(DEFINED ${_packageName}_DEFINITIONS)
|
|
94
|
+
set(definitions ${_packageName}_DEFINITIONS)
|
|
95
|
+
elseif(DEFINED ${PACKAGE_NAME}_DEFINITIONS)
|
|
96
|
+
set(definitions ${PACKAGE_NAME}_DEFINITIONS)
|
|
97
|
+
endif()
|
|
98
|
+
|
|
99
|
+
set(PACKAGE_INCLUDE_DIRS "${${includes}}")
|
|
100
|
+
set(PACKAGE_DEFINITIONS "${${definitions}}")
|
|
101
|
+
set(PACKAGE_LIBRARIES "${${libs}}")
|
|
102
|
+
endif()
|