1 2Instructions for cross compiling the Win32/64 FD on Linux 3======================================================= 4This part of the file documents the tools (scripts) we use for building Bacula for 5Microsoft Windows using the cross-compiler tools on a Linux system. We 6use Ubuntu 14.04 so building on that system should definitely work. But there 7shouldn't be any issues on other Linux distributions. 8 9We don't officially support this method, but it is what we use, and it should 10build on any Linux machine if you carefully follow the instructions and have 11all the prerequisite programs loaded on your machine. 12 13We expect that there may be problems on systems other than Linux where you 14are pretty much on your own. However, we will try to provide responses to 15your questions on the bacula-devel list, but we can't guarantee anything. 16 17Note: the environment variable DEPKGS must point to a directory that 18contains: depkgs-mingw32 depkgs-mingw-w64 and cross-tools 19 20Directory Structure 21===================== 22The new directory structure is: 23 24 xxx (any directory) 25 bacula Top level Bacula source directory -- any name 26 src 27 win32 Main directory where Windows version is built. 28 29 docs Top level Bacula documentation directory 30 31 yyy (any directory, but pointed to by the DEPKGS environment variable) 32 depkgs-mingw32 (MinGW32) 3rd Party Dependencies for MinGW32 build 33 bin -- NOTE! depkgs-msvc is no longer suppored 34 include | 35 lib | 36 man | Created by script 37 nsis |-- .../bacula/src/win32/build-depkgs-mingw32 38 scons | 39 share | 40 src | 41 ssl -- 42 vss 43 inc A copy of the Windows VSS/inc directory 44 45 46 depkgs-mingw-w64 (MinGW64) 3rd Party Dependencies for MinGW64 build 47 bin -- 48 include | 49 lib | 50 man | Created by script 51 nsis |-- .../bacula/src/win32/build-depkgs-mingw-w64 52 scons | 53 share | 54 src | 55 ssl -- 56 vss 57 inc A copy of the Windows VSS/inc directory 58 59One-time Setup 60============== 61 62If you're reading this file you've probably already cloned the GIT source tree or 63extracted the contents of the source tar. If not you need to do that first. 64 65You also need to download one of the doc tar balls and extract to your 66top level Bacula directory. 67 68The extracted doc directory name will be bacula-docs-version where version 69is the version number. The directory must be renamed to docs (ie remove 70the leading bacula- and the -version portion of the name). 71 72An alternative to setting up the old documents that are needed by the Win32 73installer, you may comment out the following lines in 74src/win32/win32_installer/Makefile: 75 76#DOC_FILES := \ 77# manual/bacula.pdf \ 78# manual/bacula/*.html \ 79# manual/bacula/*.png \ 80# manual/bacula/*.css 81 82Note, a number of packages must be installed to build the the depkgs files. 83Most are rather standard such as gcc, g++, 84make, ... However a few that you may not have are: 85 86 wget 87 texinfo 88 flex 89 bison 90 patch (Debian) 91 m4 92 postgresql (at least client) 93 mysql (at least client) 94 SQLite3 (from depkgs or as package) 95 readline (readlineN-dev on Debian) 96 ... 97 98NB: On Debian, I had to remove /usr/bin/lorder for 99postresql to build correctly. 100 101Install the cross compiler and makensis 102 apt-get install g++-mingw-w64-i686 g++-mingw-w64-x86-64 gcc-mingw-w64-i686 gcc-mingw-w64-x86-64 nsis 103 104For OpenSSL 1.0.2n, I have commented out the fstat() definition in /usr/share/mingw-w64/include/sys/stat.h 105with #ifdef 0 / #endif 106 107Download and build the 3rd party dependencies 108 ./build-depkgs-mingw32 109 ./build-depkgs-mingw64 110 111Files are also available on bsweb:/var/www/dl/Depkgs-mingw32-6.6-paa9aiMa/ 112 113 114Make sure that libgcc and libstdc++ mingw files are copied to depkgs-mingw32/bin and depkgs-mingw-w64/bin 115 /usr/lib/gcc/i686-w64-mingw32/*-posix/libgcc_s_sjlj-1.dll 116 /usr/lib/gcc/i686-w64-mingw32/*-posix/libstdc++-6.dll 117 /usr/i686-w64-mingw32/lib/libwinpthread-1.dll 118 119 /usr/lib/gcc/x86_64-w64-mingw32/*-posix/libgcc_s_seh-1.dll 120 /usr/lib/gcc/x86_64-w64-mingw32/*-posix/libstdc++-6.dll 121 /usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll 122 123Note, that during the build process you will see a moderate amount of 124output and some warnings. If something more serious happens 125and the build fails, it is probably because you don't have one 126of the build dependencies (hopefully all mentioned above) loaded on your 127system. To find out what is going wrong, do the following: 128 129 cd .../depkgs-mingw32/src/<package-name> 130 131where <package-name> is where the package is unpacked and built. Normally 132it is relatively obvious when looking at the src directory. 133 134In that directory, you should find a make.log, which has the full details 135of the compiles, links, and installs done for that package. 136 137=== 138 139For the QT part, you must download QT binaries from 140QT website 141 142the http://download.qt-project.org/archive/qt/4.8/4.8.4/ 143 144Then, copy Qt*dll files to depkgs-mingw32/bin and headers to 145depkgs-mingw32/include 146 147=== 148 149See External-mingw-w64 for download location 150 151You need the header files from the Microsoft VSS SDK. Unfortunately the SDK 152can only be downloaded and installed on a Windows system. We do not have 153the right to distribute it, so you must download it yourself. 154You can find it on Microsoft's web-site at: 155 156http://www.microsoft.com/downloads/details.aspx?FamilyID=0b4f56e4-0ccc-4626-826a-ed2c4c95c871&DisplayLang=en 157 158If that link doesn't work then go to http://www.microsoft.com and search for 159 160 "download volume shadow copy service sdk" 161 162we are currently using version 7.2 released 8/3/2005 (a bit old, but it 163works). 164 165Normally the files will be installed in: 166 167 c:\Program Files\Microsoft\VSSSDK72 168 169You only need to copy everything under the c:\Program Files\Microsoft\VSSSDK72\inc 170directory into .../depkgs-mingw32/vss/inc. and .../depkgs-mingw-w64/vss/inc 171In doing so, please ensure that 172the case in maintained on the directory and filenames -- some contain uppercase 173characters !!! 174 175Some definitions are already defined in other headers, it produces warnings 176and the depkgs-mingw-w64.tar.bz2 archive contains fixes with #ifndef 177 178The above only needs to be done once unless we change the cross-tools 179or the dependencies versions. In general, you can run the script multiple 180times with no problem. For it to work, you must have at a minimum the 181following: 182 183 gcc 184 g++ 185 patch 186 wget 187 texinfo 188 bison 189 flex 190 python 191 unzip 192 tar 193 194and possibly other packages. 195 196 197Building 198======== 199 200Finally, to build the Microsoft Windows version of Bacula, do the following: 201 202 cd .../bacula/src/win32 203 make clean 204 ./makeall 205 206or 207 cd .../bacula/src/win32 208 make clean 209 make 210 make win64=yes 211 212This builds both the 32 bit version and the 64 bit version. 213The binaries are in the release32 and release64 directories. 214 215 216 217Updating the 3rd party package patches 218====================================== 219 220If one of the patches changes in .../bacula/src/win32/patches, you will 221need to update the corresponding dependency. 222 223Adding a new global function or global data 224=========================================== 225 226bacula.dll 227---------- 228 229The code from the following directories is built into bacula.dll: 230 231 .../bacula/src/lib 232 .../bacula/src/libfind 233 .../bacula/src/win32/compat 234 235A new function or data variable which must be accessed from outside 236of bacula.dll requires special treatment. It must be specifically 237exported. 238 239New data variables are exported by adding the macro DLL_IMP_EXP to 240the variable declaration in the header file. All exported variables 241must be declared in a header file and MUST NOT be declared in a 242source file referencing the variable. Example, src/lib/runscript.h: 243 244extern DLL_IMP_EXP bool (*console_command)(JCR *jcr, const char *cmd); 245 246or src/jcr.h 247 248extern int DLL_IMP_EXP num_jobs_run; 249extern DLL_IMP_EXP dlist * last_jobs; 250... 251 252 253Exporting functions is now more or less automated. If you find that 254a function name has been added, changed, or an argument modified, 255simply do the following: 256 257 cd .../bacula/src/win32/lib 258 make (to build the .o files, note the link will fail) 259 ./make_def >bacula64.def or >bacula64.def 260 261This should rebuild the bacula.def file, but it uses relative paths 262and assumes you have the directory structure noted above. If you 263are using something different, you can set the NM variable at the 264top of the make_def file to use an absolute path to the correct 265directory. 266 267===== manual changing of bacula32.def or bacula64.def no longer necessary ===== 268If you want to do it manually, please see below: 269Exporting a function requires a bit more work. You must determine the 270C++ mangled name of the new function. 271 272 strings .../bacula/src/win32/lib/<file>.o | grep <symbol> 273 274Note, strings often will not show the desired symbol. In that case, 275use: 276 277 nm .../bacula/src/win32/lib/<file>.o 278 279Replace <file> with the base part of the name of the source code file 280which contains the new function. Replace <symbol> with the name of 281the new function. Remove the leading underscore and place the result 282in the file 283 284 .../bacula/src/win32/lib/bacula64.def 285=== end manual changing of bacula64.def ========== 286 287If you add a new file, you will need to specify its name in 288 289 .../bacula/src/win32/lib/Makefile 290and 291 .../bacula/src/win32/libbac/Makefile 292 293 294Running gdb on the Win32 files 295================================================== 296You can use the mingw64 gdb to debug Bacula on Win64 by downloading 297it from Source Forge: 298 299http://sourceforge.net/project/showfiles.php?group_id=202880&package_id=311650 300 301 302Download one of their .exe versions, which is an installer that you 303can run on Win32 to install gdb. This gdb is built with mingw64 so will 304run independently of any cygwin installation. Note, not all the releases 305come with an installer. I had to go back 3 or 4 versions to find it. Otherwise 306you can download the source and build it. Thanks to Eric Bollengier for 307this tip. 308 309Build Trial version 310=================== 311 312To build trial version, just add the HAVES=-DBEEF_DEMO_ENABLED=1 environment 313variable before compiling everything. 314 315Structure of the MinGW64/32 build environment 316========================================== 317 318The basic strategy is each Makefile in the various subdirectories includes 319Makefile.inc, defines variables and rules specific to what is being built, 320then includes Makefile.rules which defines all the rules. 321 322Makefile.inc defines the locations of all the dependencies and the compiler 323and linker flags. It is automatically created from Makefile.inc.in. Any 324changes must be made to Makefile.inc.in not Makefile.inc or they will be 325overwritten the next time Makefile.inc.in is updated. 326 327Makefile.rules defines a bunch of macros to simplify building. It also 328includes all the basic rules for building objects, GUI and console 329executables, etc. 330 331Makefile.template is a template for creating new Makefiles, if you are 332creating a new directory, copy Makefile.template to Makefile in that 333directory and edit to suit. 334 335Upgrading the system mingw 336================================== 337Every time you upgrade the system mingw, for example when changing from 338Ubuntu 12.04 to Ubuntu 14.04, you much update the system library dll 339files in your build environment. 340 341Do so by running from src/win32 342 343./build-depkgs-mingw32 mingw 344./build-depkgs-mingw-w64 mingw 345 346All that does is copy the system .dll files into the appropriate 347depkgs directory. Then while building the installer, these files 348are copied from the depkgs directory into the installer binary. 349 350Alternatively, you can look at the build-depkgs-xxx script and 351manually run the code in the function process_mingw(). 352 353 354Upgrading your depkgs mingw 355==================================== 356 357mkdir old 358mv cross-tools old 359mv depkgs-mingw32 old 360mv depkgs-mingw-w64 old 361 362# from src/win32 363./build-depkgs-mingw32 364./build-depkgs-mingw-w64 365 366# from new depkgs-mingw32 dir 367cp ../old/depkgs-mingw32/bin/libgcc_s_dw2-1.dll bin/ 368cp ../old/depkgs-mingw32/bin/Qt* bin/ 369cp -r ../old/depkgs-mingw32/lib/qt lib 370cp -r ../old/depkgs-mingw32/include/qt include/ 371cp -r ../old/depkgs-mingw32/include/src include/ 372cp -r ../old/depkgs-mingw32/vss . 373 374 375# from new depkgs-mingw-w64 376cp -r ../old/depkgs-mingw-w64/vss . 377