android-notify 1.60.0__py3-none-any.whl → 1.60.2__py3-none-any.whl
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.
Potentially problematic release.
This version of android-notify might be problematic. Click here for more details.
- android_notify/config.py +1 -1
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/METADATA +4 -4
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/RECORD +375 -6
- venv/Lib/site-packages/_distutils_hack/__init__.py +239 -0
- venv/Lib/site-packages/_distutils_hack/override.py +1 -0
- venv/Lib/site-packages/pkg_resources/__init__.py +3713 -0
- venv/Lib/site-packages/pkg_resources/py.typed +0 -0
- venv/Lib/site-packages/pkg_resources/tests/__init__.py +0 -0
- venv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py +7 -0
- venv/Lib/site-packages/pkg_resources/tests/test_find_distributions.py +56 -0
- venv/Lib/site-packages/pkg_resources/tests/test_integration_zope_interface.py +54 -0
- venv/Lib/site-packages/pkg_resources/tests/test_markers.py +8 -0
- venv/Lib/site-packages/pkg_resources/tests/test_pkg_resources.py +485 -0
- venv/Lib/site-packages/pkg_resources/tests/test_resources.py +869 -0
- venv/Lib/site-packages/pkg_resources/tests/test_working_set.py +505 -0
- venv/Lib/site-packages/setuptools/__init__.py +248 -0
- venv/Lib/site-packages/setuptools/_core_metadata.py +337 -0
- venv/Lib/site-packages/setuptools/_discovery.py +33 -0
- venv/Lib/site-packages/setuptools/_distutils/__init__.py +14 -0
- venv/Lib/site-packages/setuptools/_distutils/_log.py +3 -0
- venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py +12 -0
- venv/Lib/site-packages/setuptools/_distutils/_modified.py +95 -0
- venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +16 -0
- venv/Lib/site-packages/setuptools/_distutils/archive_util.py +294 -0
- venv/Lib/site-packages/setuptools/_distutils/ccompiler.py +26 -0
- venv/Lib/site-packages/setuptools/_distutils/cmd.py +554 -0
- venv/Lib/site-packages/setuptools/_distutils/command/__init__.py +23 -0
- venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py +54 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist.py +167 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py +141 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py +598 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build.py +156 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +201 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +812 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_py.py +407 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +160 -0
- venv/Lib/site-packages/setuptools/_distutils/command/check.py +152 -0
- venv/Lib/site-packages/setuptools/_distutils/command/clean.py +77 -0
- venv/Lib/site-packages/setuptools/_distutils/command/config.py +358 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install.py +805 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_data.py +94 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py +91 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py +46 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py +238 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py +62 -0
- venv/Lib/site-packages/setuptools/_distutils/command/sdist.py +521 -0
- venv/Lib/site-packages/setuptools/_distutils/compat/__init__.py +18 -0
- venv/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
- venv/Lib/site-packages/setuptools/_distutils/compat/py39.py +66 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +1394 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/cygwin.py +340 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/errors.py +24 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +614 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_base.py +83 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_cygwin.py +76 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_mingw.py +48 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_msvc.py +136 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py +413 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +422 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/zos.py +230 -0
- venv/Lib/site-packages/setuptools/_distutils/core.py +289 -0
- venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py +31 -0
- venv/Lib/site-packages/setuptools/_distutils/debug.py +5 -0
- venv/Lib/site-packages/setuptools/_distutils/dep_util.py +14 -0
- venv/Lib/site-packages/setuptools/_distutils/dir_util.py +244 -0
- venv/Lib/site-packages/setuptools/_distutils/dist.py +1386 -0
- venv/Lib/site-packages/setuptools/_distutils/errors.py +108 -0
- venv/Lib/site-packages/setuptools/_distutils/extension.py +258 -0
- venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py +471 -0
- venv/Lib/site-packages/setuptools/_distutils/file_util.py +236 -0
- venv/Lib/site-packages/setuptools/_distutils/filelist.py +431 -0
- venv/Lib/site-packages/setuptools/_distutils/log.py +56 -0
- venv/Lib/site-packages/setuptools/_distutils/spawn.py +134 -0
- venv/Lib/site-packages/setuptools/_distutils/sysconfig.py +598 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/__init__.py +42 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/compat/py39.py +40 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/support.py +134 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_archive_util.py +353 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist.py +47 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_dumb.py +78 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_rpm.py +127 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build.py +49 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_clib.py +134 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +628 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_py.py +196 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_scripts.py +96 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_check.py +194 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_clean.py +45 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_cmd.py +107 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_config_cmd.py +87 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_core.py +130 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_dir_util.py +139 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_dist.py +552 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_extension.py +117 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_file_util.py +95 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_filelist.py +336 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install.py +245 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_data.py +74 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_headers.py +33 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_lib.py +110 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_scripts.py +52 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_log.py +12 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_modified.py +126 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_sdist.py +470 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_spawn.py +141 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_sysconfig.py +319 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_text_file.py +127 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_util.py +243 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_version.py +80 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_versionpredicate.py +0 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/unix_compat.py +17 -0
- venv/Lib/site-packages/setuptools/_distutils/text_file.py +286 -0
- venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +9 -0
- venv/Lib/site-packages/setuptools/_distutils/util.py +518 -0
- venv/Lib/site-packages/setuptools/_distutils/version.py +348 -0
- venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py +175 -0
- venv/Lib/site-packages/setuptools/_distutils/zosccompiler.py +3 -0
- venv/Lib/site-packages/setuptools/_entry_points.py +94 -0
- venv/Lib/site-packages/setuptools/_imp.py +87 -0
- venv/Lib/site-packages/setuptools/_importlib.py +9 -0
- venv/Lib/site-packages/setuptools/_itertools.py +23 -0
- venv/Lib/site-packages/setuptools/_normalization.py +177 -0
- venv/Lib/site-packages/setuptools/_path.py +93 -0
- venv/Lib/site-packages/setuptools/_reqs.py +42 -0
- venv/Lib/site-packages/setuptools/_scripts.py +361 -0
- venv/Lib/site-packages/setuptools/_shutil.py +59 -0
- venv/Lib/site-packages/setuptools/_static.py +188 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/__init__.py +27 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/autoasync.py +142 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/autocommand.py +70 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/automain.py +59 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/autoparse.py +333 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/errors.py +23 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/__init__.py +1 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__init__.py +2937 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__main__.py +5 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/py38.py +24 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py +1083 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py +83 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py +30 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py +57 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py +104 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py +73 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py +67 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py +99 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py311.py +22 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py39.py +36 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/diagnose.py +21 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/__init__.py +3986 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/compat/py38.py +7 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/__init__.py +1091 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py +361 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.py +633 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.pyi +125 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py +624 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/layouts.py +25 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/show-newlines.py +33 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/strip-prefix.py +21 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-dvorak.py +6 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-qwerty.py +6 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py +6 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.pyi +2 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py +4806 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.pyi +709 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py +1046 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.pyi +136 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +15 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_elffile.py +110 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +263 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py +85 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_parser.py +354 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_tokenizer.py +194 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/__init__.py +145 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/_spdx.py +759 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +331 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/metadata.py +863 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +91 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +1020 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +617 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +163 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +582 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/__init__.py +627 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/__main__.py +55 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/android.py +249 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/api.py +292 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/macos.py +130 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/unix.py +275 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/version.py +16 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/windows.py +272 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py +11 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py +691 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py +107 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py +10 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/py.typed +1 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/__init__.py +48 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_checkers.py +993 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_config.py +108 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_decorators.py +235 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_exceptions.py +42 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_functions.py +308 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_importhook.py +213 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_memo.py +48 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_pytest_plugin.py +127 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_suppression.py +86 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_transformer.py +1229 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_union_transformer.py +55 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_utils.py +173 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py +3641 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +3 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/__main__.py +23 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +26 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +26 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +155 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +332 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/pack.py +85 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/tags.py +139 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/unpack.py +30 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +482 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +183 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/util.py +17 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_elffile.py +108 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_manylinux.py +260 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_musllinux.py +83 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_parser.py +356 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_structures.py +61 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_tokenizer.py +192 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/markers.py +253 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/requirements.py +90 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/specifiers.py +1011 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/tags.py +571 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/utils.py +172 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/version.py +561 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +227 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/__init__.py +501 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/compat/py310.py +11 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/glob.py +106 -0
- venv/Lib/site-packages/setuptools/archive_util.py +219 -0
- venv/Lib/site-packages/setuptools/build_meta.py +548 -0
- venv/Lib/site-packages/setuptools/command/__init__.py +21 -0
- venv/Lib/site-packages/setuptools/command/_requirestxt.py +131 -0
- venv/Lib/site-packages/setuptools/command/alias.py +77 -0
- venv/Lib/site-packages/setuptools/command/bdist_egg.py +477 -0
- venv/Lib/site-packages/setuptools/command/bdist_rpm.py +42 -0
- venv/Lib/site-packages/setuptools/command/bdist_wheel.py +604 -0
- venv/Lib/site-packages/setuptools/command/build.py +135 -0
- venv/Lib/site-packages/setuptools/command/build_clib.py +103 -0
- venv/Lib/site-packages/setuptools/command/build_ext.py +470 -0
- venv/Lib/site-packages/setuptools/command/build_py.py +400 -0
- venv/Lib/site-packages/setuptools/command/develop.py +55 -0
- venv/Lib/site-packages/setuptools/command/dist_info.py +103 -0
- venv/Lib/site-packages/setuptools/command/easy_install.py +30 -0
- venv/Lib/site-packages/setuptools/command/editable_wheel.py +908 -0
- venv/Lib/site-packages/setuptools/command/egg_info.py +718 -0
- venv/Lib/site-packages/setuptools/command/install.py +131 -0
- venv/Lib/site-packages/setuptools/command/install_egg_info.py +58 -0
- venv/Lib/site-packages/setuptools/command/install_lib.py +137 -0
- venv/Lib/site-packages/setuptools/command/install_scripts.py +67 -0
- venv/Lib/site-packages/setuptools/command/rotate.py +65 -0
- venv/Lib/site-packages/setuptools/command/saveopts.py +21 -0
- venv/Lib/site-packages/setuptools/command/sdist.py +217 -0
- venv/Lib/site-packages/setuptools/command/setopt.py +141 -0
- venv/Lib/site-packages/setuptools/command/test.py +45 -0
- venv/Lib/site-packages/setuptools/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/compat/py310.py +20 -0
- venv/Lib/site-packages/setuptools/compat/py311.py +27 -0
- venv/Lib/site-packages/setuptools/compat/py312.py +13 -0
- venv/Lib/site-packages/setuptools/compat/py39.py +9 -0
- venv/Lib/site-packages/setuptools/config/__init__.py +43 -0
- venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +526 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py +34 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py +336 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +82 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +51 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +1412 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +402 -0
- venv/Lib/site-packages/setuptools/config/expand.py +452 -0
- venv/Lib/site-packages/setuptools/config/pyprojecttoml.py +468 -0
- venv/Lib/site-packages/setuptools/config/setupcfg.py +780 -0
- venv/Lib/site-packages/setuptools/depends.py +185 -0
- venv/Lib/site-packages/setuptools/discovery.py +614 -0
- venv/Lib/site-packages/setuptools/dist.py +1119 -0
- venv/Lib/site-packages/setuptools/errors.py +67 -0
- venv/Lib/site-packages/setuptools/extension.py +177 -0
- venv/Lib/site-packages/setuptools/glob.py +185 -0
- venv/Lib/site-packages/setuptools/installer.py +155 -0
- venv/Lib/site-packages/setuptools/launch.py +36 -0
- venv/Lib/site-packages/setuptools/logging.py +40 -0
- venv/Lib/site-packages/setuptools/modified.py +18 -0
- venv/Lib/site-packages/setuptools/monkey.py +126 -0
- venv/Lib/site-packages/setuptools/msvc.py +1536 -0
- venv/Lib/site-packages/setuptools/namespaces.py +106 -0
- venv/Lib/site-packages/setuptools/tests/__init__.py +13 -0
- venv/Lib/site-packages/setuptools/tests/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/tests/compat/py39.py +3 -0
- venv/Lib/site-packages/setuptools/tests/config/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/tests/config/downloads/__init__.py +59 -0
- venv/Lib/site-packages/setuptools/tests/config/downloads/preload.py +18 -0
- venv/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +772 -0
- venv/Lib/site-packages/setuptools/tests/config/test_expand.py +247 -0
- venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml.py +396 -0
- venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py +109 -0
- venv/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +980 -0
- venv/Lib/site-packages/setuptools/tests/contexts.py +131 -0
- venv/Lib/site-packages/setuptools/tests/environment.py +95 -0
- venv/Lib/site-packages/setuptools/tests/fixtures.py +392 -0
- venv/Lib/site-packages/setuptools/tests/integration/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/tests/integration/helpers.py +77 -0
- venv/Lib/site-packages/setuptools/tests/integration/test_pbr.py +20 -0
- venv/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +223 -0
- venv/Lib/site-packages/setuptools/tests/mod_with_constant.py +1 -0
- venv/Lib/site-packages/setuptools/tests/namespaces.py +90 -0
- venv/Lib/site-packages/setuptools/tests/script-with-bom.py +1 -0
- venv/Lib/site-packages/setuptools/tests/test_archive_util.py +36 -0
- venv/Lib/site-packages/setuptools/tests/test_bdist_deprecations.py +28 -0
- venv/Lib/site-packages/setuptools/tests/test_bdist_egg.py +73 -0
- venv/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +708 -0
- venv/Lib/site-packages/setuptools/tests/test_build.py +33 -0
- venv/Lib/site-packages/setuptools/tests/test_build_clib.py +84 -0
- venv/Lib/site-packages/setuptools/tests/test_build_ext.py +293 -0
- venv/Lib/site-packages/setuptools/tests/test_build_meta.py +959 -0
- venv/Lib/site-packages/setuptools/tests/test_build_py.py +480 -0
- venv/Lib/site-packages/setuptools/tests/test_config_discovery.py +647 -0
- venv/Lib/site-packages/setuptools/tests/test_core_metadata.py +622 -0
- venv/Lib/site-packages/setuptools/tests/test_depends.py +15 -0
- venv/Lib/site-packages/setuptools/tests/test_develop.py +112 -0
- venv/Lib/site-packages/setuptools/tests/test_dist.py +278 -0
- venv/Lib/site-packages/setuptools/tests/test_dist_info.py +147 -0
- venv/Lib/site-packages/setuptools/tests/test_distutils_adoption.py +198 -0
- venv/Lib/site-packages/setuptools/tests/test_editable_install.py +1263 -0
- venv/Lib/site-packages/setuptools/tests/test_egg_info.py +1306 -0
- venv/Lib/site-packages/setuptools/tests/test_extern.py +15 -0
- venv/Lib/site-packages/setuptools/tests/test_find_packages.py +218 -0
- venv/Lib/site-packages/setuptools/tests/test_find_py_modules.py +73 -0
- venv/Lib/site-packages/setuptools/tests/test_glob.py +45 -0
- venv/Lib/site-packages/setuptools/tests/test_install_scripts.py +89 -0
- venv/Lib/site-packages/setuptools/tests/test_logging.py +76 -0
- venv/Lib/site-packages/setuptools/tests/test_manifest.py +622 -0
- venv/Lib/site-packages/setuptools/tests/test_namespaces.py +138 -0
- venv/Lib/site-packages/setuptools/tests/test_scripts.py +12 -0
- venv/Lib/site-packages/setuptools/tests/test_sdist.py +984 -0
- venv/Lib/site-packages/setuptools/tests/test_setopt.py +40 -0
- venv/Lib/site-packages/setuptools/tests/test_setuptools.py +290 -0
- venv/Lib/site-packages/setuptools/tests/test_shutil_wrapper.py +23 -0
- venv/Lib/site-packages/setuptools/tests/test_unicode_utils.py +10 -0
- venv/Lib/site-packages/setuptools/tests/test_virtualenv.py +113 -0
- venv/Lib/site-packages/setuptools/tests/test_warnings.py +106 -0
- venv/Lib/site-packages/setuptools/tests/test_wheel.py +690 -0
- venv/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +258 -0
- venv/Lib/site-packages/setuptools/tests/text.py +4 -0
- venv/Lib/site-packages/setuptools/tests/textwrap.py +6 -0
- venv/Lib/site-packages/setuptools/unicode_utils.py +102 -0
- venv/Lib/site-packages/setuptools/version.py +6 -0
- venv/Lib/site-packages/setuptools/warnings.py +110 -0
- venv/Lib/site-packages/setuptools/wheel.py +261 -0
- venv/Lib/site-packages/setuptools/windows_support.py +30 -0
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/WHEEL +0 -0
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/entry_points.txt +0 -0
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,1536 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Environment info about Microsoft Compilers.
|
|
3
|
+
|
|
4
|
+
>>> getfixture('windows_only')
|
|
5
|
+
>>> ei = EnvironmentInfo('amd64')
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import contextlib
|
|
11
|
+
import itertools
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import os.path
|
|
15
|
+
import platform
|
|
16
|
+
from typing import TYPE_CHECKING, TypedDict
|
|
17
|
+
|
|
18
|
+
from more_itertools import unique_everseen
|
|
19
|
+
|
|
20
|
+
import distutils.errors
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from typing_extensions import LiteralString, NotRequired
|
|
24
|
+
|
|
25
|
+
# https://github.com/python/mypy/issues/8166
|
|
26
|
+
if not TYPE_CHECKING and platform.system() == 'Windows':
|
|
27
|
+
import winreg
|
|
28
|
+
from os import environ
|
|
29
|
+
else:
|
|
30
|
+
# Mock winreg and environ so the module can be imported on this platform.
|
|
31
|
+
|
|
32
|
+
class winreg:
|
|
33
|
+
HKEY_USERS = None
|
|
34
|
+
HKEY_CURRENT_USER = None
|
|
35
|
+
HKEY_LOCAL_MACHINE = None
|
|
36
|
+
HKEY_CLASSES_ROOT = None
|
|
37
|
+
|
|
38
|
+
environ: dict[str, str] = dict()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class PlatformInfo:
|
|
42
|
+
"""
|
|
43
|
+
Current and Target Architectures information.
|
|
44
|
+
|
|
45
|
+
Parameters
|
|
46
|
+
----------
|
|
47
|
+
arch: str
|
|
48
|
+
Target architecture.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
current_cpu = environ.get('processor_architecture', '').lower()
|
|
52
|
+
|
|
53
|
+
def __init__(self, arch) -> None:
|
|
54
|
+
self.arch = arch.lower().replace('x64', 'amd64')
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def target_cpu(self):
|
|
58
|
+
"""
|
|
59
|
+
Return Target CPU architecture.
|
|
60
|
+
|
|
61
|
+
Return
|
|
62
|
+
------
|
|
63
|
+
str
|
|
64
|
+
Target CPU
|
|
65
|
+
"""
|
|
66
|
+
return self.arch[self.arch.find('_') + 1 :]
|
|
67
|
+
|
|
68
|
+
def target_is_x86(self):
|
|
69
|
+
"""
|
|
70
|
+
Return True if target CPU is x86 32 bits..
|
|
71
|
+
|
|
72
|
+
Return
|
|
73
|
+
------
|
|
74
|
+
bool
|
|
75
|
+
CPU is x86 32 bits
|
|
76
|
+
"""
|
|
77
|
+
return self.target_cpu == 'x86'
|
|
78
|
+
|
|
79
|
+
def current_is_x86(self):
|
|
80
|
+
"""
|
|
81
|
+
Return True if current CPU is x86 32 bits..
|
|
82
|
+
|
|
83
|
+
Return
|
|
84
|
+
------
|
|
85
|
+
bool
|
|
86
|
+
CPU is x86 32 bits
|
|
87
|
+
"""
|
|
88
|
+
return self.current_cpu == 'x86'
|
|
89
|
+
|
|
90
|
+
def current_dir(self, hidex86=False, x64=False) -> str:
|
|
91
|
+
"""
|
|
92
|
+
Current platform specific subfolder.
|
|
93
|
+
|
|
94
|
+
Parameters
|
|
95
|
+
----------
|
|
96
|
+
hidex86: bool
|
|
97
|
+
return '' and not '\x86' if architecture is x86.
|
|
98
|
+
x64: bool
|
|
99
|
+
return '\x64' and not '\amd64' if architecture is amd64.
|
|
100
|
+
|
|
101
|
+
Return
|
|
102
|
+
------
|
|
103
|
+
str
|
|
104
|
+
subfolder: '\target', or '' (see hidex86 parameter)
|
|
105
|
+
"""
|
|
106
|
+
return (
|
|
107
|
+
''
|
|
108
|
+
if (self.current_cpu == 'x86' and hidex86)
|
|
109
|
+
else r'\x64'
|
|
110
|
+
if (self.current_cpu == 'amd64' and x64)
|
|
111
|
+
else rf'\{self.current_cpu}'
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
def target_dir(self, hidex86=False, x64=False) -> str:
|
|
115
|
+
r"""
|
|
116
|
+
Target platform specific subfolder.
|
|
117
|
+
|
|
118
|
+
Parameters
|
|
119
|
+
----------
|
|
120
|
+
hidex86: bool
|
|
121
|
+
return '' and not '\x86' if architecture is x86.
|
|
122
|
+
x64: bool
|
|
123
|
+
return '\x64' and not '\amd64' if architecture is amd64.
|
|
124
|
+
|
|
125
|
+
Return
|
|
126
|
+
------
|
|
127
|
+
str
|
|
128
|
+
subfolder: '\current', or '' (see hidex86 parameter)
|
|
129
|
+
"""
|
|
130
|
+
return (
|
|
131
|
+
''
|
|
132
|
+
if (self.target_cpu == 'x86' and hidex86)
|
|
133
|
+
else r'\x64'
|
|
134
|
+
if (self.target_cpu == 'amd64' and x64)
|
|
135
|
+
else rf'\{self.target_cpu}'
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
def cross_dir(self, forcex86=False):
|
|
139
|
+
r"""
|
|
140
|
+
Cross platform specific subfolder.
|
|
141
|
+
|
|
142
|
+
Parameters
|
|
143
|
+
----------
|
|
144
|
+
forcex86: bool
|
|
145
|
+
Use 'x86' as current architecture even if current architecture is
|
|
146
|
+
not x86.
|
|
147
|
+
|
|
148
|
+
Return
|
|
149
|
+
------
|
|
150
|
+
str
|
|
151
|
+
subfolder: '' if target architecture is current architecture,
|
|
152
|
+
'\current_target' if not.
|
|
153
|
+
"""
|
|
154
|
+
current = 'x86' if forcex86 else self.current_cpu
|
|
155
|
+
return (
|
|
156
|
+
''
|
|
157
|
+
if self.target_cpu == current
|
|
158
|
+
else self.target_dir().replace('\\', f'\\{current}_')
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class RegistryInfo:
|
|
163
|
+
"""
|
|
164
|
+
Microsoft Visual Studio related registry information.
|
|
165
|
+
|
|
166
|
+
Parameters
|
|
167
|
+
----------
|
|
168
|
+
platform_info: PlatformInfo
|
|
169
|
+
"PlatformInfo" instance.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
HKEYS = (
|
|
173
|
+
winreg.HKEY_USERS,
|
|
174
|
+
winreg.HKEY_CURRENT_USER,
|
|
175
|
+
winreg.HKEY_LOCAL_MACHINE,
|
|
176
|
+
winreg.HKEY_CLASSES_ROOT,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
def __init__(self, platform_info) -> None:
|
|
180
|
+
self.pi = platform_info
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def visualstudio(self) -> str:
|
|
184
|
+
"""
|
|
185
|
+
Microsoft Visual Studio root registry key.
|
|
186
|
+
|
|
187
|
+
Return
|
|
188
|
+
------
|
|
189
|
+
str
|
|
190
|
+
Registry key
|
|
191
|
+
"""
|
|
192
|
+
return 'VisualStudio'
|
|
193
|
+
|
|
194
|
+
@property
|
|
195
|
+
def sxs(self):
|
|
196
|
+
"""
|
|
197
|
+
Microsoft Visual Studio SxS registry key.
|
|
198
|
+
|
|
199
|
+
Return
|
|
200
|
+
------
|
|
201
|
+
str
|
|
202
|
+
Registry key
|
|
203
|
+
"""
|
|
204
|
+
return os.path.join(self.visualstudio, 'SxS')
|
|
205
|
+
|
|
206
|
+
@property
|
|
207
|
+
def vc(self):
|
|
208
|
+
"""
|
|
209
|
+
Microsoft Visual C++ VC7 registry key.
|
|
210
|
+
|
|
211
|
+
Return
|
|
212
|
+
------
|
|
213
|
+
str
|
|
214
|
+
Registry key
|
|
215
|
+
"""
|
|
216
|
+
return os.path.join(self.sxs, 'VC7')
|
|
217
|
+
|
|
218
|
+
@property
|
|
219
|
+
def vs(self):
|
|
220
|
+
"""
|
|
221
|
+
Microsoft Visual Studio VS7 registry key.
|
|
222
|
+
|
|
223
|
+
Return
|
|
224
|
+
------
|
|
225
|
+
str
|
|
226
|
+
Registry key
|
|
227
|
+
"""
|
|
228
|
+
return os.path.join(self.sxs, 'VS7')
|
|
229
|
+
|
|
230
|
+
@property
|
|
231
|
+
def vc_for_python(self) -> str:
|
|
232
|
+
"""
|
|
233
|
+
Microsoft Visual C++ for Python registry key.
|
|
234
|
+
|
|
235
|
+
Return
|
|
236
|
+
------
|
|
237
|
+
str
|
|
238
|
+
Registry key
|
|
239
|
+
"""
|
|
240
|
+
return r'DevDiv\VCForPython'
|
|
241
|
+
|
|
242
|
+
@property
|
|
243
|
+
def microsoft_sdk(self) -> str:
|
|
244
|
+
"""
|
|
245
|
+
Microsoft SDK registry key.
|
|
246
|
+
|
|
247
|
+
Return
|
|
248
|
+
------
|
|
249
|
+
str
|
|
250
|
+
Registry key
|
|
251
|
+
"""
|
|
252
|
+
return 'Microsoft SDKs'
|
|
253
|
+
|
|
254
|
+
@property
|
|
255
|
+
def windows_sdk(self):
|
|
256
|
+
"""
|
|
257
|
+
Microsoft Windows/Platform SDK registry key.
|
|
258
|
+
|
|
259
|
+
Return
|
|
260
|
+
------
|
|
261
|
+
str
|
|
262
|
+
Registry key
|
|
263
|
+
"""
|
|
264
|
+
return os.path.join(self.microsoft_sdk, 'Windows')
|
|
265
|
+
|
|
266
|
+
@property
|
|
267
|
+
def netfx_sdk(self):
|
|
268
|
+
"""
|
|
269
|
+
Microsoft .NET Framework SDK registry key.
|
|
270
|
+
|
|
271
|
+
Return
|
|
272
|
+
------
|
|
273
|
+
str
|
|
274
|
+
Registry key
|
|
275
|
+
"""
|
|
276
|
+
return os.path.join(self.microsoft_sdk, 'NETFXSDK')
|
|
277
|
+
|
|
278
|
+
@property
|
|
279
|
+
def windows_kits_roots(self) -> str:
|
|
280
|
+
"""
|
|
281
|
+
Microsoft Windows Kits Roots registry key.
|
|
282
|
+
|
|
283
|
+
Return
|
|
284
|
+
------
|
|
285
|
+
str
|
|
286
|
+
Registry key
|
|
287
|
+
"""
|
|
288
|
+
return r'Windows Kits\Installed Roots'
|
|
289
|
+
|
|
290
|
+
def microsoft(self, key, x86=False):
|
|
291
|
+
"""
|
|
292
|
+
Return key in Microsoft software registry.
|
|
293
|
+
|
|
294
|
+
Parameters
|
|
295
|
+
----------
|
|
296
|
+
key: str
|
|
297
|
+
Registry key path where look.
|
|
298
|
+
x86: str
|
|
299
|
+
Force x86 software registry.
|
|
300
|
+
|
|
301
|
+
Return
|
|
302
|
+
------
|
|
303
|
+
str
|
|
304
|
+
Registry key
|
|
305
|
+
"""
|
|
306
|
+
node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node'
|
|
307
|
+
return os.path.join('Software', node64, 'Microsoft', key)
|
|
308
|
+
|
|
309
|
+
def lookup(self, key, name):
|
|
310
|
+
"""
|
|
311
|
+
Look for values in registry in Microsoft software registry.
|
|
312
|
+
|
|
313
|
+
Parameters
|
|
314
|
+
----------
|
|
315
|
+
key: str
|
|
316
|
+
Registry key path where look.
|
|
317
|
+
name: str
|
|
318
|
+
Value name to find.
|
|
319
|
+
|
|
320
|
+
Return
|
|
321
|
+
------
|
|
322
|
+
str
|
|
323
|
+
value
|
|
324
|
+
"""
|
|
325
|
+
key_read = winreg.KEY_READ
|
|
326
|
+
openkey = winreg.OpenKey
|
|
327
|
+
closekey = winreg.CloseKey
|
|
328
|
+
ms = self.microsoft
|
|
329
|
+
for hkey in self.HKEYS:
|
|
330
|
+
bkey = None
|
|
331
|
+
try:
|
|
332
|
+
bkey = openkey(hkey, ms(key), 0, key_read)
|
|
333
|
+
except OSError:
|
|
334
|
+
if not self.pi.current_is_x86():
|
|
335
|
+
try:
|
|
336
|
+
bkey = openkey(hkey, ms(key, True), 0, key_read)
|
|
337
|
+
except OSError:
|
|
338
|
+
continue
|
|
339
|
+
else:
|
|
340
|
+
continue
|
|
341
|
+
try:
|
|
342
|
+
return winreg.QueryValueEx(bkey, name)[0]
|
|
343
|
+
except OSError:
|
|
344
|
+
pass
|
|
345
|
+
finally:
|
|
346
|
+
if bkey:
|
|
347
|
+
closekey(bkey)
|
|
348
|
+
return None
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
class SystemInfo:
|
|
352
|
+
"""
|
|
353
|
+
Microsoft Windows and Visual Studio related system information.
|
|
354
|
+
|
|
355
|
+
Parameters
|
|
356
|
+
----------
|
|
357
|
+
registry_info: RegistryInfo
|
|
358
|
+
"RegistryInfo" instance.
|
|
359
|
+
vc_ver: float
|
|
360
|
+
Required Microsoft Visual C++ version.
|
|
361
|
+
"""
|
|
362
|
+
|
|
363
|
+
# Variables and properties in this class use originals CamelCase variables
|
|
364
|
+
# names from Microsoft source files for more easy comparison.
|
|
365
|
+
WinDir = environ.get('WinDir', '')
|
|
366
|
+
ProgramFiles = environ.get('ProgramFiles', '')
|
|
367
|
+
ProgramFilesx86 = environ.get('ProgramFiles(x86)', ProgramFiles)
|
|
368
|
+
|
|
369
|
+
def __init__(self, registry_info, vc_ver=None) -> None:
|
|
370
|
+
self.ri = registry_info
|
|
371
|
+
self.pi = self.ri.pi
|
|
372
|
+
|
|
373
|
+
self.known_vs_paths = self.find_programdata_vs_vers()
|
|
374
|
+
|
|
375
|
+
# Except for VS15+, VC version is aligned with VS version
|
|
376
|
+
self.vs_ver = self.vc_ver = vc_ver or self._find_latest_available_vs_ver()
|
|
377
|
+
|
|
378
|
+
def _find_latest_available_vs_ver(self):
|
|
379
|
+
"""
|
|
380
|
+
Find the latest VC version
|
|
381
|
+
|
|
382
|
+
Return
|
|
383
|
+
------
|
|
384
|
+
float
|
|
385
|
+
version
|
|
386
|
+
"""
|
|
387
|
+
reg_vc_vers = self.find_reg_vs_vers()
|
|
388
|
+
|
|
389
|
+
if not (reg_vc_vers or self.known_vs_paths):
|
|
390
|
+
raise distutils.errors.DistutilsPlatformError(
|
|
391
|
+
'No Microsoft Visual C++ version found'
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
vc_vers = set(reg_vc_vers)
|
|
395
|
+
vc_vers.update(self.known_vs_paths)
|
|
396
|
+
return sorted(vc_vers)[-1]
|
|
397
|
+
|
|
398
|
+
def find_reg_vs_vers(self):
|
|
399
|
+
"""
|
|
400
|
+
Find Microsoft Visual Studio versions available in registry.
|
|
401
|
+
|
|
402
|
+
Return
|
|
403
|
+
------
|
|
404
|
+
list of float
|
|
405
|
+
Versions
|
|
406
|
+
"""
|
|
407
|
+
ms = self.ri.microsoft
|
|
408
|
+
vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs)
|
|
409
|
+
vs_vers = []
|
|
410
|
+
for hkey, key in itertools.product(self.ri.HKEYS, vckeys):
|
|
411
|
+
try:
|
|
412
|
+
bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ)
|
|
413
|
+
except OSError:
|
|
414
|
+
continue
|
|
415
|
+
with bkey:
|
|
416
|
+
subkeys, values, _ = winreg.QueryInfoKey(bkey)
|
|
417
|
+
for i in range(values):
|
|
418
|
+
with contextlib.suppress(ValueError):
|
|
419
|
+
ver = float(winreg.EnumValue(bkey, i)[0])
|
|
420
|
+
if ver not in vs_vers:
|
|
421
|
+
vs_vers.append(ver)
|
|
422
|
+
for i in range(subkeys):
|
|
423
|
+
with contextlib.suppress(ValueError):
|
|
424
|
+
ver = float(winreg.EnumKey(bkey, i))
|
|
425
|
+
if ver not in vs_vers:
|
|
426
|
+
vs_vers.append(ver)
|
|
427
|
+
return sorted(vs_vers)
|
|
428
|
+
|
|
429
|
+
def find_programdata_vs_vers(self) -> dict[float, str]:
|
|
430
|
+
r"""
|
|
431
|
+
Find Visual studio 2017+ versions from information in
|
|
432
|
+
"C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances".
|
|
433
|
+
|
|
434
|
+
Return
|
|
435
|
+
------
|
|
436
|
+
dict
|
|
437
|
+
float version as key, path as value.
|
|
438
|
+
"""
|
|
439
|
+
vs_versions: dict[float, str] = {}
|
|
440
|
+
instances_dir = r'C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances'
|
|
441
|
+
|
|
442
|
+
try:
|
|
443
|
+
hashed_names = os.listdir(instances_dir)
|
|
444
|
+
|
|
445
|
+
except OSError:
|
|
446
|
+
# Directory not exists with all Visual Studio versions
|
|
447
|
+
return vs_versions
|
|
448
|
+
|
|
449
|
+
for name in hashed_names:
|
|
450
|
+
try:
|
|
451
|
+
# Get VS installation path from "state.json" file
|
|
452
|
+
state_path = os.path.join(instances_dir, name, 'state.json')
|
|
453
|
+
with open(state_path, 'rt', encoding='utf-8') as state_file:
|
|
454
|
+
state = json.load(state_file)
|
|
455
|
+
vs_path = state['installationPath']
|
|
456
|
+
|
|
457
|
+
# Raises OSError if this VS installation does not contain VC
|
|
458
|
+
os.listdir(os.path.join(vs_path, r'VC\Tools\MSVC'))
|
|
459
|
+
|
|
460
|
+
# Store version and path
|
|
461
|
+
vs_versions[self._as_float_version(state['installationVersion'])] = (
|
|
462
|
+
vs_path
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
except (OSError, KeyError):
|
|
466
|
+
# Skip if "state.json" file is missing or bad format
|
|
467
|
+
continue
|
|
468
|
+
|
|
469
|
+
return vs_versions
|
|
470
|
+
|
|
471
|
+
@staticmethod
|
|
472
|
+
def _as_float_version(version):
|
|
473
|
+
"""
|
|
474
|
+
Return a string version as a simplified float version (major.minor)
|
|
475
|
+
|
|
476
|
+
Parameters
|
|
477
|
+
----------
|
|
478
|
+
version: str
|
|
479
|
+
Version.
|
|
480
|
+
|
|
481
|
+
Return
|
|
482
|
+
------
|
|
483
|
+
float
|
|
484
|
+
version
|
|
485
|
+
"""
|
|
486
|
+
return float('.'.join(version.split('.')[:2]))
|
|
487
|
+
|
|
488
|
+
@property
|
|
489
|
+
def VSInstallDir(self):
|
|
490
|
+
"""
|
|
491
|
+
Microsoft Visual Studio directory.
|
|
492
|
+
|
|
493
|
+
Return
|
|
494
|
+
------
|
|
495
|
+
str
|
|
496
|
+
path
|
|
497
|
+
"""
|
|
498
|
+
# Default path
|
|
499
|
+
default = os.path.join(
|
|
500
|
+
self.ProgramFilesx86, f'Microsoft Visual Studio {self.vs_ver:0.1f}'
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
# Try to get path from registry, if fail use default path
|
|
504
|
+
return self.ri.lookup(self.ri.vs, f'{self.vs_ver:0.1f}') or default
|
|
505
|
+
|
|
506
|
+
@property
|
|
507
|
+
def VCInstallDir(self):
|
|
508
|
+
"""
|
|
509
|
+
Microsoft Visual C++ directory.
|
|
510
|
+
|
|
511
|
+
Return
|
|
512
|
+
------
|
|
513
|
+
str
|
|
514
|
+
path
|
|
515
|
+
"""
|
|
516
|
+
path = self._guess_vc() or self._guess_vc_legacy()
|
|
517
|
+
|
|
518
|
+
if not os.path.isdir(path):
|
|
519
|
+
msg = 'Microsoft Visual C++ directory not found'
|
|
520
|
+
raise distutils.errors.DistutilsPlatformError(msg)
|
|
521
|
+
|
|
522
|
+
return path
|
|
523
|
+
|
|
524
|
+
def _guess_vc(self):
|
|
525
|
+
"""
|
|
526
|
+
Locate Visual C++ for VS2017+.
|
|
527
|
+
|
|
528
|
+
Return
|
|
529
|
+
------
|
|
530
|
+
str
|
|
531
|
+
path
|
|
532
|
+
"""
|
|
533
|
+
if self.vs_ver <= 14.0:
|
|
534
|
+
return ''
|
|
535
|
+
|
|
536
|
+
try:
|
|
537
|
+
# First search in known VS paths
|
|
538
|
+
vs_dir = self.known_vs_paths[self.vs_ver]
|
|
539
|
+
except KeyError:
|
|
540
|
+
# Else, search with path from registry
|
|
541
|
+
vs_dir = self.VSInstallDir
|
|
542
|
+
|
|
543
|
+
guess_vc = os.path.join(vs_dir, r'VC\Tools\MSVC')
|
|
544
|
+
|
|
545
|
+
# Subdir with VC exact version as name
|
|
546
|
+
try:
|
|
547
|
+
# Update the VC version with real one instead of VS version
|
|
548
|
+
vc_ver = os.listdir(guess_vc)[-1]
|
|
549
|
+
self.vc_ver = self._as_float_version(vc_ver)
|
|
550
|
+
return os.path.join(guess_vc, vc_ver)
|
|
551
|
+
except (OSError, IndexError):
|
|
552
|
+
return ''
|
|
553
|
+
|
|
554
|
+
def _guess_vc_legacy(self):
|
|
555
|
+
"""
|
|
556
|
+
Locate Visual C++ for versions prior to 2017.
|
|
557
|
+
|
|
558
|
+
Return
|
|
559
|
+
------
|
|
560
|
+
str
|
|
561
|
+
path
|
|
562
|
+
"""
|
|
563
|
+
default = os.path.join(
|
|
564
|
+
self.ProgramFilesx86,
|
|
565
|
+
rf'Microsoft Visual Studio {self.vs_ver:0.1f}\VC',
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
# Try to get "VC++ for Python" path from registry as default path
|
|
569
|
+
reg_path = os.path.join(self.ri.vc_for_python, f'{self.vs_ver:0.1f}')
|
|
570
|
+
python_vc = self.ri.lookup(reg_path, 'installdir')
|
|
571
|
+
default_vc = os.path.join(python_vc, 'VC') if python_vc else default
|
|
572
|
+
|
|
573
|
+
# Try to get path from registry, if fail use default path
|
|
574
|
+
return self.ri.lookup(self.ri.vc, f'{self.vs_ver:0.1f}') or default_vc
|
|
575
|
+
|
|
576
|
+
@property
|
|
577
|
+
def WindowsSdkVersion(self) -> tuple[LiteralString, ...]:
|
|
578
|
+
"""
|
|
579
|
+
Microsoft Windows SDK versions for specified MSVC++ version.
|
|
580
|
+
|
|
581
|
+
Return
|
|
582
|
+
------
|
|
583
|
+
tuple of str
|
|
584
|
+
versions
|
|
585
|
+
"""
|
|
586
|
+
if self.vs_ver <= 9.0:
|
|
587
|
+
return '7.0', '6.1', '6.0a'
|
|
588
|
+
elif self.vs_ver == 10.0:
|
|
589
|
+
return '7.1', '7.0a'
|
|
590
|
+
elif self.vs_ver == 11.0:
|
|
591
|
+
return '8.0', '8.0a'
|
|
592
|
+
elif self.vs_ver == 12.0:
|
|
593
|
+
return '8.1', '8.1a'
|
|
594
|
+
elif self.vs_ver >= 14.0:
|
|
595
|
+
return '10.0', '8.1'
|
|
596
|
+
return ()
|
|
597
|
+
|
|
598
|
+
@property
|
|
599
|
+
def WindowsSdkLastVersion(self):
|
|
600
|
+
"""
|
|
601
|
+
Microsoft Windows SDK last version.
|
|
602
|
+
|
|
603
|
+
Return
|
|
604
|
+
------
|
|
605
|
+
str
|
|
606
|
+
version
|
|
607
|
+
"""
|
|
608
|
+
return self._use_last_dir_name(os.path.join(self.WindowsSdkDir, 'lib'))
|
|
609
|
+
|
|
610
|
+
@property
|
|
611
|
+
def WindowsSdkDir(self) -> str | None: # noqa: C901 # is too complex (12) # FIXME
|
|
612
|
+
"""
|
|
613
|
+
Microsoft Windows SDK directory.
|
|
614
|
+
|
|
615
|
+
Return
|
|
616
|
+
------
|
|
617
|
+
str
|
|
618
|
+
path
|
|
619
|
+
"""
|
|
620
|
+
sdkdir: str | None = ''
|
|
621
|
+
for ver in self.WindowsSdkVersion:
|
|
622
|
+
# Try to get it from registry
|
|
623
|
+
loc = os.path.join(self.ri.windows_sdk, f'v{ver}')
|
|
624
|
+
sdkdir = self.ri.lookup(loc, 'installationfolder')
|
|
625
|
+
if sdkdir:
|
|
626
|
+
break
|
|
627
|
+
if not sdkdir or not os.path.isdir(sdkdir):
|
|
628
|
+
# Try to get "VC++ for Python" version from registry
|
|
629
|
+
path = os.path.join(self.ri.vc_for_python, f'{self.vc_ver:0.1f}')
|
|
630
|
+
install_base = self.ri.lookup(path, 'installdir')
|
|
631
|
+
if install_base:
|
|
632
|
+
sdkdir = os.path.join(install_base, 'WinSDK')
|
|
633
|
+
if not sdkdir or not os.path.isdir(sdkdir):
|
|
634
|
+
# If fail, use default new path
|
|
635
|
+
for ver in self.WindowsSdkVersion:
|
|
636
|
+
intver = ver[: ver.rfind('.')]
|
|
637
|
+
path = rf'Microsoft SDKs\Windows Kits\{intver}'
|
|
638
|
+
d = os.path.join(self.ProgramFiles, path)
|
|
639
|
+
if os.path.isdir(d):
|
|
640
|
+
sdkdir = d
|
|
641
|
+
if not sdkdir or not os.path.isdir(sdkdir):
|
|
642
|
+
# If fail, use default old path
|
|
643
|
+
for ver in self.WindowsSdkVersion:
|
|
644
|
+
path = rf'Microsoft SDKs\Windows\v{ver}'
|
|
645
|
+
d = os.path.join(self.ProgramFiles, path)
|
|
646
|
+
if os.path.isdir(d):
|
|
647
|
+
sdkdir = d
|
|
648
|
+
if not sdkdir:
|
|
649
|
+
# If fail, use Platform SDK
|
|
650
|
+
sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK')
|
|
651
|
+
return sdkdir
|
|
652
|
+
|
|
653
|
+
@property
|
|
654
|
+
def WindowsSDKExecutablePath(self):
|
|
655
|
+
"""
|
|
656
|
+
Microsoft Windows SDK executable directory.
|
|
657
|
+
|
|
658
|
+
Return
|
|
659
|
+
------
|
|
660
|
+
str
|
|
661
|
+
path
|
|
662
|
+
"""
|
|
663
|
+
# Find WinSDK NetFx Tools registry dir name
|
|
664
|
+
if self.vs_ver <= 11.0:
|
|
665
|
+
netfxver = 35
|
|
666
|
+
arch = ''
|
|
667
|
+
else:
|
|
668
|
+
netfxver = 40
|
|
669
|
+
hidex86 = True if self.vs_ver <= 12.0 else False
|
|
670
|
+
arch = self.pi.current_dir(x64=True, hidex86=hidex86).replace('\\', '-')
|
|
671
|
+
fx = f'WinSDK-NetFx{netfxver}Tools{arch}'
|
|
672
|
+
|
|
673
|
+
# list all possibles registry paths
|
|
674
|
+
regpaths = []
|
|
675
|
+
if self.vs_ver >= 14.0:
|
|
676
|
+
for ver in self.NetFxSdkVersion:
|
|
677
|
+
regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)]
|
|
678
|
+
|
|
679
|
+
for ver in self.WindowsSdkVersion:
|
|
680
|
+
regpaths += [os.path.join(self.ri.windows_sdk, f'v{ver}A', fx)]
|
|
681
|
+
|
|
682
|
+
# Return installation folder from the more recent path
|
|
683
|
+
for path in regpaths:
|
|
684
|
+
execpath = self.ri.lookup(path, 'installationfolder')
|
|
685
|
+
if execpath:
|
|
686
|
+
return execpath
|
|
687
|
+
|
|
688
|
+
return None
|
|
689
|
+
|
|
690
|
+
@property
|
|
691
|
+
def FSharpInstallDir(self):
|
|
692
|
+
"""
|
|
693
|
+
Microsoft Visual F# directory.
|
|
694
|
+
|
|
695
|
+
Return
|
|
696
|
+
------
|
|
697
|
+
str
|
|
698
|
+
path
|
|
699
|
+
"""
|
|
700
|
+
path = os.path.join(self.ri.visualstudio, rf'{self.vs_ver:0.1f}\Setup\F#')
|
|
701
|
+
return self.ri.lookup(path, 'productdir') or ''
|
|
702
|
+
|
|
703
|
+
@property
|
|
704
|
+
def UniversalCRTSdkDir(self):
|
|
705
|
+
"""
|
|
706
|
+
Microsoft Universal CRT SDK directory.
|
|
707
|
+
|
|
708
|
+
Return
|
|
709
|
+
------
|
|
710
|
+
str
|
|
711
|
+
path
|
|
712
|
+
"""
|
|
713
|
+
# Set Kit Roots versions for specified MSVC++ version
|
|
714
|
+
vers = ('10', '81') if self.vs_ver >= 14.0 else ()
|
|
715
|
+
|
|
716
|
+
# Find path of the more recent Kit
|
|
717
|
+
for ver in vers:
|
|
718
|
+
sdkdir = self.ri.lookup(self.ri.windows_kits_roots, f'kitsroot{ver}')
|
|
719
|
+
if sdkdir:
|
|
720
|
+
return sdkdir or ''
|
|
721
|
+
|
|
722
|
+
return None
|
|
723
|
+
|
|
724
|
+
@property
|
|
725
|
+
def UniversalCRTSdkLastVersion(self):
|
|
726
|
+
"""
|
|
727
|
+
Microsoft Universal C Runtime SDK last version.
|
|
728
|
+
|
|
729
|
+
Return
|
|
730
|
+
------
|
|
731
|
+
str
|
|
732
|
+
version
|
|
733
|
+
"""
|
|
734
|
+
return self._use_last_dir_name(os.path.join(self.UniversalCRTSdkDir, 'lib'))
|
|
735
|
+
|
|
736
|
+
@property
|
|
737
|
+
def NetFxSdkVersion(self):
|
|
738
|
+
"""
|
|
739
|
+
Microsoft .NET Framework SDK versions.
|
|
740
|
+
|
|
741
|
+
Return
|
|
742
|
+
------
|
|
743
|
+
tuple of str
|
|
744
|
+
versions
|
|
745
|
+
"""
|
|
746
|
+
# Set FxSdk versions for specified VS version
|
|
747
|
+
return (
|
|
748
|
+
('4.7.2', '4.7.1', '4.7', '4.6.2', '4.6.1', '4.6', '4.5.2', '4.5.1', '4.5')
|
|
749
|
+
if self.vs_ver >= 14.0
|
|
750
|
+
else ()
|
|
751
|
+
)
|
|
752
|
+
|
|
753
|
+
@property
|
|
754
|
+
def NetFxSdkDir(self):
|
|
755
|
+
"""
|
|
756
|
+
Microsoft .NET Framework SDK directory.
|
|
757
|
+
|
|
758
|
+
Return
|
|
759
|
+
------
|
|
760
|
+
str
|
|
761
|
+
path
|
|
762
|
+
"""
|
|
763
|
+
sdkdir = ''
|
|
764
|
+
for ver in self.NetFxSdkVersion:
|
|
765
|
+
loc = os.path.join(self.ri.netfx_sdk, ver)
|
|
766
|
+
sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder')
|
|
767
|
+
if sdkdir:
|
|
768
|
+
break
|
|
769
|
+
return sdkdir
|
|
770
|
+
|
|
771
|
+
@property
|
|
772
|
+
def FrameworkDir32(self):
|
|
773
|
+
"""
|
|
774
|
+
Microsoft .NET Framework 32bit directory.
|
|
775
|
+
|
|
776
|
+
Return
|
|
777
|
+
------
|
|
778
|
+
str
|
|
779
|
+
path
|
|
780
|
+
"""
|
|
781
|
+
# Default path
|
|
782
|
+
guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework')
|
|
783
|
+
|
|
784
|
+
# Try to get path from registry, if fail use default path
|
|
785
|
+
return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw
|
|
786
|
+
|
|
787
|
+
@property
|
|
788
|
+
def FrameworkDir64(self):
|
|
789
|
+
"""
|
|
790
|
+
Microsoft .NET Framework 64bit directory.
|
|
791
|
+
|
|
792
|
+
Return
|
|
793
|
+
------
|
|
794
|
+
str
|
|
795
|
+
path
|
|
796
|
+
"""
|
|
797
|
+
# Default path
|
|
798
|
+
guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64')
|
|
799
|
+
|
|
800
|
+
# Try to get path from registry, if fail use default path
|
|
801
|
+
return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw
|
|
802
|
+
|
|
803
|
+
@property
|
|
804
|
+
def FrameworkVersion32(self) -> tuple[str, ...]:
|
|
805
|
+
"""
|
|
806
|
+
Microsoft .NET Framework 32bit versions.
|
|
807
|
+
|
|
808
|
+
Return
|
|
809
|
+
------
|
|
810
|
+
tuple of str
|
|
811
|
+
versions
|
|
812
|
+
"""
|
|
813
|
+
return self._find_dot_net_versions(32)
|
|
814
|
+
|
|
815
|
+
@property
|
|
816
|
+
def FrameworkVersion64(self) -> tuple[str, ...]:
|
|
817
|
+
"""
|
|
818
|
+
Microsoft .NET Framework 64bit versions.
|
|
819
|
+
|
|
820
|
+
Return
|
|
821
|
+
------
|
|
822
|
+
tuple of str
|
|
823
|
+
versions
|
|
824
|
+
"""
|
|
825
|
+
return self._find_dot_net_versions(64)
|
|
826
|
+
|
|
827
|
+
def _find_dot_net_versions(self, bits) -> tuple[str, ...]:
|
|
828
|
+
"""
|
|
829
|
+
Find Microsoft .NET Framework versions.
|
|
830
|
+
|
|
831
|
+
Parameters
|
|
832
|
+
----------
|
|
833
|
+
bits: int
|
|
834
|
+
Platform number of bits: 32 or 64.
|
|
835
|
+
|
|
836
|
+
Return
|
|
837
|
+
------
|
|
838
|
+
tuple of str
|
|
839
|
+
versions
|
|
840
|
+
"""
|
|
841
|
+
# Find actual .NET version in registry
|
|
842
|
+
reg_ver = self.ri.lookup(self.ri.vc, f'frameworkver{bits}')
|
|
843
|
+
dot_net_dir = getattr(self, f'FrameworkDir{bits}')
|
|
844
|
+
ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or ''
|
|
845
|
+
|
|
846
|
+
# Set .NET versions for specified MSVC++ version
|
|
847
|
+
if self.vs_ver >= 12.0:
|
|
848
|
+
return ver, 'v4.0'
|
|
849
|
+
elif self.vs_ver >= 10.0:
|
|
850
|
+
return 'v4.0.30319' if ver.lower()[:2] != 'v4' else ver, 'v3.5'
|
|
851
|
+
elif self.vs_ver == 9.0:
|
|
852
|
+
return 'v3.5', 'v2.0.50727'
|
|
853
|
+
elif self.vs_ver == 8.0:
|
|
854
|
+
return 'v3.0', 'v2.0.50727'
|
|
855
|
+
return ()
|
|
856
|
+
|
|
857
|
+
@staticmethod
|
|
858
|
+
def _use_last_dir_name(path, prefix=''):
|
|
859
|
+
"""
|
|
860
|
+
Return name of the last dir in path or '' if no dir found.
|
|
861
|
+
|
|
862
|
+
Parameters
|
|
863
|
+
----------
|
|
864
|
+
path: str
|
|
865
|
+
Use dirs in this path
|
|
866
|
+
prefix: str
|
|
867
|
+
Use only dirs starting by this prefix
|
|
868
|
+
|
|
869
|
+
Return
|
|
870
|
+
------
|
|
871
|
+
str
|
|
872
|
+
name
|
|
873
|
+
"""
|
|
874
|
+
matching_dirs = (
|
|
875
|
+
dir_name
|
|
876
|
+
for dir_name in reversed(os.listdir(path))
|
|
877
|
+
if os.path.isdir(os.path.join(path, dir_name))
|
|
878
|
+
and dir_name.startswith(prefix)
|
|
879
|
+
)
|
|
880
|
+
return next(matching_dirs, None) or ''
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
class _EnvironmentDict(TypedDict):
|
|
884
|
+
include: str
|
|
885
|
+
lib: str
|
|
886
|
+
libpath: str
|
|
887
|
+
path: str
|
|
888
|
+
py_vcruntime_redist: NotRequired[str | None]
|
|
889
|
+
|
|
890
|
+
|
|
891
|
+
class EnvironmentInfo:
|
|
892
|
+
"""
|
|
893
|
+
Return environment variables for specified Microsoft Visual C++ version
|
|
894
|
+
and platform : Lib, Include, Path and libpath.
|
|
895
|
+
|
|
896
|
+
This function is compatible with Microsoft Visual C++ 9.0 to 14.X.
|
|
897
|
+
|
|
898
|
+
Script created by analysing Microsoft environment configuration files like
|
|
899
|
+
"vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ...
|
|
900
|
+
|
|
901
|
+
Parameters
|
|
902
|
+
----------
|
|
903
|
+
arch: str
|
|
904
|
+
Target architecture.
|
|
905
|
+
vc_ver: float
|
|
906
|
+
Required Microsoft Visual C++ version. If not set, autodetect the last
|
|
907
|
+
version.
|
|
908
|
+
vc_min_ver: float
|
|
909
|
+
Minimum Microsoft Visual C++ version.
|
|
910
|
+
"""
|
|
911
|
+
|
|
912
|
+
# Variables and properties in this class use originals CamelCase variables
|
|
913
|
+
# names from Microsoft source files for more easy comparison.
|
|
914
|
+
|
|
915
|
+
def __init__(self, arch, vc_ver=None, vc_min_ver=0) -> None:
|
|
916
|
+
self.pi = PlatformInfo(arch)
|
|
917
|
+
self.ri = RegistryInfo(self.pi)
|
|
918
|
+
self.si = SystemInfo(self.ri, vc_ver)
|
|
919
|
+
|
|
920
|
+
if self.vc_ver < vc_min_ver:
|
|
921
|
+
err = 'No suitable Microsoft Visual C++ version found'
|
|
922
|
+
raise distutils.errors.DistutilsPlatformError(err)
|
|
923
|
+
|
|
924
|
+
@property
|
|
925
|
+
def vs_ver(self):
|
|
926
|
+
"""
|
|
927
|
+
Microsoft Visual Studio.
|
|
928
|
+
|
|
929
|
+
Return
|
|
930
|
+
------
|
|
931
|
+
float
|
|
932
|
+
version
|
|
933
|
+
"""
|
|
934
|
+
return self.si.vs_ver
|
|
935
|
+
|
|
936
|
+
@property
|
|
937
|
+
def vc_ver(self):
|
|
938
|
+
"""
|
|
939
|
+
Microsoft Visual C++ version.
|
|
940
|
+
|
|
941
|
+
Return
|
|
942
|
+
------
|
|
943
|
+
float
|
|
944
|
+
version
|
|
945
|
+
"""
|
|
946
|
+
return self.si.vc_ver
|
|
947
|
+
|
|
948
|
+
@property
|
|
949
|
+
def VSTools(self):
|
|
950
|
+
"""
|
|
951
|
+
Microsoft Visual Studio Tools.
|
|
952
|
+
|
|
953
|
+
Return
|
|
954
|
+
------
|
|
955
|
+
list of str
|
|
956
|
+
paths
|
|
957
|
+
"""
|
|
958
|
+
paths = [r'Common7\IDE', r'Common7\Tools']
|
|
959
|
+
|
|
960
|
+
if self.vs_ver >= 14.0:
|
|
961
|
+
arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
|
|
962
|
+
paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow']
|
|
963
|
+
paths += [r'Team Tools\Performance Tools']
|
|
964
|
+
paths += [rf'Team Tools\Performance Tools{arch_subdir}']
|
|
965
|
+
|
|
966
|
+
return [os.path.join(self.si.VSInstallDir, path) for path in paths]
|
|
967
|
+
|
|
968
|
+
@property
|
|
969
|
+
def VCIncludes(self):
|
|
970
|
+
"""
|
|
971
|
+
Microsoft Visual C++ & Microsoft Foundation Class Includes.
|
|
972
|
+
|
|
973
|
+
Return
|
|
974
|
+
------
|
|
975
|
+
list of str
|
|
976
|
+
paths
|
|
977
|
+
"""
|
|
978
|
+
return [
|
|
979
|
+
os.path.join(self.si.VCInstallDir, 'Include'),
|
|
980
|
+
os.path.join(self.si.VCInstallDir, r'ATLMFC\Include'),
|
|
981
|
+
]
|
|
982
|
+
|
|
983
|
+
@property
|
|
984
|
+
def VCLibraries(self):
|
|
985
|
+
"""
|
|
986
|
+
Microsoft Visual C++ & Microsoft Foundation Class Libraries.
|
|
987
|
+
|
|
988
|
+
Return
|
|
989
|
+
------
|
|
990
|
+
list of str
|
|
991
|
+
paths
|
|
992
|
+
"""
|
|
993
|
+
if self.vs_ver >= 15.0:
|
|
994
|
+
arch_subdir = self.pi.target_dir(x64=True)
|
|
995
|
+
else:
|
|
996
|
+
arch_subdir = self.pi.target_dir(hidex86=True)
|
|
997
|
+
paths = [f'Lib{arch_subdir}', rf'ATLMFC\Lib{arch_subdir}']
|
|
998
|
+
|
|
999
|
+
if self.vs_ver >= 14.0:
|
|
1000
|
+
paths += [rf'Lib\store{arch_subdir}']
|
|
1001
|
+
|
|
1002
|
+
return [os.path.join(self.si.VCInstallDir, path) for path in paths]
|
|
1003
|
+
|
|
1004
|
+
@property
|
|
1005
|
+
def VCStoreRefs(self):
|
|
1006
|
+
"""
|
|
1007
|
+
Microsoft Visual C++ store references Libraries.
|
|
1008
|
+
|
|
1009
|
+
Return
|
|
1010
|
+
------
|
|
1011
|
+
list of str
|
|
1012
|
+
paths
|
|
1013
|
+
"""
|
|
1014
|
+
if self.vs_ver < 14.0:
|
|
1015
|
+
return []
|
|
1016
|
+
return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')]
|
|
1017
|
+
|
|
1018
|
+
@property
|
|
1019
|
+
def VCTools(self):
|
|
1020
|
+
"""
|
|
1021
|
+
Microsoft Visual C++ Tools.
|
|
1022
|
+
|
|
1023
|
+
Return
|
|
1024
|
+
------
|
|
1025
|
+
list of str
|
|
1026
|
+
paths
|
|
1027
|
+
|
|
1028
|
+
When host CPU is ARM, the tools should be found for ARM.
|
|
1029
|
+
|
|
1030
|
+
>>> getfixture('windows_only')
|
|
1031
|
+
>>> mp = getfixture('monkeypatch')
|
|
1032
|
+
>>> mp.setattr(PlatformInfo, 'current_cpu', 'arm64')
|
|
1033
|
+
>>> ei = EnvironmentInfo(arch='irrelevant')
|
|
1034
|
+
>>> paths = ei.VCTools
|
|
1035
|
+
>>> any('HostARM64' in path for path in paths)
|
|
1036
|
+
True
|
|
1037
|
+
"""
|
|
1038
|
+
si = self.si
|
|
1039
|
+
tools = [os.path.join(si.VCInstallDir, 'VCPackages')]
|
|
1040
|
+
|
|
1041
|
+
forcex86 = True if self.vs_ver <= 10.0 else False
|
|
1042
|
+
arch_subdir = self.pi.cross_dir(forcex86)
|
|
1043
|
+
if arch_subdir:
|
|
1044
|
+
tools += [os.path.join(si.VCInstallDir, f'Bin{arch_subdir}')]
|
|
1045
|
+
|
|
1046
|
+
if self.vs_ver == 14.0:
|
|
1047
|
+
path = f'Bin{self.pi.current_dir(hidex86=True)}'
|
|
1048
|
+
tools += [os.path.join(si.VCInstallDir, path)]
|
|
1049
|
+
|
|
1050
|
+
elif self.vs_ver >= 15.0:
|
|
1051
|
+
host_id = self.pi.current_cpu.replace('amd64', 'x64').upper()
|
|
1052
|
+
host_dir = os.path.join('bin', f'Host{host_id}%s')
|
|
1053
|
+
tools += [
|
|
1054
|
+
os.path.join(si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))
|
|
1055
|
+
]
|
|
1056
|
+
|
|
1057
|
+
if self.pi.current_cpu != self.pi.target_cpu:
|
|
1058
|
+
tools += [
|
|
1059
|
+
os.path.join(
|
|
1060
|
+
si.VCInstallDir, host_dir % self.pi.current_dir(x64=True)
|
|
1061
|
+
)
|
|
1062
|
+
]
|
|
1063
|
+
|
|
1064
|
+
else:
|
|
1065
|
+
tools += [os.path.join(si.VCInstallDir, 'Bin')]
|
|
1066
|
+
|
|
1067
|
+
return tools
|
|
1068
|
+
|
|
1069
|
+
@property
|
|
1070
|
+
def OSLibraries(self):
|
|
1071
|
+
"""
|
|
1072
|
+
Microsoft Windows SDK Libraries.
|
|
1073
|
+
|
|
1074
|
+
Return
|
|
1075
|
+
------
|
|
1076
|
+
list of str
|
|
1077
|
+
paths
|
|
1078
|
+
"""
|
|
1079
|
+
if self.vs_ver <= 10.0:
|
|
1080
|
+
arch_subdir = self.pi.target_dir(hidex86=True, x64=True)
|
|
1081
|
+
return [os.path.join(self.si.WindowsSdkDir, f'Lib{arch_subdir}')]
|
|
1082
|
+
|
|
1083
|
+
else:
|
|
1084
|
+
arch_subdir = self.pi.target_dir(x64=True)
|
|
1085
|
+
lib = os.path.join(self.si.WindowsSdkDir, 'lib')
|
|
1086
|
+
libver = self._sdk_subdir
|
|
1087
|
+
return [os.path.join(lib, f'{libver}um{arch_subdir}')]
|
|
1088
|
+
|
|
1089
|
+
@property
|
|
1090
|
+
def OSIncludes(self):
|
|
1091
|
+
"""
|
|
1092
|
+
Microsoft Windows SDK Include.
|
|
1093
|
+
|
|
1094
|
+
Return
|
|
1095
|
+
------
|
|
1096
|
+
list of str
|
|
1097
|
+
paths
|
|
1098
|
+
"""
|
|
1099
|
+
include = os.path.join(self.si.WindowsSdkDir, 'include')
|
|
1100
|
+
|
|
1101
|
+
if self.vs_ver <= 10.0:
|
|
1102
|
+
return [include, os.path.join(include, 'gl')]
|
|
1103
|
+
|
|
1104
|
+
else:
|
|
1105
|
+
if self.vs_ver >= 14.0:
|
|
1106
|
+
sdkver = self._sdk_subdir
|
|
1107
|
+
else:
|
|
1108
|
+
sdkver = ''
|
|
1109
|
+
return [
|
|
1110
|
+
os.path.join(include, f'{sdkver}shared'),
|
|
1111
|
+
os.path.join(include, f'{sdkver}um'),
|
|
1112
|
+
os.path.join(include, f'{sdkver}winrt'),
|
|
1113
|
+
]
|
|
1114
|
+
|
|
1115
|
+
@property
|
|
1116
|
+
def OSLibpath(self):
|
|
1117
|
+
"""
|
|
1118
|
+
Microsoft Windows SDK Libraries Paths.
|
|
1119
|
+
|
|
1120
|
+
Return
|
|
1121
|
+
------
|
|
1122
|
+
list of str
|
|
1123
|
+
paths
|
|
1124
|
+
"""
|
|
1125
|
+
ref = os.path.join(self.si.WindowsSdkDir, 'References')
|
|
1126
|
+
libpath = []
|
|
1127
|
+
|
|
1128
|
+
if self.vs_ver <= 9.0:
|
|
1129
|
+
libpath += self.OSLibraries
|
|
1130
|
+
|
|
1131
|
+
if self.vs_ver >= 11.0:
|
|
1132
|
+
libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')]
|
|
1133
|
+
|
|
1134
|
+
if self.vs_ver >= 14.0:
|
|
1135
|
+
libpath += [
|
|
1136
|
+
ref,
|
|
1137
|
+
os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'),
|
|
1138
|
+
os.path.join(ref, 'Windows.Foundation.UniversalApiContract', '1.0.0.0'),
|
|
1139
|
+
os.path.join(ref, 'Windows.Foundation.FoundationContract', '1.0.0.0'),
|
|
1140
|
+
os.path.join(
|
|
1141
|
+
ref, 'Windows.Networking.Connectivity.WwanContract', '1.0.0.0'
|
|
1142
|
+
),
|
|
1143
|
+
os.path.join(
|
|
1144
|
+
self.si.WindowsSdkDir,
|
|
1145
|
+
'ExtensionSDKs',
|
|
1146
|
+
'Microsoft.VCLibs',
|
|
1147
|
+
f'{self.vs_ver:0.1f}',
|
|
1148
|
+
'References',
|
|
1149
|
+
'CommonConfiguration',
|
|
1150
|
+
'neutral',
|
|
1151
|
+
),
|
|
1152
|
+
]
|
|
1153
|
+
return libpath
|
|
1154
|
+
|
|
1155
|
+
@property
|
|
1156
|
+
def SdkTools(self):
|
|
1157
|
+
"""
|
|
1158
|
+
Microsoft Windows SDK Tools.
|
|
1159
|
+
|
|
1160
|
+
Return
|
|
1161
|
+
------
|
|
1162
|
+
list of str
|
|
1163
|
+
paths
|
|
1164
|
+
"""
|
|
1165
|
+
return list(self._sdk_tools())
|
|
1166
|
+
|
|
1167
|
+
def _sdk_tools(self):
|
|
1168
|
+
"""
|
|
1169
|
+
Microsoft Windows SDK Tools paths generator.
|
|
1170
|
+
|
|
1171
|
+
Return
|
|
1172
|
+
------
|
|
1173
|
+
generator of str
|
|
1174
|
+
paths
|
|
1175
|
+
"""
|
|
1176
|
+
if self.vs_ver < 15.0:
|
|
1177
|
+
bin_dir = 'Bin' if self.vs_ver <= 11.0 else r'Bin\x86'
|
|
1178
|
+
yield os.path.join(self.si.WindowsSdkDir, bin_dir)
|
|
1179
|
+
|
|
1180
|
+
if not self.pi.current_is_x86():
|
|
1181
|
+
arch_subdir = self.pi.current_dir(x64=True)
|
|
1182
|
+
path = f'Bin{arch_subdir}'
|
|
1183
|
+
yield os.path.join(self.si.WindowsSdkDir, path)
|
|
1184
|
+
|
|
1185
|
+
if self.vs_ver in (10.0, 11.0):
|
|
1186
|
+
if self.pi.target_is_x86():
|
|
1187
|
+
arch_subdir = ''
|
|
1188
|
+
else:
|
|
1189
|
+
arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
|
|
1190
|
+
path = rf'Bin\NETFX 4.0 Tools{arch_subdir}'
|
|
1191
|
+
yield os.path.join(self.si.WindowsSdkDir, path)
|
|
1192
|
+
|
|
1193
|
+
elif self.vs_ver >= 15.0:
|
|
1194
|
+
path = os.path.join(self.si.WindowsSdkDir, 'Bin')
|
|
1195
|
+
arch_subdir = self.pi.current_dir(x64=True)
|
|
1196
|
+
sdkver = self.si.WindowsSdkLastVersion
|
|
1197
|
+
yield os.path.join(path, f'{sdkver}{arch_subdir}')
|
|
1198
|
+
|
|
1199
|
+
if self.si.WindowsSDKExecutablePath:
|
|
1200
|
+
yield self.si.WindowsSDKExecutablePath
|
|
1201
|
+
|
|
1202
|
+
@property
|
|
1203
|
+
def _sdk_subdir(self):
|
|
1204
|
+
"""
|
|
1205
|
+
Microsoft Windows SDK version subdir.
|
|
1206
|
+
|
|
1207
|
+
Return
|
|
1208
|
+
------
|
|
1209
|
+
str
|
|
1210
|
+
subdir
|
|
1211
|
+
"""
|
|
1212
|
+
ucrtver = self.si.WindowsSdkLastVersion
|
|
1213
|
+
return (f'{ucrtver}\\') if ucrtver else ''
|
|
1214
|
+
|
|
1215
|
+
@property
|
|
1216
|
+
def SdkSetup(self):
|
|
1217
|
+
"""
|
|
1218
|
+
Microsoft Windows SDK Setup.
|
|
1219
|
+
|
|
1220
|
+
Return
|
|
1221
|
+
------
|
|
1222
|
+
list of str
|
|
1223
|
+
paths
|
|
1224
|
+
"""
|
|
1225
|
+
if self.vs_ver > 9.0:
|
|
1226
|
+
return []
|
|
1227
|
+
|
|
1228
|
+
return [os.path.join(self.si.WindowsSdkDir, 'Setup')]
|
|
1229
|
+
|
|
1230
|
+
@property
|
|
1231
|
+
def FxTools(self):
|
|
1232
|
+
"""
|
|
1233
|
+
Microsoft .NET Framework Tools.
|
|
1234
|
+
|
|
1235
|
+
Return
|
|
1236
|
+
------
|
|
1237
|
+
list of str
|
|
1238
|
+
paths
|
|
1239
|
+
"""
|
|
1240
|
+
pi = self.pi
|
|
1241
|
+
si = self.si
|
|
1242
|
+
|
|
1243
|
+
if self.vs_ver <= 10.0:
|
|
1244
|
+
include32 = True
|
|
1245
|
+
include64 = not pi.target_is_x86() and not pi.current_is_x86()
|
|
1246
|
+
else:
|
|
1247
|
+
include32 = pi.target_is_x86() or pi.current_is_x86()
|
|
1248
|
+
include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64'
|
|
1249
|
+
|
|
1250
|
+
tools = []
|
|
1251
|
+
if include32:
|
|
1252
|
+
tools += [
|
|
1253
|
+
os.path.join(si.FrameworkDir32, ver) for ver in si.FrameworkVersion32
|
|
1254
|
+
]
|
|
1255
|
+
if include64:
|
|
1256
|
+
tools += [
|
|
1257
|
+
os.path.join(si.FrameworkDir64, ver) for ver in si.FrameworkVersion64
|
|
1258
|
+
]
|
|
1259
|
+
return tools
|
|
1260
|
+
|
|
1261
|
+
@property
|
|
1262
|
+
def NetFxSDKLibraries(self):
|
|
1263
|
+
"""
|
|
1264
|
+
Microsoft .Net Framework SDK Libraries.
|
|
1265
|
+
|
|
1266
|
+
Return
|
|
1267
|
+
------
|
|
1268
|
+
list of str
|
|
1269
|
+
paths
|
|
1270
|
+
"""
|
|
1271
|
+
if self.vs_ver < 14.0 or not self.si.NetFxSdkDir:
|
|
1272
|
+
return []
|
|
1273
|
+
|
|
1274
|
+
arch_subdir = self.pi.target_dir(x64=True)
|
|
1275
|
+
return [os.path.join(self.si.NetFxSdkDir, rf'lib\um{arch_subdir}')]
|
|
1276
|
+
|
|
1277
|
+
@property
|
|
1278
|
+
def NetFxSDKIncludes(self):
|
|
1279
|
+
"""
|
|
1280
|
+
Microsoft .Net Framework SDK Includes.
|
|
1281
|
+
|
|
1282
|
+
Return
|
|
1283
|
+
------
|
|
1284
|
+
list of str
|
|
1285
|
+
paths
|
|
1286
|
+
"""
|
|
1287
|
+
if self.vs_ver < 14.0 or not self.si.NetFxSdkDir:
|
|
1288
|
+
return []
|
|
1289
|
+
|
|
1290
|
+
return [os.path.join(self.si.NetFxSdkDir, r'include\um')]
|
|
1291
|
+
|
|
1292
|
+
@property
|
|
1293
|
+
def VsTDb(self):
|
|
1294
|
+
"""
|
|
1295
|
+
Microsoft Visual Studio Team System Database.
|
|
1296
|
+
|
|
1297
|
+
Return
|
|
1298
|
+
------
|
|
1299
|
+
list of str
|
|
1300
|
+
paths
|
|
1301
|
+
"""
|
|
1302
|
+
return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')]
|
|
1303
|
+
|
|
1304
|
+
@property
|
|
1305
|
+
def MSBuild(self):
|
|
1306
|
+
"""
|
|
1307
|
+
Microsoft Build Engine.
|
|
1308
|
+
|
|
1309
|
+
Return
|
|
1310
|
+
------
|
|
1311
|
+
list of str
|
|
1312
|
+
paths
|
|
1313
|
+
"""
|
|
1314
|
+
if self.vs_ver < 12.0:
|
|
1315
|
+
return []
|
|
1316
|
+
elif self.vs_ver < 15.0:
|
|
1317
|
+
base_path = self.si.ProgramFilesx86
|
|
1318
|
+
arch_subdir = self.pi.current_dir(hidex86=True)
|
|
1319
|
+
else:
|
|
1320
|
+
base_path = self.si.VSInstallDir
|
|
1321
|
+
arch_subdir = ''
|
|
1322
|
+
|
|
1323
|
+
path = rf'MSBuild\{self.vs_ver:0.1f}\bin{arch_subdir}'
|
|
1324
|
+
build = [os.path.join(base_path, path)]
|
|
1325
|
+
|
|
1326
|
+
if self.vs_ver >= 15.0:
|
|
1327
|
+
# Add Roslyn C# & Visual Basic Compiler
|
|
1328
|
+
build += [os.path.join(base_path, path, 'Roslyn')]
|
|
1329
|
+
|
|
1330
|
+
return build
|
|
1331
|
+
|
|
1332
|
+
@property
|
|
1333
|
+
def HTMLHelpWorkshop(self):
|
|
1334
|
+
"""
|
|
1335
|
+
Microsoft HTML Help Workshop.
|
|
1336
|
+
|
|
1337
|
+
Return
|
|
1338
|
+
------
|
|
1339
|
+
list of str
|
|
1340
|
+
paths
|
|
1341
|
+
"""
|
|
1342
|
+
if self.vs_ver < 11.0:
|
|
1343
|
+
return []
|
|
1344
|
+
|
|
1345
|
+
return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')]
|
|
1346
|
+
|
|
1347
|
+
@property
|
|
1348
|
+
def UCRTLibraries(self):
|
|
1349
|
+
"""
|
|
1350
|
+
Microsoft Universal C Runtime SDK Libraries.
|
|
1351
|
+
|
|
1352
|
+
Return
|
|
1353
|
+
------
|
|
1354
|
+
list of str
|
|
1355
|
+
paths
|
|
1356
|
+
"""
|
|
1357
|
+
if self.vs_ver < 14.0:
|
|
1358
|
+
return []
|
|
1359
|
+
|
|
1360
|
+
arch_subdir = self.pi.target_dir(x64=True)
|
|
1361
|
+
lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib')
|
|
1362
|
+
ucrtver = self._ucrt_subdir
|
|
1363
|
+
return [os.path.join(lib, f'{ucrtver}ucrt{arch_subdir}')]
|
|
1364
|
+
|
|
1365
|
+
@property
|
|
1366
|
+
def UCRTIncludes(self):
|
|
1367
|
+
"""
|
|
1368
|
+
Microsoft Universal C Runtime SDK Include.
|
|
1369
|
+
|
|
1370
|
+
Return
|
|
1371
|
+
------
|
|
1372
|
+
list of str
|
|
1373
|
+
paths
|
|
1374
|
+
"""
|
|
1375
|
+
if self.vs_ver < 14.0:
|
|
1376
|
+
return []
|
|
1377
|
+
|
|
1378
|
+
include = os.path.join(self.si.UniversalCRTSdkDir, 'include')
|
|
1379
|
+
return [os.path.join(include, f'{self._ucrt_subdir}ucrt')]
|
|
1380
|
+
|
|
1381
|
+
@property
|
|
1382
|
+
def _ucrt_subdir(self):
|
|
1383
|
+
"""
|
|
1384
|
+
Microsoft Universal C Runtime SDK version subdir.
|
|
1385
|
+
|
|
1386
|
+
Return
|
|
1387
|
+
------
|
|
1388
|
+
str
|
|
1389
|
+
subdir
|
|
1390
|
+
"""
|
|
1391
|
+
ucrtver = self.si.UniversalCRTSdkLastVersion
|
|
1392
|
+
return (f'{ucrtver}\\') if ucrtver else ''
|
|
1393
|
+
|
|
1394
|
+
@property
|
|
1395
|
+
def FSharp(self):
|
|
1396
|
+
"""
|
|
1397
|
+
Microsoft Visual F#.
|
|
1398
|
+
|
|
1399
|
+
Return
|
|
1400
|
+
------
|
|
1401
|
+
list of str
|
|
1402
|
+
paths
|
|
1403
|
+
"""
|
|
1404
|
+
if 11.0 > self.vs_ver > 12.0:
|
|
1405
|
+
return []
|
|
1406
|
+
|
|
1407
|
+
return [self.si.FSharpInstallDir]
|
|
1408
|
+
|
|
1409
|
+
@property
|
|
1410
|
+
def VCRuntimeRedist(self) -> str | None:
|
|
1411
|
+
"""
|
|
1412
|
+
Microsoft Visual C++ runtime redistributable dll.
|
|
1413
|
+
|
|
1414
|
+
Returns the first suitable path found or None.
|
|
1415
|
+
"""
|
|
1416
|
+
vcruntime = f'vcruntime{self.vc_ver}0.dll'
|
|
1417
|
+
arch_subdir = self.pi.target_dir(x64=True).strip('\\')
|
|
1418
|
+
|
|
1419
|
+
# Installation prefixes candidates
|
|
1420
|
+
prefixes = []
|
|
1421
|
+
tools_path = self.si.VCInstallDir
|
|
1422
|
+
redist_path = os.path.dirname(tools_path.replace(r'\Tools', r'\Redist'))
|
|
1423
|
+
if os.path.isdir(redist_path):
|
|
1424
|
+
# Redist version may not be exactly the same as tools
|
|
1425
|
+
redist_path = os.path.join(redist_path, os.listdir(redist_path)[-1])
|
|
1426
|
+
prefixes += [redist_path, os.path.join(redist_path, 'onecore')]
|
|
1427
|
+
|
|
1428
|
+
prefixes += [os.path.join(tools_path, 'redist')] # VS14 legacy path
|
|
1429
|
+
|
|
1430
|
+
# CRT directory
|
|
1431
|
+
crt_dirs = (
|
|
1432
|
+
f'Microsoft.VC{self.vc_ver * 10}.CRT',
|
|
1433
|
+
# Sometime store in directory with VS version instead of VC
|
|
1434
|
+
f'Microsoft.VC{int(self.vs_ver) * 10}.CRT',
|
|
1435
|
+
)
|
|
1436
|
+
|
|
1437
|
+
# vcruntime path
|
|
1438
|
+
candidate_paths = (
|
|
1439
|
+
os.path.join(prefix, arch_subdir, crt_dir, vcruntime)
|
|
1440
|
+
for (prefix, crt_dir) in itertools.product(prefixes, crt_dirs)
|
|
1441
|
+
)
|
|
1442
|
+
return next(filter(os.path.isfile, candidate_paths), None) # type: ignore[arg-type] #python/mypy#12682
|
|
1443
|
+
|
|
1444
|
+
def return_env(self, exists: bool = True) -> _EnvironmentDict:
|
|
1445
|
+
"""
|
|
1446
|
+
Return environment dict.
|
|
1447
|
+
|
|
1448
|
+
Parameters
|
|
1449
|
+
----------
|
|
1450
|
+
exists: bool
|
|
1451
|
+
It True, only return existing paths.
|
|
1452
|
+
|
|
1453
|
+
Return
|
|
1454
|
+
------
|
|
1455
|
+
dict
|
|
1456
|
+
environment
|
|
1457
|
+
"""
|
|
1458
|
+
env = _EnvironmentDict(
|
|
1459
|
+
include=self._build_paths(
|
|
1460
|
+
'include',
|
|
1461
|
+
[
|
|
1462
|
+
self.VCIncludes,
|
|
1463
|
+
self.OSIncludes,
|
|
1464
|
+
self.UCRTIncludes,
|
|
1465
|
+
self.NetFxSDKIncludes,
|
|
1466
|
+
],
|
|
1467
|
+
exists,
|
|
1468
|
+
),
|
|
1469
|
+
lib=self._build_paths(
|
|
1470
|
+
'lib',
|
|
1471
|
+
[
|
|
1472
|
+
self.VCLibraries,
|
|
1473
|
+
self.OSLibraries,
|
|
1474
|
+
self.FxTools,
|
|
1475
|
+
self.UCRTLibraries,
|
|
1476
|
+
self.NetFxSDKLibraries,
|
|
1477
|
+
],
|
|
1478
|
+
exists,
|
|
1479
|
+
),
|
|
1480
|
+
libpath=self._build_paths(
|
|
1481
|
+
'libpath',
|
|
1482
|
+
[self.VCLibraries, self.FxTools, self.VCStoreRefs, self.OSLibpath],
|
|
1483
|
+
exists,
|
|
1484
|
+
),
|
|
1485
|
+
path=self._build_paths(
|
|
1486
|
+
'path',
|
|
1487
|
+
[
|
|
1488
|
+
self.VCTools,
|
|
1489
|
+
self.VSTools,
|
|
1490
|
+
self.VsTDb,
|
|
1491
|
+
self.SdkTools,
|
|
1492
|
+
self.SdkSetup,
|
|
1493
|
+
self.FxTools,
|
|
1494
|
+
self.MSBuild,
|
|
1495
|
+
self.HTMLHelpWorkshop,
|
|
1496
|
+
self.FSharp,
|
|
1497
|
+
],
|
|
1498
|
+
exists,
|
|
1499
|
+
),
|
|
1500
|
+
)
|
|
1501
|
+
if self.vs_ver >= 14 and self.VCRuntimeRedist:
|
|
1502
|
+
env['py_vcruntime_redist'] = self.VCRuntimeRedist
|
|
1503
|
+
return env
|
|
1504
|
+
|
|
1505
|
+
def _build_paths(self, name, spec_path_lists, exists):
|
|
1506
|
+
"""
|
|
1507
|
+
Given an environment variable name and specified paths,
|
|
1508
|
+
return a pathsep-separated string of paths containing
|
|
1509
|
+
unique, extant, directories from those paths and from
|
|
1510
|
+
the environment variable. Raise an error if no paths
|
|
1511
|
+
are resolved.
|
|
1512
|
+
|
|
1513
|
+
Parameters
|
|
1514
|
+
----------
|
|
1515
|
+
name: str
|
|
1516
|
+
Environment variable name
|
|
1517
|
+
spec_path_lists: list of str
|
|
1518
|
+
Paths
|
|
1519
|
+
exists: bool
|
|
1520
|
+
It True, only return existing paths.
|
|
1521
|
+
|
|
1522
|
+
Return
|
|
1523
|
+
------
|
|
1524
|
+
str
|
|
1525
|
+
Pathsep-separated paths
|
|
1526
|
+
"""
|
|
1527
|
+
# flatten spec_path_lists
|
|
1528
|
+
spec_paths = itertools.chain.from_iterable(spec_path_lists)
|
|
1529
|
+
env_paths = environ.get(name, '').split(os.pathsep)
|
|
1530
|
+
paths = itertools.chain(spec_paths, env_paths)
|
|
1531
|
+
extant_paths = list(filter(os.path.isdir, paths)) if exists else paths
|
|
1532
|
+
if not extant_paths:
|
|
1533
|
+
msg = f"{name.upper()} environment variable is empty"
|
|
1534
|
+
raise distutils.errors.DistutilsPlatformError(msg)
|
|
1535
|
+
unique_paths = unique_everseen(extant_paths)
|
|
1536
|
+
return os.pathsep.join(unique_paths)
|