rpm & rpmbuild — использование глобальной переменной окружения в разделе %files

Я некоторое время боролся с этим. Итак, я написал файл .specs для своего проекта, и все прошло нормально. RPM собран, установка прошла гладко... но потом у меня возникли проблемы, потому что теперь мне нужно использовать пользовательскую глобальную переменную среды, чтобы задать путь установки.

Это даст раздел %files как таковой:

%files
%defattr(-,root,root)
$INSTALLPATH/Crystal/bin/Crystal.jar

Где Crystal — это имя моего проекта, а INSTALLPATH определяется в env благодаря командной строке экспорта. Затем при запуске buildrpm -ba Crystal.specs у меня возникает следующая ошибка:

error: File must begin with "/" : $INSTALLPATH/Crystal/bin/Crystal.jar

Я попытался определить макрос внутри файла .rpmmacros как таковой: %_installpath $INSTALLPATH

И в моем файле спецификаций, когда я делаю echo %{_installpath}, я получаю значение, которое я установил в .rpmmacros. Но если я использую его в %files:

%files
%defattr(-,root,root)
%{_installpath}/Crystal/bin/Crystal.jar

Я снова получаю ту же ошибку!

error: File must begin with "/" : $INSTALLPATH/Crystal/bin/Crystal.jar

Я также попытался определить переменную в файле спецификаций, и у меня такой же печальный результат. Похоже, пока моя переменная/макрос ссылается на $INSTALL, %files не примет его. Но я должен использовать эту переменную env!

Так что это все, о чем я мог думать. Кто-нибудь понял? Любая помощь будет принята с благодарностью.

Заранее большое спасибо!


person Rinita    schedule 17.09.2014    source источник


Ответы (1)


Раздел %files не расширяет переменные оболочки. Вы не можете сделать это таким образом.

У вас есть пара вариантов, которые я вижу навскидку. Ты сможешь

  • сгенерируйте файл со списком ваших файлов (во время %install или что у вас есть), а затем используйте %files -f files.lst

  • расширить $INSTALLPATH время определения макроса об/мин с помощью:

    # For RPM >= 4.7.0
    %_installpath %{getenv:INSTALLPATH}
    # For RPM < 4.7.0
    %_installpath %{lua:print(os.getenv("INSTALLPATH"))}
    
person Etan Reisner    schedule 17.09.2014
comment
Да, это было так. Я использовал первое решение. Большое спасибо! - person Rinita; 18.09.2014
comment
@Etan Reisner: Вы можете использовать переменные оболочки в разделе %files так же, как и везде в спецификации, хотя это может быть довольно уродливым и нечитаемым. Например. использование %(echo $INSTALLPATH/Crystal/bin/Crystal.jar) должно достичь того, чего хотел ОП. - person doktor5000; 30.12.2015
comment
@doktor5000 doktor5000 Это не раздел %files, расширяющий переменные оболочки (и я не верю, что раздел %files делает это). Это rpm выполняет расширение во время синтаксического анализа вручную, потому что вы использовали макрос %(...). Но да, это (возможно) сработало бы... при условии, что %(...) расширения выполняются в правильной области действия макроса. - person Etan Reisner; 30.12.2015
comment
@EtanReisner: определенно работает в разделе %files, мы используем его для некоторых особенно уродливых пакетов, чтобы динамически помечать определенные файлы с помощью %lang($lang) и в основном создавать эту часть раздела %files на лету. Но предложенное вами решение со списком файлов, вероятно, намного чище для ОП :) - person doktor5000; 31.12.2015
comment
@doktor5000 Что конкретно работает в разделе %files? Запись типа /usr/lib/$shellvar? Ваш динамически созданный список файлов содержит %lang($lang) /path/to/file? Или он содержит %lang(en) /path/to/file? - person Etan Reisner; 31.12.2015
comment
@EtanReisner: это в основном то, что я использую в %files %(for lang in %langs ; do echo "%%lang($lang) /path/to/file-$lang" done), где %langs — это список локалей. - person doktor5000; 31.12.2015
comment
@ doktor5000 Да, это явный вызов оболочки с переменной, определенной в этом сценарии оболочки (поскольку это цикл оболочки for). Это совсем не то же самое, что раздел %files, расширяющий переменные оболочки при обычном использовании. Попробуйте использовать переменную оболочки из ваших разделов %build или %install в этом цикле или просто напрямую используйте переменную в списке %files, и вы поймете, что я имею в виду, говоря, что это не работает. - person Etan Reisner; 01.01.2016