об / мин условно с подстрокой? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть файл спецификации, в котором используется условное выражение типа

%if "%{pkgname}" = "wobble"
  Requires: extra-thing
  ....
%endif

, и теперь мне нужно обрабатывать wobble-thing, wobble-otherthing и любые другие wobble* как удовлетворяющие тому же условию.Легко, вы подумали бы.

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

К сожалению, предварительная обработка файла выиграла 'В этом контексте он перевернет целую цепочку сборки, которая, как ожидается, сможет просто создать спецификацию.

В rpm и rpmbuild много недокументированной магии, подобно ${error:blah}и %{expand:..othermacros...} и %global прочее.И даже такие простые реляционные операции, как %if %{value} < 42, на самом деле нигде не документированы.

Кто-нибудь знает оператор сопоставления с строковым префиксом или строковым инфиксом?

Япоиск спецификации, эквивалентной конструкции bash if [[ "${VAR}" == *"substring"* ]]; then.

Edit : Для ясности причина, по которой я не просто использую условные выражения оболочки, заключается в том, что мне нужно влиять на метаданные rpm.Я думал, что было очевидно, что я бы использовал shell if, если бы это было возможно.Я отредактировал, чтобы показать более четко выше.

Редактировать : Чтобы помочь другим людям найти это, речь идет о сопоставлении строковых шаблонов в rpm.Сложные условия в оборотах.Условные разделы в спецификациях.Строковые префиксы, инфиксные или суффиксные операторы и тесты в rpmbuild.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Вот способ сделать это в спецификации, используя %define.

%global original_string  SomeLongStringHere
%global matching_string  LongString
%global nomatch_string   NoMatchHere

%define matchTwoStrings(n:) \
string_one=%1 \
string_two=%2 \
if [[ "${string_one}" = *"${string_two}"* ]]; then \
   echo "It matches" \
else \
     echo "It doesn't match" \
fi \
%{nil}

# Затем где-то позже в .spec, например, я использовал раздел %post

%post
%matchTwoStrings "%{original_string}" "%{matching_string}"
%matchTwoStrings "%{original_string}" "%{nomatch_string}"

Поскольку он находится в разделе %post, он будет распечатан во время установки .rpm.

It matches
It doesn't match
0 голосов
/ 22 сентября 2018

Вы действительно можете использовать сценарии Lua, хотя это требует некоторых странных заклинаний.Вот как добавить функциональный макрос starts_with в файл спецификации rpm, который можно использовать в условиях %if.

# Define the Lua starts_with function we want to expose
%{lua:
  function starts_with(str, start)
   return str:sub(1, #start) == start
  end
}

# Define the rpm parametric macro starts_with(str,prefix) that
# calls Lua and maps "false"=>"0" and "true"=>"1"
#
# Note that we need to inject the parameters %1 and %2 to a
# string-quoted version of the Lua macro, then expand the whole
# thing.
#
%define starts_with(str,prefix) (%{expand:%%{lua:print(starts_with(%1, %2) and "1" or "0")}})

# Finally we can use the parametric macro
#
%if %{starts_with "wobble-boo" "wobble"}
  Requires: wobble
%endif

Что происходит здесь:

%{starts_with "wobble-boo", "wobble}

расширяется до

%{expand:%%{lua:print(starts_with("wobble-boo", "wobble") and "1" or "0")}}

, который расширяется до

%{lua:print(starts_with("wobble-boo", "wobble") and "1" or "0")}

, который выполняет функцию Lua starts_with, которая проверяет, является ли подстрока левого якоря "str"та же длина, что и у «start», равна «start».Если это правда, возвращается «1»;если значение равно false, возвращается «0».Это потому, что rpm не распознает false как ложное.

Итак, мы здесь вызываем функцию Lua из параметрического макроса rpm и адаптируем возвращаемое значение.

Nifty.Больно, что rpm нуждается в таком взломе для такой простой задачи, как эта, и что это почти полностью без документов.Но изящный.

0 голосов
/ 21 сентября 2018

Вы не можете использовать регулярные выражения или групповые символы.Но вы можете использовать «или».

%if "%{pkgname}" == "wobble" || "%{pkgname}" == "wobble-thing"
..
%endif

или выполнить оценку в оболочке

%global yourmacro   %(/usr/bin/perl ...%{pkgname}... )

, где /usr/bin/perl ... может быть любым сценарием, а yourmacro имеет значениезначение стандартного вывода этого скрипта.

...