Подтвердить что ты не робот

Могу ли я использовать rpm для расширения макросов в specfile?

Конкретный пример: у меня есть множество спецификаций с Source0: или другими строками Source, содержащими макросы. Как я могу использовать эти макросы без фактического запуска сборки на specfile или написания собственного анализатора?

4b9b3361

Ответ 1

Вы можете grep получить строки Source, sed, чтобы извлечь строку, содержащую макрос, а затем rpm --eval 'string' для ее оценки. Обратите внимание, что это только расширит глобальные макросы, а не те, которые определены в этой спецификации.

Чтобы расширить эти возможности, вам, вероятно, понадобится grep для них и отправьте их в rpm в качестве файла настраиваемых макросов.

Ответ 2

Так как rpm 4.9 вы можете использовать:

rpmspec -P <spec_file>

Будет распечатан расширенный файл spec на stdout

Ответ 3

Если для этого нужны только исходные строки, spectool сделает это за вас. Это часть Fedora rpmdevtools.

$ spectool ./mg.spec 
Source0: http://homepage.boetes.org/software/mg/mg-20110120.tar.gz
$ 

Вот экран справки

Usage: spectool [<options>] <specfile>
Options:
operating mode:
-l, --lf, --list-files        lists the expanded sources/patches (default)
-g, --gf, --get-files         gets the sources/patches that are listed with
                              a URL
-h, --help                    display this help screen

files on which to operate:
-A, --all                     all files, sources and patches (default)
-S, --sources                 all sources
-P, --patches                 all patches
-s, --source x[,y[,...]]      specified sources
-p, --patch a[,b[,...]]       specified patches

misc:
-d, --define 'macro value'    defines RPM macro 'macro' to be 'value'
-C, --directory dir           download into specified directory (default '.')
-R, --sourcedir               download into rpm %{_sourcedir}
-n, --dryrun, --dry-run       don't download anything, just show what would be
                              done
-D, --debug                   output debug info, don't clean up when done

Ответ 4

Если вы посмотрите на /usr/bin/spectool script в rpmdevtools, о котором говорит @mmckinst, вы увидите его просто сложный взлом. Он создает файл спецификации tmp, который по существу делает то, что делает script. Это то, что мы используем для расширения спецификационного файла, а затем grep для частей требуемого файла. В нашем случае мы хотели больше, чем источники и исправления.

Здесь образец bash script, который имитирует это поведение. Он расширит все макросы до раздела %prep.

#!/bin/bash
spec_file="$1" # pass in the path to the spec file as the first argument
tmp_spec="/tmp/eval-$$.spec"
cat "$spec_file" | sed '/^%prep/,$d' > "$tmp_spec"
echo '%prep' >> "$tmp_spec"
echo 'cat<<__EOF__' >> $tmp_spec
cat "$spec_file" | sed '/^%prep/,$d' >> "$tmp_spec"
echo '__EOF__' >> "$tmp_spec"
rpmbuild -bp "$tmp_spec" 2>/dev/null
rm -f "$tmp_spec"  

Ответ 5

Развернуть макросы в скриптах

Если вам интересно, как выглядят сценарии в вашем RPM после макрорасширения, вы можете просто создать RPM, а затем получить RPM для извлечения скриптов:

rpmbuild -bi my-package.spec
rpm -qp --scripts my-package.rpm

Это работает, потому что RPM расширяет макросы во время сборки.