From 823c733ce9a100e6748ff822c4b8a159a910fa1c Mon Sep 17 00:00:00 2001 From: pliablepixels Date: Mon, 16 May 2016 16:14:02 -0400 Subject: [PATCH 1/3] initial OSX port - baby steps - compile & make only --- CMakeLists.txt | 16 +++---- README.md | 104 ++++++++++++++-------------------------------- src/zm.h | 9 ++++ src/zm_logger.cpp | 18 ++++++++ src/zm_logger.h | 1 + src/zm_sendfile.h | 50 +++++++++++++++------- src/zm_signal.cpp | 4 ++ src/zm_thread.h | 34 +++++++++++++++ src/zmc.cpp | 2 +- 9 files changed, 143 insertions(+), 95 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dc301dfb1..e9e91bacb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -232,7 +232,7 @@ check_type_size("ucontext_t" HAVE_UCONTEXT_T) # *** LIBRARY CHECKS *** -if (UNIX) +if (UNIX AND NOT APPLE) include (CheckLibraryExists) CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME) if(NOT HAVE_CLOCK_GETTIME) @@ -240,7 +240,7 @@ if (UNIX) else(NOT HAVE_CLOCK_GETTIME) list(APPEND ZM_BIN_LIBS "-lrt") endif(NOT HAVE_CLOCK_GETTIME) -endif(UNIX) +endif(UNIX AND NOT APPLE) # zlib find_package(ZLIB) @@ -659,11 +659,13 @@ message(STATUS "Using web user: ${ZM_WEB_USER}") message(STATUS "Using web group: ${ZM_WEB_GROUP}") # Check for polkit -find_package(Polkit) -if(NOT POLKIT_FOUND) - message(FATAL_ERROR - "Running ZoneMinder requires polkit. Building ZoneMinder requires the polkit development package.") -endif(NOT POLKIT_FOUND) +if (NOT APPLE) + find_package(Polkit) + if(NOT POLKIT_FOUND) + message(FATAL_ERROR + "Running ZoneMinder requires polkit. Building ZoneMinder requires the polkit development package.") + endif(NOT POLKIT_FOUND) +endif (NOT APPLE) # Some variables that zm expects set(ZM_PID "${ZM_RUNDIR}/zm.pid") diff --git a/README.md b/README.md index 42a570cc1..8af5c11f6 100644 --- a/README.md +++ b/README.md @@ -1,83 +1,43 @@ -ZoneMinder -========== +###OSX port notes -[![Build Status](https://travis-ci.org/ZoneMinder/ZoneMinder.png)](https://travis-ci.org/ZoneMinder/ZoneMinder) [![Bountysource](https://api.bountysource.com/badge/team?team_id=204&style=bounties_received)](https://www.bountysource.com/teams/zoneminder/issues?utm_source=ZoneMinder&utm_medium=shield&utm_campaign=bounties_received) +This is an initial port *attempt* OSX +It's just at a point where stuff compiles, and processes run from command line +That's pretty much it. No packaging modifications yet (and therefore no make install) and no idea if mapped memory works +No idea if it works together as a system either. -All documentation for ZoneMinder is now online at https://zoneminder.readthedocs.org +This may help folks who are interested in an OSX port. -## 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. +#### Toolchain +requirement - brew -## 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 +brew install cmake +brew install libjpeg +brew install mysql +brew install ssl -## Installation Methods +sudo perl -MCPAN -e 'install DBI' +sudo perl -MCPAN -e 'install DBD::mysql' +sudo perl -MCPAN -e 'install Sys::Mmap' +brew install pkg-config +brew install glib +brew install pcre++ +xcode-select --install -### Building from Source is Discouraged +#### Environment used to build -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. +Xcode Version 7.3.1 (7D1014) +gcc --version +Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 +Apple LLVM version 7.3.0 (clang-703.0.31) +Target: x86_64-apple-darwin15.4.0 +Thread model: posix +InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin -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. -### Install from a Package Repository +#### Build process +git submodule update --init --recursive +cmake -DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2a-1/include -This is the recommended method to install ZoneMinder onto your system. ZoneMinder packages are maintained for the following distros: - -- Ubuntu via [Iconnor's PPA](https://launchpad.net/~iconnor/+archive/ubuntu/zoneminder) -- Debian from their [default repository](https://packages.debian.org/search?searchon=names&keywords=zoneminder) -- RHEL/CentOS and clones via [zmrepo](http://zmrepo.zoneminder.com/) -- Fedora via [zmrepo](http://zmrepo.zoneminder.com/) -- OpenSuse via [third party repository](http://www.zoneminder.com/wiki/index.php/Installing_using_ZoneMinder_RPMs_for_SuSE) -- Maegia from their default repository - -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 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](https://zoneminder.readthedocs.org/en/stable/installationguide/index.html) for distro specific instructions. - -### Package Maintainers -Many of the ZoneMinder configration 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 cambolzola javascript file. However, by default cambozola support is turned off. To fix that, add this to the pacakging script: -```bash -./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 - -* Source hosted at [GitHub](https://github.com/ZoneMinder/ZoneMinder/) -* Report issues/questions/feature requests on [GitHub Issues](https://github.com/ZoneMinder/ZoneMinder/issues) - -Pull requests are very welcome! If you would like to contribute, please follow -the following steps. - -1. Fork the repo -2. Open an issue at our [GitHub Issues Tracker](https://github.com/ZoneMinder/ZoneMinder/issues). - Describe the bug that you've found, or the feature which you're asking for. - Jot down the issue number (e.g. 456) -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. - -[![Analytics](https://ga-beacon.appspot.com/UA-15147273-6/ZoneMinder/README.md)](https://github.com/igrigorik/ga-beacon) +#### Things to resolve +Polkit is commented in CMakeLists.txt diff --git a/src/zm.h b/src/zm.h index 0c780b244..4ef825f99 100644 --- a/src/zm.h +++ b/src/zm.h @@ -37,4 +37,13 @@ extern const char* self; +#ifdef __APPLE__ +#include +#include +#include +#include +#include +#include + +#endif #endif // ZM_H diff --git a/src/zm_logger.cpp b/src/zm_logger.cpp index 4d66deee2..7e803e21d 100644 --- a/src/zm_logger.cpp +++ b/src/zm_logger.cpp @@ -42,6 +42,24 @@ Logger *Logger::smInstance = 0; Logger::StringMap Logger::smCodes; Logger::IntMap Logger::smSyslogPriorities; +#ifdef __APPLE__ +// can't find basename on OSX though it seems to exist in libgen +// credit: http://www.math.unl.edu/~rdieter1/OpenStep/Developer/PortingTips/nscompatlib/basename.c +char * basename (const char *name) +{ + const char *base = name; + + while (*name) + { + if (*name++ == '/') + { + base = name; + } + } + return (char *) base; +} +#endif + #if 0 static void subtractTime( struct timeval * const tp1, struct timeval * const tp2 ) { diff --git a/src/zm_logger.h b/src/zm_logger.h index d30396056..5157ccc37 100644 --- a/src/zm_logger.h +++ b/src/zm_logger.h @@ -21,6 +21,7 @@ #define ZM_LOGGER_H #include "zm_config.h" +#include "zm.h" #include #include #include diff --git a/src/zm_sendfile.h b/src/zm_sendfile.h index 0e35388ea..5a134ce47 100644 --- a/src/zm_sendfile.h +++ b/src/zm_sendfile.h @@ -1,31 +1,51 @@ -#ifdef HAVE_SENDFILE4_SUPPORT +#if defined(HAVE_SENDFILE4_SUPPORT) + #include int zm_sendfile(int out_fd, int in_fd, off_t *offset, size_t size) { - int err; + int err; - err = sendfile(out_fd, in_fd, offset, size); - if (err < 0) - return -errno; + err = sendfile(out_fd, in_fd, offset, size); + if (err < 0) + return -errno; - return err; + return err; } #elif HAVE_SENDFILE7_SUPPORT #include #include #include int zm_sendfile(int out_fd, int in_fd, off_t *offset, off_t size) { - int err; - err = sendfile(in_fd, out_fd, *offset, size, NULL, &size, 0); - if (err && errno != EAGAIN) - return -errno; + int err; + err = sendfile(in_fd, out_fd, *offset, size, NULL, &size, 0); + if (err && errno != EAGAIN) + return -errno; - if (size) { - *offset += size; - return size; - } + if (size) { + *offset += size; + return size; + } - return -EAGAIN; + return -EAGAIN; } +#elif HAVE_SENDFILE6_SUPPORT +#include +#include +#include +int zm_sendfile(int out_fd, int in_fd, off_t *offset, off_t size) { + int err; + err = sendfile(in_fd, out_fd, *offset, &size, 0, 0); + if (err && errno != EAGAIN) + return -errno; + + if (size) { + *offset += size; + return size; + } + + return -EAGAIN; +} + + #else #error "Your platform does not support sendfile. Sorry." #endif diff --git a/src/zm_signal.cpp b/src/zm_signal.cpp index bbc40e916..97a29c848 100644 --- a/src/zm_signal.cpp +++ b/src/zm_signal.cpp @@ -65,12 +65,16 @@ RETSIGTYPE zm_die_handler(int signal) #if defined(__x86_64__) #ifdef __FreeBSD_kernel__ ip = (void *)(uc->uc_mcontext.mc_rip); + #elif __APPLE__ + ip = (void *)(uc->uc_mcontext->__ss.__rip); #else ip = (void *)(uc->uc_mcontext.gregs[REG_RIP]); #endif #else #ifdef __FreeBSD_kernel__ ip = (void *)(uc->uc_mcontext.mc_eip); + #elif __APPLE_ + ip = (void *)(uc->uc_mcontext->__ss.__rip); #else ip = (void *)(uc->uc_mcontext.gregs[REG_EIP]); #endif diff --git a/src/zm_thread.h b/src/zm_thread.h index 15c13bb17..93f5b2122 100644 --- a/src/zm_thread.h +++ b/src/zm_thread.h @@ -20,6 +20,40 @@ #ifndef ZM_THREAD_H #define ZM_THREAD_H +// missing phread_mutex_timedlock +//https://lists.freedesktop.org/archives/spice-devel/2010-September/001231.html +#ifdef __APPLE__ +#include +#include +#define min(a,b) (((a)<(b))?(a):(b)) +int pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct timespec +*abs_timeout) +{ + int pthread_rc; + struct timespec remaining, slept, ts; + + remaining = *abs_timeout; + while ((pthread_rc = pthread_mutex_trylock(mutex)) == EBUSY) { + ts.tv_sec = 0; + ts.tv_nsec = (remaining.tv_sec > 0 ? 10000000 : min(remaining.tv_nsec,10000000)); + nanosleep(&ts, &slept); + ts.tv_nsec -= slept.tv_nsec; + if (ts.tv_nsec <= remaining.tv_nsec) { + remaining.tv_nsec -= ts.tv_nsec; + } + else { + remaining.tv_sec--; + remaining.tv_nsec = (1000000 - (ts.tv_nsec - remaining.tv_nsec)); + } + if (remaining.tv_sec < 0 || (!remaining.tv_sec && remaining.tv_nsec <= 0)) { + return ETIMEDOUT; + } + } + + return pthread_rc; +} +#endif + #include #include #include diff --git a/src/zmc.cpp b/src/zmc.cpp index 42b6b7aff..6965d9d00 100644 --- a/src/zmc.cpp +++ b/src/zmc.cpp @@ -57,7 +57,7 @@ possible, this should run at more or less constant speed. #include #include -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined (__APPLE__) #include #else #include From 130b57e9e19a30451362a19ef112a1b7e4bfb728 Mon Sep 17 00:00:00 2001 From: pliablepixels Date: Mon, 16 May 2016 16:49:46 -0400 Subject: [PATCH 2/3] moved to macports, also added polkit --- CMakeLists.txt | 4 ++-- README.md | 21 +++++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e9e91bacb..367de8c02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -659,13 +659,13 @@ message(STATUS "Using web user: ${ZM_WEB_USER}") message(STATUS "Using web group: ${ZM_WEB_GROUP}") # Check for polkit -if (NOT APPLE) +#if (NOT APPLE) find_package(Polkit) if(NOT POLKIT_FOUND) message(FATAL_ERROR "Running ZoneMinder requires polkit. Building ZoneMinder requires the polkit development package.") endif(NOT POLKIT_FOUND) -endif (NOT APPLE) +#endif (NOT APPLE) # Some variables that zm expects set(ZM_PID "${ZM_RUNDIR}/zm.pid") diff --git a/README.md b/README.md index 8af5c11f6..a915c22a4 100644 --- a/README.md +++ b/README.md @@ -9,21 +9,23 @@ This may help folks who are interested in an OSX port. #### Toolchain -requirement - brew -brew install cmake -brew install libjpeg -brew install mysql -brew install ssl +requirement - macports (brew doesn't have polkit) +sudo port install cmake sudo perl -MCPAN -e 'install DBI' sudo perl -MCPAN -e 'install DBD::mysql' sudo perl -MCPAN -e 'install Sys::Mmap' -brew install pkg-config -brew install glib -brew install pcre++ + xcode-select --install +sudo perl -MCPAN -e 'install DBI' +sudo perl -MCPAN -e 'install DBD::mysql' +sudo perl -MCPAN -e 'install Sys::Mmap' +sudo perl -MCPAN -e 'install Date::Manip' +sudo perl -MCPAN -e 'install LWP::UserAgent' + + #### Environment used to build Xcode Version 7.3.1 (7D1014) @@ -37,7 +39,6 @@ InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault #### Build process git submodule update --init --recursive -cmake -DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2a-1/include +cmake . #### Things to resolve -Polkit is commented in CMakeLists.txt From ba801e93067f9f1a91494ba045d83a36a9c9591c Mon Sep 17 00:00:00 2001 From: pliablepixels Date: Mon, 16 May 2016 17:08:19 -0400 Subject: [PATCH 3/3] switched to macports completely --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a915c22a4..d29ec7528 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,16 @@ This may help folks who are interested in an OSX port. #### Toolchain +xcode-select --install + requirement - macports (brew doesn't have polkit) sudo port install cmake +sudo port install jpeg +sudo port install mysql5 sudo perl -MCPAN -e 'install DBI' sudo perl -MCPAN -e 'install DBD::mysql' sudo perl -MCPAN -e 'install Sys::Mmap' - -xcode-select --install - sudo perl -MCPAN -e 'install DBI' sudo perl -MCPAN -e 'install DBD::mysql' sudo perl -MCPAN -e 'install Sys::Mmap' @@ -38,7 +39,10 @@ InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault #### Build process + git submodule update --init --recursive cmake . #### Things to resolve +*) Haven't tried make install - don't want my mac to explode - need a VM +*) Apache linkage is TBD