+1  A: 

why the 5.x? (under projectA)

I don't think it is useful to introduce the versions in the tree - that is what subversion, etc is for.

Tim
5.x refers to version 5.x. I Usually keep folders for 1.x, 2.x to have a quick access to older versions.
smartins
SVN will keep revisions. they should be under separate tags/branches (IMO)
Tim
I understand, but I haven't used SVN yet so this folder structure is currently setup for a non-version control system.
smartins
I find it's useful to separate out release versions (e.g., 5.x) and revision versions. This can be a lifesaver when trying to reproduce a bug in an earlier version.
Scottie T
+14  A: 

Having setup literally hundreds of projects over the years, and having specialized in software configuration management and release engineering, I would recommend that you first focus on how you want to build/release your project(s).

If you only use an IDE to build (compile and package) your project(s), then you might as well just follow the conventions typical for that IDE, plus any "best practices" you may find.

However, I would strongly recommend that you do not build only with an IDE, or even at all. Instead, create an automated build/release script using one or more of the many wonderful open-source tools available. Since you appear to be targeting Windows, I recommend starting with a look at Ant, Ivy, and the appropriate xUnit (jUnit for Java, nUnit for .NET, etc.) for testing.

Once you start down that path, you will find lots of advice regarding project structure, designing your build scripts, testing, etc. Rather than overwhelm you with detailed advice now, I will simply leave you with that suggestion--you will readily find answers to your question there, as well as find a whole lot more questions worth investigating.

Enjoy!

Based on comments, it seems that some detail is needed.

A particular recommendation that I would make is that you separate your codebase into individual subprojects that each produce a single deliverable. The main application (.EXE) should be one, any supporting binaries would each be separate projects, the installer would be a separate project, etc.

Each project produces a single primary deliverable: an .EXE, a .DLL, a .HLP, etc. That deliverable is "published" to a single, shared, local, output directory.

Make a directory tree where the subprojects are peers (no depth or hierarchy, because it does not help), and do NOT let projects "reach" into each other's subtree--each project should be completely independent, with dependencies ONLY on the primary deliverables of the other subprojects, referenced in the shared output directory.

Do NOT create a hierarchy of build scripts that invoke each other, I did and found that it does not add value but does exponentially increase the maintenance effort. Instead, make a continuous integration script that invokes your stand-alone build script, but first does a clean checkout into a temporary directory.

Do NOT commit any deliverables or dependencies into source control--not your build output, not the libraries that you use, etc. Use Ivy against a Maven-like binary repository that you deploy separate from source control, and publish your own deliverables to it for sharing within your organization.

Oh, and don't use Maven--it is too complicated, obfuscates the build process, and therefore is not cost-effective to customize.

I am moving towards SCons, BuildBot, Ant, Ivy, nAnt, etc. based on my target platform.

I have been composing a whitepaper on this topic, which I see may have an audience.

EDIT: Please see my detailed answer to http://stackoverflow.com/questions/222827/how-do-you-organize-your-version-control-repository#304036

Rob Williams
I use Delphi (Win32) for all my development so looking at nAnt and nUnit they seem to be aimed for .NET development. I currently use the IDE to compile but I can use FinalBuilder as well.
smartins
nAnt is targeted to the .NET platform. However, nAnt can be used to execute any console program or script, making it suitable (with a little work) to build any project. However, if you are not using .NET, then I would use Ant rather than nAnt since the parent is more mature.
Rob Williams