Building GNR on FreeBSD 8

Revision as of 20:02, 22 April 2010 by Solko (talk | contribs) (Preparing build enviroment via

General information

Please, read GNR_on_FreeBSD_7 for all the details.

This guide describes building GNR-606 on FreeBSD-8-_amd64. If you happen to use i386, please, substitute every amd64 found with i386.

At this point it's good to note that everything should be run as root unless stated otherwise.

Getting the source via Perforce

You need to install Perforce either from /usr/ports:

cd /usr/ports/devel/perforce && make install distclean

or fetch perforce package and its dependency from

cd /tmp && \
    fetch && \
        fetch,1.tbz && \
            pkg_add perforce-08.2_5,1.tbz && rm -f *.tbz

If you are using a csh derivate shell, which is the FreeBSD default, run:


Setup the perforce enviroment:

setenv P4PORT
setenv P4USER public
setenv P4CLIENT public-view 
setenv P4PASSWD public1234

Fire up the workspace editor:

p4 client

which may look like this:

# A Perforce Client Specification.
#  Client:      The client name.
#  Update:      The date this specification was last modified.
#  Access:      The date this client was last used in any way.
#  Owner:       The user who created this client.
#  Host:        If set, restricts access to the named host.
#  Description: A short description of the client (optional).
#  Root:        The base directory of the client workspace.
#  AltRoots:    Up to two alternate client workspace roots.
#  Options:     Client options:
#                      [no]allwrite [no]clobber [no]compress
#                      [un]locked [no]modtime [no]rmdir
#  SubmitOptions:
#                      submitunchanged/submitunchanged+reopen
#                      revertunchanged/revertunchanged+reopen
#                      leaveunchanged/leaveunchanged+reopen
#  LineEnd:     Text file line endings on client: local/unix/mac/win/share.
#  View:        Lines to map depot files into the client workspace.
# Use 'p4 help client' to see more about client views and options.

Client: public-view

Update: 2010/04/22 12:13:19

Access: 2010/04/22 12:13:31

Owner:  public

               Leave host field blank so others may use.

Root:   /home/zimbra-src


Options:        noallwrite noclobber nocompress locked modtime normdir

SubmitOptions:  submitunchanged

LineEnd:        local

        //depot/... //public-view/...

and change Root: some_path to Root: /home/zimbra-src.

Run the sync:

p4 sync -f //depot/zcs/GNR-606/...
cd /home/zimbra-src/zcs

which should be now downloaded to /home/zimbra-src/zcs/GNR-606.

Getting the source from


mkdir -p /home/zimbra-src/zcs && \
    cd /home/zimbra-src/zcs && \
        fetch && \
            tar xzf GNR-606-src.tar.gz

Initial pre-build steps

Let's check our system:

uname -a
FreeBSD 8.0-STABLE FreeBSD 8.0-STABLE #0: Fri Apr 16 21:23:49 CEST 2010  amd64

We love some optimizations:

cat /etc/make.conf
COPTFLAGS= -O2 -pipe
CFLAGS= -O2 -fno-strict-aliasing -pipe

Preparing build enviroment via /usr/ports

I created simple "meta" ports which will take care of everything. Since I am a very very creative person I named those: mail/zimbra-rundeps and mail/zimbra-builddeps.

The first installs all dependencies needed to run GNR-606 while the second installs all dependencies needed to build GNR-606. For reasons vastly uknown the second requires the first one.

cd /usr/ports/mail
fetch && \
    tar xzf usrports_zimbra-rundeps-6.0.6.tgz && \
        rm -f usrports_zimbra-rundeps-6.0.6.tgz
fetch && \
    tar xzf usrports_zimbra-builddeps-6.0.6.tgz && \
        rm -f usrports_zimbra-builddeps-6.0.6.tgz
cd /usr/ports/mail/zimbra-builddeps && make -DWITHOUT_X11 -DWITHOUT_XPM -DWITH_XS config-recursive install

followed by an optional:

make distclean

to completely clean the build mess including source files.

If you are able to use /usr/ports you should be able to figure out the configure options (not that it matters much, mostly unimportant stuff). Be warned that GNR-606 requires jdk15 to build while apache-ant requires jdk16 to run so you will end up having both. Building diablo-jdk requires downloading java stuff. How boring!

There are also those 109 Perl modules..

If you are using a csh derivate shell, which is the FreeBSD default, run:


Preparing build enviroment via

Since some people like to compile and others like to install-only I built all the necessary zimbra-builddeps packages.

cd /tmp && \
    fetch && \
        tar xzf zimbra-builddeps-8_amd64-6.0.6.tgz && \
            cd zimbra-builddeps-8_amd64-6.0.6 && \
                pkg_add zimbra-builddeps-6.0.6.tbz && cd /tmp && rm -rf zimbra-builddeps-8_amd64-6.0.6

You need to accept diablo-jdk license twice (jdk15+jdk16).

If you are using a csh derivate shell, which is the FreeBSD default, run:


Grats, you just saved yourself a lot of time.

Quick-hacks for a better day

Since Zimbra is a Linux lover by nature everything is /bin/bash but guess what.. we have /usr/local/bin/bash:

ln -s /usr/local/bin/bash /bin/bash

Since Zimbra uses gmake and since some ThirdParty (specifically snmp install script) does not honor ${MAKE} macro we have to replace make with gmake globally, otherwise some stuff just won't make (it) with weird errors:

cp -p /usr/bin/make /usr/bin/make.orig && cp /usr/local/bin/gmake /usr/bin/make

We need to compile with jdk15 so tell java about it:

setenv JAVA_VERSION 1.5

You should now get something like this:

java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build diablo-1.5.0-b01)
Java HotSpot(TM) 64-Bit Server VM (build diablo-1.5.0_07-b01, mixed mode)

Patching GNR-606 to comply with FreeBSD

Download the GNR-606 FreeBSD patch and patch the source tree:

cd /home/zimbra-src/zcs && \
    fetch && \
        cd GNR-606 && patch -p1 -s < ../GNR-606.FreeBSD.patch

Remove unnecessary files:

find . -name "*.orig" | xargs -n1 rm -f

Change modes of our new build/install scripts else the build will fail:

chmod 0755 ZimbraBuild/rpmconf/Spec/Scripts/FreeBSD/*

Rest is handled by libexec/zmfixperms after installation.

Putting diablo-jdk1.6 into ThirdPartyBuilds

Zimbra requires you to supply jdk16 so we are happy to oblige by using installed version of diablo-jdk16:

mkdir -p ThirdPartyBuilds/FreeBSD_amd64/java && cd ThirdPartyBuilds/FreeBSD_amd64/java && \
    cp -pr /usr/local/diablo-jdk1.6.0 diablo-jdk1.6.0_07 &&\
        tar zcf diablo-jdk1.6.0_07.tgz diablo-jdk1.6.0_07 && \
            rm -rf diablo-jdk1.6.0_07 && cd ../../../

The destination tarball version must match with ZimbraBuild/defs/ThirdParty/FreeBSD_amd64.def!

Building Zimbra Collaboration Suite: GNR-606

Now that's the part where real Zimbra developer's magic kicks in:

cd ZimbraBuild
./ -t

Let's clean up after the build:

cp -p /usr/bin/make.orig /usr/bin/make && rm -f /usr/bin/make.orig

You should have a fresh build inside:

cd zcs-6.*

Installing Zimbra Collaboration Suite: GNR-606 after a successful build


Further reading


--Solko 19:59, 22 April 2010 (UTC)

Jump to: navigation, search