<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.
-->

<Import Project="build.props"/>

<!-- Settings for Linux platforms -->
<PropertyGroup Condition="'$(OS)' != 'Windows_NT'">
  <TargetFrameworks>netcoreapp2.0</TargetFrameworks>
  <OutputType>Exe</OutputType>
  <RuntimeIdentifiers>linux-x64</RuntimeIdentifiers>
</PropertyGroup>

<!-- Settings for Windows platforms -->
<PropertyGroup Condition="'$(OS)' == 'Windows_NT'">
  <TargetFrameworks>net461</TargetFrameworks>
  <!-- If EnableDotNetBuild is true, override the target frameworks to include dot net core -->
  <TargetFrameworks Condition="'$(EnableDotNetBuild)' == 'true'">netcoreapp2.0;net461</TargetFrameworks>
  <OutputType>Exe</OutputType>

  <!-- This is required to copy all referenced assemblies to the bin folder -->
  <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
  <!-- REEF-1888: win7-x64 is needed for .net46 and .net451. Target a newer version of windows once net46 and 451 are removed" -->
  <RuntimeIdentifiers>win7-x64</RuntimeIdentifiers>
</PropertyGroup>

<ItemGroup>
    <None Include="$(SolutionDir)App.config">
      <Link>App.config</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
</ItemGroup>
</Project>
