From df76e657b707c1c4f3795b8bf9e8b22a8417c0e6 Mon Sep 17 00:00:00 2001 From: Fred Drake <fdrake@acm.org> Date: Thu, 11 Aug 2005 17:55:28 +0000 Subject: [PATCH] Move to a zpkg-based setup: - References to headers now involve the package names. - The zpkg support files have been moved to the top-level directory, and the releases/ tree has been removed. The resource map and configuration file have been combined now that zpkg allows that. - The scripts are now all located in src/scripts/ in a checkout. - Scripts that were imported in the tests have been split into library and script components; the library portions share name of the script (in order to reduce changes). The library portions may not be used as scripts directly. --- .../DEPENDENCIES.cfg => DEPENDENCIES.cfg | 1 + PACKAGE.cfg | 17 + .../ZODB3/PUBLICATION.cfg => PUBLICATION.cfg | 0 SETUP.cfg | 1 + releases/ZODB3/PACKAGE.cfg | 28 -- releases/ZODB3/SETUP.cfg | 13 - releases/ZODB3/zodb3.map | 28 -- setup.py | 291 ++---------------- src/BTrees/BTreeModuleTemplate.c | 2 +- src/ZEO/runzeo.py | 4 - src/ZEO/zeopasswd.py | 4 - src/scripts/SETUP.cfg | 1 + src/{ZEO => scripts}/mkzeoinst.py | 0 src/scripts/runzeo.py | 18 ++ src/{ZEO => scripts}/simul.py | 0 src/{ZEO => scripts}/stats.py | 0 src/{ZEO => scripts}/zeoctl.py | 0 src/scripts/zeopasswd.py | 20 ++ zpkg.conf | 38 +++ 19 files changed, 127 insertions(+), 339 deletions(-) rename releases/ZODB3/DEPENDENCIES.cfg => DEPENDENCIES.cfg (79%) create mode 100644 PACKAGE.cfg rename releases/ZODB3/PUBLICATION.cfg => PUBLICATION.cfg (100%) create mode 100644 SETUP.cfg delete mode 100644 releases/ZODB3/PACKAGE.cfg delete mode 100644 releases/ZODB3/SETUP.cfg delete mode 100644 releases/ZODB3/zodb3.map create mode 100644 src/scripts/SETUP.cfg rename src/{ZEO => scripts}/mkzeoinst.py (100%) create mode 100755 src/scripts/runzeo.py rename src/{ZEO => scripts}/simul.py (100%) mode change 100644 => 100755 rename src/{ZEO => scripts}/stats.py (100%) rename src/{ZEO => scripts}/zeoctl.py (100%) mode change 100644 => 100755 create mode 100755 src/scripts/zeopasswd.py create mode 100644 zpkg.conf diff --git a/releases/ZODB3/DEPENDENCIES.cfg b/DEPENDENCIES.cfg similarity index 79% rename from releases/ZODB3/DEPENDENCIES.cfg rename to DEPENDENCIES.cfg index 12a6b1bc..d89b6538 100644 --- a/releases/ZODB3/DEPENDENCIES.cfg +++ b/DEPENDENCIES.cfg @@ -1,5 +1,6 @@ ZEO ZODB +ZODB-Scripts # Needed because...? Persistence ZopeUndo diff --git a/PACKAGE.cfg b/PACKAGE.cfg new file mode 100644 index 00000000..2e78cf11 --- /dev/null +++ b/PACKAGE.cfg @@ -0,0 +1,17 @@ +<distribution> + doc + log.ini + test.py + COPYRIGHT.txt + LICENSE.txt + NEWS.txt + README.txt +</distribution> + +<collection> + doc - + setup.py - + src - + zpkg.conf - + zpkgsetup - +</collection> diff --git a/releases/ZODB3/PUBLICATION.cfg b/PUBLICATION.cfg similarity index 100% rename from releases/ZODB3/PUBLICATION.cfg rename to PUBLICATION.cfg diff --git a/SETUP.cfg b/SETUP.cfg new file mode 100644 index 00000000..3f7ec92a --- /dev/null +++ b/SETUP.cfg @@ -0,0 +1 @@ +# unfortunate turd diff --git a/releases/ZODB3/PACKAGE.cfg b/releases/ZODB3/PACKAGE.cfg deleted file mode 100644 index fbcd856d..00000000 --- a/releases/ZODB3/PACKAGE.cfg +++ /dev/null @@ -1,28 +0,0 @@ -<load> - doc svn://svn.zope.org/repos/main/ZODB/tags/*/doc/ - scripts svn://svn.zope.org/repos/main/ZODB/tags/*/src/scripts/ - scripts/runzeo.py svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO/runzeo.py - scripts/zeoctl.py svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO/zeoctl.py - scripts/zeopasswd.py svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO/zeopasswd.py - scripts/mkzeoinst.py svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO/mkzeoinst.py - log.ini svn://svn.zope.org/repos/main/ZODB/tags/*/log.ini - test.py svn://svn.zope.org/repos/main/ZODB/tags/*/test.py - COPYRIGHT.txt svn://svn.zope.org/repos/main/ZODB/tags/*/COPYRIGHT.txt - LICENSE.txt svn://svn.zope.org/repos/main/ZODB/tags/*/LICENSE.txt - NEWS.txt svn://svn.zope.org/repos/main/ZODB/tags/*/NEWS.txt - README.txt svn://svn.zope.org/repos/main/ZODB/tags/*/README.txt -</load> - -<distribution> - doc - log.ini - test.py - COPYRIGHT.txt - LICENSE.txt - NEWS.txt - README.txt -</distribution> - -<collection> - doc - -</collection> diff --git a/releases/ZODB3/SETUP.cfg b/releases/ZODB3/SETUP.cfg deleted file mode 100644 index 47b68e23..00000000 --- a/releases/ZODB3/SETUP.cfg +++ /dev/null @@ -1,13 +0,0 @@ -script scripts/fsdump.py -script scripts/fsoids.py -script scripts/fsrefs.py -script scripts/fstail.py -script scripts/fstest.py -script scripts/repozo.py -script scripts/zeopack.py - -# scripts from ZEO package -script scripts/runzeo.py -script scripts/zeoctl.py -script scripts/zeopasswd.py -script scripts/mkzeoinst.py diff --git a/releases/ZODB3/zodb3.map b/releases/ZODB3/zodb3.map deleted file mode 100644 index 7febab3c..00000000 --- a/releases/ZODB3/zodb3.map +++ /dev/null @@ -1,28 +0,0 @@ -# These packages are used to provide the standalone ZODB distribution. - -# This is the ZODB3 release package: -# -ZODB3 svn://svn.zope.org/repos/main/ZODB/tags/*/releases/ZODB3 - -# This group is maintained as part of the ZODB project: -# -BTrees svn://svn.zope.org/repos/main/ZODB/tags/*/src/BTrees -Persistence svn://svn.zope.org/repos/main/ZODB/tags/*/src/Persistence -persistent svn://svn.zope.org/repos/main/ZODB/tags/*/src/persistent -transaction svn://svn.zope.org/repos/main/ZODB/tags/*/src/transaction -ThreadedAsync svn://svn.zope.org/repos/main/ZODB/tags/*/src/ThreadedAsync -ZEO svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZEO -ZODB svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZODB -ZopeUndo svn://svn.zope.org/repos/main/ZODB/tags/*/src/ZopeUndo -zope svn://svn.zope.org/repos/main/ZODB/tags/*/src/zope - -# These are copied in from the Zope3 project; they are needed for ZODB -# 3.4 and newer: -# -zope.interface svn://svn.zope.org/repos/main/Zope3/tags/ZopeX3-3.0.0-Zope-2.8-a4/src/zope/interface -zope.testing svn://svn.zope.org/repos/main/zope.testing/trunk/src/zope/testing - -# The ZConfig and zdaemon projects: - -ZConfig svn://svn.zope.org/repos/main/ZConfig/tags/ZConfig-2.3 -zdaemon svn://svn.zope.org/repos/main/zdaemon/tags/zdaemon-1.1 \ No newline at end of file diff --git a/setup.py b/setup.py index 2fba67bb..24b4a191 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ +#!/usr/bin/env python ############################################################################## # -# Copyright (c) 2002, 2003 Zope Corporation and Contributors. +# Copyright (c) 2005 Zope Corporation and Contributors. # All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, @@ -11,274 +12,42 @@ # FOR A PARTICULAR PURPOSE. # ############################################################################## -"""Zope Object Database: object database and persistence -The Zope Object Database provides an object-oriented database for -Python that provides a high-degree of transparency. Applications can -take advantage of object database features with few, if any, changes -to application logic. ZODB includes features such as a plugable storage -interface, rich transaction support, and undo. -""" - -# The (non-obvious!) choices for the Trove Development Status line: -# Development Status :: 5 - Production/Stable -# Development Status :: 4 - Beta -# Development Status :: 3 - Alpha - -classifiers = """\ -Development Status :: 3 - Alpha -Intended Audience :: Developers -License :: OSI Approved :: Zope Public License -Programming Language :: Python -Topic :: Database -Topic :: Software Development :: Libraries :: Python Modules -Operating System :: Microsoft :: Windows -Operating System :: Unix -""" - -import glob import os +import posixpath import sys -from distutils.core import setup -from distutils.extension import Extension -from distutils import dir_util -from distutils.core import setup -from distutils.dist import Distribution -from distutils.command.install_lib import install_lib -from distutils.command.build_py import build_py -from distutils.util import convert_path - -if sys.version_info < (2, 3, 4): - print "ZODB 3.3 requires Python 2.3.4 or higher" - sys.exit(0) - -# Include directories for C extensions -include = ['src/persistent'] - -# Set up dependencies for the BTrees package -base_btrees_depends = [ - "src/BTrees/BTreeItemsTemplate.c", - "src/BTrees/BTreeModuleTemplate.c", - "src/BTrees/BTreeTemplate.c", - "src/BTrees/BucketTemplate.c", - "src/BTrees/MergeTemplate.c", - "src/BTrees/SetOpTemplate.c", - "src/BTrees/SetTemplate.c", - "src/BTrees/TreeSetTemplate.c", - "src/BTrees/sorters.c", - "src/persistent/cPersistence.h", - ] - -_flavors = {"O": "object", "I": "int", "F": "float"} - -KEY_H = "src/BTrees/%skeymacros.h" -VALUE_H = "src/BTrees/%svaluemacros.h" - -def BTreeExtension(flavor): - key = flavor[0] - value = flavor[1] - name = "BTrees._%sBTree" % flavor - sources = ["src/BTrees/_%sBTree.c" % flavor] - kwargs = {"include_dirs": include} - if flavor != "fs": - kwargs["depends"] = (base_btrees_depends + [KEY_H % _flavors[key], - VALUE_H % _flavors[value]]) - if key != "O": - kwargs["define_macros"] = [('EXCLUDE_INTSET_SUPPORT', None)] - return Extension(name, sources, **kwargs) - -exts = [BTreeExtension(flavor) - for flavor in ("OO", "IO", "OI", "II", "IF", "fs")] - -cPersistence = Extension(name = 'persistent.cPersistence', - include_dirs = include, - sources= ['src/persistent/cPersistence.c', - 'src/persistent/ring.c'], - depends = ['src/persistent/cPersistence.h', - 'src/persistent/ring.h', - 'src/persistent/ring.c'] - ) - -cPickleCache = Extension(name = 'persistent.cPickleCache', - include_dirs = include, - sources= ['src/persistent/cPickleCache.c', - 'src/persistent/ring.c'], - depends = ['src/persistent/cPersistence.h', - 'src/persistent/ring.h', - 'src/persistent/ring.c'] - ) - -TimeStamp = Extension(name = 'persistent.TimeStamp', - include_dirs = include, - sources= ['src/persistent/TimeStamp.c'] - ) - -##coptimizations = Extension(name = 'ZODB.coptimizations', -## include_dirs = include, -## sources= ['src/ZODB/coptimizations.c'] -## ) - -winlock = Extension(name = 'ZODB.winlock', - include_dirs = include, - sources = ['src/ZODB/winlock.c'] - ) - -cZopeInterface = Extension( - name = 'zope.interface._zope_interface_coptimizations', - sources= ['src/zope/interface/_zope_interface_coptimizations.c'] - ) - -cZopeProxy = Extension( - name = 'zope.proxy._zope_proxy_proxy', - sources= ['src/zope/proxy/_zope_proxy_proxy.c'] - ) - -exts += [cPersistence, - cPickleCache, - TimeStamp, - winlock, - cZopeInterface, - cZopeProxy, - ] - -# The ZODB.zodb4 code is not being packaged, because it is only -# need to convert early versions of Zope3 databases to ZODB3. - -packages = ["BTrees", "BTrees.tests", - "ZEO", "ZEO.auth", "ZEO.zrpc", "ZEO.tests", - "ZODB", "ZODB.FileStorage", "ZODB.tests", - "Persistence", "Persistence.tests", - "persistent", "persistent.tests", - "transaction", "transaction.tests", - "ThreadedAsync", - "zdaemon", "zdaemon.tests", - - "zope", - "zope.interface", "zope.interface.tests", - "zope.interface.common", "zope.interface.common.tests", - "zope.proxy", "zope.proxy.tests", - "zope.testing", - - "ZopeUndo", "ZopeUndo.tests", - "ZConfig", "ZConfig.tests", - "ZConfig.components", - "ZConfig.components.basic", "ZConfig.components.basic.tests", - "ZConfig.components.logger", "ZConfig.components.logger.tests", - "ZConfig.tests.library", "ZConfig.tests.library.widget", - "ZConfig.tests.library.thing", - ] - -scripts = ["src/scripts/fsdump.py", - "src/scripts/fsoids.py", - "src/scripts/fsrefs.py", - "src/scripts/fstail.py", - "src/scripts/fstest.py", - "src/scripts/repozo.py", - "src/scripts/zeopack.py", - "src/ZConfig/scripts/zconfig", - "src/ZEO/runzeo.py", - "src/ZEO/zeopasswd.py", - "src/ZEO/mkzeoinst.py", - "src/ZEO/zeoctl.py", - "src/zdaemon/zdrun.py", - "src/zdaemon/zdctl.py", - ] - -def copy_other_files(cmd, outputbase): - # A delicate dance to copy files with certain extensions - # into a package just like .py files. - extensions = ["*.conf", "*.xml", "*.txt", "*.sh"] - directories = [ - "transaction", - "persistent/tests", - "ZConfig/components/basic", - "ZConfig/components/logger", - "ZConfig/tests/input", - "ZConfig/tests/library", - "ZConfig/tests/library/thing", - "ZConfig/tests/library/thing/extras", - "ZConfig/tests/library/widget", - "ZEO", - "ZODB", - "ZODB/tests", - "zdaemon", - "zdaemon/tests", - "zope/interface", "zope/interface/tests", - "zope/testing", - ] - # zope.testing's testrunner-ex is not a package, but contains - # packages, in a fairly elaborate subtree. Major special-casing - # for this. First find all the (non-SVN) directories starting - # there, and append them all to `directories`. - for root, dirs, files in os.walk("src/zope/testing/testrunner-ex"): - dirs[:] = [d for d in dirs if ".svn" not in d] - assert root.startswith("src/") - normpath = root[4:].replace("\\", "/") - directories.append(normpath) - for dir in directories: - exts = extensions - if dir.startswith("zope/testing/testrunner-ex"): - # testrunner-ex isn't a package, so not even the .py files - # get copied unless we force that there. - exts = extensions + ["*.py"] - dir = convert_path(dir) - inputdir = os.path.join("src", dir) - outputdir = os.path.join(outputbase, dir) - if not os.path.exists(outputdir): - dir_util.mkpath(outputdir) - for pattern in exts: - for fn in glob.glob(os.path.join(inputdir, pattern)): - # glob is going to give us a path including "src", - # which must be stripped to get the destination dir - dest = os.path.join(outputbase, fn[4:]) - cmd.copy_file(fn, dest) -class MyLibInstaller(install_lib): - """Custom library installer, used to put hosttab in the right place.""" +import zpkgsetup.setup - # We use the install_lib command since we need to put hosttab - # inside the library directory. This is where we already have the - # real information about where to install it after the library - # location has been set by any relevant distutils command line - # options. - def run(self): - install_lib.run(self) - copy_other_files(self, self.install_dir) +here = os.path.dirname(os.path.abspath(__file__)) -class MyPyBuilder(build_py): - def build_packages(self): - build_py.build_packages(self) - copy_other_files(self, self.build_lib) +def join(*parts): + local_full_path = os.path.join(here, *parts) + relative_path = posixpath.join(*parts) + return local_full_path, relative_path -class MyDistribution(Distribution): - # To control the selection of MyLibInstaller and MyPyBuilder, we - # have to set it into the cmdclass instance variable, set in - # Distribution.__init__(). - def __init__(self, *attrs): - Distribution.__init__(self, *attrs) - self.cmdclass['build_py'] = MyPyBuilder - self.cmdclass['install_lib'] = MyLibInstaller +context = zpkgsetup.setup.SetupContext( + "ZODB3", "3.5.0a42", __file__) -doclines = __doc__.split("\n") +context.load_metadata( + os.path.join(here, "releases", "ZODB3", "PUBLICATION.cfg")) -setup(name="ZODB3", - version="3.5.0a6", - maintainer="Zope Corporation", - maintainer_email="zodb-dev@zope.org", - url = "http://www.zope.org/Wikis/ZODB", - download_url = "http://www.zope.org/Products/ZODB3.5", - packages = packages, - package_dir = {'': 'src'}, - ext_modules = exts, - headers = ['src/persistent/cPersistence.h', - 'src/persistent/ring.h'], - license = "ZPL 2.1", - platforms = ["any"], - description = doclines[0], - classifiers = filter(None, classifiers.split("\n")), - long_description = "\n".join(doclines[2:]), - distclass = MyDistribution, - scripts = scripts, - ) +context.scan("ZODB3", *join("releases", "ZODB3")) +context.scan("BTrees", *join("src", "BTrees")) +context.scan("Persistence", *join("src", "Persistence")) +context.scan("persistent", *join("src", "persistent")) +context.scan("ThreadedAsync", *join("src", "ThreadedAsync")) +context.scan("transaction", *join("src", "transaction")) +context.scan("ZConfig", *join("src", "ZConfig")) +context.scan("zdaemon", *join("src", "zdaemon")) +context.scan("ZEO", *join("src", "ZEO")) +context.scan("ZODB", *join("src", "ZODB")) +context.scan("ZODB-Scripts", *join("src", "scripts")) +context.scan("zope", *join("src", "zope")) +context.scan("zope.interface", *join("src", "zope", "interface")) +context.scan("zope.proxy", *join("src", "zope", "proxy")) +context.scan("zope.testing", *join("src", "zope", "testing")) +context.scan("ZopeUndo", *join("src", "ZopeUndo")) +context.setup() diff --git a/src/BTrees/BTreeModuleTemplate.c b/src/BTrees/BTreeModuleTemplate.c index 8238cec8..998d0378 100644 --- a/src/BTrees/BTreeModuleTemplate.c +++ b/src/BTrees/BTreeModuleTemplate.c @@ -17,7 +17,7 @@ #include "structmember.h" #ifdef PERSISTENT -#include "cPersistence.h" +#include "persistent/cPersistence.h" #else #define PER_USE_OR_RETURN(self, NULL) #define PER_ALLOW_DEACTIVATION(self) diff --git a/src/ZEO/runzeo.py b/src/ZEO/runzeo.py index a00b2ffd..960ae673 100644 --- a/src/ZEO/runzeo.py +++ b/src/ZEO/runzeo.py @@ -1,4 +1,3 @@ -#!python ############################################################################## # # Copyright (c) 2001, 2002, 2003 Zope Corporation and Contributors. @@ -352,6 +351,3 @@ def main(args=None): options.realize(args) s = ZEOServer(options) s.main() - -if __name__ == "__main__": - main() diff --git a/src/ZEO/zeopasswd.py b/src/ZEO/zeopasswd.py index e45c220d..0dac0a52 100644 --- a/src/ZEO/zeopasswd.py +++ b/src/ZEO/zeopasswd.py @@ -1,4 +1,3 @@ -#!python ############################################################################## # # Copyright (c) 2003 Zope Corporation and Contributors. @@ -124,6 +123,3 @@ def main(args=None, dbclass=None): password = getpass.getpass("Enter password: ") db.add_user(username, password) db.save() - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/src/scripts/SETUP.cfg b/src/scripts/SETUP.cfg new file mode 100644 index 00000000..985d9b88 --- /dev/null +++ b/src/scripts/SETUP.cfg @@ -0,0 +1 @@ +script *.py diff --git a/src/ZEO/mkzeoinst.py b/src/scripts/mkzeoinst.py similarity index 100% rename from src/ZEO/mkzeoinst.py rename to src/scripts/mkzeoinst.py diff --git a/src/scripts/runzeo.py b/src/scripts/runzeo.py new file mode 100755 index 00000000..b4220f71 --- /dev/null +++ b/src/scripts/runzeo.py @@ -0,0 +1,18 @@ +#!python +############################################################################## +# +# Copyright (c) 2003 Zope Corporation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## + +from ZEO.runzeo import main + +main() diff --git a/src/ZEO/simul.py b/src/scripts/simul.py old mode 100644 new mode 100755 similarity index 100% rename from src/ZEO/simul.py rename to src/scripts/simul.py diff --git a/src/ZEO/stats.py b/src/scripts/stats.py similarity index 100% rename from src/ZEO/stats.py rename to src/scripts/stats.py diff --git a/src/ZEO/zeoctl.py b/src/scripts/zeoctl.py old mode 100644 new mode 100755 similarity index 100% rename from src/ZEO/zeoctl.py rename to src/scripts/zeoctl.py diff --git a/src/scripts/zeopasswd.py b/src/scripts/zeopasswd.py new file mode 100755 index 00000000..23d8fcb4 --- /dev/null +++ b/src/scripts/zeopasswd.py @@ -0,0 +1,20 @@ +#!python +############################################################################## +# +# Copyright (c) 2003 Zope Corporation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## + +import sys + +from ZEO.zeopasswd import main + +main(sys.argv[1:]) diff --git a/zpkg.conf b/zpkg.conf new file mode 100644 index 00000000..2ec1879a --- /dev/null +++ b/zpkg.conf @@ -0,0 +1,38 @@ +# zpkg config file +# +# To getnerate a ZODB release, use: +# + +build-application no +collect-dependencies yes + +<resources> + # This is the ZODB3 release package: + # + ZODB3 . + + # This group is maintained as part of the ZODB project: + # + BTrees src/BTrees + Persistence src/Persistence + persistent src/persistent + transaction src/transaction + ThreadedAsync src/ThreadedAsync + ZEO src/ZEO + ZODB src/ZODB + ZODB-Scripts src/scripts + ZopeUndo src/ZopeUndo + + # These are copied in from the Zope3 project; they are needed for ZODB + # 3.4 and newer: + # + zope src/zope + zope.interface src/zope/interface + zope.proxy src/zope/proxy + zope.testing src/zope/testing + + # These are copied in from the ZConfig and zdaemon projects: + # + ZConfig src/ZConfig + zdaemon src/zdaemon +</resources> -- 2.30.9