Конкретный пример: у меня есть множество спецификаций с Source0
: или другими строками Source
, содержащими макросы. Как я могу использовать эти макросы без фактического запуска сборки на specfile или написания собственного анализатора?
Могу ли я использовать rpm для расширения макросов в specfile?
Ответ 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 расширяет макросы во время сборки.