rpm spec文件骨架到真正的spec文件

时间:2015-02-28 09:57:03

标签: variables replace rpm specfiles

目标是拥有骨架规范fun.spec.skel文件,其中包含VersionRelease的占位符以及此类内容。

为了简单起见,我尝试创建一个更新这些变量的构建目标,以便将fun.spec.skel转换为fun.spec然后我可以在我的github仓库中提交。这样做是为了rpmbuild -ta fun.tar可以很好地工作,并且不需要手动修改fun.spec.skel(人们往往忘记在spec文件中碰撞版本,但不会在构建系统中碰撞)。

3 个答案:

答案 0 :(得分:1)

假设隐含的问题是"我该怎么做?",常见的答案是将占位符放在文件中,如@@VERSION@@然后sed文件,或者变得更复杂,并让autotools这样做。

答案 1 :(得分:1)

我们在我们的项目目录中放置了一个version.mk文件,用于定义环境变量。示例内容包括:

RELPKG=foopackage
RELFULLVERS=1.0.0

作为构建RPM的脚本的一部分,我们可以提供此文件:

#!/bin/bash
. $(pwd)/Version.mk
export RELPKG RELFULLVERS

if [ -z "${RELPKG}" ]; then exit 1; fi
if [ -z "${RELFULLVERS}" ]; then exit 1; fi

这为我们提供了几个访问设置值的选项:

  • 我们可以在rpmbuild命令行上定义宏:

    %rpmbuild -ba --define“relpkg $ {RELPKG}”--define“relfullvers $ {RELFULLVERS}”foopackage.spec

  • 我们可以在spec文件本身中使用%{getenv:...}访问环境变量(虽然这可能更难处理错误......):

    %define relpkg%{getenv:RELPKG} %define relfullvers%{getenv:RELFULLVERS}

从这里开始,您只需在规范文件中使用宏:

Name:  %{relpkg}
Version: %{relfullvers}

我们有类似的值(由通过Jenkins启用的环境变量提供),它们提供插入“Release”标记的内部版本号。

答案 2 :(得分:0)

我找到了两种方法:

a)使用像

这样的东西
Version: %(./waf version)

其中version自定义 waf目标

def version_fun(ctx):
    print(VERSION)


class version(Context):
    """Printout the version and only the version"""
    cmd = 'version'
    fun = 'version_fun'

这将在rpm构建时检查版本


b)创建一个修改specfile本身的目标

from waflib.Context import Context
import re
def bumprpmver_fun(ctx):

    spec = ctx.path.find_node('oregano.spec')
    data = None
    with open(spec.abspath()) as f:
        data = f.read()

    if data:
        data = (re.sub(r'^(\s*Version\s*:\s*)[\w.]+\s*', r'\1 {0}\n'.format(VERSION), data, flags=re.MULTILINE))

        with open(spec.abspath(),'w') as f:
            f.write(data)
    else:
        logs.warn("Didn't find that spec file: '{0}'".format(spec.abspath()))


class bumprpmver(Context):
    """Bump version"""
    cmd = 'bumprpmver'
    fun = 'bumprpmver_fun'

后者用于我的宠物项目oregano @ github

相关问题