configured — 構成で分岐するプロジェクト
app json(任意の依存)
├── lib.core ──private──▶ lib.json (feature.json のとき)
├── bin.app ──target───▶ lib.core
└── test.config ─target──▶ lib.core
[features] の宣言は次のとおり。
default = ["fast"]
fast = ["simd"]
simd = []
trace = []
json = []
何を固定するか
match cfg.optの全てのアーム。--configを切り替えるとAPP_OPTが変わる。単一の構成では片方のアームしか通らない- 列の要素に書いた
match。 具体化した結果は列の中の列になる。 1段しか解かないと、checkもdowel whyも通るのにコンパイル引数にだけ 現れない(この形で欠陥が発覚した) - 機能の連鎖。
fastはsimdを有効にする。--features=fastだけを 渡してもAPP_SIMDが立つこと - 既定の解除。
--no-default-featuresで連鎖ごと消えること - 明示した機能は既定に加わる。
--features=traceでfastも残ること - 有効でない任意の依存を読まない。 既定では
jsonが依存グラフに現れない - 任意の依存の公開定義が届く。
--features=jsonでAPP_JSONが立ち、coreからはjsonの公開ヘッダが見えること - 非公開は伝播しない。
jsonはcoreの非公開依存であり、coreを使うbin.appへJSON_APIが漏れてはならない
1〜5 と 8 は C 側の #error と終了状態で書いてある。6 と 7 のうち
依存グラフに関わる部分は C から観測できないため、ハーネス側にある。
実行ファイルの出力
opt=0 fast=1 simd=1 trace=0 json=0
構成ごとの期待値は crates/dowel-cli/tests/fixture.rs の
configured_reflects_every_configuration にある。
app/tests/config_test.c は、この行とコンパイル時に見えている識別子が
一致することを確かめる。同じ構成から2通りに導いて突き合わせるため、
期待値をハーネスと二重に持たない。