# サブディレクトリの OS フィルタリング

本ドキュメントでは、makemain.mk におけるサブディレクトリの OS フィルタリング機能について説明します。

# 1 概要

makemain.mk では、サブディレクトリの再帰的 make 処理に先立ち、ディレクトリ名に基づく OS フィルタリングを行います。これにより、プラットフォーム固有のコードをディレクトリ単位で分離できます。

# 2 フィルタルール

サブディレクトリの 最終ディレクトリ名 (大文字小文字を無視) に基づいて、以下のルールで判定します。

最終ディレクトリ名 | Linux | Windows | 説明
--- | --- | --- | ---
`linux` | 有効 | 除外 | Linux 固有のコード
`windows` | 除外 | 有効 | Windows 固有のコード
`shared` | 有効 | 有効 | 両 OS 共通コード (明示的)
その他 | 有効 | 有効 | デフォルト動作

- `shared` とその他は動作上同じですが、`shared` はクロスプラットフォームであることを明示する意図で使用します。
- 大文字小文字を無視するため、`Linux`、`LINUX`、`linux` はすべて同一視されます。

# 3 ディレクトリ構成例

    prod/calc/src/calcapp/
    +-- makefile
    +-- shared/          # 両 OS で有効 (明示的)
    |   +-- makefile
    |   +-- common.c
    +-- linux/           # Linux でのみ有効
    |   +-- makefile
    |   +-- platform_linux.c
    +-- windows/         # Windows でのみ有効
    |   +-- makefile
    |   +-- platform_windows.c
    +-- utils/           # 両 OS で有効 (デフォルト)
        +-- makefile
        +-- helper.c

## 3.1 Linux での実行結果

    SUBDIRS = linux/ shared/ utils/

## 3.2 Windows での実行結果

    SUBDIRS = shared/ utils/ windows/

# 4 複数階層での動作

サブディレクトリが複数階層にまたがる場合、各階層で個別にフィルタリングが適用されます。最終ディレクトリ名のみで判定されるため、中間階層の名前は影響しません。

    prod/calc/src/calcapp/
    +-- platform/           # "platform" → 両 OS で有効
        +-- makefile
        +-- linux/           # "linux" → Linux でのみ有効
        |   +-- makefile
        |   +-- impl_linux.c
        +-- windows/         # "windows" → Windows でのみ有効
            +-- makefile
            +-- impl_windows.c

この場合、`calcapp/` レベルでは `platform/` が両 OS で有効となり、`platform/` 内で再帰的に make が実行される際に `linux/` または `windows/` がフィルタリングされます。