目标是拥有骨架规范fun.spec.skel
文件,其中包含Version
,Release
的占位符以及此类内容。
为了简单起见,我尝试创建一个更新这些变量的构建目标,以便将fun.spec.skel
转换为fun.spec
然后我可以在我的github仓库中提交。这样做是为了rpmbuild -ta fun.tar
可以很好地工作,并且不需要手动修改fun.spec.skel(人们往往忘记在spec文件中碰撞版本,但不会在构建系统中碰撞)。
答案 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