Skip to content

Instantly share code, notes, and snippets.

@mitchelldavis
Created December 31, 2013 04:11
Show Gist options
  • Save mitchelldavis/8192512 to your computer and use it in GitHub Desktop.
Save mitchelldavis/8192512 to your computer and use it in GitHub Desktop.
MSBuild for MinGW
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<Target Name="SetupProject">
<MakeDir Directories="$(MSBuildProjectDirectory)\obj;$(MSBuildProjectDirectory)\bin" />
</Target>
<Target Name="CleanProject">
<RemoveDir Directories="$(MSBuildProjectDirectory)\obj;$(MSBuildProjectDirectory)\bin" />
</Target>
<Target Name="Validate">
<Error Text="You must define the ProjectType property with a value of 'lib' or 'exe'"
Condition=" '$(ProjectType)' != 'lib' AND '$(ProjectType)' != 'exe' " />
</Target>
<Target Name="CreateObjectItems">
<CreateItem Include="$(MSBuildProjectDirectory)\obj\*.o">
<Output TaskParameter="Include" ItemName="ObjectFiles" />
</CreateItem>
</Target>
<Target Name="ResolveArtifactName" DependsOnTargets="Validate">
<CreateProperty Value="$(MSBuildProjectDirectory)\bin\lib$(OutputName).a"
Condition=" '$(ProjectType)' == 'lib' ">
<Output TaskParameter="Value" PropertyName="OutputArtifactFileName" />
</CreateProperty>
<CreateProperty Value="$(MSBuildProjectDirectory)\bin\$(OutputName).exe"
Condition=" '$(ProjectType)' == 'exe' ">
<Output TaskParameter="Value" PropertyName="OutputArtifactFileName" />
</CreateProperty>
</Target>
<Target Name="CleanProjectDependencies">
<MSBuild Projects="@(ProjectDependency)" Targets="Clean" />
</Target>
<Target Name="BuildProjectDependencies">
<MSBuild Projects="@(ProjectDependency)" />
</Target>
<Target Name="Compile" DependsOnTargets="SetupProject" Inputs="@(Compile)" Outputs="obj\%(Compile.Filename).o">
<Exec Command="g++ -c %(Compile.Identity) -o obj\%(Compile.Filename).o @(Include -> '-I%(Identity)', ' ')" />
</Target>
<Target Name="CompileC" DependsOnTargets="SetupProject" Inputs="@(Compile)" Outputs="obj\%(Compile.Filename).o">
<Exec Command="gcc -c %(Compile.Identity) -o obj\%(Compile.Filename).o @(Include -> '-I%(Identity)', ' ')" />
</Target>
<Target Name="BuildLibrary"
Inputs="@(ObjectFiles)"
Outputs="$(OutputArtifactFileName)"
DependsOnTargets="ResolveArtifactName;Compile;CreateObjectItems"
Condition=" '$(ProjectType)' == 'lib' ">
<Exec Command="ar -rv &quot;$(OutputArtifactFileName)&quot; @(ObjectFiles -> '&quot;%(Identity)&quot;', ' ')" />
</Target>
<Target Name="BuildLibraryC"
Inputs="@(ObjectFiles)"
Outputs="$(OutputArtifactFileName)"
DependsOnTargets="ResolveArtifactName;CompileC;CreateObjectItems"
Condition=" '$(ProjectType)' == 'lib' ">
<Exec Command="ar -rv &quot;$(OutputArtifactFileName)&quot; @(ObjectFiles -> '&quot;%(Identity)&quot;', ' ')" />
</Target>
<Target Name="BuildExe"
Inputs="@(ObjectFiles)"
Outputs="$(OutputArtifactFileName)"
DependsOnTargets="ResolveArtifactName;Compile;CreateObjectItems"
Condition=" '$(ProjectType)' == 'exe' ">
<Exec Command="g++ -o &quot;$(OutputArtifactFileName)&quot; @(ObjectFiles -> '&quot;%(Identity)&quot;', ' ') @(LibrarySearchDirectory -> '-L%(FullPath)', ' ') @(Library -> '-l%(Identity)', ' ')" />
</Target>
<Target Name="BuildExeC"
Inputs="@(ObjectFiles)"
Outputs="$(OutputArtifactFileName)"
DependsOnTargets="ResolveArtifactName;CompileC;CreateObjectItems"
Condition=" '$(ProjectType)' == 'exe' ">
<Exec Command="gcc -o &quot;$(OutputArtifactFileName)&quot; @(ObjectFiles -> '&quot;%(Identity)&quot;', ' ') @(LibrarySearchDirectory -> '-L%(FullPath)', ' ') @(Library -> '-l%(Identity)', ' ')" />
</Target>
<Target Name="Build" DependsOnTargets="BuildProjectDependencies;BuildLibrary;BuildExe" />
<Target Name="BuildC" DependsOnTargets="BuildProjectDependencies;BuildLibraryC;BuildExeC" />
<Target Name="Clean" DependsOnTargets="CleanProjectDependencies;CleanProject"/>
<Target Name="Rebuild" DependsOnTargets="Clean;Build"/>
<Target Name="RebuildC" DependsOnTargets="Clean;BuildC"/>
</Project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment