ctplt 0.0.1

A package manager + build system for C and C++
Documentation
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <PropertyPageSchema
      Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
    <AvailableItemName Include="NASM">
      <Targets>_NASM</Targets>
    </AvailableItemName>
  </ItemGroup>
  <PropertyGroup>
    <ComputeLinkInputsTargets>
      $(ComputeLinkInputsTargets);
      ComputeNASMOutput;
    </ComputeLinkInputsTargets>
    <ComputeLibInputsTargets>
      $(ComputeLibInputsTargets);
      ComputeNASMOutput;
    </ComputeLibInputsTargets>
  </PropertyGroup>
  <UsingTask
    TaskName="NASM"
    TaskFactory="XamlTaskFactory"
    AssemblyName="Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
  </UsingTask>

  <Target Name="_WriteNasmTlogs"
    Condition="'@(NASM)' != '' and '@(SelectedFiles)' == ''">
    <ItemGroup>
      <NASM Remove="@(NASM)"
        Condition="'%(NASM.ExcludedFromBuild)' == 'true' or '%(NASM.OutFile)' == ''" />
    </ItemGroup>
    <ItemGroup Condition="'@(NASM)' != ''">
      <_NasmReadTlog Include="^%(NASM.FullPath);%(NASM.AdditionalDependencies)" />
      <_NasmWriteTlog
        Include="^%(NASM.FullPath);$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '%(NASM.OutFile)'))" />
    </ItemGroup>

    <WriteLinesToFile
      Condition="'@(_NasmReadTlog)' != ''"
      File="$(TLogLocation)Nasm.read.1u.tlog"
      Lines="@(_NasmReadTlog->MetaData('Identity')->ToUpperInvariant());"
      Overwrite="true"
      Encoding="Unicode" />
    <WriteLinesToFile
      Condition="'@(_NasmWriteTlog)' != ''"
      File="$(TLogLocation)Nasm.write.1u.tlog"
      Lines="@(_NasmWriteTlog->MetaData('Identity')->ToUpperInvariant());"
      Overwrite="true"
      Encoding="Unicode" />

    <ItemGroup>
      <_NasmReadTlog Remove="@(_NasmReadTlog)" />
      <_NasmWriteTlog Remove="@(_NasmWriteTlog)" />
    </ItemGroup>
  </Target>

  <Target
    Name="_NASM"
    BeforeTargets="$(NASMBeforeTargets)"
    AfterTargets="$(NASMAfterTargets)"
    Condition="'@(NASM)' != ''"
    Outputs="%(NASM.OutFile)"
    Inputs="%(NASM.Identity);%(NASM.AdditionalDependencies);$(MSBuildProjectFile)"
    DependsOnTargets="_WriteNasmTlogs;_SelectedFiles">
    <ItemGroup Condition="'@(SelectedFiles)' != ''">
      <NASM Remove="@(NASM)" Condition="'%(Identity)' != '@(SelectedFiles)'" />
    </ItemGroup>
    <Message
      Importance="High"
      Text="%(NASM.ExecutionDescription)" />
    <NASM
      Condition="'@(NASM)' != '' and '%(NASM.ExcludedFromBuild)' != 'true'"
      CommandLineTemplate="%(NASM.CommandLineTemplate)"
      OutFile="%(NASM.OutFile)"
      Format="%(NASM.Format)"
      GenerateDebuggingInformation="%(NASM.GenerateDebuggingInformation)"
      Optimization="%(NASM.Optimization)"
      IncludePaths="%(NASM.IncludePaths)"
      Define="%(NASM.Define)"
      Undefine="%(NASM.Undefine)"
      AdditionalOptions="%(NASM.AdditionalOptions)"
      Inputs="%(NASM.Identity)" />
  </Target>
  <Target
    Name="ComputeNASMOutput"
    Condition="'@(NASM)' != ''">
    <ItemGroup>
      <Link Include="@(NASM->Metadata('OutFile')->Distinct()->ClearMetadata())"
        Condition="'%(NASM.ExcludedFromBuild)' != 'true'" />
      <Lib Include="@(NASM->Metadata('OutFile')->Distinct()->ClearMetadata())"
        Condition="'%(NASM.ExcludedFromBuild)' != 'true'" />
    </ItemGroup>
  </Target>
  <Target
    Name="ComputeNASMObj"
    Condition="'@(NASM)' != ''"
    BeforeTargets="GetResolvedLinkObjs">
    <ItemGroup>
      <Obj Include="@(NASM->Metadata('OutFile')->Distinct()->ClearMetadata())"
        Condition="'%(NASM.ExcludedFromBuild)' != 'true'" />
    </ItemGroup>
  </Target>
</Project>