跳转到主要内容

zc.buildout配方,用于编译和安装软件或Python包,并由Makina Corpus赞助生成脚本或配置文件。

项目描述

简介

请参阅 http://pypi.python.org/pypi/minitage.recipe.common 以查找选项

egg具有以下入口点

  • cmmi:安装configure/make/make install软件

我重新编写另一个buildout配方构建器的理由是

  • 支持下载内容

  • 支持egg和其他分发的即时补丁。

  • 支持在构建系统的每个阶段使用多个钩子。

  • 强大的离线模式

  • 支持自动minitage依赖性和rpath链接。

您可以在以下minitage资源上浏览代码

您可以使用buildout.minitagificator轻松迁移您的buldouts

Makina Corpus赞助软件

makinacom

minitage.recipe.cmmi

摘要

  • cmmi配方使用abusivly或-rpath来避免在运行时设置LD_LIBRARY_PATH。

  • 如果您在minitage环境中,您的minibuild的所有依赖项都放在环境中。这意味着CFLAGS、LDFLAGS、PKG_CONFIG_PATH等都会更新以引用您的minibuild的依赖项。

  • minitage.recipe.cmmi是zc.recipe.cmmi的替代品。

  • 它打算使用钩子进行配置 && 制作 && 制作安装的舞蹈,在构建过程中,您可以在每个阶段执行特定的操作(以Python为例)。

  • 使用此配方,如果目标目录存在,我们只有在成功安装某些内容时才会删除它,除非我们从未触摸过它,或者它是一个错误。

  • 请参阅共享变量,因为所有minitage配方都共享许多变量

特定选项

请查看以下选项:http://pypi.python.org/pypi/minitage.recipe.common#options-shared-by-all-the-recipes

  • make-targets(-UNAME)

    默认为全部安装,运行make目标

  • inner-dir: 在做任何事情之前切换到内部目录。

  • prefix: 安装位置(默认为options:location)请注意,除非您设置‘install-in-place’,否则目标内容将在安装之前被清除

  • install-in-place: 在先前的安装上安装,而不是删除旧安装并替换为新‘makeinstall结果’

    install-in-place=True
  • build-dir(-UNAME)

    执行构建舞蹈的内部目录[参见cmmi配方文档]

  • configure-options(-UNAME)

    给uname的配置特定选项可以是linux2|freebsd6|freebsd7|darwin|leopard|snowleopard(darwin用于leopard)这是sys.platform.lower()的结果[参见cmmi配方文档]

  • configure(-UNAME)
    • 特定操作系统的配置脚本(darwin,leopard,snowleopard,linux,freebsd,freebsd(6,7,8)配置脚本[默认为./configure])

  • prefix-separator [参见cmmi配方文档]

    用于在–prefix和location之间使用的前缀分隔符(默认为=)

  • prefix-option [参见cmmi配方文档]

    为“prefix”表达式指定的内容,默认为–prefix$PREFIX_SEPARATOR$LOCATION

  • autogen

    如果有,则使用autogen脚本[可选]

  • configure-options(-UNAME)

    提供给configure的选项[参见cmmi配方文档]

  • configure-options(-UNAME)-replace
    • 覆盖特定操作系统的选项

  • extra_options

    附加到configure-options[参见cmmi配方文档]

  • mingw

    仅限windows/cygwin使用。设置此变量(例如mingw=true)以使用mingw编译器。默认将在/minitageprefix/mingw中搜索mingw安装

  • mingw-path

    mingw安装的替代路径

  • noconfigure(-UNAME)

    不运行./configure

  • nomake(-UNAME)

    不运行make

  • noinstall(-UNAME)

    不运行make install

  • make-options(-UNAME)

    在make和目标之间预先附加的选项(例如MAKE

  • make-install-append-options(-UNAME)

    如果设置,我们将在安装时附加选项而不是在目标之前附加它们

  • make-install-options(-UNAME)

    在安装目标之后附加的选项(例如make install DESDIR=foo)

  • hooks

    钩子的形式为/path/to/hook:CALLABLE

    myhook=${buildout:directory}/toto.py:foo

    其中包含toto.py

    def foo(options, buildout):
        return 'Hourray'

    完整的可能钩子列表

    • pre-unpack-hook

      在解包舞蹈之前执行的钩子

    • post-unpack-hook

      在解包舞蹈之后执行的钩子

    • post-unpack-hook

      在解包舞蹈之后执行的钩子

    • pre-configure-hook

      在运行配置之前执行的钩子

    • pre-make-hook

      在运行第一个make目标之前执行的钩子

    • post-build-hook

      在构建make目标完成后执行的钩子

    • pending-make-install

      在make之后和make install之前执行的钩子

    • post-make-hook

      在make install之后执行的钩子

详细文档

让我们创建一个buildout配置文件。

>>> rmdir(tempdir)
>>> mkdir(tempdir)
>>> cd(tempdir)
>>> a = [mkdir(d) for d in ('eggs', 'develop-eggs', 'bin', 'src')]
>>> install_develop_eggs(['minitage.recipe.cmmi'])
>>> install_eggs_from_pathes(['zc.buildout'], sys.path)
>>> touch('buildout.cfg')
>>> sh('buildout -o bootstrap')
buildout -o bootstrap...

此第一个buildout是经典的,试图构建一些URL。

>>> touch('buildout.cfg',
... data="""
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... """)
>>> sh('bin/buildout install part')
bin/buildout install part...
<BLANKLINE>
While:
  Installing part.
<BLANKLINE>
A...
MinimergeError: URL was not set!
<BLANKLINE>

糟糕,我们忘记了URL,我们将制作一个基本的发行版包来测试我们的东西。使用带有URL位的buildout运行。

>>> if not os.path.exists('foo'):
...     mkdir('foo')
... else:
...     rmdir(foo)
...     mkdir('foo')
>>> touch('foo/configure', data ="""echo configure $@\n""")
>>> sh('chmod +x foo/configure')
c...
>>> touch('foo/Makefile',
... data = """
... all:
... \t@echo all
...
... install:
... \t@echo install
...
... """)
>>> sh('tar cfz  foo.tgz foo')
tar cfz  ...
<BLANKLINE>
>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/foo.tgz
... """
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
bin/buildout -o install part...
Installing part.
minitage.recipe: Download archive
minitage.recipe: Downloading file:///tmp/buildout.test/foo.tgz in /tmp/buildout.test/minitage/foo.tgz
minitage.recipe: Unpacking in /tmp/buildout.test/__minitage__part__tmp.
minitage.recipe: Guessing compilation directory
minitage.recipe: Setting path
minitage.recipe: Setting pkgconfigpath
minitage.recipe: Setting compilation flags
minitage.recipe: Setting path
minitage.recipe: Running /tmp/buildout.test/__minitage__part__tmp/foo/configure --prefix=/tmp/buildout.test/parts/part
configure --prefix=/tmp/buildout.test/parts/part
minitage.recipe: Running make
all
minitage.recipe: Running make  install
install
minitage.recipe: Completed install...

通用用法

此第一个buildout除了打印钩子调用外什么都不做。我们已禁用了配置和make舞蹈!

>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/foo.tgz
... noconfigure=true
... noinstall = true
... nomake = true
... """
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
bin/buildout -o install part...
Installing part.
minitage.recipe: Download archive
minitage.recipe: Unpacking in /tmp/buildout.test/__minitage__part__tmp.
minitage.recipe: Guessing compilation directory
minitage.recipe: Setting path
minitage.recipe: Setting pkgconfigpath
minitage.recipe: Setting compilation flags
minitage.recipe: Setting path
minitage.recipe: Completed install...

应用补丁

这个第二个示例旨在展示补丁的功能。

>>> sh('cp foo/Makefile foo/Makefile.old')
cp foo/Makefile foo/Makefile.old
>>> sh('echo >> foo/Makefile')
echo >> foo/Makefile
>>> sh('diff -u foo/Makefile.old foo/Makefile > patch')
diff -u foo/Makefile.old foo/Makefile > patch
>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/foo.tgz
... patches = ${buildout:directory}/patch
... noconfigure=true
... noinstall = true
... nomake = true
... """
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
bin/buildout -o install part...
minitage.recipe: Running patch -t -Np0 < /tmp/buildout.test/minitage/patch_d96115b00b41e282469f73708c68bdaf/patch
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- foo/Makefile.old ...
|+++ foo/Makefile  ...
--------------------------
No file to patch.  Skipping patch.
1 out of 1 hunk ignored
<BLANKLINE>
While:
  Installing part.
<BLANKLINE>
An internal error occured due to a bug in either zc.buildout or in a...
SystemError: ('Failed', 'patch -t -Np0 < /tmp/buildout.test/minitage/patch_d96115b00b41e282469f73708c68bdaf/patch')
<BLANKLINE>

补丁级别错误!

>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/foo.tgz
... patches = ${buildout:directory}/patch
... patch-options = -p1
... noconfigure=true
... noinstall = true
... nomake = true
... """
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
bin/buildout -o install part...
minitage.recipe: Running patch -t -p1 < /tmp/buildout.test/minitage/patch...
patching file Makefile
minitage.recipe: Completed install...

使用钩子

但现在我们有一些杂乱的包,我们能不能插入一些Python代码来颠倒事物呢?我们有钩子来实现这个目的。钩子是一个Python可调用函数,它至少接受选项部分和构建包。

>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/foo.tgz
... pre-unpack-hook    = ${buildout:directory}/hooks.py:pre_unpack_hook
... post-unpack-hook   = ${buildout:directory}/hooks.py:post_unpack_hook
... pre-configure-hook = ${buildout:directory}/hooks.py:pre_configure_hook
... pre-make-hook      = ${buildout:directory}/hooks.py:pre_make_hook
... post-build-hook    = ${buildout:directory}/hooks.py:post_build_hook
... post-make-hook     = ${buildout:directory}/hooks.py:post_make_hook
... """
>>> touch('hooks.py', data="""
... def  pre_unpack_hook    (o, b, hook='pre_unpack_hook'):
...     print "%s in %s target %s" % (hook, b['buildout']['directory'], o['location'])
... def  post_unpack_hook   (o, b, hook='post_unpack_hook'):
...     print "%s in %s target %s" % (hook, b['buildout']['directory'], o['location'])
... def  pre_configure_hook (o, b, hook='pre_configure_hook'):
...     print "%s in %s target %s" % (hook, b['buildout']['directory'], o['location'])
... def  pre_make_hook      (o, b, hook='pre_make_hook'):
...     print "%s in %s target %s" % (hook, b['buildout']['directory'], o['location'])
... def  post_build_hook    (o, b, hook='post_build_hook'):
...     print "%s in %s target %s" % (hook, b['buildout']['directory'], o['location'])
... def  post_make_hook     (o, b, hook='post_make_hook'):
...     print "%s in %s target %s" % (hook, b['buildout']['directory'], o['location'])
... """)
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
... bin/buildout -o install part...
bin/buildout -o install part...
minitage.recipe: Download archive
minitage.recipe: Executing pre-unpack-hook
pre_unpack_hook in /tmp/buildout.test target /tmp/buildout.test/parts/part...
minitage.recipe: Setting path
minitage.recipe: Executing post-unpack-hook
post_unpack_hook in /tmp/buildout.test target /tmp/buildout.test/parts/part
minitage.recipe: Executing pre-configure-hook
pre_configure_hook in /tmp/buildout.test target /tmp/buildout.test/parts/part
minitage.recipe: Running /tmp/buildout.test/__minitage__part__tmp/foo/configure --prefix=/tmp/buildout.test/parts/part
configure --prefix=/tmp/buildout.test/parts/part
minitage.recipe: Executing pre-make-hook
pre_make_hook in /tmp/buildout.test target /tmp/buildout.test/parts/part
minitage.recipe: Running make
all
minitage.recipe: Executing post-build-hook
post_build_hook in /tmp/buildout.test target /tmp/buildout.test/parts/part
minitage.recipe: Running make  install
install
minitage.recipe: Executing post-make-hook
post_make_hook in /tmp/buildout.test target /tmp/buildout.test/parts/part
minitage.recipe: Completed install...

MD5检查

当然可以检查MD5!因为我们已经将foo包放入我们的下载缓存,我们尝试下载其他内容。

>>> shutil.copy2('foo.tgz', 'bar.tgz')
>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... md5sum = b4d
... url = file://${buildout:directory}/bar.tgz
... """
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
bin/buildout -o install part
Uninstalling part.
Unused options for buildout: 'download-directory'.
Installing part.
minitage.recipe: Download archive
minitage.recipe: Downloading file:///tmp/buildout.test/bar.tgz in /tmp/buildout.test/minitage/bar.tgz
<BLANKLINE>
While:
  Installing part.
<BLANKLINE>
A...
MinimergeError: Failed download for file:///tmp/buildout.test/bar.tgz:      MD5SUM mismatch for /tmp/buildout.test/minitage/bar.tgz: Good:b4d != Bad:...
<BLANKLINE>

控制配置

提供两种方式给出配置选项。

>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/bar.tgz
... configure-options = foo
... extra_options = bar
... """
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
bin/buildout -o install part...
minitage.recipe: Running /tmp/buildout.test/__minitage__part__tmp/foo/configure --prefix=/tmp/buildout.test/parts/part foo bar
configure --prefix=/tmp/buildout.test/parts/part foo bar ...

使用特定于操作系统的规则

提供特定于操作系统的规则。

>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/foo.tgz
... configure-options-linux = linuxoptions
... """
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
b...
minitage.recipe: Running /tmp/buildout.test/__minitage__part__tmp/foo/configure --prefix=/tmp/buildout.test/parts/part    linuxoptions...

或者,以相同的方式,您可以指定特定于操作系统的补丁:(darwin,linux,freebsd6,freebsd7)。sys.platform是您的朋友:(‘linux’,适用于所有linux系统)。

>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... patch-options = -p1
... url = file://${buildout:directory}/foo.tgz
... """
>>> data += '%s-patches =${buildout:directory}/patch' % uname
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
b...
minitage.recipe: Running patch -t -p1 < /tmp/buildout.test/minitage/patch...

使用底层的minitage环境

如果您在minitage中,所有的小型构建依赖项都会自动添加到环境中,无需执行以下代码。由于您可以在环境中添加CFLAGS等,您还可以指定手动内容,底层代码是相同的。目标是证明所有内容都像我们预期的那样预先添加。我们将使用一些钩子来打印相关部分。

>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/foo.tgz
... pre-make-hook    = ${buildout:directory}/hooks.py:pre_unpack_hook
... includes-dirs = /foo/include
... rpath = /someruntimespath/lib
... library-dirs = /bar/lib
... pkgconfigpath = /lib/pkgconfig/
... noconfigure = true
... nomake = true
... noinstall = true
... """
>>> touch('hooks.py', data="""
... import os
... def  pre_unpack_hook(o, b):
...     flags = [(a, os.environ.get(a, 'not_set')) for a in ('CFLAGS', 'LDFLAGS', 'PKG_CONFIG_PATH', 'LD_RUN_PATH',)]
...     for flag in flags:
...         print flag
... """)
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
b...
minitage.recipe: Executing pre-make-hook
('CFLAGS', '-I/foo/include')
('LDFLAGS', '-L/bar/lib -Wl,-rpath -Wl,/bar/lib -L/tmp/buildout.test/parts/part/lib -Wl,-rpath -Wl,/tmp/buildout.test/parts/part/lib')
('PKG_CONFIG_PATH', '/lib/pkgconfig/...')
('LD_RUN_PATH', '/someruntimespath/lib:/tmp/buildout.test/parts/part/lib')...

玩转环境

您还可以以两种方式直接在环境中进行操作。

  • 精确指定构建包的部分。

    >>> data = """
    ... [buildout]
    ... download-cache=${buildout:directory}
    ... parts =
    ...     part
    ... [foo]
    ... CFLAGS=bar
    ... [part]
    ... recipe=minitage.recipe.cmmi
    ... url = file://${buildout:directory}/foo.tgz
    ... pre-make-hook    = ${buildout:directory}/hooks.py:pre_unpack_hook
    ... environment = foo
    ... noconfigure = true
    ... nomake = true
    ... noinstall = true
    ... """
    >>> touch('buildout.cfg', data=data)
    >>> sh('bin/buildout -o install part')
    bi...
    ('CFLAGS', 'bar')...
    
  • 通过键=值对输入选项。

    >>> data = """
    ... [buildout]
    ... download-cache=${buildout:directory}
    ... parts =
    ...     part
    ... [part]
    ... recipe=minitage.recipe.cmmi
    ... url = file://${buildout:directory}/foo.tgz
    ... pre-make-hook    = ${buildout:directory}/hooks.py:pre_unpack_hook
    ... noconfigure = true
    ... nomake = true
    ... noinstall = true
    ... environment=
    ...     CFLAGS=myvalue
    ... """
    >>> touch('buildout.cfg', data=data)
    >>> sh('bin/buildout -o install part')
     bin/buildout -o install part...
     minitage.recipe: Executing pre-make-hook
     ('CFLAGS', 'myvalue')...
    

Autogen可以成为你的朋友

可以自动生成配置文件。

>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/foo.tgz
... noconfigure = true
... nomake = true
... noinstall = true
... autogen = configure
... """
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
bin/buildout -o install part...
minitage.recipe: Auto generating configure files
minitage.recipe: Running /tmp/buildout.test/__minitage__part__tmp/foo/configure
configure...

共享构建

以向后兼容zc.recipe.cmmi的方式处理共享模式。

>>> data = """
... [buildout]
... download-cache=${buildout:directory}
... parts =
...     part
... [part]
... recipe=minitage.recipe.cmmi
... url = file://${buildout:directory}/foo.tgz
... shared = true
... """
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -o install part')
bin/buildout -o install part...
minitage.recipe: Running /tmp/buildout.test/__minitage__part__tmp/foo/configure --prefix=/tmp/buildout.test/minitage/cmmi/...

CHANGELOG

1.58 (2013-06-02)

  • 在OSX上可以make gmake。

1.57 (2013-02-25)

  • 修复:创建临时目录。

1.56 (2012-12-19)

  • 再次修复文档。

1.55 (2012-12-19)

  • 修复文档。

1.54 (2012-05-09)

  • 使用缓存子目录下载文件。

1.53 (2011-03-09)

  • 条件性地删除la文件。

1.52 (2011-03-09)

  • 添加“make-install-append-options”,在make install目标之后添加“make-options”构建包选项。

  • 添加“make-install-options”,在make install目标之后添加。

  • 添加调试停止标志。

  • 添加调试的env文件生成。

  • 添加特定于操作系统的选项。

  • 修复开发链接。

  • win32修复。

  • 如果存在,删除la文件。

1.37

  • API修复。

-> 1.36

  • 从minitage.recipe中分离出来。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分发

minitage.recipe.cmmi-1.58.zip (32.8 kB 查看散列)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面