== Origin ==

This port project started its life based on quadra's original port for
version 1.19.2.  Brooktree (bktr) video input support code written by
quadra is virtually unchanged in this port other than some function
argument changes to match the latest ZoneMinder version (1.22.3).
Although this code compiles, I have not tested its functionality.
Currently, I only have two Axis 206 network cameras, which work fine,
but I have not tested the set up with any other camera
configurations.

I have tested this port on FreeBSD 5.5 (i386) as well as FreeBSD 6.2
(i386) without any problems.

== Preparation ==

* Download the port (zoneminder-freebsd-port-1.22.3p[version].tgz)
* Become root and 'cd' to /usr/ports/multimedia/
* Extract the port files.  You know how to do 'tar zxf' right?

You should now have /usr/ports/multimedia/zoneminder/

Now, go to the directory and look at files/patch-SharedMem.pm

What this patch does is to hard-wire native size to 4 (32-bits).
On FreeBSD, Perl is configured with -Duse64bitint by default and the
method that is used by SharedMem.pm to determine architectural bit
width incorrectly considers an i386 machine as 64-bit capable.  I'm 
not a perl expert -- in fact, I hate perl -- and I really have no
idea how to properly determine pointer size in Perl, so this patch
exists.  Obviously, if you are running FreeBSD-AMD64 (or Alpha or
something, although I have no idea if this software would work on
that architecture), you will want to get rid of this patch file.
Just delete it _before_ you make.

And if you're bored, feel free to go through all the patch files just
marvelling at all the trouble I had to go through ^_^;

Now that we've gotten that little quirk out of the way, we'll move on
to Makefile.  Open Makefile using your favorite text editor and modify
the following items if they're not suitable for you.

* WWWDIR : This is where your web server will serve from.  If you
  already have apache installed, you should point this to the same
  place where apache thinks is the web base.  Default is
  /usr/local/www, as can be seen in the Makefile.
* ZM_DB_HOST : This is where mysql server runs.  If you're running
  mysql server on a different machine, you'll want to update this
  line, but I'm not sure if you can avoid installing mysql on this
  machine.  Disk space is cheap, so I don't think it's that big a deal
  having mysql just sitting there, as long as it's not started.
* ZM_DB_NAME : This is the database name that ZoneMinder will use.
  I'm pretty sure ZoneMinder won't mind sharing a base database with
  other applications, but it certainly doesn't hurt to let it have its
  own database space, so this defaults to "zm"
* ZM_DB_USER and ZM_DB_PASS are username and password for the
  database.

We're almost ready to "make," but first, consider the following points
and just imagine how things can break based on your situation.

* If you do not have apache installed, this port will install version
  1.xx.xx of apache.  On the other hand, if you already have apache
  2.xx.xx installed, I do not know what will happen.  My guess is that
  things will work just fine since php5 port will see apache2
  installation and skip apache1 installation.
* If you have mysql version other than 5.0.xx installed, this port
  build will probably fail.  Even if it doesn't fail, you probably do
  not want multiple versions of mysql installed on your machine.  You
  can either edit the dependency in the Makefile to point to your
  version of mysql, or get rid of the dependency statement for mysql.
  Getting rid of it is not as nice, but I'm sure you're able to keep
  the dependencies in mind when messing around with ports in the
  future.
* If you have PHP4 installed, you should modify the dependencies in
  the Makefile to point to php4-extensions instead of
  php5-extensions.  I know for a fact that both versions work fine
  with ZoneMinder.
* I have not set up dependencies for perl modules Device::SerialPort
  and X10::ActiveHome because I do not have PTZ camera and my X10 is
  handled by another dedicated machine.  If you want this, you'll want
  to tinker with the port some more.  You can also manually install
  those ports (if they exist) before doing make.  I imagine
  ZoneMinder's configure script will pick them up.

That's about it.  Let's make!

== Making ==

There's really nothing special about making.  Just 'make' will do.
However, during the dependency builds, make sure PHP install includes
the apache module.  If you already have PHP installed without apache
module, you can always tinker with the Makefile in
/usr/ports/lang/php5/ and do 'make deinstall' followed by 'make
reinstall' to reinstall the port with additional modules.

If the build fails, take a deep breath, yell at your computer for
a moment, and try to figure out if you messed up anything while
changing the Makefile in one of the above steps.  If you do not
believe you've done anything wrong and still can't figure out why
the build fails, there's always the forum....

If it builds fine, feel free to 'make install'

However, do NOT 'make clean' yet!

== Seeding the database ==

If this is the first time installing ZoneMinder, you'll need to seed
the mysql database with ZoneMinder's configuration information.  To do
this, follow these steps as a root user.

First, if this is the first time mysql was installed, you'll want to
consider where you want the database files to reside.  Default is
/var/db/mysql/ but you may have set up a dedicated partition for it.
If you want to change it, just put the following line in /etc/rc.conf

* mysql_dbdir="/somewhere/else/you/want"

Obviously, you'll want this line in there, too:

* mysql_enable="YES"

Now, start the sucker up.

shell> /usr/local/etc/rc.d/mysql-server start

Assuming it started fine, give it a few seconds and then continue.
Note that you should be at /usr/ports/multimedia/zoneminder/ for the
following steps.

shell> mysql -h localhost -u root -p

This will ask for a password.  Just press enter to go with an empty
password.  You should now be in mysql command line interface.

mysql> source work/ZoneMinder-1.22.3/db/zm_create.sql

Above runs bunch of SQL commands from the file, seeding the
database.

mysql> grant select,insert,update,delete on zm.* to 'zmuser'@localhost identified by 'zmpass'; flush privileges;

Above sets up permissions.  Note that if you changed database name,
user name, or password in the Makefile, you'll need to modify above
command accordingly.

mysql> quit

That one should be obvious to you.

== Post-Installation Quirks ==

PHP5 installation does not necessarily set up the apache configuration
file properly.  You will want to make sure that following lines are in
apache configuration file, /usr/local/etc/apache/httpd.conf

* AddType application/x-httpd-php .php
* AddType application/x-httpd-php-source .phps

While you're at it, you might also want to check that following line
is in the configuration file.

* LoadModule php5_module libexec/apache/libphp5.so

== Automatic Execution at Boot ==

Obviously, if this is to be used as a security device, you'll want it
to start automatically on a reboot.  Again obviously, you need to have
both apache and mysql start up as well, unless of course, you're
running mysql on a remote machine.  If you are, I'm sure you're an
expert at this stuff already.

Add following lines into /etc/rc.conf, if not already present.  Order
is not important.

* apache_enable="YES"
* mysql_enable="YES"
* zm_enable="YES"

Just for your information, I had to put 'sleep 10' in ZoneMinder
startup script because mysql port does not become available
immediately after mysql startup script finishes.

== More Quirks ==

Depending on the number of cameras and their resolution settings, you
may need a lot more shared memory than provided by a default kernel.
If you've never built a custom kernel before, umm, time for you to
read the FreeBSD Handbook.  It can be found at
/usr/share/doc/handbook/index.html or at http://freebsd.org/

For the rest of you, just add a reasonable-looking version of the
following lines into your kernel configuration file and go though the
buildkernel, installkernel process.

* options SHMMAXPGS=65536
* options SHMMNI=384
* options SHMSEG=256

I think above gives maximum of 256MB of shared memory.  SHMMNI
statement probably isn't required since ZoneMinder probably creates
one big instance per camera instead of many little instances.  I'm not
sure about the last one.  Whatever the case, above works for me with
two Axis 206 cameras.

Adding the following line into /etc/sysctl.conf may speed up the
shared memory accesses, so even though it's not required, it's
probably a good idea.

* kern.ipc.shm_use_phys=1

That's all folks!
