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,621 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2015 The Meson development team
|
|
3
|
+
# Copyright © 2021-2023 Intel Corporation
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import shutil
|
|
9
|
+
import typing as T
|
|
10
|
+
import xml.etree.ElementTree as ET
|
|
11
|
+
|
|
12
|
+
from . import ModuleReturnValue, ExtensionModule
|
|
13
|
+
from .. import build
|
|
14
|
+
from .. import coredata
|
|
15
|
+
from .. import mlog
|
|
16
|
+
from ..dependencies import find_external_dependency, Dependency, ExternalLibrary, InternalDependency
|
|
17
|
+
from ..mesonlib import MesonException, File, version_compare, Popen_safe
|
|
18
|
+
from ..interpreter import extract_required_kwarg
|
|
19
|
+
from ..interpreter.type_checking import INSTALL_DIR_KW, INSTALL_KW, NoneType
|
|
20
|
+
from ..interpreterbase import ContainerTypeInfo, FeatureDeprecated, KwargInfo, noPosargs, FeatureNew, typed_kwargs
|
|
21
|
+
from ..programs import NonExistingExternalProgram
|
|
22
|
+
|
|
23
|
+
if T.TYPE_CHECKING:
|
|
24
|
+
from . import ModuleState
|
|
25
|
+
from ..dependencies.qt import QtPkgConfigDependency, QmakeQtDependency
|
|
26
|
+
from ..interpreter import Interpreter
|
|
27
|
+
from ..interpreter import kwargs
|
|
28
|
+
from ..mesonlib import FileOrString
|
|
29
|
+
from ..programs import ExternalProgram
|
|
30
|
+
|
|
31
|
+
QtDependencyType = T.Union[QtPkgConfigDependency, QmakeQtDependency]
|
|
32
|
+
|
|
33
|
+
from typing_extensions import TypedDict
|
|
34
|
+
|
|
35
|
+
class ResourceCompilerKwArgs(TypedDict):
|
|
36
|
+
|
|
37
|
+
"""Keyword arguments for the Resource Compiler method."""
|
|
38
|
+
|
|
39
|
+
name: T.Optional[str]
|
|
40
|
+
sources: T.Sequence[T.Union[FileOrString, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
|
|
41
|
+
extra_args: T.List[str]
|
|
42
|
+
method: str
|
|
43
|
+
|
|
44
|
+
class UICompilerKwArgs(TypedDict):
|
|
45
|
+
|
|
46
|
+
"""Keyword arguments for the Ui Compiler method."""
|
|
47
|
+
|
|
48
|
+
sources: T.Sequence[T.Union[FileOrString, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
|
|
49
|
+
extra_args: T.List[str]
|
|
50
|
+
method: str
|
|
51
|
+
preserve_paths: bool
|
|
52
|
+
|
|
53
|
+
class MocCompilerKwArgs(TypedDict):
|
|
54
|
+
|
|
55
|
+
"""Keyword arguments for the Moc Compiler method."""
|
|
56
|
+
|
|
57
|
+
sources: T.Sequence[T.Union[FileOrString, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
|
|
58
|
+
headers: T.Sequence[T.Union[FileOrString, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
|
|
59
|
+
extra_args: T.List[str]
|
|
60
|
+
method: str
|
|
61
|
+
include_directories: T.List[T.Union[str, build.IncludeDirs]]
|
|
62
|
+
dependencies: T.List[T.Union[Dependency, ExternalLibrary]]
|
|
63
|
+
preserve_paths: bool
|
|
64
|
+
|
|
65
|
+
class PreprocessKwArgs(TypedDict):
|
|
66
|
+
|
|
67
|
+
sources: T.List[FileOrString]
|
|
68
|
+
moc_sources: T.List[T.Union[FileOrString, build.CustomTarget]]
|
|
69
|
+
moc_headers: T.List[T.Union[FileOrString, build.CustomTarget]]
|
|
70
|
+
qresources: T.List[FileOrString]
|
|
71
|
+
ui_files: T.List[T.Union[FileOrString, build.CustomTarget]]
|
|
72
|
+
moc_extra_arguments: T.List[str]
|
|
73
|
+
rcc_extra_arguments: T.List[str]
|
|
74
|
+
uic_extra_arguments: T.List[str]
|
|
75
|
+
include_directories: T.List[T.Union[str, build.IncludeDirs]]
|
|
76
|
+
dependencies: T.List[T.Union[Dependency, ExternalLibrary]]
|
|
77
|
+
method: str
|
|
78
|
+
preserve_paths: bool
|
|
79
|
+
|
|
80
|
+
class HasToolKwArgs(kwargs.ExtractRequired):
|
|
81
|
+
|
|
82
|
+
method: str
|
|
83
|
+
|
|
84
|
+
class CompileTranslationsKwArgs(TypedDict):
|
|
85
|
+
|
|
86
|
+
build_by_default: bool
|
|
87
|
+
install: bool
|
|
88
|
+
install_dir: T.Optional[str]
|
|
89
|
+
method: str
|
|
90
|
+
qresource: T.Optional[str]
|
|
91
|
+
rcc_extra_arguments: T.List[str]
|
|
92
|
+
ts_files: T.List[T.Union[str, File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
|
|
93
|
+
|
|
94
|
+
class QtBaseModule(ExtensionModule):
|
|
95
|
+
_tools_detected = False
|
|
96
|
+
_rcc_supports_depfiles = False
|
|
97
|
+
_moc_supports_depfiles = False
|
|
98
|
+
|
|
99
|
+
def __init__(self, interpreter: 'Interpreter', qt_version: int = 5):
|
|
100
|
+
ExtensionModule.__init__(self, interpreter)
|
|
101
|
+
self.qt_version = qt_version
|
|
102
|
+
# It is important that this list does not change order as the order of
|
|
103
|
+
# the returned ExternalPrograms will change as well
|
|
104
|
+
self.tools: T.Dict[str, T.Union[ExternalProgram, build.Executable]] = {
|
|
105
|
+
'moc': NonExistingExternalProgram('moc'),
|
|
106
|
+
'uic': NonExistingExternalProgram('uic'),
|
|
107
|
+
'rcc': NonExistingExternalProgram('rcc'),
|
|
108
|
+
'lrelease': NonExistingExternalProgram('lrelease'),
|
|
109
|
+
}
|
|
110
|
+
self.methods.update({
|
|
111
|
+
'has_tools': self.has_tools,
|
|
112
|
+
'preprocess': self.preprocess,
|
|
113
|
+
'compile_translations': self.compile_translations,
|
|
114
|
+
'compile_resources': self.compile_resources,
|
|
115
|
+
'compile_ui': self.compile_ui,
|
|
116
|
+
'compile_moc': self.compile_moc,
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
def compilers_detect(self, state: 'ModuleState', qt_dep: 'QtDependencyType') -> None:
|
|
120
|
+
"""Detect Qt (4 or 5) moc, uic, rcc in the specified bindir or in PATH"""
|
|
121
|
+
wanted = f'== {qt_dep.version}'
|
|
122
|
+
|
|
123
|
+
def gen_bins() -> T.Generator[T.Tuple[str, str], None, None]:
|
|
124
|
+
for b in self.tools:
|
|
125
|
+
if qt_dep.bindir:
|
|
126
|
+
yield os.path.join(qt_dep.bindir, b), b
|
|
127
|
+
if qt_dep.libexecdir:
|
|
128
|
+
yield os.path.join(qt_dep.libexecdir, b), b
|
|
129
|
+
# prefer the (official) <tool><version> or (unofficial) <tool>-qt<version>
|
|
130
|
+
# of the tool to the plain one, as we
|
|
131
|
+
# don't know what the unsuffixed one points to without calling it.
|
|
132
|
+
yield f'{b}{qt_dep.qtver}', b
|
|
133
|
+
yield f'{b}-qt{qt_dep.qtver}', b
|
|
134
|
+
yield b, b
|
|
135
|
+
|
|
136
|
+
for b, name in gen_bins():
|
|
137
|
+
if self.tools[name].found():
|
|
138
|
+
continue
|
|
139
|
+
|
|
140
|
+
if name == 'lrelease':
|
|
141
|
+
arg = ['-version']
|
|
142
|
+
elif version_compare(qt_dep.version, '>= 5'):
|
|
143
|
+
arg = ['--version']
|
|
144
|
+
else:
|
|
145
|
+
arg = ['-v']
|
|
146
|
+
|
|
147
|
+
# Ensure that the version of qt and each tool are the same
|
|
148
|
+
def get_version(p: T.Union[ExternalProgram, build.Executable]) -> str:
|
|
149
|
+
_, out, err = Popen_safe(p.get_command() + arg)
|
|
150
|
+
if name == 'lrelease' or not qt_dep.version.startswith('4'):
|
|
151
|
+
care = out
|
|
152
|
+
else:
|
|
153
|
+
care = err
|
|
154
|
+
return care.rsplit(' ', maxsplit=1)[-1].replace(')', '').strip()
|
|
155
|
+
|
|
156
|
+
p = state.find_program(b, required=False,
|
|
157
|
+
version_func=get_version,
|
|
158
|
+
wanted=wanted)
|
|
159
|
+
if p.found():
|
|
160
|
+
self.tools[name] = p
|
|
161
|
+
|
|
162
|
+
def _detect_tools(self, state: 'ModuleState', method: str, required: bool = True) -> None:
|
|
163
|
+
if self._tools_detected:
|
|
164
|
+
return
|
|
165
|
+
self._tools_detected = True
|
|
166
|
+
mlog.log(f'Detecting Qt{self.qt_version} tools')
|
|
167
|
+
kwargs = {'required': required, 'modules': 'Core', 'method': method}
|
|
168
|
+
# Just pick one to make mypy happy
|
|
169
|
+
qt = T.cast('QtPkgConfigDependency', find_external_dependency(f'qt{self.qt_version}', state.environment, kwargs))
|
|
170
|
+
if qt.found():
|
|
171
|
+
# Get all tools and then make sure that they are the right version
|
|
172
|
+
self.compilers_detect(state, qt)
|
|
173
|
+
if version_compare(qt.version, '>=5.15.0'):
|
|
174
|
+
self._moc_supports_depfiles = True
|
|
175
|
+
else:
|
|
176
|
+
mlog.warning('moc dependencies will not work properly until you move to Qt >= 5.15', fatal=False)
|
|
177
|
+
if version_compare(qt.version, '>=5.14.0'):
|
|
178
|
+
self._rcc_supports_depfiles = True
|
|
179
|
+
else:
|
|
180
|
+
mlog.warning('rcc dependencies will not work properly until you move to Qt >= 5.14:',
|
|
181
|
+
mlog.bold('https://bugreports.qt.io/browse/QTBUG-45460'), fatal=False)
|
|
182
|
+
else:
|
|
183
|
+
suffix = f'-qt{self.qt_version}'
|
|
184
|
+
self.tools['moc'] = NonExistingExternalProgram(name='moc' + suffix)
|
|
185
|
+
self.tools['uic'] = NonExistingExternalProgram(name='uic' + suffix)
|
|
186
|
+
self.tools['rcc'] = NonExistingExternalProgram(name='rcc' + suffix)
|
|
187
|
+
self.tools['lrelease'] = NonExistingExternalProgram(name='lrelease' + suffix)
|
|
188
|
+
|
|
189
|
+
@staticmethod
|
|
190
|
+
def _qrc_nodes(state: 'ModuleState', rcc_file: 'FileOrString') -> T.Tuple[str, T.List[str]]:
|
|
191
|
+
abspath: str
|
|
192
|
+
if isinstance(rcc_file, str):
|
|
193
|
+
abspath = os.path.join(state.environment.source_dir, state.subdir, rcc_file)
|
|
194
|
+
else:
|
|
195
|
+
abspath = rcc_file.absolute_path(state.environment.source_dir, state.environment.build_dir)
|
|
196
|
+
rcc_dirname = os.path.dirname(abspath)
|
|
197
|
+
|
|
198
|
+
# FIXME: what error are we actually trying to check here? (probably parse errors?)
|
|
199
|
+
try:
|
|
200
|
+
tree = ET.parse(abspath)
|
|
201
|
+
root = tree.getroot()
|
|
202
|
+
result: T.List[str] = []
|
|
203
|
+
for child in root[0]:
|
|
204
|
+
if child.tag != 'file':
|
|
205
|
+
mlog.warning("malformed rcc file: ", os.path.join(state.subdir, str(rcc_file)))
|
|
206
|
+
break
|
|
207
|
+
elif child.text is None:
|
|
208
|
+
raise MesonException(f'<file> element without a path in {os.path.join(state.subdir, str(rcc_file))}')
|
|
209
|
+
else:
|
|
210
|
+
result.append(child.text)
|
|
211
|
+
|
|
212
|
+
return rcc_dirname, result
|
|
213
|
+
except MesonException:
|
|
214
|
+
raise
|
|
215
|
+
except Exception:
|
|
216
|
+
raise MesonException(f'Unable to parse resource file {abspath}')
|
|
217
|
+
|
|
218
|
+
def _parse_qrc_deps(self, state: 'ModuleState',
|
|
219
|
+
rcc_file_: T.Union['FileOrString', build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]) -> T.List[File]:
|
|
220
|
+
result: T.List[File] = []
|
|
221
|
+
inputs: T.Sequence['FileOrString'] = []
|
|
222
|
+
if isinstance(rcc_file_, (str, File)):
|
|
223
|
+
inputs = [rcc_file_]
|
|
224
|
+
else:
|
|
225
|
+
inputs = rcc_file_.get_outputs()
|
|
226
|
+
|
|
227
|
+
for rcc_file in inputs:
|
|
228
|
+
rcc_dirname, nodes = self._qrc_nodes(state, rcc_file)
|
|
229
|
+
for resource_path in nodes:
|
|
230
|
+
# We need to guess if the pointed resource is:
|
|
231
|
+
# a) in build directory -> implies a generated file
|
|
232
|
+
# b) in source directory
|
|
233
|
+
# c) somewhere else external dependency file to bundle
|
|
234
|
+
#
|
|
235
|
+
# Also from qrc documentation: relative path are always from qrc file
|
|
236
|
+
# So relative path must always be computed from qrc file !
|
|
237
|
+
if os.path.isabs(resource_path):
|
|
238
|
+
# a)
|
|
239
|
+
if resource_path.startswith(os.path.abspath(state.environment.build_dir)):
|
|
240
|
+
resource_relpath = os.path.relpath(resource_path, state.environment.build_dir)
|
|
241
|
+
result.append(File(is_built=True, subdir='', fname=resource_relpath))
|
|
242
|
+
# either b) or c)
|
|
243
|
+
else:
|
|
244
|
+
result.append(File(is_built=False, subdir=state.subdir, fname=resource_path))
|
|
245
|
+
else:
|
|
246
|
+
path_from_rcc = os.path.normpath(os.path.join(rcc_dirname, resource_path))
|
|
247
|
+
# a)
|
|
248
|
+
if path_from_rcc.startswith(state.environment.build_dir):
|
|
249
|
+
result.append(File(is_built=True, subdir=state.subdir, fname=resource_path))
|
|
250
|
+
# b)
|
|
251
|
+
else:
|
|
252
|
+
result.append(File(is_built=False, subdir=state.subdir, fname=path_from_rcc))
|
|
253
|
+
return result
|
|
254
|
+
|
|
255
|
+
@FeatureNew('qt.has_tools', '0.54.0')
|
|
256
|
+
@noPosargs
|
|
257
|
+
@typed_kwargs(
|
|
258
|
+
'qt.has_tools',
|
|
259
|
+
KwargInfo('required', (bool, coredata.UserFeatureOption), default=False),
|
|
260
|
+
KwargInfo('method', str, default='auto'),
|
|
261
|
+
)
|
|
262
|
+
def has_tools(self, state: 'ModuleState', args: T.Tuple, kwargs: 'HasToolKwArgs') -> bool:
|
|
263
|
+
method = kwargs.get('method', 'auto')
|
|
264
|
+
# We have to cast here because TypedDicts are invariant, even though
|
|
265
|
+
# ExtractRequiredKwArgs is a subset of HasToolKwArgs, type checkers
|
|
266
|
+
# will insist this is wrong
|
|
267
|
+
disabled, required, feature = extract_required_kwarg(kwargs, state.subproject, default=False)
|
|
268
|
+
if disabled:
|
|
269
|
+
mlog.log('qt.has_tools skipped: feature', mlog.bold(feature), 'disabled')
|
|
270
|
+
return False
|
|
271
|
+
self._detect_tools(state, method, required=False)
|
|
272
|
+
for tool in self.tools.values():
|
|
273
|
+
if not tool.found():
|
|
274
|
+
if required:
|
|
275
|
+
raise MesonException('Qt tools not found')
|
|
276
|
+
return False
|
|
277
|
+
return True
|
|
278
|
+
|
|
279
|
+
@FeatureNew('qt.compile_resources', '0.59.0')
|
|
280
|
+
@noPosargs
|
|
281
|
+
@typed_kwargs(
|
|
282
|
+
'qt.compile_resources',
|
|
283
|
+
KwargInfo('name', (str, NoneType)),
|
|
284
|
+
KwargInfo(
|
|
285
|
+
'sources',
|
|
286
|
+
ContainerTypeInfo(list, (File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList), allow_empty=False),
|
|
287
|
+
listify=True,
|
|
288
|
+
required=True,
|
|
289
|
+
),
|
|
290
|
+
KwargInfo('extra_args', ContainerTypeInfo(list, str), listify=True, default=[]),
|
|
291
|
+
KwargInfo('method', str, default='auto')
|
|
292
|
+
)
|
|
293
|
+
def compile_resources(self, state: 'ModuleState', args: T.Tuple, kwargs: 'ResourceCompilerKwArgs') -> ModuleReturnValue:
|
|
294
|
+
"""Compile Qt resources files.
|
|
295
|
+
|
|
296
|
+
Uses CustomTargets to generate .cpp files from .qrc files.
|
|
297
|
+
"""
|
|
298
|
+
if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in kwargs['sources']):
|
|
299
|
+
FeatureNew.single_use('qt.compile_resources: custom_target or generator for "sources" keyword argument',
|
|
300
|
+
'0.60.0', state.subproject, location=state.current_node)
|
|
301
|
+
out = self._compile_resources_impl(state, kwargs)
|
|
302
|
+
return ModuleReturnValue(out, [out])
|
|
303
|
+
|
|
304
|
+
def _compile_resources_impl(self, state: 'ModuleState', kwargs: 'ResourceCompilerKwArgs') -> T.List[build.CustomTarget]:
|
|
305
|
+
# Avoid the FeatureNew when dispatching from preprocess
|
|
306
|
+
self._detect_tools(state, kwargs['method'])
|
|
307
|
+
if not self.tools['rcc'].found():
|
|
308
|
+
err_msg = ("{0} sources specified and couldn't find {1}, "
|
|
309
|
+
"please check your qt{2} installation")
|
|
310
|
+
raise MesonException(err_msg.format('RCC', f'rcc-qt{self.qt_version}', self.qt_version))
|
|
311
|
+
|
|
312
|
+
# List of generated CustomTargets
|
|
313
|
+
targets: T.List[build.CustomTarget] = []
|
|
314
|
+
|
|
315
|
+
# depfile arguments
|
|
316
|
+
DEPFILE_ARGS: T.List[str] = ['--depfile', '@DEPFILE@'] if self._rcc_supports_depfiles else []
|
|
317
|
+
|
|
318
|
+
name = kwargs['name']
|
|
319
|
+
sources: T.List['FileOrString'] = []
|
|
320
|
+
for s in kwargs['sources']:
|
|
321
|
+
if isinstance(s, (str, File)):
|
|
322
|
+
sources.append(s)
|
|
323
|
+
else:
|
|
324
|
+
sources.extend(s.get_outputs())
|
|
325
|
+
extra_args = kwargs['extra_args']
|
|
326
|
+
|
|
327
|
+
# If a name was set generate a single .cpp file from all of the qrc
|
|
328
|
+
# files, otherwise generate one .cpp file per qrc file.
|
|
329
|
+
if name:
|
|
330
|
+
qrc_deps: T.List[File] = []
|
|
331
|
+
for s in sources:
|
|
332
|
+
qrc_deps.extend(self._parse_qrc_deps(state, s))
|
|
333
|
+
|
|
334
|
+
res_target = build.CustomTarget(
|
|
335
|
+
name,
|
|
336
|
+
state.subdir,
|
|
337
|
+
state.subproject,
|
|
338
|
+
state.environment,
|
|
339
|
+
self.tools['rcc'].get_command() + ['-name', name, '-o', '@OUTPUT@'] + extra_args + ['@INPUT@'] + DEPFILE_ARGS,
|
|
340
|
+
sources,
|
|
341
|
+
[f'{name}.cpp'],
|
|
342
|
+
state.is_build_only_subproject,
|
|
343
|
+
depend_files=qrc_deps,
|
|
344
|
+
depfile=f'{name}.d',
|
|
345
|
+
description='Compiling Qt resources {}',
|
|
346
|
+
)
|
|
347
|
+
targets.append(res_target)
|
|
348
|
+
else:
|
|
349
|
+
for rcc_file in sources:
|
|
350
|
+
qrc_deps = self._parse_qrc_deps(state, rcc_file)
|
|
351
|
+
if isinstance(rcc_file, str):
|
|
352
|
+
basename = os.path.basename(rcc_file)
|
|
353
|
+
else:
|
|
354
|
+
basename = os.path.basename(rcc_file.fname)
|
|
355
|
+
name = f'qt{self.qt_version}-{basename.replace(".", "_")}'
|
|
356
|
+
res_target = build.CustomTarget(
|
|
357
|
+
name,
|
|
358
|
+
state.subdir,
|
|
359
|
+
state.subproject,
|
|
360
|
+
state.environment,
|
|
361
|
+
self.tools['rcc'].get_command() + ['-name', '@BASENAME@', '-o', '@OUTPUT@'] + extra_args + ['@INPUT@'] + DEPFILE_ARGS,
|
|
362
|
+
[rcc_file],
|
|
363
|
+
[f'{name}.cpp'],
|
|
364
|
+
state.is_build_only_subproject,
|
|
365
|
+
depend_files=qrc_deps,
|
|
366
|
+
depfile=f'{name}.d',
|
|
367
|
+
description='Compiling Qt resources {}',
|
|
368
|
+
)
|
|
369
|
+
targets.append(res_target)
|
|
370
|
+
|
|
371
|
+
return targets
|
|
372
|
+
|
|
373
|
+
@FeatureNew('qt.compile_ui', '0.59.0')
|
|
374
|
+
@noPosargs
|
|
375
|
+
@typed_kwargs(
|
|
376
|
+
'qt.compile_ui',
|
|
377
|
+
KwargInfo(
|
|
378
|
+
'sources',
|
|
379
|
+
ContainerTypeInfo(list, (File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList), allow_empty=False),
|
|
380
|
+
listify=True,
|
|
381
|
+
required=True,
|
|
382
|
+
),
|
|
383
|
+
KwargInfo('extra_args', ContainerTypeInfo(list, str), listify=True, default=[]),
|
|
384
|
+
KwargInfo('method', str, default='auto'),
|
|
385
|
+
KwargInfo('preserve_paths', bool, default=False, since='1.4.0'),
|
|
386
|
+
)
|
|
387
|
+
def compile_ui(self, state: ModuleState, args: T.Tuple, kwargs: UICompilerKwArgs) -> ModuleReturnValue:
|
|
388
|
+
"""Compile UI resources into cpp headers."""
|
|
389
|
+
if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in kwargs['sources']):
|
|
390
|
+
FeatureNew.single_use('qt.compile_ui: custom_target or generator for "sources" keyword argument',
|
|
391
|
+
'0.60.0', state.subproject, location=state.current_node)
|
|
392
|
+
out = self._compile_ui_impl(state, kwargs)
|
|
393
|
+
return ModuleReturnValue(out, [out])
|
|
394
|
+
|
|
395
|
+
def _compile_ui_impl(self, state: ModuleState, kwargs: UICompilerKwArgs) -> build.GeneratedList:
|
|
396
|
+
# Avoid the FeatureNew when dispatching from preprocess
|
|
397
|
+
self._detect_tools(state, kwargs['method'])
|
|
398
|
+
if not self.tools['uic'].found():
|
|
399
|
+
err_msg = ("{0} sources specified and couldn't find {1}, "
|
|
400
|
+
"please check your qt{2} installation")
|
|
401
|
+
raise MesonException(err_msg.format('UIC', f'uic-qt{self.qt_version}', self.qt_version))
|
|
402
|
+
|
|
403
|
+
preserve_path_from = os.path.join(state.source_root, state.subdir) if kwargs['preserve_paths'] else None
|
|
404
|
+
# TODO: This generator isn't added to the generator list in the Interpreter
|
|
405
|
+
gen = build.Generator(
|
|
406
|
+
self.tools['uic'],
|
|
407
|
+
kwargs['extra_args'] + ['-o', '@OUTPUT@', '@INPUT@'],
|
|
408
|
+
['ui_@BASENAME@.h'],
|
|
409
|
+
name=f'Qt{self.qt_version} ui')
|
|
410
|
+
return gen.process_files(kwargs['sources'], state, preserve_path_from)
|
|
411
|
+
|
|
412
|
+
@FeatureNew('qt.compile_moc', '0.59.0')
|
|
413
|
+
@noPosargs
|
|
414
|
+
@typed_kwargs(
|
|
415
|
+
'qt.compile_moc',
|
|
416
|
+
KwargInfo(
|
|
417
|
+
'sources',
|
|
418
|
+
ContainerTypeInfo(list, (File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)),
|
|
419
|
+
listify=True,
|
|
420
|
+
default=[],
|
|
421
|
+
),
|
|
422
|
+
KwargInfo(
|
|
423
|
+
'headers',
|
|
424
|
+
ContainerTypeInfo(list, (File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)),
|
|
425
|
+
listify=True,
|
|
426
|
+
default=[]
|
|
427
|
+
),
|
|
428
|
+
KwargInfo('extra_args', ContainerTypeInfo(list, str), listify=True, default=[]),
|
|
429
|
+
KwargInfo('method', str, default='auto'),
|
|
430
|
+
KwargInfo('include_directories', ContainerTypeInfo(list, (build.IncludeDirs, str)), listify=True, default=[]),
|
|
431
|
+
KwargInfo('dependencies', ContainerTypeInfo(list, (Dependency, ExternalLibrary)), listify=True, default=[]),
|
|
432
|
+
KwargInfo('preserve_paths', bool, default=False, since='1.4.0'),
|
|
433
|
+
)
|
|
434
|
+
def compile_moc(self, state: ModuleState, args: T.Tuple, kwargs: MocCompilerKwArgs) -> ModuleReturnValue:
|
|
435
|
+
if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in kwargs['headers']):
|
|
436
|
+
FeatureNew.single_use('qt.compile_moc: custom_target or generator for "headers" keyword argument',
|
|
437
|
+
'0.60.0', state.subproject, location=state.current_node)
|
|
438
|
+
if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in kwargs['sources']):
|
|
439
|
+
FeatureNew.single_use('qt.compile_moc: custom_target or generator for "sources" keyword argument',
|
|
440
|
+
'0.60.0', state.subproject, location=state.current_node)
|
|
441
|
+
out = self._compile_moc_impl(state, kwargs)
|
|
442
|
+
return ModuleReturnValue(out, [out])
|
|
443
|
+
|
|
444
|
+
def _compile_moc_impl(self, state: ModuleState, kwargs: MocCompilerKwArgs) -> T.List[build.GeneratedList]:
|
|
445
|
+
# Avoid the FeatureNew when dispatching from preprocess
|
|
446
|
+
self._detect_tools(state, kwargs['method'])
|
|
447
|
+
if not self.tools['moc'].found():
|
|
448
|
+
err_msg = ("{0} sources specified and couldn't find {1}, "
|
|
449
|
+
"please check your qt{2} installation")
|
|
450
|
+
raise MesonException(err_msg.format('MOC', f'uic-qt{self.qt_version}', self.qt_version))
|
|
451
|
+
|
|
452
|
+
if not (kwargs['headers'] or kwargs['sources']):
|
|
453
|
+
raise build.InvalidArguments('At least one of the "headers" or "sources" keyword arguments must be provided and not empty')
|
|
454
|
+
|
|
455
|
+
inc = state.get_include_args(include_dirs=kwargs['include_directories'])
|
|
456
|
+
compile_args: T.List[str] = []
|
|
457
|
+
for dep in kwargs['dependencies']:
|
|
458
|
+
compile_args.extend(a for a in dep.get_all_compile_args() if a.startswith(('-I', '-F', '-D')))
|
|
459
|
+
if isinstance(dep, InternalDependency):
|
|
460
|
+
for incl in dep.include_directories:
|
|
461
|
+
compile_args.extend(f'-I{i}' for i in incl.to_string_list(self.interpreter.source_root, self.interpreter.environment.build_dir))
|
|
462
|
+
|
|
463
|
+
output: T.List[build.GeneratedList] = []
|
|
464
|
+
|
|
465
|
+
# depfile arguments (defaults to <output-name>.d)
|
|
466
|
+
DEPFILE_ARGS: T.List[str] = ['--output-dep-file'] if self._moc_supports_depfiles else []
|
|
467
|
+
|
|
468
|
+
arguments = kwargs['extra_args'] + DEPFILE_ARGS + inc + compile_args + ['@INPUT@', '-o', '@OUTPUT@']
|
|
469
|
+
preserve_path_from = os.path.join(state.source_root, state.subdir) if kwargs['preserve_paths'] else None
|
|
470
|
+
if kwargs['headers']:
|
|
471
|
+
moc_gen = build.Generator(
|
|
472
|
+
self.tools['moc'], arguments, ['moc_@BASENAME@.cpp'],
|
|
473
|
+
depfile='moc_@BASENAME@.cpp.d',
|
|
474
|
+
name=f'Qt{self.qt_version} moc header')
|
|
475
|
+
output.append(moc_gen.process_files(kwargs['headers'], state, preserve_path_from))
|
|
476
|
+
if kwargs['sources']:
|
|
477
|
+
moc_gen = build.Generator(
|
|
478
|
+
self.tools['moc'], arguments, ['@BASENAME@.moc'],
|
|
479
|
+
depfile='@BASENAME@.moc.d',
|
|
480
|
+
name=f'Qt{self.qt_version} moc source')
|
|
481
|
+
output.append(moc_gen.process_files(kwargs['sources'], state, preserve_path_from))
|
|
482
|
+
|
|
483
|
+
return output
|
|
484
|
+
|
|
485
|
+
# We can't use typed_pos_args here, the signature is ambiguous
|
|
486
|
+
@typed_kwargs(
|
|
487
|
+
'qt.preprocess',
|
|
488
|
+
KwargInfo('sources', ContainerTypeInfo(list, (File, str)), listify=True, default=[], deprecated='0.59.0'),
|
|
489
|
+
KwargInfo('qresources', ContainerTypeInfo(list, (File, str)), listify=True, default=[]),
|
|
490
|
+
KwargInfo('ui_files', ContainerTypeInfo(list, (File, str, build.CustomTarget)), listify=True, default=[]),
|
|
491
|
+
KwargInfo('moc_sources', ContainerTypeInfo(list, (File, str, build.CustomTarget)), listify=True, default=[]),
|
|
492
|
+
KwargInfo('moc_headers', ContainerTypeInfo(list, (File, str, build.CustomTarget)), listify=True, default=[]),
|
|
493
|
+
KwargInfo('moc_extra_arguments', ContainerTypeInfo(list, str), listify=True, default=[], since='0.44.0'),
|
|
494
|
+
KwargInfo('rcc_extra_arguments', ContainerTypeInfo(list, str), listify=True, default=[], since='0.49.0'),
|
|
495
|
+
KwargInfo('uic_extra_arguments', ContainerTypeInfo(list, str), listify=True, default=[], since='0.49.0'),
|
|
496
|
+
KwargInfo('method', str, default='auto'),
|
|
497
|
+
KwargInfo('include_directories', ContainerTypeInfo(list, (build.IncludeDirs, str)), listify=True, default=[]),
|
|
498
|
+
KwargInfo('dependencies', ContainerTypeInfo(list, (Dependency, ExternalLibrary)), listify=True, default=[]),
|
|
499
|
+
KwargInfo('preserve_paths', bool, default=False, since='1.4.0'),
|
|
500
|
+
)
|
|
501
|
+
def preprocess(self, state: ModuleState, args: T.List[T.Union[str, File]], kwargs: PreprocessKwArgs) -> ModuleReturnValue:
|
|
502
|
+
_sources = args[1:]
|
|
503
|
+
if _sources:
|
|
504
|
+
FeatureDeprecated.single_use('qt.preprocess positional sources', '0.59', state.subproject, location=state.current_node)
|
|
505
|
+
# List is invariant, os we have to cast...
|
|
506
|
+
sources = T.cast('T.List[T.Union[str, File, build.GeneratedList, build.CustomTarget]]',
|
|
507
|
+
_sources + kwargs['sources'])
|
|
508
|
+
for s in sources:
|
|
509
|
+
if not isinstance(s, (str, File)):
|
|
510
|
+
raise build.InvalidArguments('Variadic arguments to qt.preprocess must be Strings or Files')
|
|
511
|
+
method = kwargs['method']
|
|
512
|
+
|
|
513
|
+
if kwargs['qresources']:
|
|
514
|
+
# custom output name set? -> one output file, multiple otherwise
|
|
515
|
+
rcc_kwargs: ResourceCompilerKwArgs = {'name': '', 'sources': kwargs['qresources'], 'extra_args': kwargs['rcc_extra_arguments'], 'method': method}
|
|
516
|
+
if args:
|
|
517
|
+
name = args[0]
|
|
518
|
+
if not isinstance(name, str):
|
|
519
|
+
raise build.InvalidArguments('First argument to qt.preprocess must be a string')
|
|
520
|
+
rcc_kwargs['name'] = name
|
|
521
|
+
sources.extend(self._compile_resources_impl(state, rcc_kwargs))
|
|
522
|
+
|
|
523
|
+
if kwargs['ui_files']:
|
|
524
|
+
ui_kwargs: UICompilerKwArgs = {
|
|
525
|
+
'sources': kwargs['ui_files'],
|
|
526
|
+
'extra_args': kwargs['uic_extra_arguments'],
|
|
527
|
+
'method': method,
|
|
528
|
+
'preserve_paths': kwargs['preserve_paths'],
|
|
529
|
+
}
|
|
530
|
+
sources.append(self._compile_ui_impl(state, ui_kwargs))
|
|
531
|
+
|
|
532
|
+
if kwargs['moc_headers'] or kwargs['moc_sources']:
|
|
533
|
+
moc_kwargs: MocCompilerKwArgs = {
|
|
534
|
+
'extra_args': kwargs['moc_extra_arguments'],
|
|
535
|
+
'sources': kwargs['moc_sources'],
|
|
536
|
+
'headers': kwargs['moc_headers'],
|
|
537
|
+
'include_directories': kwargs['include_directories'],
|
|
538
|
+
'dependencies': kwargs['dependencies'],
|
|
539
|
+
'method': method,
|
|
540
|
+
'preserve_paths': kwargs['preserve_paths'],
|
|
541
|
+
}
|
|
542
|
+
sources.extend(self._compile_moc_impl(state, moc_kwargs))
|
|
543
|
+
|
|
544
|
+
return ModuleReturnValue(sources, [sources])
|
|
545
|
+
|
|
546
|
+
@FeatureNew('qt.compile_translations', '0.44.0')
|
|
547
|
+
@noPosargs
|
|
548
|
+
@typed_kwargs(
|
|
549
|
+
'qt.compile_translations',
|
|
550
|
+
KwargInfo('build_by_default', bool, default=False),
|
|
551
|
+
INSTALL_KW,
|
|
552
|
+
INSTALL_DIR_KW,
|
|
553
|
+
KwargInfo('method', str, default='auto'),
|
|
554
|
+
KwargInfo('qresource', (str, NoneType), since='0.56.0'),
|
|
555
|
+
KwargInfo('rcc_extra_arguments', ContainerTypeInfo(list, str), listify=True, default=[], since='0.56.0'),
|
|
556
|
+
KwargInfo('ts_files', ContainerTypeInfo(list, (str, File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)), listify=True, default=[]),
|
|
557
|
+
)
|
|
558
|
+
def compile_translations(self, state: 'ModuleState', args: T.Tuple, kwargs: 'CompileTranslationsKwArgs') -> ModuleReturnValue:
|
|
559
|
+
ts_files = kwargs['ts_files']
|
|
560
|
+
if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in ts_files):
|
|
561
|
+
FeatureNew.single_use('qt.compile_translations: custom_target or generator for "ts_files" keyword argument',
|
|
562
|
+
'0.60.0', state.subproject, location=state.current_node)
|
|
563
|
+
if kwargs['install'] and not kwargs['install_dir']:
|
|
564
|
+
raise MesonException('qt.compile_translations: "install_dir" keyword argument must be set when "install" is true.')
|
|
565
|
+
qresource = kwargs['qresource']
|
|
566
|
+
if qresource:
|
|
567
|
+
if ts_files:
|
|
568
|
+
raise MesonException('qt.compile_translations: Cannot specify both ts_files and qresource')
|
|
569
|
+
if os.path.dirname(qresource) != '':
|
|
570
|
+
raise MesonException('qt.compile_translations: qresource file name must not contain a subdirectory.')
|
|
571
|
+
qresource_file = File.from_built_file(state.subdir, qresource)
|
|
572
|
+
infile_abs = os.path.join(state.environment.source_dir, qresource_file.relative_name())
|
|
573
|
+
outfile_abs = os.path.join(state.environment.build_dir, qresource_file.relative_name())
|
|
574
|
+
os.makedirs(os.path.dirname(outfile_abs), exist_ok=True)
|
|
575
|
+
shutil.copy2(infile_abs, outfile_abs)
|
|
576
|
+
self.interpreter.add_build_def_file(infile_abs)
|
|
577
|
+
|
|
578
|
+
_, nodes = self._qrc_nodes(state, qresource_file)
|
|
579
|
+
for c in nodes:
|
|
580
|
+
if c.endswith('.qm'):
|
|
581
|
+
ts_files.append(c.rstrip('.qm') + '.ts')
|
|
582
|
+
else:
|
|
583
|
+
raise MesonException(f'qt.compile_translations: qresource can only contain qm files, found {c}')
|
|
584
|
+
results = self.preprocess(state, [], {'qresources': qresource_file, 'rcc_extra_arguments': kwargs['rcc_extra_arguments']})
|
|
585
|
+
self._detect_tools(state, kwargs['method'])
|
|
586
|
+
translations: T.List[build.CustomTarget] = []
|
|
587
|
+
for ts in ts_files:
|
|
588
|
+
if not self.tools['lrelease'].found():
|
|
589
|
+
raise MesonException('qt.compile_translations: ' +
|
|
590
|
+
self.tools['lrelease'].name + ' not found')
|
|
591
|
+
if qresource:
|
|
592
|
+
# In this case we know that ts_files is always a List[str], as
|
|
593
|
+
# it's generated above and no ts_files are passed in. However,
|
|
594
|
+
# mypy can't figure that out so we use assert to assure it that
|
|
595
|
+
# what we're doing is safe
|
|
596
|
+
assert isinstance(ts, str), 'for mypy'
|
|
597
|
+
outdir = os.path.dirname(os.path.normpath(os.path.join(state.subdir, ts)))
|
|
598
|
+
ts = os.path.basename(ts)
|
|
599
|
+
else:
|
|
600
|
+
outdir = state.subdir
|
|
601
|
+
cmd: T.List[T.Union[ExternalProgram, build.Executable, str]] = [self.tools['lrelease'], '@INPUT@', '-qm', '@OUTPUT@']
|
|
602
|
+
lrelease_target = build.CustomTarget(
|
|
603
|
+
f'qt{self.qt_version}-compile-{ts}',
|
|
604
|
+
outdir,
|
|
605
|
+
state.subproject,
|
|
606
|
+
state.environment,
|
|
607
|
+
cmd,
|
|
608
|
+
[ts],
|
|
609
|
+
['@BASENAME@.qm'],
|
|
610
|
+
state.is_build_only_subproject,
|
|
611
|
+
install=kwargs['install'],
|
|
612
|
+
install_dir=[kwargs['install_dir']],
|
|
613
|
+
install_tag=['i18n'],
|
|
614
|
+
build_by_default=kwargs['build_by_default'],
|
|
615
|
+
description='Compiling Qt translations {}',
|
|
616
|
+
)
|
|
617
|
+
translations.append(lrelease_target)
|
|
618
|
+
if qresource:
|
|
619
|
+
return ModuleReturnValue(results.return_value[0], [results.new_objects, translations])
|
|
620
|
+
else:
|
|
621
|
+
return ModuleReturnValue(translations, [translations])
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2015 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
import typing as T
|
|
6
|
+
|
|
7
|
+
from .qt import QtBaseModule
|
|
8
|
+
from . import ModuleInfo
|
|
9
|
+
|
|
10
|
+
if T.TYPE_CHECKING:
|
|
11
|
+
from ..interpreter import Interpreter
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Qt4Module(QtBaseModule):
|
|
15
|
+
|
|
16
|
+
INFO = ModuleInfo('qt4')
|
|
17
|
+
|
|
18
|
+
def __init__(self, interpreter: Interpreter):
|
|
19
|
+
QtBaseModule.__init__(self, interpreter, qt_version=4)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def initialize(interp: Interpreter) -> Qt4Module:
|
|
23
|
+
return Qt4Module(interp)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Copyright 2015 The Meson development team
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
import typing as T
|
|
6
|
+
|
|
7
|
+
from .qt import QtBaseModule
|
|
8
|
+
from . import ModuleInfo
|
|
9
|
+
|
|
10
|
+
if T.TYPE_CHECKING:
|
|
11
|
+
from ..interpreter import Interpreter
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Qt5Module(QtBaseModule):
|
|
15
|
+
|
|
16
|
+
INFO = ModuleInfo('qt5')
|
|
17
|
+
|
|
18
|
+
def __init__(self, interpreter: Interpreter):
|
|
19
|
+
QtBaseModule.__init__(self, interpreter, qt_version=5)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def initialize(interp: Interpreter) -> Qt5Module:
|
|
23
|
+
return Qt5Module(interp)
|