<Project>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

  <PropertyGroup>
    <SnapshotNumber>01</SnapshotNumber>
    <IsSnapshot>true</IsSnapshot>
    <VersionPrefix>0.17.0</VersionPrefix>
    <VersionSuffix Condition="'$(IsSnapshot)' == true">SNAPSHOT-$(SnapshotNumber)</VersionSuffix>

    <Authors>Apache Software Foundation</Authors>
    <Owners>The Apache REEF project</Owners>
    <Product>Apache REEF</Product>
    <ProductId>$(AssemblyName)</ProductId>
    <AssemblyVersion>$(Version)</AssemblyVersion>
    <FileVersion>$(Version)</FileVersion>
    <NeutralLanguage>en</NeutralLanguage>
    <Copyright>The Apache Software Foundation</Copyright>
    <PackageLicenseUrl>https://www.apache.org/licenses/LICENSE-2.0</PackageLicenseUrl>
    <PackageProjectUrl>https://reef.apache.org</PackageProjectUrl>
    <PackageIconUrl>https://reef.apache.org/ApacheREEF_logo_no_margin_small.png</PackageIconUrl>
    <RepositoryUrl>https://github.com/apache/reef.git</RepositoryUrl>
    <PackageReleaseNotes>Contact the Apache REEF development alias dev@reef.apache.org for questions or issues.</PackageReleaseNotes>
    <DefaultItemExcludes>$(DefaultItemExcludes);packages.config;*.nuspec</DefaultItemExcludes>
  </PropertyGroup>

  <PropertyGroup>
    <Platforms>x64</Platforms>
    <PlatformTarget>x64</PlatformTarget>
    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildThisFileDirectory)\</SolutionDir>
    <BinDir Condition="$(BinDir) == '' Or $(BinDir) == '*Undefined*'">$(SolutionDir)bin\.netcore\</BinDir>
    <PackagesDir Condition="$(PackagesDir) == '' Or $(PackagesDir) == '*Undefined*'">$(SolutionDir)\packages\</PackagesDir>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <DefineConstants>$(DefineConstants);REEF_DOTNET_BUILD</DefineConstants>
    <NoWarn>NU1701;NU1603</NoWarn>
    <OutputPath>$(BinDir)$(Configuration)\$(AssemblyName)\</OutputPath>
  </PropertyGroup>

  <!-- For linux builds, always enable the dot net build -->
  <PropertyGroup Condition="'$(OS)' != 'Windows_NT'">
    <EnableDotNetBuild>true</EnableDotNetBuild>
  </PropertyGroup>

  <!-- For window builds, we are defaulting the dot net build to false until dot net core is fully supported -->
  <PropertyGroup Condition="'$(OS)' == 'Windows_NT'">
    <EnableDotNetBuild>false</EnableDotNetBuild>
  </PropertyGroup>

    <!-- Locations -->
  <PropertyGroup>
    <!--The root directory of the REEF source tree. -->
    <REEF_Source_Folder>$([System.IO.Path]::GetFullPath($(MSBuildProjectDirectory)\..\..\..))</REEF_Source_Folder>
  </PropertyGroup>

</Project>
