dowel

layered — 3層・5パッケージ

        app
       /   \
   codec     net
       \   /    \
        base    util

依存の向きは上から下。辺の種類は以下のとおり。

種別 意図
appcodec, net private 実行ファイルの依存。外へ供給するものが無い
codecbase public base の公開部分が app まで届く
netbase public ダイヤモンドのもう一辺
netutil private util は app から見えてはならない

何を固定するか

  1. 推移的なインクルード探索。 appbase に直接依存していないが、 codec の公開依存を通じて <base/base.h> を include できる
  2. ダイヤモンドで衝突しない。 BASE_APIcodecnet の2経路で app へ届く。defines の併合は error_on_conflict だが、同一の値が 同一の出所から2度来ただけなので誤検知してはならない
  3. 同じ相対パスが別パッケージで衝突しない。 5パッケージ全てが公開ヘッダを include/ に置く。併合が相対パスだけで重複を判定すると、 1つを残して全て消える(実際にこの形で発覚した欠陥である)
  4. 非公開は伝播しない。 netprivate.deps である util の公開定義は app に届いてはならない。private.defines も同様
  5. 非公開は自分には効く。 net 自身のコンパイルでは util が見えていること
  6. パッケージごとのテスト。 各ライブラリが test ターゲットを持ち、 自分の公開ヘッダだけで組み上がること

主張の大半は C 側の #error と終了状態で書いてある。ビルドシステムの利用者が 実際に踏む経路と同じ形で確かめるためであり、期待値を Rust 側と二重に持たないためでもある。

実行ファイルの出力

sum=5 encode=5 port=1024 opt=0

opt は構成で変わる(--config=release なら 1)。