You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
4.1 KiB
100 lines
4.1 KiB
"""
|
|
Provides .props file.
|
|
"""
|
|
|
|
import os
|
|
|
|
from .constants import *
|
|
|
|
__all__ = ["get_props_layout"]
|
|
|
|
PYTHON_PROPS_NAME = "python.props"
|
|
|
|
PROPS_DATA = {
|
|
"PYTHON_TAG": VER_DOT,
|
|
"PYTHON_VERSION": os.getenv("PYTHON_NUSPEC_VERSION"),
|
|
"PYTHON_PLATFORM": os.getenv("PYTHON_PROPS_PLATFORM"),
|
|
"PYTHON_TARGET": "",
|
|
}
|
|
|
|
if not PROPS_DATA["PYTHON_VERSION"]:
|
|
PROPS_DATA["PYTHON_VERSION"] = "{}.{}{}{}".format(
|
|
VER_DOT, VER_MICRO, "-" if VER_SUFFIX else "", VER_SUFFIX
|
|
)
|
|
|
|
PROPS_DATA["PYTHON_TARGET"] = "_GetPythonRuntimeFilesDependsOn{}{}_{}".format(
|
|
VER_MAJOR, VER_MINOR, PROPS_DATA["PYTHON_PLATFORM"]
|
|
)
|
|
|
|
PROPS_TEMPLATE = r"""<?xml version="1.0" encoding="utf-8"?>
|
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
<PropertyGroup Condition="$(Platform) == '{PYTHON_PLATFORM}'">
|
|
<PythonHome Condition="$(PythonHome) == ''">$([System.IO.Path]::GetFullPath("$(MSBuildThisFileDirectory)\..\..\tools"))</PythonHome>
|
|
<PythonInclude>$(PythonHome)\include</PythonInclude>
|
|
<PythonLibs>$(PythonHome)\libs</PythonLibs>
|
|
<PythonTag>{PYTHON_TAG}</PythonTag>
|
|
<PythonVersion>{PYTHON_VERSION}</PythonVersion>
|
|
|
|
<IncludePythonExe Condition="$(IncludePythonExe) == ''">true</IncludePythonExe>
|
|
<IncludeDistutils Condition="$(IncludeDistutils) == ''">false</IncludeDistutils>
|
|
<IncludeLib2To3 Condition="$(IncludeLib2To3) == ''">false</IncludeLib2To3>
|
|
<IncludeVEnv Condition="$(IncludeVEnv) == ''">false</IncludeVEnv>
|
|
|
|
<GetPythonRuntimeFilesDependsOn>{PYTHON_TARGET};$(GetPythonRuntimeFilesDependsOn)</GetPythonRuntimeFilesDependsOn>
|
|
</PropertyGroup>
|
|
|
|
<ItemDefinitionGroup Condition="$(Platform) == '{PYTHON_PLATFORM}'">
|
|
<ClCompile>
|
|
<AdditionalIncludeDirectories>$(PythonInclude);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
|
</ClCompile>
|
|
<Link>
|
|
<AdditionalLibraryDirectories>$(PythonLibs);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
|
</Link>
|
|
</ItemDefinitionGroup>
|
|
|
|
<Target Name="GetPythonRuntimeFiles" Returns="@(PythonRuntime)" DependsOnTargets="$(GetPythonRuntimeFilesDependsOn)" />
|
|
|
|
<Target Name="{PYTHON_TARGET}" Returns="@(PythonRuntime)">
|
|
<ItemGroup>
|
|
<_PythonRuntimeExe Include="$(PythonHome)\python*.dll" />
|
|
<_PythonRuntimeExe Include="$(PythonHome)\python*.exe" Condition="$(IncludePythonExe) == 'true'" />
|
|
<_PythonRuntimeExe>
|
|
<Link>%(Filename)%(Extension)</Link>
|
|
</_PythonRuntimeExe>
|
|
<_PythonRuntimeDlls Include="$(PythonHome)\DLLs\*.pyd" />
|
|
<_PythonRuntimeDlls Include="$(PythonHome)\DLLs\*.dll" />
|
|
<_PythonRuntimeDlls>
|
|
<Link>DLLs\%(Filename)%(Extension)</Link>
|
|
</_PythonRuntimeDlls>
|
|
<_PythonRuntimeLib Include="$(PythonHome)\Lib\**\*" Exclude="$(PythonHome)\Lib\**\*.pyc;$(PythonHome)\Lib\site-packages\**\*" />
|
|
<_PythonRuntimeLib Remove="$(PythonHome)\Lib\distutils\**\*" Condition="$(IncludeDistutils) != 'true'" />
|
|
<_PythonRuntimeLib Remove="$(PythonHome)\Lib\lib2to3\**\*" Condition="$(IncludeLib2To3) != 'true'" />
|
|
<_PythonRuntimeLib Remove="$(PythonHome)\Lib\ensurepip\**\*" Condition="$(IncludeVEnv) != 'true'" />
|
|
<_PythonRuntimeLib Remove="$(PythonHome)\Lib\venv\**\*" Condition="$(IncludeVEnv) != 'true'" />
|
|
<_PythonRuntimeLib>
|
|
<Link>Lib\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
|
</_PythonRuntimeLib>
|
|
<PythonRuntime Include="@(_PythonRuntimeExe);@(_PythonRuntimeDlls);@(_PythonRuntimeLib)" />
|
|
</ItemGroup>
|
|
|
|
<Message Importance="low" Text="Collected Python runtime from $(PythonHome):%0D%0A@(PythonRuntime->' %(Link)','%0D%0A')" />
|
|
</Target>
|
|
</Project>
|
|
"""
|
|
|
|
|
|
def get_props_layout(ns):
|
|
if ns.include_all or ns.include_props:
|
|
# TODO: Filter contents of props file according to included/excluded items
|
|
d = dict(PROPS_DATA)
|
|
if not d.get("PYTHON_PLATFORM"):
|
|
d["PYTHON_PLATFORM"] = {
|
|
"win32": "Win32",
|
|
"amd64": "X64",
|
|
"arm32": "ARM",
|
|
"arm64": "ARM64",
|
|
}[ns.arch]
|
|
props = PROPS_TEMPLATE.format_map(d)
|
|
yield "python.props", ("python.props", props.encode("utf-8"))
|