скелет файла спецификации rpm в реальный файл спецификации

Цель состоит в том, чтобы иметь файл спецификации скелета fun.spec.skel, который содержит заполнители для Version, Release и тому подобного.

Ради простоты я пытаюсь создать цель сборки, которая обновляет эти переменные таким образом, что я преобразую fun.spec.skel в fun.spec, которые я затем могу зафиксировать в моем репозитории github. Это сделано для того, чтобы rpmbuild -ta fun.tar работал хорошо, и не требовалось никаких ручных модификаций fun.spec.skel (люди обычно забывают изменить версию в файле спецификаций, но не в системе сборки).


person drahnr    schedule 28.02.2015    source источник


Ответы (3)


Предполагая, что подразумеваемый вопрос звучит так: «Как бы я это сделал?», общий ответ — поместить заполнители в файл, например @@VERSION@@, а затем sed в файл, или усложнить и использовать автоинструменты.

person Aaron D. Marasco    schedule 28.02.2015
comment
Есть только одна проблема: лично я ненавижу автоинструменты. Моя любимая система сборки, которую я использую, это waf - person drahnr; 28.02.2015
comment
Я тоже не фанат, но именно поэтому я сказал, что буду использовать sed. - person Aaron D. Marasco; 01.03.2015

Мы помещаем файл 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

  • Мы можем получить доступ к переменным среды, используя %{getenv:...} в самом файле спецификации (хотя это может быть сложнее для обработки ошибок...):

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

Отсюда вы просто используете макросы в своем файле спецификаций:

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

У нас есть аналогичные значения (предоставленные переменными среды, включенными через Jenkins), которые предоставляют номер сборки, который подключается к тегу «Release».

person Jeff W    schedule 05.03.2015
comment
Цель состояла в том, чтобы получить спецификационный файл, не зависящий ни от каких скриптов, чтобы я мог скопировать его в ~/rpmbuild/SPECS и построить rpmspec без каких-либо дополнительных размышлений. Спасибо за ваши идеи, хотя - person drahnr; 07.03.2015

Я нашел два пути:

а) использовать что-то вроде

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


б) создать цель, которая изменяет сам спецификационный файл

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.

person drahnr    schedule 28.02.2015