{ "info": { "author": "Nexedi", "author_email": "info@nexedi.com", "bugtrack_url": null, "classifiers": [ "Framework :: Buildout", "Framework :: Buildout :: Recipe", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "********************************************\nRecipe for compiling and installing software\n********************************************\n\n.. contents::\n\nThe recipe provides the means to compile and install source distributions\nusing ``configure`` and ``make`` and other similar tools. It is inspired by\nthe hexagonit.recipe.cmmi_ recipe but provides more control over the build process.\n\nUse python 2.7 to run test, at least python 2.6 results in some\nfailures in the tests.py:\n\n TypeError: failUnlessRaises() takes at least 3 arguments (2 given)\n\nFirst, we make test environments:\n\n::\n\n cd slapos.recipe.cmmi\n wget http://downloads.buildout.org/2/bootstrap.py\n wget http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py\n\n cat < buildout.cfg\n [buildout]\n develop = .\n parts = test\n prefix = /tmp/test\n\n [test]\n recipe = zc.recipe.testrunner\n eggs =\n slapos.recipe.cmmi[test]\n EOF\n\n python -S bootstrap.py --version 1.7.0\n bin/buildout\n\nIt will generate script bin/test, run it to do all the testcases:\n\n::\n\n bin/test\n\nAfter source changed, run buildout to update eggs again:\n\n::\n\n bin/buildout -v -N\n bin/test\n\nBuild dist/slapos.recipe.cmmi-0.2-py2.7.egg\n\n::\n\n bin/buildout setup setup.py bdist_egg\n\nBuild source package dist/slapos.recipe.cmmi-0.2.tar.gz\n\n::\n\n python setup.py sdist\n\nRepository: http://git.erp5.org/gitweb/slapos.recipe.cmmi.git\n\nClone URL: git clone http://git.erp5.org/repos/slapos.recipe.cmmi.git\n\nIssue tracker: None\n\nSupported Python versions: 2.6, 2.7, 3.2, 3.3\n\nSupported zc.buildout versions: 1.x, 2.x\n\nTravis build: |travis|\n\n.. |travis| image:: https://api.travis-ci.org/hexagonit/hexagonit.recipe.cmmi.png\n\n.. _hexagonit.recipe.cmmi : http://pypi.python.org/pypi/hexagonit.recipe.cmmi\n\nChanges\n=======\n\n0.11 (2019-10-02)\n-----------------\n\n* Support multiple directories for shared parts. This now uses\n ``${buildout:shared-part-list}`` as list of directories to use.\n\n\n0.10 (2018-11-30)\n-----------------\n\n* Make sure FDs are closed before spawning subprocesses.\n\n0.9 (2018-10-29)\n----------------\n\n* More Py3 fixes.\n\n0.8 (2018-08-27)\n----------------\n\n* Add shared feature.\n\n0.7 (2017-06-06)\n----------------\n\n* Fix MANIFEST.in: some files were missing.\n\n0.6 (2017-06-05)\n----------------\n\n* Add support for Python 3.\n* Optimize wrapper to scripts with long shebangs.\n\n0.5 (2017-04-07)\n----------------\n\n* Create a wrapper shell script for very long shebang scripts.\n\n0.4 (2017-03-08)\n----------------\n\n* Use slapos.recipe.build:downloadunpacked instead of hexagonit.recipe.download.\n\n0.1.1 (2013-04-12)\n------------------\n\n* Fix the wrong name 'path_filename'\n\n0.1 (2013-04-12)\n----------------\n\n* Initial release, forking from hexagonit.recipe.cmmi (https://github.com/hexagonit/hexagonit.recipe.cmmi)\n\nSupported options\n=================\n\n``url``\n\n URL to the package that will be downloaded and extracted. The\n supported package formats are .tar.gz, .tar.bz2, and .zip. The\n value must be a full URL,\n e.g. http://python.org/ftp/python/2.4.4/Python-2.4.4.tgz. The\n ``path`` option can not be used at the same time with ``url``.\n\n``path``\n\n Path to a local directory containing the source code to be built\n and installed. The directory must contain the ``configure``\n script. The ``url`` option can not be used at the same time with\n ``path``.\n\n``prefix``\n\n Custom installation prefix passed to the ``--prefix`` option of the\n ``configure`` script. Defaults to the location of the part. Note that this\n is a convenience shortcut which assumes that the default ``configure``\n command is used to configure the package. If the ``configure-command``\n option is used to define a custom configure command no automatic\n ``--prefix`` injection takes place. You can also set the ``--prefix``\n parameter explicitly in ``configure-options``.\n\n``shared``\n\n Specify the path in which this package is shared by many other\n packages.\n ``shared-part-list`` should be defined in ``[buildout]`` section\n Shared option is True or False\n The package will be installed on path/name/hash of options.\n\n``md5sum``\n\n MD5 checksum for the package file. If available the MD5\n checksum of the downloaded package will be compared to this value\n and if the values do not match the execution of the recipe will\n fail.\n\n``make-binary``\n\n Path to the ``make`` program. Defaults to 'make' which\n should work on any system that has the ``make`` program available\n in the system ``PATH``.\n\n``make-options``\n\n Extra ``KEY=VALUE`` options included in the invocation of the ``make``\n program. Multiple options can be given on separate lines to increase\n readability.\n\n``make-targets``\n\n Targets for the ``make`` command. Defaults to 'install'\n which will be enough to install most software packages. You only\n need to use this if you want to build alternate targets. Each\n target must be given on a separate line.\n\n``configure-command``\n\n Name of the configure command that will be run to generate the Makefile.\n This defaults to ``./configure`` which is fine for packages that come with\n a configure script. You may wish to change this when compiling packages\n with a different set up. See the ``Compiling a Perl package`` section for\n an example.\n\n``configure-options``\n\n Extra options to be given to the ``configure`` script. By default\n only the ``--prefix`` option is passed which is set to the part\n directory. Each option must be given on a separate line.\n\n``patch-binary``\n\n Path to the ``patch`` program. Defaults to 'patch' which should\n work on any system that has the ``patch`` program available in the\n system ``PATH``.\n\n``patch-options``\n\n Options passed to the ``patch`` program. Defaults to ``-p0``.\n\n``patches``\n\n List of patch files to the applied to the extracted source. Each\n file should be given on a separate line.\n\n.. _Python hook scripts:\n\n``pre-configure-hook``\n\n Custom python script that will be executed before running the\n ``configure`` script. The format of the options is::\n\n /path/to/the/module.py:name_of_callable\n url:name_of_callable\n url#md5sum:name_of_callable\n\n where the first part is a filesystem path or url to the python\n module and the second part is the name of the callable in the\n module that will be called. The callable will be passed three\n parameters in the following order:\n\n 1. The ``options`` dictionary from the recipe.\n\n 2. The global ``buildout`` dictionary.\n\n 3. A dictionary containing the current ``os.environ`` augmented with\n the part specific overrides.\n\n The callable is not expected to return anything.\n\n .. note:: The ``os.environ`` is not modified so if the hook script is\n interested in the environment variable overrides defined for the\n part it needs to read them from the dictionary that is passed in\n as the third parameter instead of accessing ``os.environ``\n directly.\n\n``pre-make-hook``\n\n Custom python script that will be executed before running\n ``make``. The format and semantics are the same as with the\n ``pre-configure-hook`` option.\n\n``post-make-hook``\n\n Custom python script that will be executed after running\n ``make``. The format and semantics are the same as with the\n ``pre-configure-hook`` option.\n\n.. hook shell command:\n\n``pre-configure``\n\n Shell command that will be executed before running ``configure``\n script. It takes the same effect as ``pre-configure-hook`` option\n except it's shell command.\n\n``pre-build``\n\n Shell command that will be executed before running ``make``. It\n takes the same effect as ``pre-make-hook`` option except it's\n shell command.\n\n``pre-install``\n\n Shell command that will be executed before running ``make``\n install.\n\n``post-install``\n\n Shell command that will be executed after running ``make``. It\n takes the same effect as ``post-make-hook`` option except it's\n shell command.\n\n``keep-compile-dir``\n\n Switch to optionally keep the temporary directory where the\n package was compiled. This is mostly useful for other recipes that\n use this recipe to compile a software but wish to do some\n additional steps not handled by this recipe. The location of the\n compile directory is stored in ``options['compile-directory']``.\n Accepted values are ``true`` or ``false``, defaults to ``false``.\n\n``promises``\n\n List the pathes and files should be existed after install part. The\n file or path must be absolute path. One line one item\n\n If any item doesn't exist, the recipe shows a warning message. The\n default value is empty.\n\n``dependencies``\n\n List all the depended parts:\n\n dependencies = part1 part2 ...\n\n All the dependent parts will be installed before this part, besides\n the changes in any dependent parts will trigger to reinstall\n current part.\n\n``environment-section``\n\n Name of a section that provides environment variables that will be used to\n augment the variables read from ``os.environ`` before executing the\n recipe.\n\n This recipe does not modify ``os.environ`` directly. External commands\n run as part of the recipe (e.g. make, configure, etc.) get an augmented\n environment when they are forked. Python hook scripts are passed the\n augmented as a parameter.\n\n The values of the environment variables may contain references to other\n existing environment variables (including themselves) in the form of\n Python string interpolation variables using the dictionary notation. These\n references will be expanded using values from ``os.environ``. This can be\n used, for example, to append to the ``PATH`` variable, e.g.::\n\n [component]\n recipe = slapos.recipe.cmmi\n environment-section =\n environment\n\n [environment]\n PATH = %(PATH)s:${buildout:directory}/bin\n\n``environment``\n\n A sequence of ``KEY=VALUE`` pairs separated by newlines that define\n additional environment variables used to update ``os.environ`` before\n executing the recipe.\n\n The semantics of this option are the same as ``environment-section``. If\n both ``environment-section`` and ``environment`` are provided the values from\n the former will be overridden by the latter allowing per-part customization.\n\nThe recipe uses separated part to support custom options in different\nplatforms. These platform's part has a pattern \"part:platform\" or\n\"part:platform:arch\".\n\narch could be 'x86', 'amd64', 'ia64' ... which equals\nplatform.machine().\n\nplatform could be 'linux', 'cygwin', 'macos', 'sunos', 'freebsd',\n'netbsd', 'unixware' ... which equals a formatted sys.platform.\n\nFor example::\n\n [bzip2]\n recipe = slapos.recipe.cmmi\n\n [bzip2:cygwin]\n patches = cygwin-bzip2-1.0.6.src.patch\n\nAll the options in the [part:platform] have high priority level.\n\nThe recipe first searches the exact match, if no found. Ignore arch\nand search again, if still found nothing. Use no platform part.\n\nAdditionally, the recipe honors the ``download-cache`` option set\nin the ``[buildout]`` section and stores the downloaded files under\nit. If the value is not set a directory called ``downloads`` will be\ncreated in the root of the buildout and the ``download-cache``\noption set accordingly.\n\nThe recipe will first check if there is a local copy of the package\nbefore downloading it from the net. Files can be shared among\ndifferent buildouts by setting the ``download-cache`` to the same\nlocation.\n\nThe recipe honors the ``prefix`` option set in the ``[buildout]``\nsection either. It implicts all the parts which recipe is\nslapos.recipe.cmmi in this buildout process will be installed in the\nsame ``prefix`` option in the ``[buildout]``. Besides, once it takes\neffects, recipe will return all the installed files in the prefix\ndirectory. The own ``prefix`` of part will disable this behaviour.\n\nIf the ``buildout`` section has a valid ``prefix`` option, the recipe\nwill add it to environmet variables as the following::\n\n PATH=${buildout:prefix}/bin:$PATH\n CPPFLAGS=-I${buildout:prefix} $CPPFLAGS\n CFLAGS=-I${buildout:prefix} $CFFLAGS\n CXXFLAGS=-I${buildout:prefix} $CXXFLAGS\n LDFLAGS=-L${buildout:prefix}/lib\n\n\nExample usage\n=============\n\nWe'll use a simple tarball to demonstrate the recipe.\n\n >>> import os.path\n >>> src = join(os.path.dirname(__file__), 'testdata')\n >>> ls(src)\n - Foo-Bar-0.0.0.tar.gz\n - haproxy-1.4.8-dummy.tar.gz\n - package-0.0.0.tar.gz\n\nThe package contains a dummy ``configure`` script that will simply\necho the options it was called with and create a ``Makefile`` that\nwill do the same.\n\nLet's create a buildout to build and install the package.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = true\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... \"\"\" % src)\n\nThis will download, extract and build our demo package with the\ndefault build options.\n\n >>> print(system(buildout)) #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE\n Installing package.\n configure --prefix=/sample_buildout/parts/package\n building package\n installing package\n \n\nCheck option \"promises\"\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = packagex\n ...\n ... [packagex]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... promises = /usr/bin/myfoo\n ... \"\"\" % src)\n\nThis will download, extract and build our demo package with the\ndefault build options.\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing packagex.\n configure --prefix=/sample_buildout/parts/packagex\n building package\n installing package\n packagex: could not find promise \"/usr/bin/myfoo\"\n \n\nAs we can see the configure script was called with the ``--prefix``\noption by default followed by calls to ``make`` and ``make install``.\n\nInstalling a Perl package\n=========================\n\nThe recipe can be used to install packages that use a slightly different build\nprocess. Perl packages often come with a ``Makefile.PL`` script that performs\nthe same task as a ``configure`` script and generates a ``Makefile``.\n\nWe can build and install such a package by overriding the ``configure-command``\noption. The following example builds a Foo::Bar perl module and installs it in\na custom location within the buildout::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = foobar\n ... perl_lib = ${buildout:directory}/perl_lib\n ...\n ... [foobar]\n ... recipe = slapos.recipe.cmmi\n ... configure-command = perl -I${buildout:perl_lib}/lib/perl5 Makefile.PL INSTALL_BASE=${buildout:perl_lib}\n ... url = file://%s/Foo-Bar-0.0.0.tar.gz\n ... \"\"\" % src)\n\n >>> print(system(buildout))\n Uninstalling packagex.\n Installing foobar.\n building package\n installing package\n\n.. _Installing a package without an autoconf like system:\n\nInstalling a package without an ``autoconf`` like system\n========================================================\n\nSome packages do not use a configuration mechanism and simply provide a\n``Makefile`` for building. It is common in these cases that the build process\nis controlled entirely by direct options to ``make``. We can build such a\npackage by faking a configure command that does nothing and passing the\nappropriate options to ``make``. The ``true`` utility found in most shell\nenvironments is a good candidate for this although anything that returns a\nzero exit code would do.\n\nWe are using a dummy \"HAProxy\" package as an example of a package with only a\nMakefile and using explicit ``make`` options to control the build process.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = haproxy\n ...\n ... [haproxy]\n ... recipe = slapos.recipe.cmmi\n ... configure-command = true\n ... make-options =\n ... TARGET=linux26\n ... CPU=i686\n ... USE_PCRE=1\n ... url = file://%s/haproxy-1.4.8-dummy.tar.gz\n ... \"\"\" % src)\n\n >>> print(system(buildout))\n Uninstalling foobar.\n Installing haproxy.\n Building HAProxy 1.4.8 (dummy package)\n TARGET: linux26\n CPU: i686\n USE_PCRE: 1\n Installing haproxy\n\nInstalling checkouts\n====================\n\nSometimes instead of downloading and building an existing tarball we need to\nwork with code that is already available on the filesystem, for example an SVN\ncheckout.\n\nInstead of providing the ``url`` option we will provide a ``path`` option to\nthe directory containing the source code.\n\nLet's demonstrate this by first unpacking our test package to the filesystem\nand building that.\n\n >>> checkout_dir = tmpdir('checkout')\n >>> import setuptools.archive_util\n >>> setuptools.archive_util.unpack_archive('%s/package-0.0.0.tar.gz' % src,\n ... checkout_dir)\n >>> ls(checkout_dir)\n d package-0.0.0\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... path = %s/package-0.0.0\n ... \"\"\" % checkout_dir)\n\n >>> print(system(buildout))\n Uninstalling haproxy.\n Installing package.\n package: Using local source directory: /checkout/package-0.0.0\n configure --prefix=/sample_buildout/parts/package\n building package\n installing package\n\nSince using the ``path`` implies that the source code has been acquired\noutside of the control of the recipe also the responsibility of managing it is\noutside of the recipe.\n\nDepending on the software you may need to manually run ``make clean`` etc.\nbetween buildout runs if you make changes to the code. Also, the\n``keep-compile-dir`` has no effect when ``path`` is used.\n\n\nAdvanced configuration\n======================\n\nThe above options are enough to build most packages. However, in some cases it\nis not enough and we need to control the build process more. Let's try again\nwith a new buildout and provide more options.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [build-environment]\n ... CFLAGS = -I/sw/include\n ... LDFLAGS = -I/sw/lib\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%(src)s/package-0.0.0.tar.gz\n ... md5sum = 6b94295c042a91ea3203857326bc9209\n ... prefix = /somewhere/else\n ... environment-section = build-environment\n ... environment =\n ... LDFLAGS=-L/sw/lib -L/some/extra/lib\n ... configure-options =\n ... --with-threads\n ... --without-foobar\n ... make-targets =\n ... install\n ... install-lib\n ... patches =\n ... patches/configure.patch\n ... patches/Makefile.dist.patch\n ... \"\"\" % dict(src=src))\n\nThis configuration uses custom configure options, an environment section,\nper-part customization to the environment, custom prefix, multiple make\ntargets and also patches the source code before the scripts are run.\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n package: [ENV] CFLAGS = -I/sw/include\n package: [ENV] LDFLAGS = -L/sw/lib -L/some/extra/lib\n package: Applying patches\n patching file configure\n patching file Makefile.dist\n patched-configure --prefix=/somewhere/else --with-threads --without-foobar\n building patched package\n installing patched package\n installing patched package-lib\n \n\nCustomizing the build process\n=============================\n\nSometimes even the above is not enough and you need to be able to control the\nprocess in even more detail. One such use case would be to perform dynamic\nsubstitutions on the source code (possible based on information from the\nbuildout) which cannot be done with static patches or to simply run arbitrary\ncommands.\n\nThe recipe allows you to write custom python scripts that hook into the build\nprocess. You can define a script to be run:\n\n - before the configure script is executed (pre-configure-hook)\n - before the make process is executed (pre-make-hook)\n - after the make process is finished (post-make-hook)\n\nEach option needs to contain the following information\n\n /full/path/to/the/python/module.py:name_of_callable\n\nwhere the callable object (here name_of_callable) is expected to take three\nparameters:\n\n 1. The ``options`` dictionary from the recipe.\n\n 2. The global ``buildout`` dictionary.\n\n 3. A dictionary containing the current ``os.environ`` augmented with\n the part specific overrides.\n\nThese parameters should provide the callable all the necessary information to\nperform any part specific customization to the build process.\n\nLet's create a simple python script to demonstrate the functionality. You can\nnaturally have separate modules for each hook or simply use just one or two\nhooks. Here we use just a single module.\n\n >>> hooks = tmpdir('hooks')\n >>> write(hooks, 'customhandlers.py',\n ... \"\"\"\n ... import logging\n ... log = logging.getLogger('hook')\n ...\n ... def preconfigure(options, buildout, environment):\n ... log.info('This is pre-configure-hook!')\n ...\n ... def premake(options, buildout, environment):\n ... log.info('This is pre-make-hook!')\n ...\n ... def postmake(options, buildout, environment):\n ... log.info('This is post-make-hook!')\n ...\n ... \"\"\")\n\nand a new buildout to try it out\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%(src)s/package-0.0.0.tar.gz\n ... pre-configure-hook = %(module)s:preconfigure\n ... pre-make-hook = %(module)s:premake\n ... post-make-hook = %(module)s:postmake\n ... \"\"\" % dict(src=src, module='%s/customhandlers.py' % hooks))\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n package: Executing pre-configure-hook\n hook: This is pre-configure-hook!\n configure --prefix=/sample_buildout/parts/package\n package: Executing pre-make-hook\n hook: This is pre-make-hook!\n building package\n installing package\n package: Executing post-make-hook\n hook: This is post-make-hook!\n\nIf you prefer to use shell script, then try these options:\n pre-configure\n pre-build\n pre-install\n post-install\n\nLet's create a buildout to use these options.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... pre-configure = echo \"Configure part: ${:_buildout_section_name_}\"\n ... pre-build = echo \"OH OH OH\" > a.txt\n ... pre-install = cat a.txt\n ... post-install = rm -f a.txt && echo \"Finished.\"\n ... \"\"\" % src)\n\nThis will run pre-configure, pre-build, pre-install, post-install as\nshell command in the corresponding stage.\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n package: Executing pre-configure\n Configure part: package\n configure --prefix=/sample_buildout/parts/package\n package: Executing pre-build\n building package\n package: Executing pre-install\n OH OH OH\n installing package\n package: Executing post-install\n Finished.\n\nBuilding in multi-platforms\n===========================\n\nThe recipe can specify build options for each platform. For example,\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... pre-configure = echo \"Configure in common platform\"\n ... post-install = echo \"Finished.\"\n ...\n ... [package:cygwin]\n ... pre-configure = echo \"Configure in the CYGWIN platform\"\n ... pre-install = echo \"Installing in the CYGWIN\"\n ... post-install = echo -n \"CYGWIN \" && ${package:post-install}\n ... \"\"\" % src)\n\nIn the linux, the recipe gets the options from part 'package', there\nare only ``pre-configure`` and ``post-install``. the output will be\n\n #>>> print(system(buildout))\n Uninstalling package.\n Installing package.\n package: Executing pre-configure\n Configure part: Configure in common platform\n configure --prefix=/sample_buildout/parts/package\n building package\n installing package\n package: Executing post-install\n Finished.\n\nIn the cygwin, the recipe merges the options in the parts 'package'\nand 'package:cygwin'.\n\nUnion prefix\n============\n\nIf the recipe finds ``prefix`` option in the section buildout, it will\n\n * First, use this ``prefix`` as configure prefix, if\n ``configure-command`` isn't set in the part, or ``make-binary``\n equals 'make' and ``make-target`` includes pattern '\\s+install.*'\n\n * Second, return all the new installed files in the prefix when the\n recipe returns after intall.\n\n * Finally, change some environment variables(See first section).\n\nLet's see what happens when set prefix in the buildout section:\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... prefix = ${buildout:directory}/mylocal\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... pre-configure = mkdir -p \"${buildout:prefix}\"\n ... \"\"\" % src)\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n package: Executing pre-configure\n configure --prefix=/sample_buildout/mylocal\n building package\n installing package\n \n\nLook these environment variables and prefix's value, you know what's\nthe differences.\n\nIf part has its own ``prefix``, it will disable above behavious. For\nexample,\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... prefix = ${buildout:directory}/mylocal\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... prefix = ${buildout:parts-directory}/package\n ... url = file://%s/package-0.0.0.tar.gz\n ... pre-configure = rm -rf \"${buildout:prefix}\"\n ... post-install = test -d \"${buildout:prefix}\" || echo \"None\"\n ... \"\"\" % src)\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n package: Executing pre-configure\n configure --prefix=/sample_buildout/parts/package\n building package\n installing package\n package: Executing post-install\n None\n\nThen no extra environment variables such as CFLAGS etc., and no\n${buildout:prefix} directory is created.\n\nThe following example shows how to install package, package-2 in one\nprefix:\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package package-2\n ... prefix = ${buildout:directory}/mylocal\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... pre-install = sleep 2; mkdir -p \"${buildout:prefix}\" ; echo x >\"${buildout:prefix}/a.txt\"\n ... [package-2]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... pre-install = sleep 2; mkdir -p \"${buildout:prefix}\" ; echo x >\"${buildout:prefix}/b.txt\"; echo\n ... \"\"\" % (src, src))\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n configure --prefix=/sample_buildout/mylocal\n building package\n package: Executing pre-install\n installing package\n Installing package-2.\n configure --prefix=/sample_buildout/mylocal\n building package\n package-2: Executing pre-install\n \n installing package\n \n\n >>> ls('mylocal')\n - a.txt\n - b.txt\n\nNext we unintall package-2, it should only remove file b.txt (which seems broken currently\nas nothing it is removing):\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... prefix = ${buildout:directory}/mylocal\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... pre-install = sleep 2; mkdir -p \"${buildout:prefix}\" ; echo x >\"${buildout:prefix}/a.txt\"\n ... \"\"\" % src)\n\n >>> print(system(buildout))\n Uninstalling package-2.\n Updating package.\n\n >>> ls('mylocal')\n - a.txt\n - b.txt\n\nMagic prefix\n============\n\nIf configure-command is set, the recipe wouldn't insert \"--prefix\"\ninto configure-options. Then it checks whether both of make-binary and\nmake-targets aren't set, if so, string \"prefix=xxx\" will be appended\nin the make-targets. xxx is the final prefix of this recipe. We call\nit Magic Prefix.\n\nIn these options magic prefix can be represented by ``%(prefix)s``:\n\n ``configure-command``, ``configure-options``,\n ``make-binary``, ``make-options``, ``make-targets``,\n ``pre-configure``, ``pre-build``, ``pre-install``, ``post-install``\n\nFor example::\n\n [bzip2]\n post-install = rm %(prefix)s/*.h\n\nThe other part can refer to magic prefix of this part by\n${part:prefix}, it will return the magic prefix, other than literal\nvalue in the part section. For example::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package package-2\n ... prefix = /mytemp\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... configure-command = true\n ... make-binary = true\n ...\n ... [package-2]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... configure-command = true\n ... make-binary = true\n ... post-install = echo package magic prefix is ${package:prefix}\n ... \"\"\" % (src, src))\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n Installing package-2.\n package-2: Executing post-install\n package magic prefix is /mytemp\n \n\nHere it's another sample, we change Makefile before installing so it\ncan display \"prefix\" value in the stdout.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... configure-command = ./configure\n ... pre-install = sed -i -e \"s/installing package/installing package at \\\\$\\\\$prefix /g\" Makefile\n ... \"\"\" % src)\n\n >>> print(system(buildout))\n Uninstalling package-2.\n Uninstalling package.\n Installing package.\n configure\n building package\n package: Executing pre-install\n installing package at /sample_buildout/parts/package\n\nYou even can include pattern %(prefix)s in this option, it will be\nreplaced with the recipe final prefix.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... configure-command = ./configure\n ... make-targets = install-lib prefix=%%(prefix)s\n ... pre-install = sed -i -e \"s/installing package/installing package at \\\\$\\\\$prefix /g\" Makefile\n ... \"\"\" % src)\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package.\n configure\n building package\n package: Executing pre-install\n installing package at /sample_buildout/parts/package -lib\n\nExtra part dependencies\n=======================\n\nThe recipe will treat all the parts list in the option\n``dependencies`` as dependent parts. zc.buildout will install all the\ndependent parts before install this part. For example,\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... dependencies = package-2\n ... url = file://%s/package-0.0.0.tar.gz\n ...\n ... [package-2]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... \"\"\" % (src, src))\n\nHere \"package-2\" will be installed first, because it's a denpend part\nof \"package\":\n\n >>> print(system(buildout))\n Uninstalling package.\n Installing package-2.\n configure --prefix=/sample_buildout/parts/package-2\n building package\n installing package\n Installing package.\n configure --prefix=/sample_buildout/parts/package\n building package\n installing package\n\nNow let's add a new option for \"package-2\",\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... dependencies = package-2\n ... url = file://%s/package-0.0.0.tar.gz\n ...\n ... [package-2]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... configure-command = ./configure\n ... \"\"\" % (src, src))\n\nLook, \"package\" is reinstalled either:\n\n >>> print(system(buildout))\n Uninstalling package.\n Uninstalling package-2.\n Installing package-2.\n configure\n building package\n installing package\n Installing package.\n configure --prefix=/sample_buildout/parts/package\n building package\n installing package\n\nInstall shared package\n======================\n\nUse option ``shared`` to install a shared package.\n >>> import os\n >>> _ = system('chmod -R u+w %(path)s && rm -rf %(path)s' % dict(\n ... path=join(os.path.dirname(__file__), 'shared')))\n >>> shared_dir = join(os.path.dirname(__file__), 'shared')\n >>> os.mkdir(shared_dir)\n >>> _ = system('chmod -R u+w %(path)s && rm -rf %(path)s' % dict(\n ... path=join(os.path.dirname(__file__), 'another_shared_dir')))\n >>> another_shared_dir = join(\n ... os.path.dirname(__file__), 'another_shared_dir')\n >>> os.mkdir(another_shared_dir)\n\n\nIf no ``shared-part-list`` is set, and ``shared`` is True, ``shared`` feature\nis not used.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... shared = True\n ... \"\"\"% src)\n \n >>> print(system(buildout)) #doctest:+ELLIPSIS\n Uninstalling package.\n Uninstalling package-2.\n Installing package.\n configure --prefix=/sample_buildout/parts/package\n building package\n installing package\n\nIf ``shared-part-list`` is set and shared is True, build package failed, the\nbuild directory is removed, a build directory__compile__ is left for\ndebugging.\nAlso a shell script with the environment variable is created, so that\ndeveloper can try same build process as the recipe tried.\n\n >>> _ = system('mv %s/package-0.0.0.tar.gz %s/package-0.0.0.tar.gz.bak' % (src, src))\n >>> import tarfile\n >>> from io import BytesIO\n >>> import sys\n >>> tarpath = os.path.join(src, 'package-0.0.0.tar.gz')\n >>> with tarfile.open(tarpath, 'w:gz') as tar:\n ... configure = b'invalid'\n ... info = tarfile.TarInfo('configure.off')\n ... info.size = len(configure)\n ... info.mode = 0o755\n ... tar.addfile(info, BytesIO(configure))\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... shared-part-list = %s\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... shared = True\n ... environment =\n ... FOO=bar\n ... \"\"\" % (shared_dir, src))\n >>> print(system(buildout)) #doctest:+ELLIPSIS\n package: shared directory /shared/package/FIRST_SHARED_PACKAGE_HASH set for package\n Uninstalling package.\n Installing package.\n package: Checking whether package is installed at shared path: /shared/package/FIRST_SHARED_PACKAGE_HASH\n package: [ENV] FOO = bar\n package: Command './configure --prefix=\"/shared/package/FIRST_SHARED_PACKAGE_HASH\"' returned non-zero exit status 127.\n package: Compilation error. The package is left as is at /shared/package/FIRST_SHARED_PACKAGE_HASH__compile__ where you can inspect what went wrong.\n A shell script slapos.recipe.build.env.sh has been generated. You can source it in your shell to reproduce build environment.\n /bin/sh: 1: ./configure: not found\n While:\n Installing package.\n Error: System error\n >>> import glob\n >>> cat(glob.glob(os.path.join(shared_dir, 'package/**__compile__/slapos.recipe.build.env.sh'))[0])\n export FOO=\"bar\"\n ...\n\nIf ``shared-part-list`` is set as an option in buildout section and\n``shared`` is True, package will be installed in shared_part/package\nand a hash of the recipe's configuration options.\n\nThere can be multiple path listed in ``shared-part-list``, the recipe\nwill look in each of these paths if package was already installed and\nif not, it will install the package in the last entry the last entry\nfrom the list of ``shared-part-list``.\n\n >>> _ = system('mv %s/package-0.0.0.tar.gz.bak %s/package-0.0.0.tar.gz' % (src, src))\n >>> print(system(buildout)) #doctest:+ELLIPSIS\n package: shared directory /shared/package/FIRST_SHARED_PACKAGE_HASH set for package\n Installing package.\n package: Checking whether package is installed at shared path: /shared/package/FIRST_SHARED_PACKAGE_HASH\n package: [ENV] FOO = bar\n package: Removing already existing directory /shared/package/FIRST_SHARED_PACKAGE_HASH__compile__\n configure --prefix=/shared/package/FIRST_SHARED_PACKAGE_HASH\n building package\n installing package\n\nIf package was already installed in any of the ``shared-part-list`` used, it will be\nused instead of installing if one package has been installed.\n\n >>> remove('.installed.cfg')\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... shared-part-list =\n ... %s\n ... not/exists\n ... %s\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... shared = True\n ... environment =\n ... FOO=bar\n ... \"\"\" % (shared_dir, another_shared_dir, src))\n >>> print(system(buildout)) #doctest:+ELLIPSIS\n package: shared directory /shared/package/FIRST_SHARED_PACKAGE_HASH set for package\n Installing package.\n package: Checking whether package is installed at shared path: /shared/package/FIRST_SHARED_PACKAGE_HASH\n package: This shared package has been installed by other package\n\nIf options change, reinstall in different location:\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... newest = false\n ... parts = package\n ... shared-part-list = %s\n ...\n ... [package]\n ... recipe = slapos.recipe.cmmi\n ... url = file://%s/package-0.0.0.tar.gz\n ... shared =True\n ... change = True\n ... \"\"\" % (shared_dir, src))\n\n >>> print(system(buildout)) #doctest:+ELLIPSIS\n package: shared directory /shared/package/ANOTHER_SHARED_PACKAGE_HASH set for package\n Uninstalling package.\n Installing package.\n package: Checking whether package is installed at shared path: /shared/package/ANOTHER_SHARED_PACKAGE_HASH\n configure --prefix=/shared/package/ANOTHER_SHARED_PACKAGE_HASH\n building package\n installing package\n\nFor even more specific needs you can write your own recipe that uses\n``slapos.recipe.cmmi`` and set the ``keep-compile-dir`` option to ``true``.\nYou can then continue from where this recipe finished by reading the location\nof the compile directory from ``options['compile-directory']`` from your own\nrecipe.\n\n\nContributors\n============\n\n* Kai Lautaportti (dokai), Author\n* C\u00e9dric de Saint Martin (desaintmartin)\n* Marc Abramowitz (msabramo)\n* Nicolas Dumazet (nicdumz)\n* Guy Rozendorn (grzn)\n* Marco Mariani (mmariani)\n* galpin\n\nDownload\n========", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://lab.nexedi.com/nexedi/slapos.recipe.cmmi", "keywords": "development buildout recipe", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "slapos.recipe.cmmi", "package_url": "https://pypi.org/project/slapos.recipe.cmmi/", "platform": "", "project_url": "https://pypi.org/project/slapos.recipe.cmmi/", "project_urls": { "Homepage": "https://lab.nexedi.com/nexedi/slapos.recipe.cmmi" }, "release_url": "https://pypi.org/project/slapos.recipe.cmmi/0.11/", "requires_dist": null, "requires_python": "", "summary": "zc.buildout recipe for compiling and installing source distributions.", "version": "0.11" }, "last_serial": 5921529, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "ded57ba367dffa91e8b59015761be1c5", "sha256": "85ef3084a38be76a08a1fc93bed3fe0a29b85a1a7fb23147c6474323ce519540" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.1.tar.gz", "has_sig": false, "md5_digest": "ded57ba367dffa91e8b59015761be1c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45052, "upload_time": "2013-04-12T16:10:04", "url": "https://files.pythonhosted.org/packages/c8/6b/7f943ba52edf442ea78440e4c8866dc1befa97c6e043bec38cef0c3928c4/slapos.recipe.cmmi-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "f7ef1bff9202b06bd8eefbc73f374528", "sha256": "0a83ffd5f16a2258f224f7be235eed8cf4a4d0d18519abdb2d9414c9d857199d" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.1.1.tar.gz", "has_sig": false, "md5_digest": "f7ef1bff9202b06bd8eefbc73f374528", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45346, "upload_time": "2013-05-02T08:56:15", "url": "https://files.pythonhosted.org/packages/1f/b8/8b281afaf548f0c74083816e3410be0ffe33e344f21d55fb7d8078316056/slapos.recipe.cmmi-0.1.1.tar.gz" }, { "comment_text": "", "digests": { "md5": "30ef08e87724ad53d1b283c1e99e61ae", "sha256": "3b8fe5753144422270029c805942814f0f6986b5c5ea0e8bc8adca36b62e3e2e" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.2.tar.gz", "has_sig": false, "md5_digest": "30ef08e87724ad53d1b283c1e99e61ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47756, "upload_time": "2013-11-07T16:25:56", "url": "https://files.pythonhosted.org/packages/fc/0b/837e67dd0cdd4b615ffaf7342623084cfd4c64014720ef15e0d0ea13bd35/slapos.recipe.cmmi-0.2.tar.gz" } ], "0.10": [ { "comment_text": "", "digests": { "md5": "8392b368b32af858b0daca697de413b8", "sha256": "ec4e898f57875679b3b2e5caee4aa89b131192e3f7e666f4e08f7708cacb4075" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.10.tar.gz", "has_sig": true, "md5_digest": "8392b368b32af858b0daca697de413b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40374, "upload_time": "2018-11-30T14:58:53", "url": "https://files.pythonhosted.org/packages/3d/b2/fb8f6b7e00eab68637d07707f2d6feff842d218e13b08390f2d87a94a3b0/slapos.recipe.cmmi-0.10.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "0dea73e2580d03b7b563a9749e44dcf4", "sha256": "9f8434674970a84a94a6fc74b155aa11c770c335a522bf1d42d94efa7e8a6aab" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.11.tar.gz", "has_sig": true, "md5_digest": "0dea73e2580d03b7b563a9749e44dcf4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42241, "upload_time": "2019-10-03T03:42:24", "url": "https://files.pythonhosted.org/packages/68/0e/12c90f1eee836199455e023d6208a5168ddd6fae96f1192ef32bed2d52f4/slapos.recipe.cmmi-0.11.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "e7f3e8cb73f229011b26e8be64840764", "sha256": "931a477f8916a60df1f88ce73286932ca97b78ca922a0179006944f7b519e41c" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.4.tar.gz", "has_sig": false, "md5_digest": "e7f3e8cb73f229011b26e8be64840764", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52286, "upload_time": "2017-03-08T16:06:51", "url": "https://files.pythonhosted.org/packages/e7/74/04c052d17c18f33307cdf84c56b4454dcddbb411b772f49fc7c764c5ecd8/slapos.recipe.cmmi-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "cc71eeadf5d2ea4044af5d644529cdf6", "sha256": "ce6f8ca57dae40bad8d9168adaf4ff79a87a978e1cc92b7c251ce5efcdbda080" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.5.tar.gz", "has_sig": false, "md5_digest": "cc71eeadf5d2ea4044af5d644529cdf6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60278, "upload_time": "2017-04-07T08:41:26", "url": "https://files.pythonhosted.org/packages/ef/7c/69ee0b9c2fee0842650073c1af97f99a571d6dd8a57c3d63306a02c763f6/slapos.recipe.cmmi-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "4c5b3f5616b13621106bc194b707b281", "sha256": "f9e9af85a63e36b2ab0dd0cf7073731108c64c8b1136ca48bca0c4b4dd8c02a0" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.6.tar.gz", "has_sig": true, "md5_digest": "4c5b3f5616b13621106bc194b707b281", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38226, "upload_time": "2017-06-06T09:08:50", "url": "https://files.pythonhosted.org/packages/30/0a/384efa5d113145e9896e1ce20812e5aea9db28fc33dd7792c7ce9a4f3507/slapos.recipe.cmmi-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "dc0ff633f1535b19ad4c6cc37f77262b", "sha256": "ca7a1ae56fc56e3268c3f247ea9802e326668df88b37d13f70c7bf4eab193e62" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.7.tar.gz", "has_sig": true, "md5_digest": "dc0ff633f1535b19ad4c6cc37f77262b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38439, "upload_time": "2017-06-06T09:25:51", "url": "https://files.pythonhosted.org/packages/94/75/05025b3351e5f36b26cad23d7e70bf9660462b38f6c3d9e126e2d5a83855/slapos.recipe.cmmi-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "217fe8a96ff851b5798468729026502a", "sha256": "e639e5a7def46c168f60dfc344bd7b97fbd0e5c6df94d314286d92cffbf102a1" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.8.tar.gz", "has_sig": false, "md5_digest": "217fe8a96ff851b5798468729026502a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52664, "upload_time": "2018-08-27T09:10:18", "url": "https://files.pythonhosted.org/packages/c7/ff/5da2b4c7016332f1c05364018d7a182bef3fbc090d59e079377f35b5b23a/slapos.recipe.cmmi-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "0ee0a3f1dd45698e1a03747bebbc44f6", "sha256": "d9e66ad6de8e88ca18da56c5c22ae5e5ff46640b6519bf6c4a5fc6b480e0006f" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.9.tar.gz", "has_sig": true, "md5_digest": "0ee0a3f1dd45698e1a03747bebbc44f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40271, "upload_time": "2018-10-29T16:09:39", "url": "https://files.pythonhosted.org/packages/06/1d/390905085d3f46be4b52fbbc85536e2c6bb673444409cdd2fae647a1793c/slapos.recipe.cmmi-0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0dea73e2580d03b7b563a9749e44dcf4", "sha256": "9f8434674970a84a94a6fc74b155aa11c770c335a522bf1d42d94efa7e8a6aab" }, "downloads": -1, "filename": "slapos.recipe.cmmi-0.11.tar.gz", "has_sig": true, "md5_digest": "0dea73e2580d03b7b563a9749e44dcf4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42241, "upload_time": "2019-10-03T03:42:24", "url": "https://files.pythonhosted.org/packages/68/0e/12c90f1eee836199455e023d6208a5168ddd6fae96f1192ef32bed2d52f4/slapos.recipe.cmmi-0.11.tar.gz" } ] }