# バッチ設計書 33-init-os-and-arch.sh

## 概要

本ドキュメントは、OS・アーキテクチャ検出バッチ `init-os-and-arch.sh` の設計仕様を記載したものです。このバッチは、実行環境のオペレーティングシステムとCPUアーキテクチャを検出し、クロスコンパイル用の情報を提供します。

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

このバッチは、`uname`コマンドを使用して実行環境のOS種別とCPUアーキテクチャを検出し、.NETランタイム識別子（RID）形式に正規化された値を環境変数として設定します。

**業務上の目的・背景**：.NETプロジェクトのビルドにおいて、ターゲットプラットフォームに応じた適切なバイナリを生成する必要があります。本バッチは、実行環境（Linux、macOS、FreeBSDなど）とCPUアーキテクチャ（x64、arm64など）を自動検出し、他のビルドスクリプトが参照できる形式で情報を提供します。これにより、マルチプラットフォーム対応のビルドパイプラインを実現できます。

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

**主要な処理内容**：
1. `uname -s`でOS名を取得し、小文字に正規化
2. Androidデバイスの特別検出（getpropコマンド使用）
3. OS名を.NET RID形式にマッピング（darwin→osx等）
4. Solaris/Illumosの場合は`isainfo`でCPU検出
5. その他のOSは`uname -m`でCPU名を取得
6. CPU名を.NET RID形式のアーキテクチャにマッピング

**前後の処理との関連**：本スクリプトは他のビルドスクリプト（install-dependencies.sh、build-rootfs.shなど）から読み込まれ、`$os`および`$arch`変数を提供します。

**影響範囲**：シェル変数`os`と`arch`を設定します。これらの値はビルドプロセス全体で使用されます。

## バッチ種別

環境検出 / 初期化処理

## 実行スケジュール

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

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| uname | unameコマンドが使用可能であること |
| POSIX準拠シェル | /bin/shが利用可能であること |

### 実行可否判定

特に前提条件なし。すべてのUnix系環境で実行可能です。

## 入力仕様

### 入力パラメータ

本バッチは入力パラメータを受け取りません。システムコマンドから情報を取得します。

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| uname -s | コマンド出力 | OS名（Linux、Darwin等） |
| uname -m | コマンド出力 | CPU名（x86_64、aarch64等） |
| isainfo -n | コマンド出力 | Solaris用CPU情報 |
| getprop | コマンド出力 | Androidデバイス情報 |
| /etc/os-release | ファイル | Linuxディストリビューション情報 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| os | シェル変数 | 正規化されたOS名（linux、osx、freebsd等） |
| arch | シェル変数 | 正規化されたアーキテクチャ名（x64、arm64等） |

### 出力ファイル仕様

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

## 処理フロー

### 処理シーケンス

```
1. OS検出
   ├─ uname -s を実行し小文字に変換
   ├─ Androidデバイスチェック（getprop使用）
   └─ OS名を正規化
      ├─ linux, freebsd, netbsd, openbsd, sunos, android, haiku → そのまま
      ├─ darwin → osx
      └─ その他 → エラー終了

2. CPU検出（Solaris/Illumosの場合）
   ├─ uname -o でIllumos判定
   ├─ Illumosなら os=illumos、それ以外は os=solaris
   └─ isainfo -n でCPU名取得

3. CPU検出（その他のOS）
   └─ uname -m でCPU名取得

4. アーキテクチャマッピング
   ├─ arm64, aarch64 → arm64（32bit OSの場合はarm）
   ├─ loongarch64 → loongarch64
   ├─ riscv64 → riscv64
   ├─ amd64, x86_64 → x64
   ├─ armv7l, armv8l → arm（Tizenの場合はarmel）
   ├─ armv6l → armv6
   ├─ i[3-6]86 → x86（警告付き）
   ├─ s390x → s390x
   ├─ ppc64le → ppc64le
   └─ その他 → エラー終了
```

### フローチャート

```mermaid
flowchart TD
    A[スクリプト開始] --> B[uname -s でOS取得]
    B --> C{Androidデバイス?}
    C -->|Yes| D[os=android]
    C -->|No| E{OS判定}
    E -->|linux/freebsd/etc| F[os=取得値]
    E -->|darwin| G[os=osx]
    E -->|sunos| H{Illumos?}
    E -->|その他| I[エラー終了]
    H -->|Yes| J[os=illumos]
    H -->|No| K[os=solaris]

    F --> L[CPU検出]
    G --> L
    J --> M[isainfo -n でCPU取得]
    K --> M
    D --> L

    L --> N[uname -m でCPU取得]
    M --> O[アーキテクチャマッピング]
    N --> O

    O --> P{CPU種別}
    P -->|arm64/aarch64| Q{32bit OS?}
    Q -->|Yes| R[arch=arm]
    Q -->|No| S[arch=arm64]
    P -->|x86_64/amd64| T[arch=x64]
    P -->|armv7l/armv8l| U{Tizen?}
    U -->|Yes| V[arch=armel]
    U -->|No| W[arch=arm]
    P -->|その他既知| X[対応arch設定]
    P -->|不明| Y[エラー終了]
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 未対応OS | 認識できないOS名が検出された場合 | サポート対象OSで実行するか、スクリプトを拡張 |
| 1 | 未対応CPU | 認識できないCPU名が検出された場合 | サポート対象CPUで実行するか、スクリプトを拡張 |

### リトライ仕様

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

### 障害時対応

未対応のOS/CPUが検出された場合は、手動でos/arch変数を設定してから後続処理を実行するか、スクリプトを拡張してサポートを追加してください。

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

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

## パフォーマンス要件

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

## 排他制御

なし。読み取り専用のスクリプトです。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| エラーログ | 未対応OS検出時 | "Unsupported OS $OSName detected!" |
| 警告ログ | x86 CPU検出時 | "Unsupported CPU $CPUName detected, build might not succeed!" |
| エラーログ | 未対応CPU検出時 | "Unknown CPU $CPUName detected!" |

## 監視・アラート

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

## 備考

- 本スクリプトは`source`コマンドで読み込むことを想定しています
- 対応OS：Linux、macOS（Darwin）、FreeBSD、NetBSD、OpenBSD、Solaris、Illumos、Android、Haiku
- 対応アーキテクチャ：x64、arm64、arm、armv6、armel、x86、s390x、ppc64le、loongarch64、riscv64
- 32bit OS on 64bit CPU（Raspberry Pi OS等）の検出に対応
- Tizen環境での特別なarmelアーキテクチャ検出に対応
