views:

641

answers:

3

I am looking to implement a tinderbox, (a build server that does clean version control check-outs and full system builds of everything in a given source repository or project), and something like "continuous integration" for small teams, with Delphi.

I am loathe to commit to a commercial "build server" product and am hoping I can do a lot of this just with MS-Build support that is built into delphi.

I am looking for resources, ideas, and a place to get started. I do not know how to use MS Build for this purpose. Steve Trevethen has a blog post that leads to a little discussion on the old dcc32 command line build, and some comments mention ms-build which has been here since delphi 2007. I am using Delphi 2010. I am looking for guidance and insight, and experiences, that will tell me, is this a reasonable path to go down, and if not, what way should I go instead?

I found you can override the Unit (DCU) and EXE Output Directory from the msbuild command line with /p:DCU_DcuOutput=. Note that I looked at the XML inside my DPROJ files to figure out how to override stuff.

However, it only does a make, not a build, and /t:rebuild does not work (edit: yes it does. it works fine on DPROJ files, but not on GroupProjects.)

I wish there was more MSBuild-with-Delphi documentation out there anywhere? The MS-Build help in "Rad Studio 2010" product documentation shows one or two things about MS-Build but is really sketchy and incomplete.

Related questions:

MSBuild command lines

+6  A: 

Delphi 2010 uses MSBuild as it's main build engine. That means that the IDE and the command line both do exactly the same thing. It also means that you can easily build existing projects with the command line. In fact, we on the Delphi team do this exact thing all the time. You need not worry about switches for the compiler itself -- the DProj file created by the IDE will

On the Start Menu is a command line for using MSBuild with an existing Delphi project. It sets up the environment correctly so that you can simply call:

msbuild myproject.dproj

You can also call specific build configurations from the command line, using the IDE to easily create said configurations using command line parameters for MSBuild.

If you want to create the environment yourself, you can run the rsvars.bat batch file to set things up. That file can be found in your \bin directory, and should be available from a default command line.

The file contains the following:

@SET BDS=<your BDS directory>
@SET BDSCOMMONDIR=C:\Users\Public\Documents\RAD Studio\7.0
@SET FrameworkDir=C:\Windows\Microsoft.NET\Framework\v2.0.50727
@SET FrameworkVersion=v2.0.50727
@SET FrameworkSDKDir=
@SET PATH=%FrameworkDir%;%FrameworkSDKDir%;%PATH%
@SET LANGDIR=EN

Thus, if you want to create your own continuous integration build, you can easily manage your Delphi build using MSBuild.

Nick Hodges
SO far so good, but somewhere it is documented that to do a build instead of a recompile, I should use /t:rebuild. Any idea what the flag is to force a build instead of a dependency-check (aka, make)?
Warren P
Looks like /t:rebuild works, but only with .dproj passed to msbuild, not project groups. Which is fine. Just a little more cutting and pasting for me.
Warren P
Lars has noted that /t:Build works for .GroupProj whereas its /t:Rebuild for .dproj files. Eccentric, but workable.
Warren P
Actually, Build is a target in both and does what you want: Build. ReBuild is an extra target .dproj has and it does a Clean before Build.
Lars Truijens
Be aware there are some issues when using msbuild outside the IDE: 1) Build number is increased by the IDE, not the compiler, and there's no easy way to set it outside the IDE 2) Prebuild/Postbuild vars may not be set to the correct value
ldsandon
I think I will need to write some code to do things like that. (1) Increment build numbers, set versioninfo strings to "tinderbox build svn rev ABC, date YYYY-MM-DD HH:NN:SS, machine {MACHINENAME}"
Warren P
+6  A: 

The dproj and groupproj are msbuild files and you can have a look inside them. The other parts of the information are to be find in the msbuild installation path (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727). There you will find several Borland.*.targets files.

Inside the msbuild scripts you can see the different targets named with . For example the groupfile contains Make, Clean and Build targets which you can specify with the /t parameter. The same goes for the dproj files. dproj files also have a ReBuild target. It does a Clean and then a Build. If you want to have the same effect for groupfile you could specify two targets: /t:Clean;Build

You will also find lots of parameters in you can set with /p. Like for example Configuration to specify the configuration or DCC_Quiet to instruct dcc32 to stop outputting useless whitespaces.

So the doing a build with Release configuration from the command line is this command:

msbuild mygroup.groupproj /p:Configuration=Release /t:Build

disclaimer: I have looked at Delphi 2007's msbuild files. Later Delphi versions might have changed the name of the targets or parameters. Just have a look inside the msbuild scripts to find out which is which.

Lars Truijens
It is very helpful to know you can do /t:Build on a groupproj
Warren P
Nice, and you may wonder why all that stuff is undocumented - oh, now I recall, documentation is lame...
ldsandon
@ldsandon: yes, RAD and documentation don't go well together...
mjustin
+4  A: 

I'm not sure if this is what you need, but I have CruiseControl.NET setup for doing continuous integration - and DUnit tests - for Delphi 2009. CCNET has a specific set of tasks for MSBuild, and other than a few setup issues, it works perfectly for me.

I can let you know what I had to do get ths working if you need.

Mark

Mmarquee
Have you tried TeamCity too? It has a free 'Professional' license.
mjustin
I am interested in CruiseControl.NET. Please post a link to any "Delphi with CruiseControl.NET" info you have.
Warren P
You could look on my Blog, I think there is something there. If not I can certainly add something, as I have just upgraded to the latest version.
Mmarquee
See whether this link helps - http://inpwtepydjuf.blogspot.com/2010/02/delphisurroundcruisecontrolnet-howto.html
Mmarquee
+1 for TeamCity as a build server. We use it for Java and Delphi builds and find it very flexible. Hudson is nice too, but requires more work to get up and running.
David Taylor