Go to file
Nic Boet c23869b6ac build: replace Perl ExtUtils::MakeMaker with pure CMake install
MakeMaker was only used to copy .pm files — no XS compilation, no binary
linking, no dependency resolution. Its hardcoded "Makefile" output name
conflicts with cmake's generated Makefile for in-source builds, and using
FIRST_MAKEFILE=MakefilePerl causes thousands of "uninitialized value"
warnings because MM.pm stats the wrong file.

Replace with native CMake install(DIRECTORY ... FILES_MATCHING PATTERN
"*.pm") directives. Perl module install path is auto-detected at configure
time via `perl -MConfig` (vendorlib on Linux, sitelib on FreeBSD),
overridable with -DZM_PERL_INSTALL_PATH=<path>.

What's removed:
- ExtUtils::MakeMaker as build dependency
- Three perl+make subprocesses at build time (zmperlmodules,
  zmonvifmodules, zmonvifproxy build targets)
- ~6000 auto-generated man3 pages from WSDL stubs
- MakeMaker scaffolding: Makefile.PL, MANIFEST, META.yml, Changes,
  README, and t/ZoneMinder.t test stub

What's preserved:
- configure_file() for .pm.in templates (same behavior)
- ZM_PERL_SEARCH_PATH (independent mechanism, unchanged)
- Section 8 man pages for .pl scripts (Pod2Man.cmake, unaffected)
- DESTDIR support (CMake install() handles natively)
- Installed file paths (perl -MConfig returns same paths MakeMaker used)

Verified: 3102 .pm files installed, 0 .pm.in files, 0 .3pm man pages,
no @VERSION@ markers in generated files, DESTDIR and user override work.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 14:47:35 -06:00
.github fix: always render monitorStatus HTML in montage view 2026-02-10 09:26:34 -05:00
.well-known Add funding-manifest-urls 2025-01-03 14:00:57 -05:00
cmake fix: use ${PERL_EXECUTABLE} instead of hardcoded perl in CMake builds 2026-02-12 12:25:37 -05:00
conf.d Merge pull request #3792 from Simpler1/patch-7 2023-12-07 10:08:30 -05:00
db Increase ONVIF_Options column width to 255 characters 2026-02-02 13:35:57 -05:00
dep add AV1 support 2026-01-31 12:43:13 -05:00
distros build: replace Perl ExtUtils::MakeMaker with pure CMake install 2026-02-15 14:47:35 -06:00
docs Add section on debug logs that we can reference when asking for them. 2026-01-02 14:04:22 +11:00
email_content Rough in some email content templates 2023-10-26 18:29:13 -04:00
fonts ZmFont: Store character padding in font file 2021-04-25 23:13:21 +02:00
icons/16x16 add an icon made from favicon.ico and a .desktop file to be install in /usr/share/applications/ 2017-04-26 15:21:28 -04:00
misc feat: merge MacVendors.json with zm_utils, adding 39 new MAC prefixes 2026-02-13 10:30:53 -05:00
onvif build: replace Perl ExtUtils::MakeMaker with pure CMake install 2026-02-15 14:47:35 -06:00
scripts build: replace Perl ExtUtils::MakeMaker with pure CMake install 2026-02-15 14:47:35 -06:00
src Merge pull request #4618 from pliablepixels/fix_event_start_stop_commands 2026-02-13 14:40:18 -05:00
tests refactor: move format_absolute_time_iso8601 from zm_monitor_onvif to zm_time 2026-02-12 16:53:39 -05:00
utils feat: add --local-source option to do_debian_package.sh 2026-02-11 20:12:25 -05:00
web Merge pull request #4623 from IgorA100/patch-164992 2026-02-13 13:25:44 -05:00
.cirrus.yml Fix images for Freebsd 2025-12-31 23:38:47 +11:00
.dockerignore Improve Docker build; reduce image size & layer count 2016-06-02 10:51:41 +10:00
.eslintignore Ignore hls-1.6.13 2025-10-16 12:18:22 -04:00
.eslintrc.js Turn off operator-linebreak in eslint 2025-10-02 11:16:04 -04:00
.git-blame-ignore-revs git: Add .git-blame-ignore-revs file and add previous CMake cleanup commit to it 2021-02-04 22:12:09 +01:00
.gitignore build: replace Perl ExtUtils::MakeMaker with pure CMake install 2026-02-15 14:47:35 -06:00
.gitlab-ci.yml Bumped up the timeout due to build server being slow sometimes 2022-04-24 13:36:05 -05:00
.gitmodules Fix url to CxxURL 2025-09-04 15:42:49 -04:00
.readthedocs.yaml Add explicit path to sphinx conf.py as required by readthedocs 2024-12-18 12:27:38 -05:00
AGENTS.md Tell agents to run with sudo -u www-data 2026-02-13 11:48:29 -05:00
CHANGELOG.md spelling fixes 2016-12-29 10:31:05 +01:00
CLAUDE.md Update AGENTS.md and symlink CLAUDE.md 2026-01-09 12:26:43 +11:00
CMakeLists.txt build: replace Perl ExtUtils::MakeMaker with pure CMake install 2026-02-15 14:47:35 -06:00
CONTRIBUTING.md Create CONTRIBUTING.md 2015-09-21 08:52:32 -05:00
COPYING update gpl 2 statement 2016-12-26 09:08:08 -06:00
LICENSE Copied COPYING to LICENSE 2013-04-12 19:11:17 -04:00
README.md Remove broken google analytics 2025-04-22 10:24:59 -04:00
SECURITY.md Update ZM version in SECURITY.md 2023-11-12 04:59:37 -08:00
cmakecacheimport.sh cmakecacheimport parameters 2023-08-19 12:41:07 +02:00
code_of_conduct.md set email address to send complaints to 2017-06-06 16:03:10 -04:00
eslint.config.js Add new eslint config 2025-08-18 16:04:17 -04:00
funding.json Fixed funding.json 2025-01-03 14:45:53 -05:00
version.txt Release 1.38.0 2026-02-01 17:43:29 -05:00
zm.conf.in Text corrections 2023-08-27 02:00:59 +02:00
zmconfgen.pl.in build: Store all generated sources in CMAKE_BINARY_DIR 2021-04-11 01:28:23 +02:00
zmlinkcontent.sh.in Text corrections 2023-08-27 02:00:59 +02:00
zoneminder-config.cmake fix: improve crash backtrace on ARM and fix misleading signal info 2026-01-30 15:09:02 -05:00

README.md

ZoneMinder

Join Slack drawing

All documentation for ZoneMinder is now online at https://zoneminder.readthedocs.org

Overview

ZoneMinder is an integrated set of applications which provide a complete surveillance solution allowing capture, analysis, recording and monitoring of any CCTV or security cameras attached to a Linux based machine. It is designed to run on distributions which support the Video For Linux (V4L) interface and has been tested with video cameras attached to BTTV cards, various USB cameras and also supports most IP network cameras.

Contacting the Development Team

Before creating an issue in our github forum, please read our posting rules: https://github.com/ZoneMinder/ZoneMinder/wiki/Github-Posting-Rules

Our Dockerfile has moved

Please file issues against the ZoneMinder Dockerfile here: https://github.com/ZoneMinder/zmdockerfiles

Installation Methods

Install from a Package Repository

This is the recommended method to install ZoneMinder onto your system. ZoneMinder packages are maintained for the following distros:

If a repository that hosts ZoneMinder packages is not available for your distro, then you are encouraged to build your own package, rather than build from source. While each distro is different in ways that set it apart from all the others, they are often similar enough to allow you to adapt another distro's package building instructions to your own.

Building from Source is Discouraged

Historically, installing ZoneMinder onto your system required building from source code by issuing the traditional configure, make, make install commands. To get ZoneMinder to build, all of its dependencies had to be determined and installed beforehand. Init and logrotate scripts had to be manually copied into place following the build. Optional packages such as jscalendar and Cambozola had to be manually installed. Uninstalls could leave stale files around, which could cause problems during an upgrade. Speaking of upgrades, when it comes time to upgrade all these manual steps must be repeated again.

Better methods exist today that do much of this for you. The current development team, along with other volunteers, have taken great strides in providing the resources necessary to avoid building from source.

Building a ZoneMinder Package

Building ZoneMinder into a package is not any harder than building from source. As a matter of fact, if you have successfully built ZoneMinder from source in the past, then you may find these steps to be easier.

When building a package, it is best to do this work in a separate environment, dedicated to development purposes. This could be as simple as creating a virtual machine, using Docker, or using mock. All it takes is one “Oops” to regret doing this work on your production server.

Lastly, if you desire to build a development snapshot from the master branch, it is recommended you first build your package using an official release of ZoneMinder. This will help identify whether any problems you may encounter are caused by the build process or is a new issue in the master branch.

Please visit our ReadtheDocs site for distro specific instructions.

Package Maintainers

Many of the ZoneMinder configuration variable default values are not configurable at build time through autotools or cmake. A new tool called zmeditconfigdata.sh has been added to allow package maintainers to manipulate any variable stored in ConfigData.pm without patching the source.

For example, let's say I have created a new ZoneMinder package that contains the cambozola javascript file. However by default cambozola support is turned off. To fix that, add this to the packaging script:

./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes

Note that zmeditconfigdata.sh is intended to be called, from the root build folder, prior to running cmake or configure.

Docker

Docker is a system to run applications inside isolated containers. ZoneMinder, and the ZM webserver, will run using the Dockerfile contained in this repository. However, there is still work needed to ensure that the main ZM features work properly and are documented.

Contribution Model and Development

Pull requests are very welcome! If you would like to contribute, please follow the following steps. While step 3 is optional, it is preferred.

  1. Fork the repo
  2. Open an issue at our GitHub Issues Tracker. Follow the issue template to describe the bug or security issue you found. Please note feature requests or questions should be posted in our user forum or Slack channel.
  3. Create your feature branch (git checkout -b 456-my-new-feature)
  4. Commit your changes (git commit -am 'Added some feature') It is preferred that you 'commit early and often' instead of bunching all changes into a single commit.
  5. Push your branch to your fork on github (git push origin 456-my-new-feature)
  6. Create new Pull Request
  7. The team will then review, discuss and hopefully merge your changes.