<!--

 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.

-->
<Project>

  <!-- Features in .NET Core 3.x and .NET 5 only -->
  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netcoreapp')) Or '$(TargetFramework)' == 'net5.0' ">

    <DefineConstants>$(DefineConstants);FEATURE_ARGITERATOR</DefineConstants>

  </PropertyGroup>
  
  <!-- Features in .NET Standard, .NET Core, and .NET 5 only (no .NET Framework support) -->
  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netstandard')) Or $(TargetFramework.StartsWith('netcoreapp')) Or '$(TargetFramework)' == 'net5.0' ">
    
    <DefineConstants>$(DefineConstants);NETSTANDARD</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_ARRAYEMPTY</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_CULTUREINFO_CURRENTCULTURE_SETTER</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_ENCODINGPROVIDERS</DefineConstants>
    
    <DebugType>portable</DebugType>
  </PropertyGroup>

  <!-- Features in .NET Standard 2.1 only -->
  <PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' Or $(TargetFramework.StartsWith('netcoreapp3.')) Or '$(TargetFramework)' == 'net5.0' ">

    <DefineConstants>$(DefineConstants);FEATURE_CONDITIONALWEAKTABLE_ENUMERATOR</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_CONDITIONALWEAKTABLE_ADDORUPDATE</DefineConstants>
    
    
  </PropertyGroup>

  <!-- Features in .NET Standard 2.x, .NET Core 2.x, .NET Core 3.x, and .NET 5 -->
  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netstandard2.')) Or $(TargetFramework.StartsWith('netcoreapp2.')) Or $(TargetFramework.StartsWith('netcoreapp3.')) Or '$(TargetFramework)' == 'net5.0' ">

    <DefineConstants>$(DefineConstants);FEATURE_ICONFIGURATIONROOT_PROVIDERS</DefineConstants>

  </PropertyGroup>

  <!-- Features in .NET Framework 4.5+, .NET Standard 2.x, .NET Core 2.x, .NET Core 3.x, and .NET 5  -->
  <PropertyGroup Condition=" $(TargetFramework.StartsWith('net4')) Or $(TargetFramework.StartsWith('netstandard2.')) Or $(TargetFramework.StartsWith('netcoreapp2.')) Or $(TargetFramework.StartsWith('netcoreapp3.')) Or '$(TargetFramework)' == 'net5.0' ">

    <DefineConstants>$(DefineConstants);FEATURE_APPDOMAIN_BASEDIRECTORY</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_APPDOMAIN_GETASSEMBLIES</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_APPDOMAIN_ISFULLYTRUSTED</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_ASSEMBLY_GETCALLINGASSEMBLY</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_BITARRAY_COPYTO</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_CONCURRENTMERGESCHEDULER</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_CULTUREINFO_GETCULTURES</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_DTD_PROCESSING</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_FILESTREAM_LOCK</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_METHODBASE_GETMETHODBODY</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_SERIALIZABLE</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_STACKTRACE</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_TEXTWRITER_CLOSE</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_TEXTWRITER_INITIALIZELIFETIMESERVICE</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_THREAD_INTERRUPT</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_THREAD_PRIORITY</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_THREAD_YIELD</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_THREADPOOL_UNSAFEQUEUEWORKITEM</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_TYPE_GETMETHOD__BINDINGFLAGS_PARAMS</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_XSLT</DefineConstants>

    <!-- NOTE: Microsoft's recommendation is not to use the ICloneable interface.
        To add it to the build, just add /p:IncludeICloneable to the command line. -->
    <DefineConstants Condition=" '$(IncludeICloneable)' == 'true' ">$(DefineConstants);FEATURE_CLONEABLE</DefineConstants>
  </PropertyGroup>

  <!-- Features in .NET Standard 1.x and .NET Core 1.x -->
  <PropertyGroup Condition=" $(TargetFramework.StartsWith('netstandard1.')) Or $(TargetFramework.StartsWith('netcoreapp1.')) ">
    
    <DefineConstants>$(DefineConstants);NETSTANDARD1_X</DefineConstants>
    
  </PropertyGroup>

  <!-- Features in .NET Framework 4.6.1+ only -->
  <PropertyGroup Condition="'$(TargetFramework)' == 'net461' Or '$(TargetFramework)' == 'net462' Or $(TargetFramework.StartsWith('net47')) Or $(TargetFramework.StartsWith('net48'))">
    
    <DefineConstants>$(DefineConstants);FEATURE_ICONFIGURATIONROOT_PROVIDERS</DefineConstants>
    
  </PropertyGroup>

  <!-- Features in .NET Framework 4.6+ only -->
  <PropertyGroup Condition="$(TargetFramework.StartsWith('net46')) Or $(TargetFramework.StartsWith('net47')) Or $(TargetFramework.StartsWith('net48'))">
    
    <DefineConstants>$(DefineConstants);FEATURE_ARRAYEMPTY</DefineConstants>

  </PropertyGroup>

  <!-- Features in .NET Framework 4.5+ -->
  <PropertyGroup Condition="$(TargetFramework.StartsWith('net4'))">

    <DefineConstants>$(DefineConstants);NETFRAMEWORK</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_ARGITERATOR</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_MEMORYMAPPEDFILESECURITY</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_SERIALIZABLE_EXCEPTIONS</DefineConstants>
    <!-- Although HostProtectionAttribute is available in .NET Standard 2.0+ via platform extensions, we are excluding
         it due to the fact it is not a primary feature of Lucene.NET -->
    <DefineConstants>$(DefineConstants);FEATURE_SECURITYPERMISSIONS_HOSTPROTECTION</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_STACKOVERFLOWEXCEPTION__ISCATCHABLE</DefineConstants>
    <DefineConstants>$(DefineConstants);FEATURE_TEXTWRITER_CREATEOBJREF</DefineConstants>
    
    <DebugType>full</DebugType>
  </PropertyGroup>

  <PropertyGroup>
    <!-- NuGet.org only supports portable debug symbol format: 
         https://docs.microsoft.com/en-us/nuget/create-packages/symbol-packages-snupkg#nugetorg-symbol-package-constraints -->
    <DebugType Condition=" '$(PortableDebugTypeOnly)' == 'true' ">portable</DebugType>
  </PropertyGroup>

  <Target Name="AddInternalsVisibleTo" BeforeTargets="BeforeCompile" Label="Adds InternalsVisibleTo Attribute and PublicKey (if supplied)">
    <ItemGroup Condition="'@(InternalsVisibleTo->Count())' &gt; 0 ">
      <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>%(InternalsVisibleTo.Identity)</_Parameter1>
        <_Parameter1 Condition=" '$(SignAssembly)' == 'true' And '$(PublicKey)' != '' ">%(InternalsVisibleTo.Identity), PublicKey=$(PublicKey)</_Parameter1>
      </AssemblyAttribute>
    </ItemGroup>
  </Target>

  <Import Project="build\Release.targets" Condition="Exists('build\Release.targets')" />

</Project>