6.2. ブール型依存関係のサポート
バージョン 4.13 以降では、RPM は以下の依存関係でブール式を処理できます。
-
Requires
-
Recommends
-
Suggests
-
supplements
-
Enhances
-
Conflicts
このセクションでは、ブール値の依存関係構文 を説明し、ブール値演算子 のリストを紹介して、ブール値の依存関係のセマンティクス およびブール値の 依存関係のセマンティクス について説明します。
6.2.1. ブール値の依存関係構文
ブール値は、常に括弧で囲まれています。
これは、通常の依存関係から構築されます。
- 名前のみまたは名前
- 比較
- バージョンの説明
6.2.2. ブール値の演算子
RPM 4.13 では、以下のブール値演算子が導入されました。
ブール値演算子 | 説明 | 使用例 |
---|---|---|
| 用語が真となるには、すべてのオペランドを満たす必要があります。 | Conflicts: (pkgA and pkgB) |
| 用語が真となるには、いずれかのオペランドを満たす必要があります。 | Requires: (pkgA >= 3.2 or pkgB) |
| 第 2 のオペランドが満たされる場合、第 1 オペランドも満たされる必要があります (リバースインプリケーション) | Recommends: (myPkg-langCZ if langsupportCZ) |
|
| Requires: myPkg-backend-mariaDB if mariaDB else sqlite |
RPM 4.14 では、以下のブール値演算子がさらに導入されています。
ブール値演算子 | 説明 | 使用例 |
---|---|---|
| 用語が真となるには、すべてのオペランドが同じパッケージで満たされる必要があります。 | Requires: (pkgA-foo with pkgA-bar) |
| 最初のオペランドを満たすが、2 番目のオペランドを満たさない単一のパッケージが必要 | Requires: (pkgA-foo without pkgA-bar) |
| 2 番目のオペランドが満たされない場合、最初のオペランドを満たす必要があります (リバースネガティブインプリケーション)。 | Conflicts: (myPkg-driverA unless driverB) |
|
| Conflicts: (myPkg-backend-SDL1 unless myPkg-backend-SDL2 else SDL2) |
if
演算子と or
演算子は同じコンテキストで使用できず、unless
演算子は and
と同じコンテキストで使用できません。
6.2.3. ネスト化
以下の例のように、オペランド自体をブール式として使用できます。
このような場合は、オペランドを括弧で囲む必要もあります。and
と or
演算子を組み合わせて、括弧で囲った同じ 1 セットと同じ演算子を繰り返すことができます。
例6.2 ブール式として適用されるオペランドの使用例
Requires: (pkgA or pkgB or pkgC)
Requires: (pkgA or (pkgB and pkgC))
Supplements: (foo and (lang-support-cz or lang-support-all))
Requires: (pkgA with capB) or (pkgB without capA)
Supplements: ((driverA and driverA-tools) unless driverB)
Recommends: myPkg-langCZ and (font1-langCZ or font2-langCZ) if langsupportCZ
6.2.4. セマンティクス
ブール値の依存関係
を使用しても、通常の依存関係のセマンティックは変更されません。
ブール値の依存関係
が使用されている場合は、名前が一致するものをすべてチェックし、一致する名前のブール値をブール値演算子で集計します。
Conflicts:
を除くすべての依存関係では、インストールを防ぐために、結果が True
である必要があります。Conflicts:
については、インストールを防ぐために、結果が False
である必要があります。
Provides
は依存関係ではないため、ブール式を含めることはできません。
6.2.5. if 演算子の出力の理解
if
演算子もブール値を返します。これは、直感的に理解しやすいものです。ただし、以下の例では、if
の直感的な使用が誤解を招く可能性がある場合を示しています。
例6.3 if 演算子の出力の誤解
このステートメントは、pkgB がインストールされていない場合には真になります。ただし、このステートメントを、デフォルトの結果が偽であるところで使用すると、事が複雑になります。
Requires: (pkgA if pkgB)
このステートメントは、pkgB がインストールされていて、pkgA がインストールされていない場合に競合します。
Conflicts: (pkgA if pkgB)
そのため、以下を使用することが推奨されます。
Conflicts: (pkgA and pkgB)
if
演算子が or
にネストされている場合も同様です。
Requires: ((pkgA if pkgB) or pkgC or pkg)
pkgB がインストールされていない場合に if
が真となるため、用語が完全に真となります。pkgB がインストールされている場合にのみ pkgA が役立つ場合は、代わりに and
を使用します。
Requires: ((pkgA and pkgB) or pkgC or pkg)