%%
%%

\chapter{Bacula Porting Notes}\label{PortingChapter}
\label{TheChapterStart1}
\index{Notes!Bacula Porting}
\index{Bacula Porting Notes}
\addcontentsline{toc}{section}{Bacula Porting Notes}

This document is intended mostly for developers who wish to port Bacula to a
system that is not {\bf officially} supported. 

It is hoped that Bacula clients will eventually run on every imaginable system
that needs backing up (perhaps even a Palm). It is also hoped that the Bacula
Directory and Storage daemons will run on every system capable of supporting
them. 

\section{Porting Requirements}
\index{Requirements!Porting}
\index{Porting Requirements}
\addcontentsline{toc}{section}{Porting Requirements}

In General, the following holds true: 

\begin{itemize}
\item {\bf Bacula} has been compiled and run on Linux RedHat, FreeBSD,  and
   Solaris systems. 
\item In addition, clients exist on Win32, and Irix 
\item It requires GNU C++ to compile. You can try with other compilers, but 
   you are on your own. The Irix client is built with the Irix complier,  but, in
   general, you will need GNU. 
\item Your compiler must provide support for 64 bit signed and unsigned 
   integers. 
\item You will need a recent copy of the {\bf autoconf} tools loaded  on your
   system (version 2.13 or later). The {\bf autoconf} tools  are used to build
   the configuration program, but are not part of  the Bacula source
distribution. 
\item There are certain third party packages that Bacula needs. Except  for
   MySQL, they can all be found in the {\bf depkgs} and  {\bf depkgs1} releases. 
\item To build the Win32 binaries, we use Microsoft VC++ standard
   2003. Please see the instructions in
   bacula-source/src/win32/README.win32 for more details. If you
   want to use VC++ Express, please see README.vc8. Our build is
   done under the most recent version of Cygwin, but Cygwin is
   not used in the Bacula binaries that are produced.
   Unfortunately, we do not have the resources to help you build
   your own version of the Win32 FD, so you are pretty much on
   your own. You can ask the bacula-devel list for help, but
   please don't expect much.
\item {\bf Bacula} requires a good implementation of pthreads to work. 
\item The source code has been written with portability in mind and is  mostly
   POSIX compatible. Thus porting to any POSIX compatible operating  system
   should be relatively easy. 
\end{itemize}

\section{Steps to Take for Porting}
\index{Porting!Steps to Take for}
\index{Steps to Take for Porting}
\addcontentsline{toc}{section}{Steps to Take for Porting}

\begin{itemize}
\item The first step is to ensure that you have version 2.13 or later  of the
   {\bf autoconf} tools loaded. You can skip this step, but  making changes to
   the configuration program will be difficult or  impossible. 
\item The run a {\bf ./configure} command in the main source directory  and
   examine the output. It should look something like the  following:  

\footnotesize
\begin{verbatim}
Configuration on Mon Oct 28 11:42:27 CET 2002:
  Host:                        i686-pc-linux-gnu -- redhat 7.3
  Bacula version:              1.27 (26 October 2002)
  Source code location:        .
  Install binaries:            /sbin
  Install config files:        /etc/bacula
  C Compiler:                  gcc
  C++ Compiler:                c++
  Compiler flags:              -g -O2
  Linker flags:
  Libraries:                   -lpthread
  Statically Linked Tools:     no
  Database found:              no
  Database type:               Internal
  Database lib:
  Job Output Email:            root@localhost
  Traceback Email:             root@localhost
  SMTP Host Address:           localhost
  Director Port                9101
  File daemon Port             9102
  Storage daemon Port          9103
  Working directory            /etc/bacula/working
  SQL binaries Directory
  Large file support:          yes
  readline support:            yes
  cweb support:                yes /home/kern/bacula/depkgs/cweb
  TCP Wrappers support:        no
  ZLIB support:                yes
  enable-smartalloc:           yes
  enable-gnome:                no
  gmp support:                 yes
\end{verbatim}
\normalsize

The details depend on your system. The first thing to check is that  it
properly identified your host on the {\bf Host:} line. The  first part (added
in version 1.27) is the GNU four part identification  of your system. The part
after the -- is your system and the system version.  Generally, if your system
is not yet supported, you must correct these. 
\item If the {\bf ./configure} does not function properly, you must  determine
   the cause and fix it. Generally, it will be because some  required system
   routine is not available on your machine. 
\item To correct problems with detection of your system type or with routines 
   and libraries, you must edit the file {\bf
   \lt{}bacula-src\gt{}/autoconf/configure.in}.  This is the ``source'' from
which {\bf configure} is built.  In general, most of the changes for your
system will be made in  {\bf autoconf/aclocal.m4} in the routine {\bf
BA\_CHECK\_OPSYS} or  in the routine {\bf BA\_CHECK\_OPSYS\_DISTNAME}. I have
already added the  necessary code for most systems, but if yours shows up as
{\bf unknown}  you will need to make changes. Then as mentioned above, you
will need  to set a number of system dependent items in {\bf configure.in} in
the  {\bf case} statement at approximately line 1050 (depending on the  Bacula
release). 
\item The items to in the case statement that corresponds to your system  are
   the following:  

\begin{itemize}
\item DISTVER -- set to the version of your operating system. Typically  some
   form of {\bf uname} obtains it. 
\item TAPEDRIVE -- the default tape drive. Not too important as the user  can
   set it as an option.  
\item PSCMD -- set to the {\bf ps} command that will provide the PID  in the
   first field and the program name in the second field. If this  is not set
   properly, the {\bf bacula stop} script will most likely  not be able to stop
Bacula in all cases.  
\item hostname -- command to return the base host name (non-qualified)  of
   your system. This is generally the machine name. Not too important  as the
   user can correct this in his configuration file. 
\item CFLAGS -- set any special compiler flags needed. Many systems need  a
   special flag to make pthreads work. See cygwin for an example.  
\item LDFLAGS -- set any special loader flags. See cygwin for an example.  
\item PTHREAD\_LIB -- set for any special pthreads flags needed during 
   linking. See freebsd as an example.  
\item lld -- set so that a ``long long int'' will be properly edited in  a
   printf() call.  
\item llu -- set so that a ``long long unsigned'' will be properly edited in 
   a printf() call.  
\item PFILES -- set to add any files that you may define is your platform 
   subdirectory. These files are used for installation of automatic  system
   startup of Bacula daemons.  
\end{itemize}

\item To rebuild a new version of {\bf configure} from a changed {\bf
   autoconf/configure.in}  you enter {\bf make configure} in the top level Bacula
   source  directory. You must have done a ./configure prior to trying to rebuild
 the configure script or it will get into an infinite loop. 
\item If the {\bf make configure} gets into an infinite loop, ctl-c it, then
   do  {\bf ./configure} (no options are necessary) and retry the  {\bf make
   configure}, which should now work. 
\item To rebuild {\bf configure} you will need to have {\bf autoconf} version 
   2.57-3 or higher loaded. Older versions of autoconf will complain about 
   unknown or bad options, and won't work. 
\item After you have a working {\bf configure} script, you may need to  make a
   few system dependent changes to the way Bacula works.  Generally, these are
   done in {\bf src/baconfig.h}. You can find  a few examples of system dependent
changes toward the end of this  file. For example, on Irix systems, there is
no definition for  {\bf socklen\_t}, so it is made in this file. If your
system has  structure alignment requirements, check the definition of BALIGN
in  this file. Currently, all Bacula allocated memory is aligned on a {\bf
double}  boundary. 
\item If you are having problems with Bacula's type definitions, you might 
   look at {\bf src/bc\_types.h} where all the types such as {\bf uint32\_t}, 
   {\bf uint64\_t}, etc. that Bacula uses are defined. 
\end{itemize}
