# 機能設計書 78-mruby-configコマンド

## 概要

本ドキュメントは、mruby-configコマンドの設計について記述する。mrubyのビルド設定（コンパイルフラグ・リンクフラグ等）を出力するシェルスクリプトベースのツールである。

### 本機能の処理概要

mruby-configコマンドは、mrubyのビルド時に決定されたコンパイラ・フラグ・ライブラリ等のビルド構成情報を出力する。C/C++プログラムからmrubyを利用する際に必要なコンパイルフラグやリンクフラグを簡単に取得できる。シェルスクリプト（Unix系）とバッチファイル（Windows）の2つの実装がある。

**業務上の目的・背景**：mrubyをC/C++プロジェクトに組み込む際、コンパイルフラグやリンクフラグを正確に取得する必要がある。pkg-config相当の機能をmruby専用に提供し、ビルドシステムとの統合を容易にする。

**機能の利用シーン**：Makefile/CMakeListsでのmrubyビルド設定取得、mruby拡張gemの開発時のコンパイルフラグ確認、CI/CDパイプラインでのビルド設定自動取得。

**主要な処理内容**：
1. コマンドラインスイッチの解析
2. ビルド時に埋め込まれた設定値の出力（MRUBY_CC、MRUBY_CFLAGS等）
3. 複数スイッチの一括出力

**関連システム・外部連携**：mrubyのビルドシステム（Rake）がスクリプト内のプレースホルダを実際の値に置換する。

**権限による制御**：特になし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | コマンドラインツール。画面なし |

## 機能種別

ビルド設定出力ツール / シェルスクリプト

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| --cc | フラグ | No | Cコンパイラ名を出力 | - |
| --cflags | フラグ | No | Cコンパイラフラグを出力 | - |
| --cxx | フラグ | No | C++コンパイラ名を出力 | - |
| --cxxflags | フラグ | No | C++コンパイラフラグを出力 | - |
| --as | フラグ | No | アセンブラ名を出力 | - |
| --asflags | フラグ | No | アセンブラフラグを出力 | - |
| --objc | フラグ | No | Objective Cコンパイラ名を出力 | - |
| --objcflags | フラグ | No | Objective Cコンパイラフラグを出力 | - |
| --ld | フラグ | No | リンカ名を出力 | - |
| --ldflags | フラグ | No | リンカフラグを出力 | - |
| --ldflags-before-libs | フラグ | No | ライブラリ前のリンカフラグを出力 | - |
| --libs | フラグ | No | リンクライブラリを出力 | - |
| --libmruby-path | フラグ | No | libmrubyのパスを出力 | - |
| --help | フラグ | No | ヘルプ表示 | - |

### 入力データソース

- コマンドライン引数のみ

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 設定値 | String | 指定されたビルド設定の値 |

### 出力先

標準出力（echo）。

## 処理フロー

### 処理シーケンス

```
1. 引数なしの場合はヘルプ表示
2. 各引数をwhileループで処理
3. case文でスイッチに対応するMRUBY_*変数をecho
4. 不明なスイッチの場合もヘルプ表示
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{引数あり?}
    B -->|No| C[ヘルプ表示→終了]
    B -->|Yes| D{次の引数}
    D --> E{スイッチ種別}
    E -->|--cc| F[echo MRUBY_CC]
    E -->|--cflags| G[echo MRUBY_CFLAGS]
    E -->|--ld| H[echo MRUBY_LD]
    E -->|--libs| I[echo MRUBY_LIBS]
    E -->|その他| J[ヘルプ表示]
    F --> K{次の引数?}
    G --> K
    H --> K
    I --> K
    K -->|Yes| D
    K -->|No| L[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-78-1 | プレースホルダ置換 | ビルド時にMRUBY_*プレースホルダが実際の値に置換される | ビルドシステムが生成時 |
| BR-78-2 | 複数スイッチ | 複数のスイッチを同時に指定可能 | whileループで順次処理 |
| BR-78-3 | 不明スイッチ | 認識できないスイッチはヘルプを表示 | default case |

### 計算ロジック

特になし。

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

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 0 | 引数なし | スイッチが1つも指定されていない | ヘルプ表示してexit 0 |
| 0 | 不明スイッチ | 認識できないスイッチ | ヘルプ表示 |

### リトライ仕様

リトライは不要。

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

該当なし。

## パフォーマンス要件

特に定義されていない（シェルスクリプトのためオーバーヘッドは最小）。

## セキュリティ考慮事項

特になし。

## 備考

- 実体はシェルスクリプト（Unix系）およびバッチファイル（Windows）
- スクリプト内のMRUBY_CC等のプレースホルダはmrbgem.rakeによりビルド時に実際の値に置換される
- Cバイナリではなくスクリプトのため、実行にmruby VMは不要

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: シェルスクリプトの構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | mruby-config | `mrbgems/mruby-bin-config/mruby-config` | メインスクリプト（全47行） |

**読解のコツ**: MRUBY_CC、MRUBY_CFLAGS等はビルド時にRakeタスクで実際の値に置換されるプレースホルダ。スクリプトそのものは単純なcase文の羅列。

**主要処理フロー**:
- **3-22行目**: print_help関数（全スイッチのヘルプ表示）
- **24-26行目**: 引数なし判定
- **28-46行目**: whileループ＋case文で各スイッチ処理

#### Step 2: Windowsバッチファイルを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | mruby-config.bat | `mrbgems/mruby-bin-config/mruby-config.bat` | Windows版（同等機能） |

#### Step 3: gem定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | mrbgem.rake | `mrbgems/mruby-bin-config/mrbgem.rake` | ビルド時のプレースホルダ置換ロジック |

### プログラム呼び出し階層図

```
mruby-config (シェルスクリプト)
    ├─ print_help (引数なし/不明スイッチ時)
    └─ case $1 (各スイッチ)
        ├─ --cc → echo MRUBY_CC
        ├─ --cflags → echo MRUBY_CFLAGS
        ├─ --ld → echo MRUBY_LD
        ├─ --ldflags → echo MRUBY_LDFLAGS
        ├─ --libs → echo MRUBY_LIBS
        ├─ --libmruby-path → echo MRUBY_LIBMRUBY_PATH
        └─ * → print_help
```

### データフロー図

```
[入力]                      [処理]                    [出力]

ビルド時設定 ──▶ mrbgem.rake ──▶ プレースホルダ置換
                                       │
                                       ▼
コマンドラインスイッチ ──▶ case文分岐 ──▶ echo (stdout)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| mruby-config | `mrbgems/mruby-bin-config/mruby-config` | スクリプト | Unix系メインスクリプト |
| mruby-config.bat | `mrbgems/mruby-bin-config/mruby-config.bat` | スクリプト | Windows版バッチファイル |
| mrbgem.rake | `mrbgems/mruby-bin-config/mrbgem.rake` | 設定 | gem定義・プレースホルダ置換 |
