Oh hi everyone,
I figured I'd announce this here to see if anyone is interested in using it. Over the past few years I've been working on an open source tool called Protobuild, which is a project generation system for cross-platform projects. The most well known user of Protobuild is perhaps the MonoGame team, who use it to manage building MonoGame for all the platforms they support.
If you're finding yourself in a position where your solution has a project for each different platform, like MyProject.Windows, MyProject.iOS, MyProject.Android, etc, then Protobuild can be used to unify these into a single project definition, which then gets generated and synchronised by Protobuild.
Protobuild supports generating platforms for iOS, Android, Windows, Linux, Mac, Windows 8.1, Ouya, Windows Phone 7, Windows Phone 8.1 and the Web platform via JSIL. It also supports PlayStation Mobile, although Sony recently deprecated this platform so it's likely to be removed in a future release.
Basically when you're using Protobuild, your projects are defined in XML files that look something like this:
<?xml version="1.0" encoding="utf-8"?> <Project Name="MyApp" Path="MyApp" Type="App"> <Properties /> <References> <Reference Include="System" /> <Reference Include="System.Core" /> <Reference Include="MyExternalProject" /> </References> <Files> <Compile Include="MyClass.cs" /> <Compile Include="Program.cs" /> <Compile Include="MyClass.Windows.cs"> <Platforms>Windows</Platforms> </Compile> <Compile Include="MyClass.Linux.cs"> <Platforms>Linux</Platforms> </Compile> <!-- ... --> </Files> </Project>
What separates Protobuild definitions from normal C# projects is that the platform-dependent structure (such as project type GUIDs) is all handled by the project generator when you run it. You can also define references that are conditional on platforms, by defining an external project and referencing it:
<?xml version="1.0" encoding="utf-8" ?> <ExternalProject Name="MyExternalProject"> <Platform Type="Windows"> <Reference Include="SharpDX" /> </Platform> <Platform Type="Linux"> <Reference Include="OpenTK" /> </Platform> </ExternalProject>
There are also some other features of Protobuild:
If you think Protobuild might be useful for you, or if you have any questions feel free to reply to this thread and I'll answer them. You can also get started with Protobuild straight away by following the Getting Started guide.