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赞助软件
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...
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的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 217f3272476cf4fc01839753d1997e039ccc160f5957d345c0d303df4c3e2816 |
|
MD5 | fcd552ef0a5e79c913cc9c443c1e64bb |
|
BLAKE2b-256 | c30d64769077b030262b1bb22fcafe76a1f874b9f604f3053d00bfac8587ec32 |