1 """ 2 Provides .props file. 3 """ 4 5 import os 6 7 from .constants import * 8 9 __all__ = ["PYTHON_PROPS_NAME"] 10 11 12 def public(f): 13 __all__.append(f.__name__) 14 return f 15 16 17 PYTHON_PROPS_NAME = "python.props" 18 19 PROPS_DATA = { 20 "PYTHON_TAG": VER_DOT, 21 "PYTHON_VERSION": os.getenv("PYTHON_NUSPEC_VERSION"), 22 "PYTHON_PLATFORM": os.getenv("PYTHON_PROPS_PLATFORM"), 23 "PYTHON_TARGET": "", 24 } 25 26 if not PROPS_DATA["PYTHON_VERSION"]: 27 if VER_NAME: 28 PROPS_DATA["PYTHON_VERSION"] = "{}.{}-{}{}".format( 29 VER_DOT, VER_MICRO, VER_NAME, VER_SERIAL 30 ) 31 else: 32 PROPS_DATA["PYTHON_VERSION"] = "{}.{}".format(VER_DOT, VER_MICRO) 33 34 if not PROPS_DATA["PYTHON_PLATFORM"]: 35 PROPS_DATA["PYTHON_PLATFORM"] = "x64" if IS_X64 else "Win32" 36 37 PROPS_DATA["PYTHON_TARGET"] = "_GetPythonRuntimeFilesDependsOn{}{}_{}".format( 38 VER_MAJOR, VER_MINOR, PROPS_DATA["PYTHON_PLATFORM"] 39 ) 40 41 PROPS_TEMPLATE = r"""<?xml version="1.0" encoding="utf-8"?> 42 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 43 <PropertyGroup Condition="$(Platform) == '{PYTHON_PLATFORM}'"> 44 <PythonHome Condition="$(Configuration) == 'Debug'">$([msbuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), "python_d.exe")</PythonHome> 45 <PythonHome Condition="$(PythonHome) == ''">$([msbuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), "python.exe")</PythonHome> 46 <PythonInclude>$(PythonHome)\include</PythonInclude> 47 <PythonLibs>$(PythonHome)\libs</PythonLibs> 48 <PythonTag>{PYTHON_TAG}</PythonTag> 49 <PythonVersion>{PYTHON_VERSION}</PythonVersion> 50 51 <IncludePythonExe Condition="$(IncludePythonExe) == ''">true</IncludePythonExe> 52 <IncludeDistutils Condition="$(IncludeDistutils) == ''">false</IncludeDistutils> 53 <IncludeLib2To3 Condition="$(IncludeLib2To3) == ''">false</IncludeLib2To3> 54 <IncludeVEnv Condition="$(IncludeVEnv) == ''">false</IncludeVEnv> 55 56 <GetPythonRuntimeFilesDependsOn>{PYTHON_TARGET};$(GetPythonRuntimeFilesDependsOn)</GetPythonRuntimeFilesDependsOn> 57 </PropertyGroup> 58 59 <ItemDefinitionGroup Condition="$(Platform) == '{PYTHON_PLATFORM}'"> 60 <ClCompile> 61 <AdditionalIncludeDirectories>$(PythonInclude);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> 62 <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> 63 </ClCompile> 64 <Link> 65 <AdditionalLibraryDirectories>$(PythonLibs);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> 66 </Link> 67 </ItemDefinitionGroup> 68 69 <Target Name="GetPythonRuntimeFiles" Returns="@(PythonRuntime)" DependsOnTargets="$(GetPythonRuntimeFilesDependsOn)" /> 70 71 <Target Name="{PYTHON_TARGET}" Returns="@(PythonRuntime)"> 72 <ItemGroup> 73 <_PythonRuntimeExe Include="$(PythonHome)\python*.dll" /> 74 <_PythonRuntimeExe Include="$(PythonHome)\python*.exe" Condition="$(IncludePythonExe) == 'true'" /> 75 <_PythonRuntimeExe> 76 <Link>%(Filename)%(Extension)</Link> 77 </_PythonRuntimeExe> 78 <_PythonRuntimeDlls Include="$(PythonHome)\DLLs\*.pyd" /> 79 <_PythonRuntimeDlls Include="$(PythonHome)\DLLs\*.dll" /> 80 <_PythonRuntimeDlls> 81 <Link>DLLs\%(Filename)%(Extension)</Link> 82 </_PythonRuntimeDlls> 83 <_PythonRuntimeLib Include="$(PythonHome)\Lib\**\*" Exclude="$(PythonHome)\Lib\**\*.pyc;$(PythonHome)\Lib\site-packages\**\*" /> 84 <_PythonRuntimeLib Remove="$(PythonHome)\Lib\distutils\**\*" Condition="$(IncludeDistutils) != 'true'" /> 85 <_PythonRuntimeLib Remove="$(PythonHome)\Lib\lib2to3\**\*" Condition="$(IncludeLib2To3) != 'true'" /> 86 <_PythonRuntimeLib Remove="$(PythonHome)\Lib\ensurepip\**\*" Condition="$(IncludeVEnv) != 'true'" /> 87 <_PythonRuntimeLib Remove="$(PythonHome)\Lib\venv\**\*" Condition="$(IncludeVEnv) != 'true'" /> 88 <_PythonRuntimeLib> 89 <Link>Lib\%(RecursiveDir)%(Filename)%(Extension)</Link> 90 </_PythonRuntimeLib> 91 <PythonRuntime Include="@(_PythonRuntimeExe);@(_PythonRuntimeDlls);@(_PythonRuntimeLib)" /> 92 </ItemGroup> 93 94 <Message Importance="low" Text="Collected Python runtime from $(PythonHome):%0D%0A@(PythonRuntime->' %(Link)','%0D%0A')" /> 95 </Target> 96 </Project> 97 """ 98 99 100 @public 101 def get_props_layout(ns): 102 if ns.include_all or ns.include_props: 103 yield "python.props", ns.temp / "python.props" 104 105 106 @public 107 def get_props(ns): 108 # TODO: Filter contents of props file according to included/excluded items 109 props = PROPS_TEMPLATE.format_map(PROPS_DATA) 110 return props.encode("utf-8") 111