The C++ programming environment where I feel most comfortable is GCC/Linux (lately with some clang here and there). In terms of build systems I use cmake whenever possible. This environment also makes it easy to use Jenkins as CI server and RPM for deployment and distribution tasks.
So when presented with the task to set up a C++ windows project in Jenkins I tried to do it the same way as much as possible.
The Goal:
A Jenkins job should be set up that builds a windows c++ project on a Windows 7 build slave. For reasons that I will not get into here, compatibility with Visual Studio 8 is required.
The first step was to download and install the correct Windows SDK. This provides all that is needed to build C++ stuff under windows.
Then, after installation of cmake, the first naive try looked like this (in an “execute Windows Batch file” build step)
cmake . -DCMAKE_BUILD_TYPE=Release
This cannot work of course, because cmake will not find compilers and stuff.
Problem: Build Environment
When I do cmake builds manually, i.e. not in Jenkins, I open the Visual Studio 2005 Command Prompt which is a normal windows command shell with all environment variables set. So I tried to do that in Jenkins, too:
call “c:\Program Files\Microsoft SDKs\Windows\v6.0\Bin\SetEnv.Cmd” /Release /x86
cmake . -DCMAKE_BUILD_TYPE=Release
This also did not work and even worse, produced strange (to me, at least) error messages like:
‘Cmd’ is not recognized as an internal or external command, operable program or batch file.
The system cannot find the batch label specified – Set_x86
After some digging, I found the solution: a feature of windows batch programming called delayed expansion, which has to be enabled for SetEnv.Cmd to work correctly.
Solution: SetEnv.cmd and delayed expansion
setlocal enabledelayedexpansion
call “c:\Program Files\Microsoft SDKs\Windows\v6.0\Bin\SetEnv.Cmd” /Release /x86
cmake . -DCMAKE_BUILD_TYPE=Release
nmake
Yes! With this little trick it worked perfectly. And feels almost as with GCC/CMake under Linux: nice, short and easy.
Do you also make the cmakebuilder plugin for Jenkins?
https://schneide.wordpress.com/2009/11/09/cmake-builder-plugin-reloaded/
Does the plugin suffer the same problem (i.e. visual studio environment variables are not set up). It seems so for me.
Is there a way to make this work from the plugin. I.e. add a field to the plugin which allows arbitrary batch to be run prior to running cmake (hence allowing you to define the environment variables from the plugin). Or even better add a combo box which allows you to select the build environment variable configuration from the plugin.
As u say CMake is better , i will use it but can i make serup file by it like VS?