layered — 3層・5パッケージ
app
/ \
codec net
\ / \
base util
依存の向きは上から下。辺の種類は以下のとおり。
| 辺 | 種別 | 意図 |
|---|---|---|
app → codec, net |
private | 実行ファイルの依存。外へ供給するものが無い |
codec → base |
public | base の公開部分が app まで届く |
net → base |
public | ダイヤモンドのもう一辺 |
net → util |
private | util は app から見えてはならない |
何を固定するか
- 推移的なインクルード探索。
appはbaseに直接依存していないが、codecの公開依存を通じて<base/base.h>を include できる - ダイヤモンドで衝突しない。
BASE_APIはcodecとnetの2経路でappへ届く。definesの併合はerror_on_conflictだが、同一の値が 同一の出所から2度来ただけなので誤検知してはならない - 同じ相対パスが別パッケージで衝突しない。 5パッケージ全てが公開ヘッダを
include/に置く。併合が相対パスだけで重複を判定すると、 1つを残して全て消える(実際にこの形で発覚した欠陥である) - 非公開は伝播しない。
netのprivate.depsであるutilの公開定義はappに届いてはならない。private.definesも同様 - 非公開は自分には効く。
net自身のコンパイルではutilが見えていること - パッケージごとのテスト。 各ライブラリが
testターゲットを持ち、 自分の公開ヘッダだけで組み上がること
主張の大半は C 側の #error と終了状態で書いてある。ビルドシステムの利用者が
実際に踏む経路と同じ形で確かめるためであり、期待値を Rust 側と二重に持たないためでもある。
実行ファイルの出力
sum=5 encode=5 port=1024 opt=0
opt は構成で変わる(--config=release なら 1)。