alopex-sql 0.7.1

SQL parser components for the Alopex DB dialect
# Package
version       = "0.1.0"
author        = "Alopex Team"
description   = "SQL parser for Alopex DB — trial implementation in Nim"
license       = "Apache-2.0"
srcDir        = "src"

# Dependencies
requires "nim >= 2.2"
requires "npeg"
requires "msgpack4nim"

# Tasks
task test, "Run tests":
  exec "nim c -r tests/test_parser.nim"
  exec "nim c -r tests/test_msgpack_output.nim"
  exec "nim c -r tests/test_ffi_boundary.nim"

task lib, "Build shared library":
  # 前提 (issue #40 対応時に Nim 2.2.10 / alopex-parity コンテナで実測検証済み):
  # このタスクは `--panics` / `--exceptions` を明示指定しない。Nim 2.2 の
  # 既定は `--panics:off` (Defect は Exception 階層に属し catchable) と
  # `--exceptions:goto` であり、`-d:release --mm:orc --opt:speed` を付けても
  # 変わらない。`alopex_sql_parser.nim` の `alopex_parse_sql` は
  # `except CatchableError` に加えて `except Defect` で IndexDefect/
  # FieldDefect 等の内部不変条件違反を捕捉して prkError に変換しており、
  # これは `--panics:off` (Defect が catchable) 前提で成立する。将来
  # `--panics:on` (Defect が回復不能な fatal abort になる、Nim 3 相当の
  # 動作) へ切り替える場合は、この except 節が到達不能になり FFI 境界の
  # no-throw 保証が崩れるため、alopex_sql_parser.nim 側の設計も併せて
  # 見直すこと。フラグを明示追加しない理由: `--exceptions:goto` を明示すると
  # Windows MinGW ターゲットでのコード生成差分を検証していないため、
  # 既定値への暗黙依存よりリスクが高いと判断した。
  #
  # OS 別に build.rs が探す正確なファイル名で出力する。
  #   Linux:   libalopex_sql_parser.so   (lib 接頭辞 + .so)
  #   macOS:   libalopex_sql_parser.dylib(lib 接頭辞 + .dylib)
  #   Windows: alopex_sql_parser.dll      (接頭辞なし + .dll)
  # `--app:lib` の OS 既定名に依存せず、-o: で明示することで
  # クロスプラットフォームで build.rs の nim_lib_filename() と一致させる。
  let outName =
    when defined(windows):
      "alopex_sql_parser.dll"
    elif defined(macosx):
      "libalopex_sql_parser.dylib"
    else:
      "libalopex_sql_parser.so"
  # Windows: MinGW ランタイム (libgcc_s_seh-1.dll / libwinpthread-1.dll 等) を
  # DLL へ静的リンクし、DLL を自己完結にする。Python の os.add_dll_directory()
  # は登録ディレクトリから推移的依存も解決するが、MinGW ランタイム DLL は
  # ビルド環境固有で配置が保証されないため、動的リンクのままだと
  # `import alopex` が DLL load failed になる (PR #32)。DLL 同梱 (issue #33) の
  # 布石として静的リンクを採用する。Linux/macOS のフラグは不変。
  let staticFlags =
    when defined(windows):
      " --passL:-static --passL:-static-libgcc"
    else:
      ""
  exec "nim c -d:release --app:lib --mm:orc --opt:speed" & staticFlags &
    " -o:" & outName & " src/alopex_sql_parser.nim"