Argu すごい

Argu は F# 製のコマンドラインパーサーだよ。

gmake のオプションを前半だけ書いてみた。

type Arguments =
  | [<AltCommandLine("-B")>] Always_Make
  | [<AltCommandLine("-C")>] Directory             of dir        : string
  |                          Debug                 of mode       : DebugMode option
  | [<AltCommandLine("-e")>] Environment_Overrides
  |                          Eval                  of expr       : string
  | [<AltCommandLine("-f")>] File                  of file       : string
  | [<AltCommandLine("-i")>] Ignore_Errors
  | [<AltCommandLine("-I")>] Include_Dir           of dir        : string
  | [<AltCommandLine("-h")>] Jobs                  of n          : int option
  | [<AltCommandLine("-k")>] Keep_Going
with
  interface IArgParserTemplate with
    member this.Usage =
      match this with
        | Always_Make             -> "Unconditionally make all targets."
        | Directory _             -> "Change to <dir> before doing anything."
        | Debug _                 -> "Print various types of debugging information."
        | Environment_Overrides   -> "Environment variables override makefiles."
        | Eval _                  -> "Evaluate <expr> as a makefile statement."
        | File _                  -> "Read <file> as a makefile."
        | Ignore_Errors           -> "Ignore errors from recipes."
        | Include_Dir _           -> "Search <dir> for included makefiles."
        | Jobs _                  -> "Allow <n> jobs at once; infinite jobs with no arg."
        | Keep_Going              -> "Keep going when some targets can't be made."

DebugMode に何を入れるのかわからなかったので、スキップ。
書くならこんな感じに:

type DebugMode =
  | A = 1
  | B = 2
  | C = 3

コマンドラインをパースする

コマンドラインをパースするにはパーサーを作成する:

open Argu

let parser = ArgumentParser.Create<Arguments>( programName = "make.exe", errorHandler = ProcessExiter() )

第 2 引数の errorHandler = ProcessExiter() を忘れると恐ろしいことが起こるので注意。
後は、argv を引数に parserParse() メソッドか ParseCommandLine() メソッドを呼び出すだけ:

let results = parser.ParseCommandLine argv

すると、Arguments [] が返ってくる。
ので、これをあれこれする。

らしい。