# バッチ設計書 42-tizen-build-rootfs.sh

## 概要

本ドキュメントは、Tizenプラットフォーム向けrootfs構築スクリプト（tizen-build-rootfs.sh）の設計仕様を記載したものです。このスクリプトは、.NETランタイムをTizenオペレーティングシステム向けにクロスコンパイルするために必要なルートファイルシステム（rootfs）を構築します。

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

このバッチは、指定されたアーキテクチャに対応するTizen用のrootfsを自動的に構築します。Tizenの公式リポジトリからRPMパッケージをダウンロードし、展開・設定を行って、クロスコンパイル用のシステムルート環境を準備します。

**業務上の目的・背景**：Tizenは Samsung が主導するLinuxベースのオープンソースオペレーティングシステムで、スマートTV、ウェアラブルデバイス、IoTデバイスなどで使用されています。.NETをTizenプラットフォーム上で動作させるためには、Tizen固有のライブラリやヘッダーファイルを含むrootfsが必要です。このスクリプトにより、開発者はTizen向けの.NETランタイムをビルドするための環境を容易に構築できます。

**バッチの実行タイミング**：Tizen向けの.NETランタイムをビルドする前に、手動またはCI/CDパイプラインの一部として実行されます。rootfsが既に存在する場合は再実行の必要はありません。

**主要な処理内容**：
1. 入力されたアーキテクチャをTizen固有のアーキテクチャ名にマッピング
2. tizen-fetch.shを呼び出して必要なRPMパッケージをダウンロード
3. rpm2cpioとcpioを使用してRPMパッケージを展開
4. アセンブラヘッダーのシンボリックリンクを作成
5. Tizen固有のパッチを適用
6. RISC-V 64bit向けの追加修正（壊れたシンボリックリンクの修正）

**前後の処理との関連**：tizen-fetch.shに依存してパッケージをダウンロードします。このスクリプトで構築されたrootfsは、build-rootfs.shから呼び出されることもあり、.NETのクロスコンパイルビルドで使用されます。

**影響範囲**：ROOTFS_DIR環境変数で指定されたディレクトリにrootfsが構築されます。既存のディレクトリ内容は上書きされる可能性があります。

## バッチ種別

クロスコンパイル環境構築 / rootfs構築

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（rootfs構築が必要な場合） |
| 実行時刻 | 手動実行またはCI/CDパイプライン内 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動実行 / CI/CDパイプライン / build-rootfs.shからの呼び出し |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| ROOTFS_DIR環境変数 | rootfsの出力先ディレクトリが設定されていること |
| rpm2cpioコマンド | RPMパッケージを展開するためのツール |
| cpioコマンド | アーカイブ展開ツール |
| patchコマンド | パッチ適用ツール |
| curlコマンド | HTTPダウンロード用（tizen-fetch.shで使用） |
| xmllintコマンド | XML解析用（tizen-fetch.shで使用） |
| sha256sumコマンド | チェックサム検証用（tizen-fetch.shで使用） |

### 実行可否判定

- ROOTFS_DIR環境変数が未設定の場合はエラー終了
- サポートされていないアーキテクチャが指定された場合はエラー終了

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| $1 (ARCH) | string | Yes | なし | ターゲットアーキテクチャ（arm, armel, arm64, x86, x64, riscv64） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Tizenパッケージリポジトリ | HTTP | http://download.tizen.org/snapshots/TIZEN/Tizen |
| tizen.patch | パッチファイル | アーキテクチャ固有の設定パッチ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| $ROOTFS_DIR | ディレクトリ | 構築されたrootfs |
| 標準出力 | テキスト | 進捗メッセージ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | rootfs（ディレクトリ全体） |
| 出力先 | ROOTFS_DIR環境変数で指定されたパス |
| 文字コード | バイナリ/テキスト混在 |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. アーキテクチャの解析とマッピング
   └─ arm → armv7hl, armel → armv7l, arm64 → aarch64 等
2. ROOTFS_DIR環境変数の確認
   └─ 未設定の場合はエラー終了
3. 一時ディレクトリの作成
   └─ $ROOTFS_DIR/tizen_tmp を作成
4. RPMパッケージのダウンロード
   └─ tizen-fetch.shを呼び出してパッケージを取得
5. RPMパッケージの展開
   └─ rpm2cpio | cpio -idm で各パッケージを展開
6. 一時ディレクトリのクリーンアップ
   └─ tizen_tmpディレクトリを削除
7. rootfsの設定
   └─ asmヘッダーのシンボリックリンク作成
   └─ tizen.patchの適用
8. RISC-V固有の修正（該当する場合）
   └─ 壊れたシンボリックリンクを修正
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[アーキテクチャ解析]
    B --> C{サポート対象?}
    C -->|なし| D[エラー: Unsupported architecture]
    C -->|あり| E{ROOTFS_DIR設定済み?}
    E -->|なし| F[エラー: ROOTFS_DIR is not defined]
    E -->|あり| G[一時ディレクトリ作成]
    G --> H[tizen-fetch.sh実行]
    H --> I[RPMパッケージ展開]
    I --> J[一時ディレクトリ削除]
    J --> K[asmシンボリックリンク作成]
    K --> L[tizen.patch適用]
    L --> M{RISC-V?}
    M -->|Yes| N[シンボリックリンク修正]
    M -->|No| O[正常終了]
    N --> O
    D --> P[終了コード1]
    F --> P
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 該当なし | - | - | このバッチはデータベース操作を行いません |

### テーブル別操作詳細

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | Unsupported architecture | サポートされていないアーキテクチャ指定 | arm, armel, arm64, x86, x64, riscv64のいずれかを指定 |
| 1 | ROOTFS_DIR not defined | ROOTFS_DIR環境変数が未設定 | ROOTFS_DIR環境変数を設定して再実行 |
| 非0 | ダウンロードエラー | tizen-fetch.shでのパッケージ取得失敗 | ネットワーク接続を確認し再実行 |
| 非0 | パッチ適用エラー | tizen.patchの適用失敗 | パッチファイルとrootfs状態を確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（スクリプト自体ではリトライなし） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

1. エラーメッセージを確認し、原因を特定
2. ROOTFS_DIRを空にして再実行
3. ネットワーク接続を確認
4. 必要なツール（rpm2cpio, cpio, patch）がインストールされているか確認

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし（失敗時はROOTFS_DIRを手動でクリーンアップ） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 数十個のRPMパッケージ |
| 目標処理時間 | 数分（ネットワーク速度に依存） |
| メモリ使用量上限 | 特になし（通常のファイル操作程度） |

## 排他制御

同一のROOTFS_DIRに対して同時実行しないでください。ファイルの上書きや不完全なrootfsが生成される可能性があります。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | ダウンロード開始時 | ">>Start downloading files" |
| 終了ログ | ダウンロード完了時 | "<<Finish downloading files" |
| 開始ログ | rootfs構築開始時 | ">>Start constructing Tizen rootfs" |
| 終了ログ | rootfs構築完了時 | "<<Finish constructing Tizen rootfs" |
| 開始ログ | 設定開始時 | ">>Start configuring Tizen rootfs" |
| 終了ログ | 設定完了時 | "<<Finish configuring Tizen rootfs" |
| 情報ログ | RISC-V修正時 | "Fixing broken symlinks in $PWD" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 0以外 | CI/CDパイプラインの失敗通知 |
| ダウンロード時間 | 環境依存 | タイムアウト設定に依存 |

## 備考

- サポートされるアーキテクチャとTizenアーキテクチャのマッピング：
  - arm → armv7hl
  - armel → armv7l
  - arm64 → aarch64
  - x86 → i686
  - x64 → x86_64
  - riscv64 → riscv64
- RISC-V 64bitの場合、glibcライブラリのシンボリックリンクが壊れているため修正が必要
- このスクリプトはset -eで実行されるため、いずれかのコマンドが失敗すると即座に終了します
