Skip to content

Commit

Permalink
Building .Net Core on Linux
Browse files Browse the repository at this point in the history
  • Loading branch information
David Brownell committed Jun 6, 2018
1 parent cdb9afb commit 7882cf0
Show file tree
Hide file tree
Showing 39 changed files with 1,389 additions and 247 deletions.
2 changes: 2 additions & 0 deletions .gitattributes
Expand Up @@ -35,6 +35,8 @@ Readme text
*.psm1 text
*.ps text
*.i text
*.cmake text
*.patch text

*.sh text eol=lf
*.awk text eol=lf
Expand Down
5 changes: 3 additions & 2 deletions .gitignore
Expand Up @@ -255,8 +255,9 @@ bindings/python/cntk/i_plus_i_0.mod
bindings/csharp/Swig/cntk_cs_wrap.h
bindings/csharp/Swig/cntk_cs_wrap.cxx
bindings/csharp/Swig/cntk_cs_wrap.cxx
bindings/csharp/CNTKLibraryManagedDll/SwigProxyClasses/GeneratedCode/Debug/*.cs
bindings/csharp/CNTKLibraryManagedDll/SwigProxyClasses/GeneratedCode/Release/*.cs
bindings/csharp/Swig/Generated/*
bindings/csharp/CNTKLibraryManagedDll/build/Linux/Debug/CSharpBindings/CMakeFiles/CSharpBindings.dir/depend.make
bindings/csharp/CNTKLibraryManagedDll/build/Linux/Release/CSharpBindings/CMakeFiles/CSharpBindings.dir/depend.make

# Java bindings
bindings/java/Swig/cntk_java_wrap.h
Expand Down
11 changes: 11 additions & 0 deletions CMakeLists.txt
@@ -0,0 +1,11 @@
cmake_minimum_required(VERSION 3.8)

project(CNTK)

include(Tools/cmake/options.cmake REQUIRED)
include(Tools/cmake/common.cmake REQUIRED)
include(Tools/cmake/cntk_common.cmake REQUIRED)

add_subdirectory(bindings/csharp/swig)

include(Tools/cmake/debug.cmake REQUIRED)
24 changes: 21 additions & 3 deletions CNTK.sln
Expand Up @@ -1609,7 +1609,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageRecognizerLib", "Tests
{E5606ECE-48CA-4464-BB12-09D81D02B9EF} = {E5606ECE-48CA-4464-BB12-09D81D02B9EF}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CNTKLibraryCSTrainingTest", "Tests\EndToEndTests\CNTKv2CSharp\CNTKLibraryCSTrainingTest\CNTKLibraryCSTrainingTest.csproj", "{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CNTKLibraryCSTrainingTest.standard", "Tests\EndToEndTests\CNTKv2CSharp\CNTKLibraryCSTrainingTest\CNTKLibraryCSTrainingTest.standard.csproj", "{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}"
ProjectSection(ProjectDependencies) = postProject
{7B7A563D-AA8E-4660-A805-D50235A02120} = {7B7A563D-AA8E-4660-A805-D50235A02120}
{91973E60-A7BE-4C86-8FDB-59C88A0B3715} = {91973E60-A7BE-4C86-8FDB-59C88A0B3715}
Expand All @@ -1635,6 +1635,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CNTKLibraryManagedDll", "bi
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "V2LibraryCSTests", "Tests\UnitTests\V2LibraryCSTests\V2LibraryCSTests.csproj", "{16B2571F-CFD9-490F-AAC0-04089C6EF576}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bindings", "bindings", "{AC472411-780E-40F2-93AF-B703E9B65264}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CNTKLibraryCSTrainingTest", "Tests\EndToEndTests\CNTKv2CSharp\CNTKLibraryCSTrainingTest\CNTKLibraryCSTrainingTest.csproj", "{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug_CpuOnly|x64 = Debug_CpuOnly|x64
Expand Down Expand Up @@ -2280,7 +2284,7 @@ Global
{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}.Release_CpuOnly|x64.Build.0 = Release_CpuOnly|x64
{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}.Release_NoOpt|x64.ActiveCfg = Release_NoOpt|x64
{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}.Release_NoOpt|x64.Build.0 = Release_NoOpt|x64
{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}.Release_UWP|x64.ActiveCfg = Release_NoOpt|x64
{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}.Release_UWP|x64.ActiveCfg = Release_CpuOnly|x64
{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}.Release|x64.ActiveCfg = Release|x64
{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}.Release|x64.Build.0 = Release|x64
{91EA9F28-B9B6-4FC7-A47D-9838F5915700}.Debug_CpuOnly|x64.ActiveCfg = Debug_CpuOnly|x64
Expand Down Expand Up @@ -2347,6 +2351,18 @@ Global
{16B2571F-CFD9-490F-AAC0-04089C6EF576}.Release_UWP|x64.ActiveCfg = Release_CpuOnly|x64
{16B2571F-CFD9-490F-AAC0-04089C6EF576}.Release|x64.ActiveCfg = Release|x64
{16B2571F-CFD9-490F-AAC0-04089C6EF576}.Release|x64.Build.0 = Release|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Debug_CpuOnly|x64.ActiveCfg = Debug_CpuOnly|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Debug_CpuOnly|x64.Build.0 = Debug_CpuOnly|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Debug_UWP|x64.ActiveCfg = Debug_CpuOnly|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Debug|x64.ActiveCfg = Debug|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Debug|x64.Build.0 = Debug|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Release_CpuOnly|x64.ActiveCfg = Release_CpuOnly|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Release_CpuOnly|x64.Build.0 = Release_CpuOnly|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Release_NoOpt|x64.ActiveCfg = Release_NoOpt|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Release_NoOpt|x64.Build.0 = Release_NoOpt|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Release_UWP|x64.ActiveCfg = Release_CpuOnly|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Release|x64.ActiveCfg = Release|x64
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -2494,7 +2510,7 @@ Global
{80B83483-CCDC-4E59-AB54-B6495E967A11} = {77EAB92C-CDCB-40D2-BD19-6C8C6C876B51}
{784A839C-762F-4A85-9EF1-A1E00546AD6C} = {D30B34AF-3618-4C55-900E-8F60A9F39E66}
{6730F9BE-92AA-45F7-9F98-CD13E725CCA9} = {784A839C-762F-4A85-9EF1-A1E00546AD6C}
{1526F027-B007-472D-82E2-5A91340F3B62} = {DD043083-71A4-409A-AA91-F9C548DCF7EC}
{1526F027-B007-472D-82E2-5A91340F3B62} = {AC472411-780E-40F2-93AF-B703E9B65264}
{2A95B23C-D91E-4DF9-B8F0-5E997608AB65} = {47755F2E-D674-4175-9E38-8EA053455072}
{FB604F98-008F-45CD-B06E-42C30E121F13} = {2A95B23C-D91E-4DF9-B8F0-5E997608AB65}
{5EDBCD1A-4F07-4618-84C9-FC6905A438B4} = {FB604F98-008F-45CD-B06E-42C30E121F13}
Expand Down Expand Up @@ -2573,6 +2589,8 @@ Global
{2ECE5AEB-F471-4A1D-9BAD-963D5C8A8A1D} = {DD043083-71A4-409A-AA91-F9C548DCF7EC}
{3A09FFE0-7865-4268-8301-73ED64BB75DF} = {1526F027-B007-472D-82E2-5A91340F3B62}
{16B2571F-CFD9-490F-AAC0-04089C6EF576} = {6F19321A-65E7-4829-B00C-3886CD6C6EDE}
{AC472411-780E-40F2-93AF-B703E9B65264} = {DD043083-71A4-409A-AA91-F9C548DCF7EC}
{4F2971CD-021F-443A-95F9-2AEAABDFD5F8} = {B3B46744-DBB5-42C2-BAD7-9151D9486045}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9FF5B559-FC1B-4694-963F-355905287887}
Expand Down
2 changes: 1 addition & 1 deletion Examples/TrainingCSharp/Common/TransferLearning.cs
Expand Up @@ -139,7 +139,7 @@ public static void TrainAndEvaluateWithAnimalData(DeviceDescriptor device, bool
string predictionNodeName = "prediction";
Variable imageInput, labelInput;
Function trainingLoss, predictionError;
Function transferLearningModel = CreateTransferLearningModel(BaseResnetModelFile, featureNodeName, predictionNodeName,
Function transferLearningModel = CreateTransferLearningModel(Path.Combine(ExampleImageFoler, BaseResnetModelFile), featureNodeName, predictionNodeName,
lastHiddenNodeName, animalModelNumClasses, device,
out imageInput, out labelInput, out trainingLoss, out predictionError);

Expand Down
48 changes: 48 additions & 0 deletions Makefile
Expand Up @@ -113,6 +113,7 @@ ALL:=
ALL_LIBS:=
PYTHON_LIBS:=
JAVA_LIBS:=
CSHARP_LIBS:=
LIBS_FULLPATH:=
SRC:=
Expand Down Expand Up @@ -333,6 +334,7 @@ PERF_PROFILER_LIB:= $(LIBDIR)/lib$(PERF_PROFILER).so
ALL_LIBS += $(PERF_PROFILER_LIB)
PYTHON_LIBS += $(PERF_PROFILER_LIB)
JAVA_LIBS += $(PERF_PROFILER_LIB)
CSHARP_LIBS += $(PERF_PROFILER_LIB)
SRC += $(PP_SRC)
$(PERF_PROFILER_LIB): $(PP_OBJ)
Expand Down Expand Up @@ -433,6 +435,7 @@ CNTKMATH_LIB:= $(LIBDIR)/lib$(CNTKMATH).so
ALL_LIBS += $(CNTKMATH_LIB)
PYTHON_LIBS += $(CNTKMATH_LIB)
JAVA_LIBS += $(CNTKMATH_LIB)
CSHARP_LIBS += $(CNTKMATH_LIB)
SRC+=$(MATH_SRC)
$(CNTKMATH_LIB): $(MATH_OBJ) | $(PERF_PROFILER_LIB)
Expand Down Expand Up @@ -568,6 +571,7 @@ CNTKLIBRARY_LIB:=$(LIBDIR)/lib$(CNTKLIBRARY).so
ALL_LIBS+=$(CNTKLIBRARY_LIB)
PYTHON_LIBS+=$(CNTKLIBRARY_LIB)
JAVA_LIBS+=$(CNTKLIBRARY_LIB)
CSHARP_LIBS+=$(CNTKLIBRARY_LIB)
SRC+=$(CNTKLIBRARY_SRC)
$(CNTKLIBRARY_LIB): $(CNTKLIBRARY_OBJ) | $(CNTKMATH_LIB)
Expand Down Expand Up @@ -1554,6 +1558,50 @@ ALL += java
endif
########################################
# C# Support
########################################
ifeq ("$(CSHARP_SUPPORT)","true")
# This is a short-term hack to shoehorn cmake into our build system. In the near future, we will fully migrate
# to a cmake-based system and this hack will no longer be necessary.
ifeq ("$(BUILDTYPE)","debug")
CSHARP_BUILDTYPE:=Debug
endif
ifeq ("$(BUILDTYPE)","release")
CSHARP_BUILDTYPE:=Release
endif
.PHONY: csharp
csharp: $(CSHARP_LIBS)
@echo $(SEPARATOR)
@echo creating $@ for $(ARCH) with build type $(CSHARP_BUILDTYPE)
mkdir -p bindings/csharp/Swig/build/Linux/$(CSHARP_BUILDTYPE)
cd bindings/csharp/Swig/build/Linux/$(CSHARP_BUILDTYPE) && \
cmake ../../.. -DCNTK_VERSION=$(BUILD_VERSION) -DCMAKE_BUILD_TYPE=$(CSHARP_BUILDTYPE) && \
make
mkdir -p bindings/csharp/CNTKLibraryManagedDll/build/Linux/$(CSHARP_BUILDTYPE)
cd bindings/csharp/CNTKLibraryManagedDll/build/Linux/$(CSHARP_BUILDTYPE) && \
cmake ../../.. -DCNTK_VERSION=$(BUILD_VERSION) -DCMAKE_BUILD_TYPE=$(CSHARP_BUILDTYPE) && \
make
cp --recursive bindings/csharp/CNTKLibraryManagedDll/build/Linux/$(CSHARP_BUILDTYPE)/AnyCPU/$(CSHARP_BUILDTYPE)/* $(LIBDIR)
ALL += csharp
# Note that CMakeLists.txt has not been created for this project yet. The paths created here are really ugly.
V2LibraryCSTests.dll: csharp
@echo $(SEPARATOR)
@echo creating $@ for $(ARCH) with build type $(CSHARP_BUILDTYPE)
cd Tests/UnitTests/V2LibraryCSTests && \
mkdir -p build/Linux/$(CSHARP_BUILDTYPE) && \
dotnet build /p:OutDirPrefix=build/Linux/$(CSHARP_BUILDTYPE) /p:PlatformName=Linux -c $(CSHARP_BUILDTYPE)
cp $(LIBDIR)/*.so Tests/UnitTests/V2LibraryCSTests/build/Linux/$(CSHARP_BUILDTYPE)/AnyCPU/$(CSHARP_BUILDTYPE)
ALL += V2LibraryCSTests.dll
endif
########################################
# General compile and dependency rules
########################################
Expand Down
@@ -1,97 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" InitialTargets="CheckDependencies" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<Import Project="$(SolutionDir)\CNTK.Common.props" />
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\CNTK.Common.props" />

<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x64</Platform>
<ProjectGuid>{0DF2109B-BB85-4718-82DE-1C0536D4F2C3}</ProjectGuid>
<IntermediateOutputPath>$(IntDir)obj\</IntermediateOutputPath>
<BaseIntermediateOutputPath>$(IntDir)obj\</BaseIntermediateOutputPath>
<OutputPath>$(OutDir)</OutputPath>
<OutputType>Exe</OutputType>
<OutDirPrefix Condition="'$(OutDirPrefix)' == ''">..\..\..\..</OutDirPrefix>
</PropertyGroup>

<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<RootNamespace>CNTK.CNTKLibraryCSTrainingTest</RootNamespace>

<IsPackable>false</IsPackable>

<Version>$(CntkVersion)</Version>

<Authors>Microsoft Corporation</Authors>

<Copyright>Copyright © $([System.DateTime]::Now.ToString(`yyyy`))</Copyright>

<OutDir>$(OutDirPrefix)\$(Platform)\$(Configuration)</OutDir>

<Platforms>x64</Platforms>

<Configurations>Debug;Debug_CpuOnly;Release;Release_CpuOnly;Release_NoOpt</Configurations>
<PlatformTarget>x64</PlatformTarget>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<DebugType>portable</DebugType>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<ErrorReport>prompt</ErrorReport>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>CNTK.CNTKLibraryCSTrainingTest</RootNamespace>
<AssemblyName>CNTKLibraryCSTrainingTest</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition="$(DebugBuild)">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="$(ReleaseBuild)">
<DebugType>pdbonly</DebugType>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
</PropertyGroup>
<!-- The following definitions are needed in order to make the configuration Debug/Debug_CpuOnly live -->
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug_CpuOnly|x64'">
<DefineConstants>TRACE;DEBUG;CPUONLY</DefineConstants>
<WarningsAsErrors />
<ApplicationIcon />
<OutputType>Exe</OutputType>
<StartupObject />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<Optimize>true</Optimize>

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_NoOpt|x64'">
<DefineConstants>TRACE</DefineConstants>
<Optimize>false</Optimize>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_CpuOnly|x64'">
<Optimize>true</Optimize>
<DefineConstants>TRACE;CPUONLY</DefineConstants>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_CpuOnly|x64'">
<DefineConstants>TRACE;DEBUG_CPUONLY;NETCOREAPP2_0;CPUONLY</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_NoOpt|x64'">
<Optimize>false</Optimize>
<DefineConstants>TRACE</DefineConstants>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_CpuOnly|x64'">
<DefineConstants>TRACE;RELEASE_CPUONLY;NETCOREAPP2_0;CPUONLY</DefineConstants>
</PropertyGroup>

<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Drawing" />
<ProjectReference Include="..\..\..\..\bindings\csharp\CNTKLibraryManagedDll\CNTKLibraryManagedDll.csproj">
<Project>{3A09FFE0-7865-4268-8301-73ED64BB75DF}</Project>
<Name>CNTKLibraryManagedDll</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\..\..\Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs">
<Link>CNTKImageProcessing.cs</Link>
</Compile>
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\CifarResNetClassifier.cs">
<Link>CifarResNetClassifier.cs</Link>
</Compile>
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\LogisticRegression.cs">
<Link>LogisticRegression.cs</Link>
</Compile>
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\LSTMSequenceClassifier.cs">
<Link>LSTMSequenceClassifier.cs</Link>
</Compile>
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\MNISTClassifier.cs">
<Link>MNISTClassifier.cs</Link>
</Compile>
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\TestHelper.cs">
<Link>TestHelper.cs</Link>
</Compile>
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\TransferLearning.cs">
<Link>TransferLearning.cs</Link>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SimpleFeedForwardClassifierTest.cs" />
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\CifarResNetClassifier.cs" Link="CifarResNetClassifier.cs" />
<Compile Include="..\..\..\..\Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs" Link="CNTKImageProcessing.cs" />
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\LogisticRegression.cs" Link="LogisticRegression.cs" />
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\LSTMSequenceClassifier.cs" Link="LSTMSequenceClassifier.cs" />
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\MNISTClassifier.cs" Link="MNISTClassifier.cs" />
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\TestHelper.cs" Link="TestHelper.cs" />
<Compile Include="..\..\..\..\Examples\TrainingCSharp\Common\TransferLearning.cs" Link="TransferLearning.cs" />

<None Remove="App.config" />
<Compile Remove="Properties\AssemblyInfo.cs" />
</ItemGroup>

<ItemGroup>
<None Include="App.config" />
<PackageReference Include="CoreCompat.System.Drawing" Version="1.0.0-beta006" />

<ProjectReference Include="..\..\..\..\bindings\csharp\CNTKLibraryManagedDll\CNTKLibraryManagedDll.csproj" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="Build" Condition="$(HasSwig)" DependsOnTargets="$(BuildDependsOn)" />
<Target Name="CheckDependencies">
<Warning Condition="!$(HasSwig)" Text="The project requires SWIG to be installed. Please see https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Windows#optional-swig for installation instructions." />
</Target>
</Project>

</Project>

0 comments on commit 7882cf0

Please sign in to comment.