# バッチ設計書 38-init-distro-rid.sh

## 概要

本ドキュメントは、ディストリビューションRID初期化バッチ `init-distro-rid.sh` の設計仕様を記載したものです。このバッチは、Linuxディストリビューションの識別子（RID: Runtime Identifier）を取得し、クロスコンパイルやビルド構成に使用する情報を提供します。

### 本バッチの処理概要

このバッチは、ターゲットOS、アーキテクチャ、およびrootfsディレクトリ情報からディストリビューション固有のRIDを生成し、環境変数としてエクスポートします。

**業務上の目的・背景**：.NETランタイムのビルドでは、ターゲットプラットフォームごとに適切なRIDが必要です。RIDはプラットフォーム固有のバイナリを識別するために使用され、例えば「ubuntu.22.04-x64」や「fedora.38-arm64」のような形式で表現されます。クロスコンパイル時には、ホストマシンではなくターゲット環境の情報を取得する必要があるため、rootfsディレクトリを参照してRIDを決定します。

**バッチの実行タイミング**：ビルドスクリプトの初期化フェーズで、sourceコマンドで読み込まれます。

**主要な処理内容**：
1. getNonPortableDistroRid関数：非ポータブル（ディストリビューション固有）RIDを生成
   - Linux: /etc/os-releaseからID、VERSION_IDを取得
   - FreeBSD: freebsd-versionからメジャーバージョンを取得
   - Android: getpropからSDKバージョンを取得
   - Solaris/Illumos/Haiku: 各環境固有の処理
2. initDistroRidGlobal関数：グローバル変数を初期化
   - __DistroRid: 非ポータブルRID
   - __PortableTargetOS: ポータブルOS名（musl検出含む）

**前後の処理との関連**：ビルドスクリプトから読み込まれ、__DistroRidと__PortableTargetOSはビルド構成で使用されます。

**影響範囲**：環境変数__DistroRidと__PortableTargetOSを設定します。

## バッチ種別

環境検出 / RID初期化

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（sourceコマンドで読込時） |
| 実行時刻 | - |
| 実行曜日 | - |
| 実行日 | - |
| トリガー | sourceコマンド / ビルドスクリプト |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| POSIX準拠シェル | /bin/shが利用可能であること |
| rootfsディレクトリ | クロスコンパイル時は有効なrootfsパスが必要 |

### 実行可否判定

特に前提条件なし。関数を呼び出す前に必要なパラメータを設定してください。

## 入力仕様

### 入力パラメータ

#### getNonPortableDistroRid関数

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| targetOs | string | Yes | - | ターゲットOS（linux、freebsd等） |
| targetArch | string | Yes | - | ターゲットアーキテクチャ（x64、arm64等） |
| rootfsDir | string | No | - | rootfsディレクトリパス（クロスコンパイル用） |

#### initDistroRidGlobal関数

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| os | string | Yes | - | ターゲットOS |
| arch | string | Yes | - | ターゲットアーキテクチャ |
| rootfsDir | string | No | - | rootfsディレクトリパス |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| /etc/os-release | 環境ファイル | Linuxディストリビューション情報 |
| android_platform | 環境ファイル | Android RID情報 |
| freebsd-version | コマンド | FreeBSDバージョン |
| getprop | コマンド | Android SDKバージョン |
| uname -v | コマンド | Solaris/Haikuバージョン |
| ldd | バイナリ | musl検出用 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| __DistroRid | 環境変数 | 非ポータブルRID（例：ubuntu.22.04-x64） |
| __PortableTargetOS | 環境変数 | ポータブルOS名（例：linux、linux-musl） |
| 関数戻り値 | 標準出力 | getNonPortableDistroRid関数はRIDを出力 |

### 出力ファイル仕様

本バッチはファイル出力を行いません。

## 処理フロー

### 処理シーケンス

#### getNonPortableDistroRid関数
```
1. OS判定
   ├─ linux: /etc/os-releaseまたはandroid_platform読み込み
   ├─ freebsd: freebsd-versionでメジャーバージョン取得
   ├─ android: getpropでSDKバージョン取得
   ├─ illumos: "illumos-$arch"を返す
   ├─ solaris: メジャーバージョン付きRIDを返す
   └─ haiku: リリースバージョン付きRIDを返す

2. Linux処理詳細
   ├─ /etc/os-release存在: ID.VERSION_ID-archを生成
   ├─ VERSION_IDが数字のみでない: IDのみ使用（ローリングリリース）
   └─ android_platform存在: RID変数を使用

3. 出力
   └─ 小文字に変換して出力
```

#### initDistroRidGlobal関数
```
1. rootfsDir検証
   └─ 指定されているが存在しない場合: エラー終了

2. __DistroRid取得
   └─ getNonPortableDistroRidを呼び出し

3. __PortableTargetOS設定
   ├─ 未設定の場合: targetOsを使用
   └─ musl検出: lddまたはstringsでmusl判定
      └─ musl検出時: "linux-musl"に変更

4. 環境変数エクスポート
   └─ __DistroRid、__PortableTargetOSをexport
```

### フローチャート

```mermaid
flowchart TD
    subgraph getNonPortableDistroRid
        A1[開始] --> B1{targetOs?}
        B1 -->|linux| C1{/etc/os-release存在?}
        C1 -->|Yes| D1[ID、VERSION_ID読み込み]
        D1 --> E1{VERSION_IDが数字?}
        E1 -->|Yes| F1[ID.VERSION_ID-arch]
        E1 -->|No| G1[ID-arch]
        C1 -->|No| H1{android_platform存在?}
        H1 -->|Yes| I1[RID変数使用]
        H1 -->|No| J1[空文字]

        B1 -->|freebsd| K1[freebsd.major-arch]
        B1 -->|android| L1[android.sdk-arch]
        B1 -->|illumos| M1[illumos-arch]
        B1 -->|solaris| N1[solaris.major-arch]
        B1 -->|haiku| O1[haiku.r-arch]
    end

    subgraph initDistroRidGlobal
        A2[開始] --> B2{rootfsDir指定?}
        B2 -->|Yes| C2{存在?}
        C2 -->|No| D2[エラー終了]
        C2 -->|Yes| E2[__DistroRid取得]
        B2 -->|No| E2

        E2 --> F2{__PortableTargetOS設定?}
        F2 -->|No| G2[targetOs使用]
        G2 --> H2{musl検出?}
        H2 -->|Yes| I2[linux-musl]
        H2 -->|No| J2[そのまま]
        F2 -->|Yes| J2

        I2 --> K2[export]
        J2 --> K2
    end
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチはデータベース操作を行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | rootfs不正 | rootfsDirが指定されているが存在しない | 正しいパスを指定 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

rootfsDirパスが不正な場合は、正しいクロスコンパイル用rootfsディレクトリを指定してください。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（読み取り専用） |
| コミットタイミング | - |
| ロールバック条件 | - |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回 |
| 目標処理時間 | 100ミリ秒以内 |
| メモリ使用量上限 | 最小限 |

## 排他制御

なし。読み取り専用の関数です。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| エラーログ | rootfs不正時 | "Error: rootfsDir has been passed, but the location is not valid." |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 1 | 呼び出し元スクリプト |

## 備考

### サポートされるディストリビューション/OS
- **Linux**: 全ディストリビューション（/etc/os-release対応）
- **FreeBSD**: メジャーバージョンを含むRID
- **Android**: SDKバージョンを含むRID
- **Solaris**: メジャーバージョンを含むRID
- **Illumos**: バージョンなしRID
- **Haiku**: リリースバージョンを含むRID

### RID形式例
- `ubuntu.22.04-x64`
- `fedora.38-arm64`
- `alpine-x64`（ローリングリリース）
- `freebsd.14-x64`
- `android.33-arm64`

### musl検出
- ldd --versionの出力にmuslが含まれる場合
- lddバイナリをstringsで検索してmuslが含まれる場合
- 検出時は__PortableTargetOSが"linux-musl"に設定される

### ローリングリリース対応
- VERSION_IDが未設定、空、または非数字の場合はIDのみ使用
- 例：Arch Linux → `arch-x64`
