packages feed

dhall-1.42.3: benchmark/parser/examples/cpkg.dhall

-- Generated from https://github.com/vmchale/cpkg/blob/master/pkgs/pkg-set.dhall by running dhall resolve

let concatMapSep =
      λ(_ : Text) →
      λ(_ : Type) →
      λ(_ : _ → Text) →
      λ(_ : List _@1) →
        merge
          { Empty = "", NonEmpty = λ(_ : Text) → _ }
          ( List/fold
              _@2
              _
              < Empty | NonEmpty : Text >
              ( λ(_ : _@2) →
                λ(_ : < Empty | NonEmpty : Text >) →
                  merge
                    { Empty = < Empty | NonEmpty : Text >.NonEmpty (_@3 _@1)
                    , NonEmpty =
                        λ(_ : Text) →
                          < Empty | NonEmpty : Text >.NonEmpty
                            "${_@4 _@2}${_@6}${_}"
                    }
                    _
              )
              < Empty | NonEmpty : Text >.Empty
          )

let concat =
      λ(_ : List Text) →
        List/fold Text _ Text (λ(_ : Text) → λ(_ : Text) → "${_@1}${_}") ""

let types =
      { ABI = < GNU | GNUabi64 | GNUeabi | GNUeabihf | GNUspe | MinGw >
      , Arch =
          < AArch
          | Alpha
          | Arm
          | HPPA
          | HPPA64
          | M68k
          | Mips
          | Mips64
          | Mips64El
          | MipsEl
          | MipsIsa32r6
          | MipsIsa32r6El
          | MipsIsa64r6
          | MipsIsa64r6El
          | PowerPC
          | PowerPC64
          | PowerPC64le
          | RISCV64
          | S390x
          | SH4
          | Sparc64
          | X64
          | X86
          >
      , BuildVars =
          { binDirs : List Text
          , buildArch :
              < AArch
              | Alpha
              | Arm
              | HPPA
              | HPPA64
              | M68k
              | Mips
              | Mips64
              | Mips64El
              | MipsEl
              | MipsIsa32r6
              | MipsIsa32r6El
              | MipsIsa64r6
              | MipsIsa64r6El
              | PowerPC
              | PowerPC64
              | PowerPC64le
              | RISCV64
              | S390x
              | SH4
              | Sparc64
              | X64
              | X86
              >
          , buildOS :
              < AIX
              | Android
              | Darwin
              | Dragonfly
              | FreeBSD
              | Haiku
              | Hurd
              | IOS
              | Linux
              | NetBSD
              | NoOs
              | OpenBSD
              | Redox
              | Solaris
              | Windows
              >
          , cpus : Natural
          , currentDir : Text
          , includeDirs : List Text
          , installDir : Text
          , isCross : Bool
          , linkDirs : List Text
          , preloadLibs : List Text
          , shareDirs : List Text
          , static : Bool
          , targetTriple :
              Optional
                { abi :
                    Optional
                      < GNU | GNUabi64 | GNUeabi | GNUeabihf | GNUspe | MinGw >
                , arch :
                    < AArch
                    | Alpha
                    | Arm
                    | HPPA
                    | HPPA64
                    | M68k
                    | Mips
                    | Mips64
                    | Mips64El
                    | MipsEl
                    | MipsIsa32r6
                    | MipsIsa32r6El
                    | MipsIsa64r6
                    | MipsIsa64r6El
                    | PowerPC
                    | PowerPC64
                    | PowerPC64le
                    | RISCV64
                    | S390x
                    | SH4
                    | Sparc64
                    | X64
                    | X86
                    >
                , manufacturer : Optional < Apple | IBM | PC | Unknown >
                , os :
                    < AIX
                    | Android
                    | Darwin
                    | Dragonfly
                    | FreeBSD
                    | Haiku
                    | Hurd
                    | IOS
                    | Linux
                    | NetBSD
                    | NoOs
                    | OpenBSD
                    | Redox
                    | Solaris
                    | Windows
                    >
                }
          }
      , Command =
          < Call :
              { arguments : List Text
              , environment : Optional (List { value : Text, var : Text })
              , procDir : Optional Text
              , program : Text
              }
          | CopyFile : { dest : Text, src : Text }
          | CreateDirectory : { dir : Text }
          | MakeExecutable : { file : Text }
          | Patch : { patchContents : Text }
          | Symlink : { linkName : Text, tgt : Text }
          | SymlinkBinary : { file : Text }
          | SymlinkManpage : { file : Text, section : Natural }
          | Write : { contents : Text, file : Text }
          >
      , Dep =
          { bound :
              < Lower : { lower : List Natural }
              | LowerUpper : { lower : List Natural, upper : List Natural }
              | NoBound
              | Upper : { upper : List Natural }
              >
          , name : Text
          }
      , EnvVar = { value : Text, var : Text }
      , Manufacturer = < Apple | IBM | PC | Unknown >
      , OS =
          < AIX
          | Android
          | Darwin
          | Dragonfly
          | FreeBSD
          | Haiku
          | Hurd
          | IOS
          | Linux
          | NetBSD
          | NoOs
          | OpenBSD
          | Redox
          | Solaris
          | Windows
          >
      , Proc =
          { arguments : List Text
          , environment : Optional (List { value : Text, var : Text })
          , procDir : Optional Text
          , program : Text
          }
      , TargetTriple =
          { abi :
              Optional < GNU | GNUabi64 | GNUeabi | GNUeabihf | GNUspe | MinGw >
          , arch :
              < AArch
              | Alpha
              | Arm
              | HPPA
              | HPPA64
              | M68k
              | Mips
              | Mips64
              | Mips64El
              | MipsEl
              | MipsIsa32r6
              | MipsIsa32r6El
              | MipsIsa64r6
              | MipsIsa64r6El
              | PowerPC
              | PowerPC64
              | PowerPC64le
              | RISCV64
              | S390x
              | SH4
              | Sparc64
              | X64
              | X86
              >
          , manufacturer : Optional < Apple | IBM | PC | Unknown >
          , os :
              < AIX
              | Android
              | Darwin
              | Dragonfly
              | FreeBSD
              | Haiku
              | Hurd
              | IOS
              | Linux
              | NetBSD
              | NoOs
              | OpenBSD
              | Redox
              | Solaris
              | Windows
              >
          }
      , VersionBound =
          < Lower : { lower : List Natural }
          | LowerUpper : { lower : List Natural, upper : List Natural }
          | NoBound
          | Upper : { upper : List Natural }
          >
      }

let prelude =
      { archCfg =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            merge
              { None = cfg.buildArch
              , Some =
                  λ ( tgt
                    : { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                    ) →
                    tgt.arch
              }
              cfg.targetTriple
      , autogenConfigure =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [] : List Text
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.shareDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/aclocal:${_@1}/autoconf"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/aclocal:${_@2}/autoconf:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "ACLOCAL_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = None Text
                , program = "./autogen.sh"
                }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                    ( if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  λ(x : List Text) → [ "configure" ] # x
                      else  λ(x : List Text) → x
                    )
                      ( merge
                          { None = [ "--prefix=${cfg.installDir}" ]
                          , Some =
                              λ(x : Text) → [ "--prefix=${cfg.installDir}", x ]
                          }
                          ( merge
                              { None = None Text
                              , Some =
                                  λ ( _
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    Some
                                      "--host=${merge
                                                  { AArch = "aarch64"
                                                  , Alpha = "alpha"
                                                  , Arm = "arm"
                                                  , HPPA = "hppa"
                                                  , HPPA64 = "hppa64"
                                                  , M68k = "m68k"
                                                  , Mips = "mips"
                                                  , Mips64 = "mips64"
                                                  , Mips64El = "mips64el"
                                                  , MipsEl = "mipsel"
                                                  , MipsIsa32r6 = "mipsisa32r6"
                                                  , MipsIsa32r6El =
                                                      "mipsisa32r6el"
                                                  , MipsIsa64r6 = "mipsisa64r6"
                                                  , MipsIsa64r6El =
                                                      "mipsisa64r6el"
                                                  , PowerPC = "powerpc"
                                                  , PowerPC64 = "powerpc64"
                                                  , PowerPC64le = "powerpc64le"
                                                  , RISCV64 = "riscv64"
                                                  , S390x = "s390x"
                                                  , SH4 = "sh4"
                                                  , Sparc64 = "sparc64"
                                                  , X64 = "x86_64"
                                                  , X86 = "i686"
                                                  }
                                                  _.arch}-${merge
                                                              { AIX = "aix"
                                                              , Android =
                                                                  "android"
                                                              , Darwin =
                                                                  "darwin"
                                                              , Dragonfly =
                                                                  "dragonfly"
                                                              , FreeBSD =
                                                                  "freebsd"
                                                              , Haiku = "haiku"
                                                              , Hurd = "hurd"
                                                              , IOS = "darwin"
                                                              , Linux = "linux"
                                                              , NetBSD =
                                                                  "netbsd"
                                                              , NoOs = "none"
                                                              , OpenBSD =
                                                                  "openbsd"
                                                              , Redox = "redox"
                                                              , Solaris =
                                                                  "solaris"
                                                              , Windows = "w64"
                                                              }
                                                              _.os}${merge
                                                                       { None =
                                                                           ""
                                                                       , Some =
                                                                           λ ( abi
                                                                             : < GNU
                                                                               | GNUabi64
                                                                               | GNUeabi
                                                                               | GNUeabihf
                                                                               | GNUspe
                                                                               | MinGw
                                                                               >
                                                                             ) →
                                                                             "-${merge
                                                                                   { GNU =
                                                                                       "gnu"
                                                                                   , GNUabi64 =
                                                                                       "gnuabi64"
                                                                                   , GNUeabi =
                                                                                       "gnueabi"
                                                                                   , GNUeabihf =
                                                                                       "gnueabihf"
                                                                                   , GNUspe =
                                                                                       "gnuspe"
                                                                                   , MinGw =
                                                                                       "mingw32"
                                                                                   }
                                                                                   abi}"
                                                                       }
                                                                       _.abi}"
                              }
                              cfg.targetTriple
                          )
                      )
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_RUN_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        ]
                    )
                , procDir = None Text
                , program =
                    if    merge
                            { AIX = False
                            , Android = False
                            , Darwin = True
                            , Dragonfly = False
                            , FreeBSD = False
                            , Haiku = False
                            , Hurd = False
                            , IOS = False
                            , Linux = False
                            , NetBSD = False
                            , NoOs = False
                            , OpenBSD = False
                            , Redox = False
                            , Solaris = False
                            , Windows = False
                            }
                            cfg.buildOS
                    then  "sh"
                    else  "./configure"
                }
            ]
      , buildEnv =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              ( if    merge
                        { AIX = True
                        , Android = True
                        , Darwin = True
                        , Dragonfly = True
                        , FreeBSD = True
                        , Haiku = False
                        , Hurd = True
                        , IOS = True
                        , Linux = True
                        , NetBSD = True
                        , NoOs = False
                        , OpenBSD = True
                        , Redox = False
                        , Solaris = True
                        , Windows = False
                        }
                        cfg.buildOS
                then  [ { value =
                            "${List/fold
                                 Text
                                 cfg.binDirs
                                 Text
                                 (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                        , var = "PATH"
                        }
                      ]
                else  [] : List { value : Text, var : Text }
              )
            # [ { value =
                    merge
                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                      ( List/fold
                          Text
                          (cfg.shareDirs # cfg.linkDirs)
                          < Empty | NonEmpty : Text >
                          ( λ(_ : Text) →
                            λ(_ : < Empty | NonEmpty : Text >) →
                              merge
                                { Empty =
                                    < Empty | NonEmpty : Text >.NonEmpty
                                      "${_@1}/pkgconfig"
                                , NonEmpty =
                                    λ(_ : Text) →
                                      < Empty | NonEmpty : Text >.NonEmpty
                                        "${_@2}/pkgconfig:${_}"
                                }
                                _
                          )
                          < Empty | NonEmpty : Text >.Empty
                      )
                , var = "PKG_CONFIG_PATH"
                }
              , { value =
                    merge
                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                      ( List/fold
                          Text
                          cfg.linkDirs
                          < Empty | NonEmpty : Text >
                          ( λ(_ : Text) →
                            λ(_ : < Empty | NonEmpty : Text >) →
                              merge
                                { Empty =
                                    < Empty | NonEmpty : Text >.NonEmpty
                                      "${_@1}/site_perl/5.30.2/${merge
                                                                   { AArch =
                                                                       "aarch64"
                                                                   , Alpha =
                                                                       "alpha"
                                                                   , Arm = "arm"
                                                                   , HPPA =
                                                                       "hppa"
                                                                   , HPPA64 =
                                                                       "hppa64"
                                                                   , M68k =
                                                                       "m68k"
                                                                   , Mips =
                                                                       "mips"
                                                                   , Mips64 =
                                                                       "mips64"
                                                                   , Mips64El =
                                                                       "mips64el"
                                                                   , MipsEl =
                                                                       "mipsel"
                                                                   , MipsIsa32r6 =
                                                                       "mipsisa32r6"
                                                                   , MipsIsa32r6El =
                                                                       "mipsisa32r6el"
                                                                   , MipsIsa64r6 =
                                                                       "mipsisa64r6"
                                                                   , MipsIsa64r6El =
                                                                       "mipsisa64r6el"
                                                                   , PowerPC =
                                                                       "powerpc"
                                                                   , PowerPC64 =
                                                                       "powerpc64"
                                                                   , PowerPC64le =
                                                                       "powerpc64le"
                                                                   , RISCV64 =
                                                                       "riscv64"
                                                                   , S390x =
                                                                       "s390x"
                                                                   , SH4 = "sh4"
                                                                   , Sparc64 =
                                                                       "sparc64"
                                                                   , X64 =
                                                                       "x86_64"
                                                                   , X86 =
                                                                       "i686"
                                                                   }
                                                                   cfg.buildArch}-${merge
                                                                                      { AIX =
                                                                                          "aix"
                                                                                      , Android =
                                                                                          "android"
                                                                                      , Darwin =
                                                                                          "darwin"
                                                                                      , Dragonfly =
                                                                                          "dragonfly"
                                                                                      , FreeBSD =
                                                                                          "freebsd"
                                                                                      , Haiku =
                                                                                          "haiku"
                                                                                      , Hurd =
                                                                                          "hurd"
                                                                                      , IOS =
                                                                                          "darwin"
                                                                                      , Linux =
                                                                                          "linux"
                                                                                      , NetBSD =
                                                                                          "netbsd"
                                                                                      , NoOs =
                                                                                          "none"
                                                                                      , OpenBSD =
                                                                                          "openbsd"
                                                                                      , Redox =
                                                                                          "redox"
                                                                                      , Solaris =
                                                                                          "solaris"
                                                                                      , Windows =
                                                                                          "w64"
                                                                                      }
                                                                                      cfg.buildOS}/"
                                , NonEmpty =
                                    λ(_ : Text) →
                                      < Empty | NonEmpty : Text >.NonEmpty
                                        "${_@2}/site_perl/5.30.2/${merge
                                                                     { AArch =
                                                                         "aarch64"
                                                                     , Alpha =
                                                                         "alpha"
                                                                     , Arm =
                                                                         "arm"
                                                                     , HPPA =
                                                                         "hppa"
                                                                     , HPPA64 =
                                                                         "hppa64"
                                                                     , M68k =
                                                                         "m68k"
                                                                     , Mips =
                                                                         "mips"
                                                                     , Mips64 =
                                                                         "mips64"
                                                                     , Mips64El =
                                                                         "mips64el"
                                                                     , MipsEl =
                                                                         "mipsel"
                                                                     , MipsIsa32r6 =
                                                                         "mipsisa32r6"
                                                                     , MipsIsa32r6El =
                                                                         "mipsisa32r6el"
                                                                     , MipsIsa64r6 =
                                                                         "mipsisa64r6"
                                                                     , MipsIsa64r6El =
                                                                         "mipsisa64r6el"
                                                                     , PowerPC =
                                                                         "powerpc"
                                                                     , PowerPC64 =
                                                                         "powerpc64"
                                                                     , PowerPC64le =
                                                                         "powerpc64le"
                                                                     , RISCV64 =
                                                                         "riscv64"
                                                                     , S390x =
                                                                         "s390x"
                                                                     , SH4 =
                                                                         "sh4"
                                                                     , Sparc64 =
                                                                         "sparc64"
                                                                     , X64 =
                                                                         "x86_64"
                                                                     , X86 =
                                                                         "i686"
                                                                     }
                                                                     cfg.buildArch}-${merge
                                                                                        { AIX =
                                                                                            "aix"
                                                                                        , Android =
                                                                                            "android"
                                                                                        , Darwin =
                                                                                            "darwin"
                                                                                        , Dragonfly =
                                                                                            "dragonfly"
                                                                                        , FreeBSD =
                                                                                            "freebsd"
                                                                                        , Haiku =
                                                                                            "haiku"
                                                                                        , Hurd =
                                                                                            "hurd"
                                                                                        , IOS =
                                                                                            "darwin"
                                                                                        , Linux =
                                                                                            "linux"
                                                                                        , NetBSD =
                                                                                            "netbsd"
                                                                                        , NoOs =
                                                                                            "none"
                                                                                        , OpenBSD =
                                                                                            "openbsd"
                                                                                        , Redox =
                                                                                            "redox"
                                                                                        , Solaris =
                                                                                            "solaris"
                                                                                        , Windows =
                                                                                            "w64"
                                                                                        }
                                                                                        cfg.buildOS}/:${_}"
                                }
                                _
                          )
                          < Empty | NonEmpty : Text >.Empty
                      )
                , var = "PERL5LIB"
                }
              , { value =
                    merge
                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                      ( List/fold
                          Text
                          cfg.linkDirs
                          < Empty | NonEmpty : Text >
                          ( λ(_ : Text) →
                            λ(_ : < Empty | NonEmpty : Text >) →
                              merge
                                { Empty =
                                    < Empty | NonEmpty : Text >.NonEmpty _@1
                                , NonEmpty =
                                    λ(_ : Text) →
                                      < Empty | NonEmpty : Text >.NonEmpty
                                        "${_@2}:${_}"
                                }
                                _
                          )
                          < Empty | NonEmpty : Text >.Empty
                      )
                , var = "LD_LIBRARY_PATH"
                }
              , { value =
                    "${merge
                         { Empty = "", NonEmpty = λ(_ : Text) → _ }
                         ( List/fold
                             Text
                             cfg.linkDirs
                             < Empty | NonEmpty : Text >
                             ( λ(_ : Text) →
                               λ(_ : < Empty | NonEmpty : Text >) →
                                 merge
                                   { Empty =
                                       < Empty | NonEmpty : Text >.NonEmpty
                                         "-L${_@1}"
                                   , NonEmpty =
                                       λ(_ : Text) →
                                         < Empty | NonEmpty : Text >.NonEmpty
                                           "-L${_@2} ${_}"
                                   }
                                   _
                             )
                             < Empty | NonEmpty : Text >.Empty
                         )}${List/fold
                               Text
                               cfg.linkDirs
                               Text
                               ( λ(_ : Text) →
                                 λ(_ : Text) →
                                   "${if    merge
                                              { AIX = False
                                              , Android = False
                                              , Darwin = True
                                              , Dragonfly = False
                                              , FreeBSD = False
                                              , Haiku = False
                                              , Hurd = False
                                              , IOS = False
                                              , Linux = False
                                              , NetBSD = False
                                              , NoOs = False
                                              , OpenBSD = False
                                              , Redox = False
                                              , Solaris = False
                                              , Windows = False
                                              }
                                              cfg.buildOS
                                      then  ""
                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                               )
                               ""}"
                , var = "LDFLAGS"
                }
              ]
      , buildWith =
          λ(envs : List { value : Text, var : Text }) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [ "-j${Natural/show cfg.cpus}" ]
                , environment = Some envs
                , procDir = None Text
                , program =
                    merge
                      { AIX = "make"
                      , Android = "make"
                      , Darwin = "make"
                      , Dragonfly = "gmake"
                      , FreeBSD = "gmake"
                      , Haiku = "make"
                      , Hurd = "make"
                      , IOS = "make"
                      , Linux = "make"
                      , NetBSD = "gmake"
                      , NoOs = "make"
                      , OpenBSD = "gmake"
                      , Redox = "make"
                      , Solaris = "gmake"
                      , Windows = "make"
                      }
                      cfg.buildOS
                }
            ]
      , call =
          < Call :
              { arguments : List Text
              , environment : Optional (List { value : Text, var : Text })
              , procDir : Optional Text
              , program : Text
              }
          | CopyFile : { dest : Text, src : Text }
          | CreateDirectory : { dir : Text }
          | MakeExecutable : { file : Text }
          | Patch : { patchContents : Text }
          | Symlink : { linkName : Text, tgt : Text }
          | SymlinkBinary : { file : Text }
          | SymlinkManpage : { file : Text, section : Natural }
          | Write : { contents : Text, file : Text }
          >.Call
      , cmakeBuild =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                  [ "--build"
                  , "."
                  , "--config"
                  , "Release"
                  , "--"
                  , "-j"
                  , Natural/show cfg.cpus
                  ]
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.includeDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "CMAKE_INCLUDE_PATH"
                          }
                        , { value =
                              ( if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              ).value
                          , var = "CMAKE_LIBRARY_PATH"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = Some "build"
                , program = "cmake"
                }
            ]
      , cmakeConfigure =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "build" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                      [ "../"
                      , "-DCMAKE_INSTALL_PREFIX:PATH=${cfg.installDir}"
                      , "-DCMAKE_MAKE_PROGRAM=${merge
                                                  { AIX = "make"
                                                  , Android = "make"
                                                  , Darwin = "make"
                                                  , Dragonfly = "gmake"
                                                  , FreeBSD = "gmake"
                                                  , Haiku = "make"
                                                  , Hurd = "make"
                                                  , IOS = "make"
                                                  , Linux = "make"
                                                  , NetBSD = "gmake"
                                                  , NoOs = "make"
                                                  , OpenBSD = "gmake"
                                                  , Redox = "make"
                                                  , Solaris = "gmake"
                                                  , Windows = "make"
                                                  }
                                                  cfg.buildOS}"
                      ]
                    # merge
                        { None =
                          [ "-DCMAKE_C_COMPILER=gcc"
                          , "-DCMAKE_CXX_COMPILER=g++"
                          ]
                        , Some =
                            λ ( tgt
                              : { abi :
                                    Optional
                                      < GNU
                                      | GNUabi64
                                      | GNUeabi
                                      | GNUeabihf
                                      | GNUspe
                                      | MinGw
                                      >
                                , arch :
                                    < AArch
                                    | Alpha
                                    | Arm
                                    | HPPA
                                    | HPPA64
                                    | M68k
                                    | Mips
                                    | Mips64
                                    | Mips64El
                                    | MipsEl
                                    | MipsIsa32r6
                                    | MipsIsa32r6El
                                    | MipsIsa64r6
                                    | MipsIsa64r6El
                                    | PowerPC
                                    | PowerPC64
                                    | PowerPC64le
                                    | RISCV64
                                    | S390x
                                    | SH4
                                    | Sparc64
                                    | X64
                                    | X86
                                    >
                                , manufacturer :
                                    Optional < Apple | IBM | PC | Unknown >
                                , os :
                                    < AIX
                                    | Android
                                    | Darwin
                                    | Dragonfly
                                    | FreeBSD
                                    | Haiku
                                    | Hurd
                                    | IOS
                                    | Linux
                                    | NetBSD
                                    | NoOs
                                    | OpenBSD
                                    | Redox
                                    | Solaris
                                    | Windows
                                    >
                                }
                              ) →
                              [ "-DCMAKE_C_COMPILER=${merge
                                                        { AArch = "aarch64"
                                                        , Alpha = "alpha"
                                                        , Arm = "arm"
                                                        , HPPA = "hppa"
                                                        , HPPA64 = "hppa64"
                                                        , M68k = "m68k"
                                                        , Mips = "mips"
                                                        , Mips64 = "mips64"
                                                        , Mips64El = "mips64el"
                                                        , MipsEl = "mipsel"
                                                        , MipsIsa32r6 =
                                                            "mipsisa32r6"
                                                        , MipsIsa32r6El =
                                                            "mipsisa32r6el"
                                                        , MipsIsa64r6 =
                                                            "mipsisa64r6"
                                                        , MipsIsa64r6El =
                                                            "mipsisa64r6el"
                                                        , PowerPC = "powerpc"
                                                        , PowerPC64 =
                                                            "powerpc64"
                                                        , PowerPC64le =
                                                            "powerpc64le"
                                                        , RISCV64 = "riscv64"
                                                        , S390x = "s390x"
                                                        , SH4 = "sh4"
                                                        , Sparc64 = "sparc64"
                                                        , X64 = "x86_64"
                                                        , X86 = "i686"
                                                        }
                                                        tgt.arch}-${merge
                                                                      { AIX =
                                                                          "aix"
                                                                      , Android =
                                                                          "android"
                                                                      , Darwin =
                                                                          "darwin"
                                                                      , Dragonfly =
                                                                          "dragonfly"
                                                                      , FreeBSD =
                                                                          "freebsd"
                                                                      , Haiku =
                                                                          "haiku"
                                                                      , Hurd =
                                                                          "hurd"
                                                                      , IOS =
                                                                          "darwin"
                                                                      , Linux =
                                                                          "linux"
                                                                      , NetBSD =
                                                                          "netbsd"
                                                                      , NoOs =
                                                                          "none"
                                                                      , OpenBSD =
                                                                          "openbsd"
                                                                      , Redox =
                                                                          "redox"
                                                                      , Solaris =
                                                                          "solaris"
                                                                      , Windows =
                                                                          "w64"
                                                                      }
                                                                      tgt.os}${merge
                                                                                 { None =
                                                                                     ""
                                                                                 , Some =
                                                                                     λ ( abi
                                                                                       : < GNU
                                                                                         | GNUabi64
                                                                                         | GNUeabi
                                                                                         | GNUeabihf
                                                                                         | GNUspe
                                                                                         | MinGw
                                                                                         >
                                                                                       ) →
                                                                                       "-${merge
                                                                                             { GNU =
                                                                                                 "gnu"
                                                                                             , GNUabi64 =
                                                                                                 "gnuabi64"
                                                                                             , GNUeabi =
                                                                                                 "gnueabi"
                                                                                             , GNUeabihf =
                                                                                                 "gnueabihf"
                                                                                             , GNUspe =
                                                                                                 "gnuspe"
                                                                                             , MinGw =
                                                                                                 "mingw32"
                                                                                             }
                                                                                             abi}"
                                                                                 }
                                                                                 tgt.abi}-gcc"
                              , "-DCMAKE_CXX_COMPILER=${merge
                                                          { AArch = "aarch64"
                                                          , Alpha = "alpha"
                                                          , Arm = "arm"
                                                          , HPPA = "hppa"
                                                          , HPPA64 = "hppa64"
                                                          , M68k = "m68k"
                                                          , Mips = "mips"
                                                          , Mips64 = "mips64"
                                                          , Mips64El =
                                                              "mips64el"
                                                          , MipsEl = "mipsel"
                                                          , MipsIsa32r6 =
                                                              "mipsisa32r6"
                                                          , MipsIsa32r6El =
                                                              "mipsisa32r6el"
                                                          , MipsIsa64r6 =
                                                              "mipsisa64r6"
                                                          , MipsIsa64r6El =
                                                              "mipsisa64r6el"
                                                          , PowerPC = "powerpc"
                                                          , PowerPC64 =
                                                              "powerpc64"
                                                          , PowerPC64le =
                                                              "powerpc64le"
                                                          , RISCV64 = "riscv64"
                                                          , S390x = "s390x"
                                                          , SH4 = "sh4"
                                                          , Sparc64 = "sparc64"
                                                          , X64 = "x86_64"
                                                          , X86 = "i686"
                                                          }
                                                          tgt.arch}-${merge
                                                                        { AIX =
                                                                            "aix"
                                                                        , Android =
                                                                            "android"
                                                                        , Darwin =
                                                                            "darwin"
                                                                        , Dragonfly =
                                                                            "dragonfly"
                                                                        , FreeBSD =
                                                                            "freebsd"
                                                                        , Haiku =
                                                                            "haiku"
                                                                        , Hurd =
                                                                            "hurd"
                                                                        , IOS =
                                                                            "darwin"
                                                                        , Linux =
                                                                            "linux"
                                                                        , NetBSD =
                                                                            "netbsd"
                                                                        , NoOs =
                                                                            "none"
                                                                        , OpenBSD =
                                                                            "openbsd"
                                                                        , Redox =
                                                                            "redox"
                                                                        , Solaris =
                                                                            "solaris"
                                                                        , Windows =
                                                                            "w64"
                                                                        }
                                                                        tgt.os}${merge
                                                                                   { None =
                                                                                       ""
                                                                                   , Some =
                                                                                       λ ( abi
                                                                                         : < GNU
                                                                                           | GNUabi64
                                                                                           | GNUeabi
                                                                                           | GNUeabihf
                                                                                           | GNUspe
                                                                                           | MinGw
                                                                                           >
                                                                                         ) →
                                                                                         "-${merge
                                                                                               { GNU =
                                                                                                   "gnu"
                                                                                               , GNUabi64 =
                                                                                                   "gnuabi64"
                                                                                               , GNUeabi =
                                                                                                   "gnueabi"
                                                                                               , GNUeabihf =
                                                                                                   "gnueabihf"
                                                                                               , GNUspe =
                                                                                                   "gnuspe"
                                                                                               , MinGw =
                                                                                                   "mingw32"
                                                                                               }
                                                                                               abi}"
                                                                                   }
                                                                                   tgt.abi}-g++"
                              ]
                        }
                        cfg.targetTriple
                    # merge
                        { None = [] : List Text
                        , Some =
                            λ ( tgt
                              : { abi :
                                    Optional
                                      < GNU
                                      | GNUabi64
                                      | GNUeabi
                                      | GNUeabihf
                                      | GNUspe
                                      | MinGw
                                      >
                                , arch :
                                    < AArch
                                    | Alpha
                                    | Arm
                                    | HPPA
                                    | HPPA64
                                    | M68k
                                    | Mips
                                    | Mips64
                                    | Mips64El
                                    | MipsEl
                                    | MipsIsa32r6
                                    | MipsIsa32r6El
                                    | MipsIsa64r6
                                    | MipsIsa64r6El
                                    | PowerPC
                                    | PowerPC64
                                    | PowerPC64le
                                    | RISCV64
                                    | S390x
                                    | SH4
                                    | Sparc64
                                    | X64
                                    | X86
                                    >
                                , manufacturer :
                                    Optional < Apple | IBM | PC | Unknown >
                                , os :
                                    < AIX
                                    | Android
                                    | Darwin
                                    | Dragonfly
                                    | FreeBSD
                                    | Haiku
                                    | Hurd
                                    | IOS
                                    | Linux
                                    | NetBSD
                                    | NoOs
                                    | OpenBSD
                                    | Redox
                                    | Solaris
                                    | Windows
                                    >
                                }
                              ) →
                              [ "-DCMAKE_SYSTEM_NAME=${merge
                                                         { AIX = "AIX"
                                                         , Android = "Android"
                                                         , Darwin = "Darwin"
                                                         , Dragonfly = "BSD"
                                                         , FreeBSD = "BSD"
                                                         , Haiku = "Haiku"
                                                         , Hurd = "Hurd"
                                                         , IOS = "Darwin"
                                                         , Linux = "Linux"
                                                         , NetBSD = "BSD"
                                                         , NoOs = "Generic"
                                                         , OpenBSD = "BSD"
                                                         , Redox = "Redox"
                                                         , Solaris = "Solaris"
                                                         , Windows = "Windows"
                                                         }
                                                         tgt.os}"
                              ]
                        }
                        cfg.targetTriple
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.includeDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "CMAKE_INCLUDE_PATH"
                          }
                        , { value =
                              ( if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              ).value
                          , var = "CMAKE_LIBRARY_PATH"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = Some "build"
                , program = "cmake"
                }
            ]
      , cmakeConfigureGeneral =
          λ ( envVars
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              } →
                Optional (List { value : Text, var : Text })
            ) →
          λ(flags : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "build" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                      [ "../"
                      , "-DCMAKE_INSTALL_PREFIX:PATH=${cfg.installDir}"
                      , "-DCMAKE_MAKE_PROGRAM=${merge
                                                  { AIX = "make"
                                                  , Android = "make"
                                                  , Darwin = "make"
                                                  , Dragonfly = "gmake"
                                                  , FreeBSD = "gmake"
                                                  , Haiku = "make"
                                                  , Hurd = "make"
                                                  , IOS = "make"
                                                  , Linux = "make"
                                                  , NetBSD = "gmake"
                                                  , NoOs = "make"
                                                  , OpenBSD = "gmake"
                                                  , Redox = "make"
                                                  , Solaris = "gmake"
                                                  , Windows = "make"
                                                  }
                                                  cfg.buildOS}"
                      ]
                    # merge
                        { None =
                          [ "-DCMAKE_C_COMPILER=gcc"
                          , "-DCMAKE_CXX_COMPILER=g++"
                          ]
                        , Some =
                            λ ( tgt
                              : { abi :
                                    Optional
                                      < GNU
                                      | GNUabi64
                                      | GNUeabi
                                      | GNUeabihf
                                      | GNUspe
                                      | MinGw
                                      >
                                , arch :
                                    < AArch
                                    | Alpha
                                    | Arm
                                    | HPPA
                                    | HPPA64
                                    | M68k
                                    | Mips
                                    | Mips64
                                    | Mips64El
                                    | MipsEl
                                    | MipsIsa32r6
                                    | MipsIsa32r6El
                                    | MipsIsa64r6
                                    | MipsIsa64r6El
                                    | PowerPC
                                    | PowerPC64
                                    | PowerPC64le
                                    | RISCV64
                                    | S390x
                                    | SH4
                                    | Sparc64
                                    | X64
                                    | X86
                                    >
                                , manufacturer :
                                    Optional < Apple | IBM | PC | Unknown >
                                , os :
                                    < AIX
                                    | Android
                                    | Darwin
                                    | Dragonfly
                                    | FreeBSD
                                    | Haiku
                                    | Hurd
                                    | IOS
                                    | Linux
                                    | NetBSD
                                    | NoOs
                                    | OpenBSD
                                    | Redox
                                    | Solaris
                                    | Windows
                                    >
                                }
                              ) →
                              [ "-DCMAKE_C_COMPILER=${merge
                                                        { AArch = "aarch64"
                                                        , Alpha = "alpha"
                                                        , Arm = "arm"
                                                        , HPPA = "hppa"
                                                        , HPPA64 = "hppa64"
                                                        , M68k = "m68k"
                                                        , Mips = "mips"
                                                        , Mips64 = "mips64"
                                                        , Mips64El = "mips64el"
                                                        , MipsEl = "mipsel"
                                                        , MipsIsa32r6 =
                                                            "mipsisa32r6"
                                                        , MipsIsa32r6El =
                                                            "mipsisa32r6el"
                                                        , MipsIsa64r6 =
                                                            "mipsisa64r6"
                                                        , MipsIsa64r6El =
                                                            "mipsisa64r6el"
                                                        , PowerPC = "powerpc"
                                                        , PowerPC64 =
                                                            "powerpc64"
                                                        , PowerPC64le =
                                                            "powerpc64le"
                                                        , RISCV64 = "riscv64"
                                                        , S390x = "s390x"
                                                        , SH4 = "sh4"
                                                        , Sparc64 = "sparc64"
                                                        , X64 = "x86_64"
                                                        , X86 = "i686"
                                                        }
                                                        tgt.arch}-${merge
                                                                      { AIX =
                                                                          "aix"
                                                                      , Android =
                                                                          "android"
                                                                      , Darwin =
                                                                          "darwin"
                                                                      , Dragonfly =
                                                                          "dragonfly"
                                                                      , FreeBSD =
                                                                          "freebsd"
                                                                      , Haiku =
                                                                          "haiku"
                                                                      , Hurd =
                                                                          "hurd"
                                                                      , IOS =
                                                                          "darwin"
                                                                      , Linux =
                                                                          "linux"
                                                                      , NetBSD =
                                                                          "netbsd"
                                                                      , NoOs =
                                                                          "none"
                                                                      , OpenBSD =
                                                                          "openbsd"
                                                                      , Redox =
                                                                          "redox"
                                                                      , Solaris =
                                                                          "solaris"
                                                                      , Windows =
                                                                          "w64"
                                                                      }
                                                                      tgt.os}${merge
                                                                                 { None =
                                                                                     ""
                                                                                 , Some =
                                                                                     λ ( abi
                                                                                       : < GNU
                                                                                         | GNUabi64
                                                                                         | GNUeabi
                                                                                         | GNUeabihf
                                                                                         | GNUspe
                                                                                         | MinGw
                                                                                         >
                                                                                       ) →
                                                                                       "-${merge
                                                                                             { GNU =
                                                                                                 "gnu"
                                                                                             , GNUabi64 =
                                                                                                 "gnuabi64"
                                                                                             , GNUeabi =
                                                                                                 "gnueabi"
                                                                                             , GNUeabihf =
                                                                                                 "gnueabihf"
                                                                                             , GNUspe =
                                                                                                 "gnuspe"
                                                                                             , MinGw =
                                                                                                 "mingw32"
                                                                                             }
                                                                                             abi}"
                                                                                 }
                                                                                 tgt.abi}-gcc"
                              , "-DCMAKE_CXX_COMPILER=${merge
                                                          { AArch = "aarch64"
                                                          , Alpha = "alpha"
                                                          , Arm = "arm"
                                                          , HPPA = "hppa"
                                                          , HPPA64 = "hppa64"
                                                          , M68k = "m68k"
                                                          , Mips = "mips"
                                                          , Mips64 = "mips64"
                                                          , Mips64El =
                                                              "mips64el"
                                                          , MipsEl = "mipsel"
                                                          , MipsIsa32r6 =
                                                              "mipsisa32r6"
                                                          , MipsIsa32r6El =
                                                              "mipsisa32r6el"
                                                          , MipsIsa64r6 =
                                                              "mipsisa64r6"
                                                          , MipsIsa64r6El =
                                                              "mipsisa64r6el"
                                                          , PowerPC = "powerpc"
                                                          , PowerPC64 =
                                                              "powerpc64"
                                                          , PowerPC64le =
                                                              "powerpc64le"
                                                          , RISCV64 = "riscv64"
                                                          , S390x = "s390x"
                                                          , SH4 = "sh4"
                                                          , Sparc64 = "sparc64"
                                                          , X64 = "x86_64"
                                                          , X86 = "i686"
                                                          }
                                                          tgt.arch}-${merge
                                                                        { AIX =
                                                                            "aix"
                                                                        , Android =
                                                                            "android"
                                                                        , Darwin =
                                                                            "darwin"
                                                                        , Dragonfly =
                                                                            "dragonfly"
                                                                        , FreeBSD =
                                                                            "freebsd"
                                                                        , Haiku =
                                                                            "haiku"
                                                                        , Hurd =
                                                                            "hurd"
                                                                        , IOS =
                                                                            "darwin"
                                                                        , Linux =
                                                                            "linux"
                                                                        , NetBSD =
                                                                            "netbsd"
                                                                        , NoOs =
                                                                            "none"
                                                                        , OpenBSD =
                                                                            "openbsd"
                                                                        , Redox =
                                                                            "redox"
                                                                        , Solaris =
                                                                            "solaris"
                                                                        , Windows =
                                                                            "w64"
                                                                        }
                                                                        tgt.os}${merge
                                                                                   { None =
                                                                                       ""
                                                                                   , Some =
                                                                                       λ ( abi
                                                                                         : < GNU
                                                                                           | GNUabi64
                                                                                           | GNUeabi
                                                                                           | GNUeabihf
                                                                                           | GNUspe
                                                                                           | MinGw
                                                                                           >
                                                                                         ) →
                                                                                         "-${merge
                                                                                               { GNU =
                                                                                                   "gnu"
                                                                                               , GNUabi64 =
                                                                                                   "gnuabi64"
                                                                                               , GNUeabi =
                                                                                                   "gnueabi"
                                                                                               , GNUeabihf =
                                                                                                   "gnueabihf"
                                                                                               , GNUspe =
                                                                                                   "gnuspe"
                                                                                               , MinGw =
                                                                                                   "mingw32"
                                                                                               }
                                                                                               abi}"
                                                                                   }
                                                                                   tgt.abi}-g++"
                              ]
                        }
                        cfg.targetTriple
                    # merge
                        { None = [] : List Text
                        , Some =
                            λ ( tgt
                              : { abi :
                                    Optional
                                      < GNU
                                      | GNUabi64
                                      | GNUeabi
                                      | GNUeabihf
                                      | GNUspe
                                      | MinGw
                                      >
                                , arch :
                                    < AArch
                                    | Alpha
                                    | Arm
                                    | HPPA
                                    | HPPA64
                                    | M68k
                                    | Mips
                                    | Mips64
                                    | Mips64El
                                    | MipsEl
                                    | MipsIsa32r6
                                    | MipsIsa32r6El
                                    | MipsIsa64r6
                                    | MipsIsa64r6El
                                    | PowerPC
                                    | PowerPC64
                                    | PowerPC64le
                                    | RISCV64
                                    | S390x
                                    | SH4
                                    | Sparc64
                                    | X64
                                    | X86
                                    >
                                , manufacturer :
                                    Optional < Apple | IBM | PC | Unknown >
                                , os :
                                    < AIX
                                    | Android
                                    | Darwin
                                    | Dragonfly
                                    | FreeBSD
                                    | Haiku
                                    | Hurd
                                    | IOS
                                    | Linux
                                    | NetBSD
                                    | NoOs
                                    | OpenBSD
                                    | Redox
                                    | Solaris
                                    | Windows
                                    >
                                }
                              ) →
                              [ "-DCMAKE_SYSTEM_NAME=${merge
                                                         { AIX = "AIX"
                                                         , Android = "Android"
                                                         , Darwin = "Darwin"
                                                         , Dragonfly = "BSD"
                                                         , FreeBSD = "BSD"
                                                         , Haiku = "Haiku"
                                                         , Hurd = "Hurd"
                                                         , IOS = "Darwin"
                                                         , Linux = "Linux"
                                                         , NetBSD = "BSD"
                                                         , NoOs = "Generic"
                                                         , OpenBSD = "BSD"
                                                         , Redox = "Redox"
                                                         , Solaris = "Solaris"
                                                         , Windows = "Windows"
                                                         }
                                                         tgt.os}"
                              ]
                        }
                        cfg.targetTriple
                    # flags
                , environment = envVars cfg
                , procDir = Some "build"
                , program = "cmake"
                }
            ]
      , cmakeConfigureNinja =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "build" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                      [ "../"
                      , "-DCMAKE_INSTALL_PREFIX:PATH=${cfg.installDir}"
                      , "-G"
                      , "Ninja"
                      ]
                    # merge
                        { None = [] : List Text
                        , Some =
                            λ ( tgt
                              : { abi :
                                    Optional
                                      < GNU
                                      | GNUabi64
                                      | GNUeabi
                                      | GNUeabihf
                                      | GNUspe
                                      | MinGw
                                      >
                                , arch :
                                    < AArch
                                    | Alpha
                                    | Arm
                                    | HPPA
                                    | HPPA64
                                    | M68k
                                    | Mips
                                    | Mips64
                                    | Mips64El
                                    | MipsEl
                                    | MipsIsa32r6
                                    | MipsIsa32r6El
                                    | MipsIsa64r6
                                    | MipsIsa64r6El
                                    | PowerPC
                                    | PowerPC64
                                    | PowerPC64le
                                    | RISCV64
                                    | S390x
                                    | SH4
                                    | Sparc64
                                    | X64
                                    | X86
                                    >
                                , manufacturer :
                                    Optional < Apple | IBM | PC | Unknown >
                                , os :
                                    < AIX
                                    | Android
                                    | Darwin
                                    | Dragonfly
                                    | FreeBSD
                                    | Haiku
                                    | Hurd
                                    | IOS
                                    | Linux
                                    | NetBSD
                                    | NoOs
                                    | OpenBSD
                                    | Redox
                                    | Solaris
                                    | Windows
                                    >
                                }
                              ) →
                              [ "-DCMAKE_C_COMPILER=${merge
                                                        { AArch = "aarch64"
                                                        , Alpha = "alpha"
                                                        , Arm = "arm"
                                                        , HPPA = "hppa"
                                                        , HPPA64 = "hppa64"
                                                        , M68k = "m68k"
                                                        , Mips = "mips"
                                                        , Mips64 = "mips64"
                                                        , Mips64El = "mips64el"
                                                        , MipsEl = "mipsel"
                                                        , MipsIsa32r6 =
                                                            "mipsisa32r6"
                                                        , MipsIsa32r6El =
                                                            "mipsisa32r6el"
                                                        , MipsIsa64r6 =
                                                            "mipsisa64r6"
                                                        , MipsIsa64r6El =
                                                            "mipsisa64r6el"
                                                        , PowerPC = "powerpc"
                                                        , PowerPC64 =
                                                            "powerpc64"
                                                        , PowerPC64le =
                                                            "powerpc64le"
                                                        , RISCV64 = "riscv64"
                                                        , S390x = "s390x"
                                                        , SH4 = "sh4"
                                                        , Sparc64 = "sparc64"
                                                        , X64 = "x86_64"
                                                        , X86 = "i686"
                                                        }
                                                        tgt.arch}-${merge
                                                                      { AIX =
                                                                          "aix"
                                                                      , Android =
                                                                          "android"
                                                                      , Darwin =
                                                                          "darwin"
                                                                      , Dragonfly =
                                                                          "dragonfly"
                                                                      , FreeBSD =
                                                                          "freebsd"
                                                                      , Haiku =
                                                                          "haiku"
                                                                      , Hurd =
                                                                          "hurd"
                                                                      , IOS =
                                                                          "darwin"
                                                                      , Linux =
                                                                          "linux"
                                                                      , NetBSD =
                                                                          "netbsd"
                                                                      , NoOs =
                                                                          "none"
                                                                      , OpenBSD =
                                                                          "openbsd"
                                                                      , Redox =
                                                                          "redox"
                                                                      , Solaris =
                                                                          "solaris"
                                                                      , Windows =
                                                                          "w64"
                                                                      }
                                                                      tgt.os}${merge
                                                                                 { None =
                                                                                     ""
                                                                                 , Some =
                                                                                     λ ( abi
                                                                                       : < GNU
                                                                                         | GNUabi64
                                                                                         | GNUeabi
                                                                                         | GNUeabihf
                                                                                         | GNUspe
                                                                                         | MinGw
                                                                                         >
                                                                                       ) →
                                                                                       "-${merge
                                                                                             { GNU =
                                                                                                 "gnu"
                                                                                             , GNUabi64 =
                                                                                                 "gnuabi64"
                                                                                             , GNUeabi =
                                                                                                 "gnueabi"
                                                                                             , GNUeabihf =
                                                                                                 "gnueabihf"
                                                                                             , GNUspe =
                                                                                                 "gnuspe"
                                                                                             , MinGw =
                                                                                                 "mingw32"
                                                                                             }
                                                                                             abi}"
                                                                                 }
                                                                                 tgt.abi}-gcc"
                              , "-DCMAKE_CXX_COMPILER=${merge
                                                          { AArch = "aarch64"
                                                          , Alpha = "alpha"
                                                          , Arm = "arm"
                                                          , HPPA = "hppa"
                                                          , HPPA64 = "hppa64"
                                                          , M68k = "m68k"
                                                          , Mips = "mips"
                                                          , Mips64 = "mips64"
                                                          , Mips64El =
                                                              "mips64el"
                                                          , MipsEl = "mipsel"
                                                          , MipsIsa32r6 =
                                                              "mipsisa32r6"
                                                          , MipsIsa32r6El =
                                                              "mipsisa32r6el"
                                                          , MipsIsa64r6 =
                                                              "mipsisa64r6"
                                                          , MipsIsa64r6El =
                                                              "mipsisa64r6el"
                                                          , PowerPC = "powerpc"
                                                          , PowerPC64 =
                                                              "powerpc64"
                                                          , PowerPC64le =
                                                              "powerpc64le"
                                                          , RISCV64 = "riscv64"
                                                          , S390x = "s390x"
                                                          , SH4 = "sh4"
                                                          , Sparc64 = "sparc64"
                                                          , X64 = "x86_64"
                                                          , X86 = "i686"
                                                          }
                                                          tgt.arch}-${merge
                                                                        { AIX =
                                                                            "aix"
                                                                        , Android =
                                                                            "android"
                                                                        , Darwin =
                                                                            "darwin"
                                                                        , Dragonfly =
                                                                            "dragonfly"
                                                                        , FreeBSD =
                                                                            "freebsd"
                                                                        , Haiku =
                                                                            "haiku"
                                                                        , Hurd =
                                                                            "hurd"
                                                                        , IOS =
                                                                            "darwin"
                                                                        , Linux =
                                                                            "linux"
                                                                        , NetBSD =
                                                                            "netbsd"
                                                                        , NoOs =
                                                                            "none"
                                                                        , OpenBSD =
                                                                            "openbsd"
                                                                        , Redox =
                                                                            "redox"
                                                                        , Solaris =
                                                                            "solaris"
                                                                        , Windows =
                                                                            "w64"
                                                                        }
                                                                        tgt.os}${merge
                                                                                   { None =
                                                                                       ""
                                                                                   , Some =
                                                                                       λ ( abi
                                                                                         : < GNU
                                                                                           | GNUabi64
                                                                                           | GNUeabi
                                                                                           | GNUeabihf
                                                                                           | GNUspe
                                                                                           | MinGw
                                                                                           >
                                                                                         ) →
                                                                                         "-${merge
                                                                                               { GNU =
                                                                                                   "gnu"
                                                                                               , GNUabi64 =
                                                                                                   "gnuabi64"
                                                                                               , GNUeabi =
                                                                                                   "gnueabi"
                                                                                               , GNUeabihf =
                                                                                                   "gnueabihf"
                                                                                               , GNUspe =
                                                                                                   "gnuspe"
                                                                                               , MinGw =
                                                                                                   "mingw32"
                                                                                               }
                                                                                               abi}"
                                                                                   }
                                                                                   tgt.abi}-g++"
                              ]
                        }
                        cfg.targetTriple
                    # merge
                        { None = [] : List Text
                        , Some =
                            λ ( tgt
                              : { abi :
                                    Optional
                                      < GNU
                                      | GNUabi64
                                      | GNUeabi
                                      | GNUeabihf
                                      | GNUspe
                                      | MinGw
                                      >
                                , arch :
                                    < AArch
                                    | Alpha
                                    | Arm
                                    | HPPA
                                    | HPPA64
                                    | M68k
                                    | Mips
                                    | Mips64
                                    | Mips64El
                                    | MipsEl
                                    | MipsIsa32r6
                                    | MipsIsa32r6El
                                    | MipsIsa64r6
                                    | MipsIsa64r6El
                                    | PowerPC
                                    | PowerPC64
                                    | PowerPC64le
                                    | RISCV64
                                    | S390x
                                    | SH4
                                    | Sparc64
                                    | X64
                                    | X86
                                    >
                                , manufacturer :
                                    Optional < Apple | IBM | PC | Unknown >
                                , os :
                                    < AIX
                                    | Android
                                    | Darwin
                                    | Dragonfly
                                    | FreeBSD
                                    | Haiku
                                    | Hurd
                                    | IOS
                                    | Linux
                                    | NetBSD
                                    | NoOs
                                    | OpenBSD
                                    | Redox
                                    | Solaris
                                    | Windows
                                    >
                                }
                              ) →
                              [ "-DCMAKE_SYSTEM_NAME=${merge
                                                         { AIX = "AIX"
                                                         , Android = "Android"
                                                         , Darwin = "Darwin"
                                                         , Dragonfly = "BSD"
                                                         , FreeBSD = "BSD"
                                                         , Haiku = "Haiku"
                                                         , Hurd = "Hurd"
                                                         , IOS = "Darwin"
                                                         , Linux = "Linux"
                                                         , NetBSD = "BSD"
                                                         , NoOs = "Generic"
                                                         , OpenBSD = "BSD"
                                                         , Redox = "Redox"
                                                         , Solaris = "Solaris"
                                                         , Windows = "Windows"
                                                         }
                                                         tgt.os}"
                              ]
                        }
                        cfg.targetTriple
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.includeDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "CMAKE_INCLUDE_PATH"
                          }
                        , { value =
                              ( if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              ).value
                          , var = "CMAKE_LIBRARY_PATH"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = Some "build"
                , program = "cmake"
                }
            ]
      , cmakeConfigureWithFlags =
          λ(flags : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "build" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                      [ "../"
                      , "-DCMAKE_INSTALL_PREFIX:PATH=${cfg.installDir}"
                      , "-DCMAKE_MAKE_PROGRAM=${merge
                                                  { AIX = "make"
                                                  , Android = "make"
                                                  , Darwin = "make"
                                                  , Dragonfly = "gmake"
                                                  , FreeBSD = "gmake"
                                                  , Haiku = "make"
                                                  , Hurd = "make"
                                                  , IOS = "make"
                                                  , Linux = "make"
                                                  , NetBSD = "gmake"
                                                  , NoOs = "make"
                                                  , OpenBSD = "gmake"
                                                  , Redox = "make"
                                                  , Solaris = "gmake"
                                                  , Windows = "make"
                                                  }
                                                  cfg.buildOS}"
                      ]
                    # merge
                        { None =
                          [ "-DCMAKE_C_COMPILER=gcc"
                          , "-DCMAKE_CXX_COMPILER=g++"
                          ]
                        , Some =
                            λ ( tgt
                              : { abi :
                                    Optional
                                      < GNU
                                      | GNUabi64
                                      | GNUeabi
                                      | GNUeabihf
                                      | GNUspe
                                      | MinGw
                                      >
                                , arch :
                                    < AArch
                                    | Alpha
                                    | Arm
                                    | HPPA
                                    | HPPA64
                                    | M68k
                                    | Mips
                                    | Mips64
                                    | Mips64El
                                    | MipsEl
                                    | MipsIsa32r6
                                    | MipsIsa32r6El
                                    | MipsIsa64r6
                                    | MipsIsa64r6El
                                    | PowerPC
                                    | PowerPC64
                                    | PowerPC64le
                                    | RISCV64
                                    | S390x
                                    | SH4
                                    | Sparc64
                                    | X64
                                    | X86
                                    >
                                , manufacturer :
                                    Optional < Apple | IBM | PC | Unknown >
                                , os :
                                    < AIX
                                    | Android
                                    | Darwin
                                    | Dragonfly
                                    | FreeBSD
                                    | Haiku
                                    | Hurd
                                    | IOS
                                    | Linux
                                    | NetBSD
                                    | NoOs
                                    | OpenBSD
                                    | Redox
                                    | Solaris
                                    | Windows
                                    >
                                }
                              ) →
                              [ "-DCMAKE_C_COMPILER=${merge
                                                        { AArch = "aarch64"
                                                        , Alpha = "alpha"
                                                        , Arm = "arm"
                                                        , HPPA = "hppa"
                                                        , HPPA64 = "hppa64"
                                                        , M68k = "m68k"
                                                        , Mips = "mips"
                                                        , Mips64 = "mips64"
                                                        , Mips64El = "mips64el"
                                                        , MipsEl = "mipsel"
                                                        , MipsIsa32r6 =
                                                            "mipsisa32r6"
                                                        , MipsIsa32r6El =
                                                            "mipsisa32r6el"
                                                        , MipsIsa64r6 =
                                                            "mipsisa64r6"
                                                        , MipsIsa64r6El =
                                                            "mipsisa64r6el"
                                                        , PowerPC = "powerpc"
                                                        , PowerPC64 =
                                                            "powerpc64"
                                                        , PowerPC64le =
                                                            "powerpc64le"
                                                        , RISCV64 = "riscv64"
                                                        , S390x = "s390x"
                                                        , SH4 = "sh4"
                                                        , Sparc64 = "sparc64"
                                                        , X64 = "x86_64"
                                                        , X86 = "i686"
                                                        }
                                                        tgt.arch}-${merge
                                                                      { AIX =
                                                                          "aix"
                                                                      , Android =
                                                                          "android"
                                                                      , Darwin =
                                                                          "darwin"
                                                                      , Dragonfly =
                                                                          "dragonfly"
                                                                      , FreeBSD =
                                                                          "freebsd"
                                                                      , Haiku =
                                                                          "haiku"
                                                                      , Hurd =
                                                                          "hurd"
                                                                      , IOS =
                                                                          "darwin"
                                                                      , Linux =
                                                                          "linux"
                                                                      , NetBSD =
                                                                          "netbsd"
                                                                      , NoOs =
                                                                          "none"
                                                                      , OpenBSD =
                                                                          "openbsd"
                                                                      , Redox =
                                                                          "redox"
                                                                      , Solaris =
                                                                          "solaris"
                                                                      , Windows =
                                                                          "w64"
                                                                      }
                                                                      tgt.os}${merge
                                                                                 { None =
                                                                                     ""
                                                                                 , Some =
                                                                                     λ ( abi
                                                                                       : < GNU
                                                                                         | GNUabi64
                                                                                         | GNUeabi
                                                                                         | GNUeabihf
                                                                                         | GNUspe
                                                                                         | MinGw
                                                                                         >
                                                                                       ) →
                                                                                       "-${merge
                                                                                             { GNU =
                                                                                                 "gnu"
                                                                                             , GNUabi64 =
                                                                                                 "gnuabi64"
                                                                                             , GNUeabi =
                                                                                                 "gnueabi"
                                                                                             , GNUeabihf =
                                                                                                 "gnueabihf"
                                                                                             , GNUspe =
                                                                                                 "gnuspe"
                                                                                             , MinGw =
                                                                                                 "mingw32"
                                                                                             }
                                                                                             abi}"
                                                                                 }
                                                                                 tgt.abi}-gcc"
                              , "-DCMAKE_CXX_COMPILER=${merge
                                                          { AArch = "aarch64"
                                                          , Alpha = "alpha"
                                                          , Arm = "arm"
                                                          , HPPA = "hppa"
                                                          , HPPA64 = "hppa64"
                                                          , M68k = "m68k"
                                                          , Mips = "mips"
                                                          , Mips64 = "mips64"
                                                          , Mips64El =
                                                              "mips64el"
                                                          , MipsEl = "mipsel"
                                                          , MipsIsa32r6 =
                                                              "mipsisa32r6"
                                                          , MipsIsa32r6El =
                                                              "mipsisa32r6el"
                                                          , MipsIsa64r6 =
                                                              "mipsisa64r6"
                                                          , MipsIsa64r6El =
                                                              "mipsisa64r6el"
                                                          , PowerPC = "powerpc"
                                                          , PowerPC64 =
                                                              "powerpc64"
                                                          , PowerPC64le =
                                                              "powerpc64le"
                                                          , RISCV64 = "riscv64"
                                                          , S390x = "s390x"
                                                          , SH4 = "sh4"
                                                          , Sparc64 = "sparc64"
                                                          , X64 = "x86_64"
                                                          , X86 = "i686"
                                                          }
                                                          tgt.arch}-${merge
                                                                        { AIX =
                                                                            "aix"
                                                                        , Android =
                                                                            "android"
                                                                        , Darwin =
                                                                            "darwin"
                                                                        , Dragonfly =
                                                                            "dragonfly"
                                                                        , FreeBSD =
                                                                            "freebsd"
                                                                        , Haiku =
                                                                            "haiku"
                                                                        , Hurd =
                                                                            "hurd"
                                                                        , IOS =
                                                                            "darwin"
                                                                        , Linux =
                                                                            "linux"
                                                                        , NetBSD =
                                                                            "netbsd"
                                                                        , NoOs =
                                                                            "none"
                                                                        , OpenBSD =
                                                                            "openbsd"
                                                                        , Redox =
                                                                            "redox"
                                                                        , Solaris =
                                                                            "solaris"
                                                                        , Windows =
                                                                            "w64"
                                                                        }
                                                                        tgt.os}${merge
                                                                                   { None =
                                                                                       ""
                                                                                   , Some =
                                                                                       λ ( abi
                                                                                         : < GNU
                                                                                           | GNUabi64
                                                                                           | GNUeabi
                                                                                           | GNUeabihf
                                                                                           | GNUspe
                                                                                           | MinGw
                                                                                           >
                                                                                         ) →
                                                                                         "-${merge
                                                                                               { GNU =
                                                                                                   "gnu"
                                                                                               , GNUabi64 =
                                                                                                   "gnuabi64"
                                                                                               , GNUeabi =
                                                                                                   "gnueabi"
                                                                                               , GNUeabihf =
                                                                                                   "gnueabihf"
                                                                                               , GNUspe =
                                                                                                   "gnuspe"
                                                                                               , MinGw =
                                                                                                   "mingw32"
                                                                                               }
                                                                                               abi}"
                                                                                   }
                                                                                   tgt.abi}-g++"
                              ]
                        }
                        cfg.targetTriple
                    # merge
                        { None = [] : List Text
                        , Some =
                            λ ( tgt
                              : { abi :
                                    Optional
                                      < GNU
                                      | GNUabi64
                                      | GNUeabi
                                      | GNUeabihf
                                      | GNUspe
                                      | MinGw
                                      >
                                , arch :
                                    < AArch
                                    | Alpha
                                    | Arm
                                    | HPPA
                                    | HPPA64
                                    | M68k
                                    | Mips
                                    | Mips64
                                    | Mips64El
                                    | MipsEl
                                    | MipsIsa32r6
                                    | MipsIsa32r6El
                                    | MipsIsa64r6
                                    | MipsIsa64r6El
                                    | PowerPC
                                    | PowerPC64
                                    | PowerPC64le
                                    | RISCV64
                                    | S390x
                                    | SH4
                                    | Sparc64
                                    | X64
                                    | X86
                                    >
                                , manufacturer :
                                    Optional < Apple | IBM | PC | Unknown >
                                , os :
                                    < AIX
                                    | Android
                                    | Darwin
                                    | Dragonfly
                                    | FreeBSD
                                    | Haiku
                                    | Hurd
                                    | IOS
                                    | Linux
                                    | NetBSD
                                    | NoOs
                                    | OpenBSD
                                    | Redox
                                    | Solaris
                                    | Windows
                                    >
                                }
                              ) →
                              [ "-DCMAKE_SYSTEM_NAME=${merge
                                                         { AIX = "AIX"
                                                         , Android = "Android"
                                                         , Darwin = "Darwin"
                                                         , Dragonfly = "BSD"
                                                         , FreeBSD = "BSD"
                                                         , Haiku = "Haiku"
                                                         , Hurd = "Hurd"
                                                         , IOS = "Darwin"
                                                         , Linux = "Linux"
                                                         , NetBSD = "BSD"
                                                         , NoOs = "Generic"
                                                         , OpenBSD = "BSD"
                                                         , Redox = "Redox"
                                                         , Solaris = "Solaris"
                                                         , Windows = "Windows"
                                                         }
                                                         tgt.os}"
                              ]
                        }
                        cfg.targetTriple
                    # flags
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.includeDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "CMAKE_INCLUDE_PATH"
                          }
                        , { value =
                              ( if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              ).value
                          , var = "CMAKE_LIBRARY_PATH"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = Some "build"
                , program = "cmake"
                }
            ]
      , cmakeEnv =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              [ { value =
                    merge
                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                      ( List/fold
                          Text
                          (cfg.shareDirs # cfg.linkDirs)
                          < Empty | NonEmpty : Text >
                          ( λ(_ : Text) →
                            λ(_ : < Empty | NonEmpty : Text >) →
                              merge
                                { Empty =
                                    < Empty | NonEmpty : Text >.NonEmpty
                                      "${_@1}/pkgconfig"
                                , NonEmpty =
                                    λ(_ : Text) →
                                      < Empty | NonEmpty : Text >.NonEmpty
                                        "${_@2}/pkgconfig:${_}"
                                }
                                _
                          )
                          < Empty | NonEmpty : Text >.Empty
                      )
                , var = "PKG_CONFIG_PATH"
                }
              , { value =
                    merge
                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                      ( List/fold
                          Text
                          cfg.includeDirs
                          < Empty | NonEmpty : Text >
                          ( λ(_ : Text) →
                            λ(_ : < Empty | NonEmpty : Text >) →
                              merge
                                { Empty =
                                    < Empty | NonEmpty : Text >.NonEmpty _@1
                                , NonEmpty =
                                    λ(_ : Text) →
                                      < Empty | NonEmpty : Text >.NonEmpty
                                        "${_@2}:${_}"
                                }
                                _
                          )
                          < Empty | NonEmpty : Text >.Empty
                      )
                , var = "CMAKE_INCLUDE_PATH"
                }
              , { value =
                    ( if    cfg.static
                      then  { value =
                                "${List/fold
                                     Text
                                     cfg.linkDirs
                                     Text
                                     (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                     ""}/usr/local/lib:/lib:/usr/lib"
                            , var = "LIBRARY_PATH"
                            }
                      else  { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_LIBRARY_PATH"
                            }
                    ).value
                , var = "CMAKE_LIBRARY_PATH"
                }
              ]
            # ( if    merge
                        { AIX = True
                        , Android = True
                        , Darwin = True
                        , Dragonfly = True
                        , FreeBSD = True
                        , Haiku = False
                        , Hurd = True
                        , IOS = True
                        , Linux = True
                        , NetBSD = True
                        , NoOs = False
                        , OpenBSD = True
                        , Redox = False
                        , Solaris = True
                        , Windows = False
                        }
                        cfg.buildOS
                then  [ { value =
                            "${List/fold
                                 Text
                                 cfg.binDirs
                                 Text
                                 (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                        , var = "PATH"
                        }
                      ]
                else  [] : List { value : Text, var : Text }
              )
      , cmakeInstall =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                  [ "--build"
                  , "."
                  , "--target"
                  , "install"
                  , "--config"
                  , "Release"
                  ]
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.includeDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "CMAKE_INCLUDE_PATH"
                          }
                        , { value =
                              ( if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              ).value
                          , var = "CMAKE_LIBRARY_PATH"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = Some "build"
                , program = "cmake"
                }
            ]
      , cmakeInstallWithBinaries =
          λ(bins : List Text) →
          λ ( installVars
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                    [ "--build"
                    , "."
                    , "--target"
                    , "install"
                    , "--config"
                    , "Release"
                    ]
                  , environment = Some
                      (   [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (   installVars.shareDirs
                                        # installVars.linkDirs
                                      )
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      installVars.includeDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "CMAKE_INCLUDE_PATH"
                            }
                          , { value =
                                ( if    installVars.static
                                  then  { value =
                                            "${List/fold
                                                 Text
                                                 installVars.linkDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/lib:/lib:/usr/lib"
                                        , var = "LIBRARY_PATH"
                                        }
                                  else  { value =
                                            merge
                                              { Empty = ""
                                              , NonEmpty = λ(_ : Text) → _
                                              }
                                              ( List/fold
                                                  Text
                                                  installVars.linkDirs
                                                  < Empty | NonEmpty : Text >
                                                  ( λ(_ : Text) →
                                                    λ ( _
                                                      : < Empty
                                                        | NonEmpty : Text
                                                        >
                                                      ) →
                                                      merge
                                                        { Empty =
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              _@1
                                                        , NonEmpty =
                                                            λ(_ : Text) →
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >.NonEmpty
                                                                "${_@2}:${_}"
                                                        }
                                                        _
                                                  )
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.Empty
                                              )
                                        , var = "LD_LIBRARY_PATH"
                                        }
                                ).value
                            , var = "CMAKE_LIBRARY_PATH"
                            }
                          ]
                        # ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    installVars.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             installVars.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                      )
                  , procDir = Some "build"
                  , program = "cmake"
                  }
              ]
            # List/fold
                Text
                bins
                ( List
                    < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >
                )
                ( λ(_ : Text) →
                  λ ( _
                    : List
                        < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >
                    ) →
                      [ < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.SymlinkBinary
                          { file = _@1 }
                      ]
                    # _
                )
                ( [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
                )
      , cmakePackage =
        { buildCommand =
            λ ( cfg
              : { binDirs : List Text
                , buildArch :
                    < AArch
                    | Alpha
                    | Arm
                    | HPPA
                    | HPPA64
                    | M68k
                    | Mips
                    | Mips64
                    | Mips64El
                    | MipsEl
                    | MipsIsa32r6
                    | MipsIsa32r6El
                    | MipsIsa64r6
                    | MipsIsa64r6El
                    | PowerPC
                    | PowerPC64
                    | PowerPC64le
                    | RISCV64
                    | S390x
                    | SH4
                    | Sparc64
                    | X64
                    | X86
                    >
                , buildOS :
                    < AIX
                    | Android
                    | Darwin
                    | Dragonfly
                    | FreeBSD
                    | Haiku
                    | Hurd
                    | IOS
                    | Linux
                    | NetBSD
                    | NoOs
                    | OpenBSD
                    | Redox
                    | Solaris
                    | Windows
                    >
                , cpus : Natural
                , currentDir : Text
                , includeDirs : List Text
                , installDir : Text
                , isCross : Bool
                , linkDirs : List Text
                , preloadLibs : List Text
                , shareDirs : List Text
                , static : Bool
                , targetTriple :
                    Optional
                      { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                }
              ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                    [ "--build"
                    , "."
                    , "--config"
                    , "Release"
                    , "--"
                    , "-j"
                    , Natural/show cfg.cpus
                    ]
                  , environment = Some
                      (   [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.includeDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "CMAKE_INCLUDE_PATH"
                            }
                          , { value =
                                ( if    cfg.static
                                  then  { value =
                                            "${List/fold
                                                 Text
                                                 cfg.linkDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/lib:/lib:/usr/lib"
                                        , var = "LIBRARY_PATH"
                                        }
                                  else  { value =
                                            merge
                                              { Empty = ""
                                              , NonEmpty = λ(_ : Text) → _
                                              }
                                              ( List/fold
                                                  Text
                                                  cfg.linkDirs
                                                  < Empty | NonEmpty : Text >
                                                  ( λ(_ : Text) →
                                                    λ ( _
                                                      : < Empty
                                                        | NonEmpty : Text
                                                        >
                                                      ) →
                                                      merge
                                                        { Empty =
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              _@1
                                                        , NonEmpty =
                                                            λ(_ : Text) →
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >.NonEmpty
                                                                "${_@2}:${_}"
                                                        }
                                                        _
                                                  )
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.Empty
                                              )
                                        , var = "LD_LIBRARY_PATH"
                                        }
                                ).value
                            , var = "CMAKE_LIBRARY_PATH"
                            }
                          ]
                        # ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                      )
                  , procDir = Some "build"
                  , program = "cmake"
                  }
              ]
        , configureCommand =
            λ ( cfg
              : { binDirs : List Text
                , buildArch :
                    < AArch
                    | Alpha
                    | Arm
                    | HPPA
                    | HPPA64
                    | M68k
                    | Mips
                    | Mips64
                    | Mips64El
                    | MipsEl
                    | MipsIsa32r6
                    | MipsIsa32r6El
                    | MipsIsa64r6
                    | MipsIsa64r6El
                    | PowerPC
                    | PowerPC64
                    | PowerPC64le
                    | RISCV64
                    | S390x
                    | SH4
                    | Sparc64
                    | X64
                    | X86
                    >
                , buildOS :
                    < AIX
                    | Android
                    | Darwin
                    | Dragonfly
                    | FreeBSD
                    | Haiku
                    | Hurd
                    | IOS
                    | Linux
                    | NetBSD
                    | NoOs
                    | OpenBSD
                    | Redox
                    | Solaris
                    | Windows
                    >
                , cpus : Natural
                , currentDir : Text
                , includeDirs : List Text
                , installDir : Text
                , isCross : Bool
                , linkDirs : List Text
                , preloadLibs : List Text
                , shareDirs : List Text
                , static : Bool
                , targetTriple :
                    Optional
                      { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                }
              ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.CreateDirectory
                  { dir = "build" }
              , < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                        [ "../"
                        , "-DCMAKE_INSTALL_PREFIX:PATH=${cfg.installDir}"
                        , "-DCMAKE_MAKE_PROGRAM=${merge
                                                    { AIX = "make"
                                                    , Android = "make"
                                                    , Darwin = "make"
                                                    , Dragonfly = "gmake"
                                                    , FreeBSD = "gmake"
                                                    , Haiku = "make"
                                                    , Hurd = "make"
                                                    , IOS = "make"
                                                    , Linux = "make"
                                                    , NetBSD = "gmake"
                                                    , NoOs = "make"
                                                    , OpenBSD = "gmake"
                                                    , Redox = "make"
                                                    , Solaris = "gmake"
                                                    , Windows = "make"
                                                    }
                                                    cfg.buildOS}"
                        ]
                      # merge
                          { None =
                            [ "-DCMAKE_C_COMPILER=gcc"
                            , "-DCMAKE_CXX_COMPILER=g++"
                            ]
                          , Some =
                              λ ( tgt
                                : { abi :
                                      Optional
                                        < GNU
                                        | GNUabi64
                                        | GNUeabi
                                        | GNUeabihf
                                        | GNUspe
                                        | MinGw
                                        >
                                  , arch :
                                      < AArch
                                      | Alpha
                                      | Arm
                                      | HPPA
                                      | HPPA64
                                      | M68k
                                      | Mips
                                      | Mips64
                                      | Mips64El
                                      | MipsEl
                                      | MipsIsa32r6
                                      | MipsIsa32r6El
                                      | MipsIsa64r6
                                      | MipsIsa64r6El
                                      | PowerPC
                                      | PowerPC64
                                      | PowerPC64le
                                      | RISCV64
                                      | S390x
                                      | SH4
                                      | Sparc64
                                      | X64
                                      | X86
                                      >
                                  , manufacturer :
                                      Optional < Apple | IBM | PC | Unknown >
                                  , os :
                                      < AIX
                                      | Android
                                      | Darwin
                                      | Dragonfly
                                      | FreeBSD
                                      | Haiku
                                      | Hurd
                                      | IOS
                                      | Linux
                                      | NetBSD
                                      | NoOs
                                      | OpenBSD
                                      | Redox
                                      | Solaris
                                      | Windows
                                      >
                                  }
                                ) →
                                [ "-DCMAKE_C_COMPILER=${merge
                                                          { AArch = "aarch64"
                                                          , Alpha = "alpha"
                                                          , Arm = "arm"
                                                          , HPPA = "hppa"
                                                          , HPPA64 = "hppa64"
                                                          , M68k = "m68k"
                                                          , Mips = "mips"
                                                          , Mips64 = "mips64"
                                                          , Mips64El =
                                                              "mips64el"
                                                          , MipsEl = "mipsel"
                                                          , MipsIsa32r6 =
                                                              "mipsisa32r6"
                                                          , MipsIsa32r6El =
                                                              "mipsisa32r6el"
                                                          , MipsIsa64r6 =
                                                              "mipsisa64r6"
                                                          , MipsIsa64r6El =
                                                              "mipsisa64r6el"
                                                          , PowerPC = "powerpc"
                                                          , PowerPC64 =
                                                              "powerpc64"
                                                          , PowerPC64le =
                                                              "powerpc64le"
                                                          , RISCV64 = "riscv64"
                                                          , S390x = "s390x"
                                                          , SH4 = "sh4"
                                                          , Sparc64 = "sparc64"
                                                          , X64 = "x86_64"
                                                          , X86 = "i686"
                                                          }
                                                          tgt.arch}-${merge
                                                                        { AIX =
                                                                            "aix"
                                                                        , Android =
                                                                            "android"
                                                                        , Darwin =
                                                                            "darwin"
                                                                        , Dragonfly =
                                                                            "dragonfly"
                                                                        , FreeBSD =
                                                                            "freebsd"
                                                                        , Haiku =
                                                                            "haiku"
                                                                        , Hurd =
                                                                            "hurd"
                                                                        , IOS =
                                                                            "darwin"
                                                                        , Linux =
                                                                            "linux"
                                                                        , NetBSD =
                                                                            "netbsd"
                                                                        , NoOs =
                                                                            "none"
                                                                        , OpenBSD =
                                                                            "openbsd"
                                                                        , Redox =
                                                                            "redox"
                                                                        , Solaris =
                                                                            "solaris"
                                                                        , Windows =
                                                                            "w64"
                                                                        }
                                                                        tgt.os}${merge
                                                                                   { None =
                                                                                       ""
                                                                                   , Some =
                                                                                       λ ( abi
                                                                                         : < GNU
                                                                                           | GNUabi64
                                                                                           | GNUeabi
                                                                                           | GNUeabihf
                                                                                           | GNUspe
                                                                                           | MinGw
                                                                                           >
                                                                                         ) →
                                                                                         "-${merge
                                                                                               { GNU =
                                                                                                   "gnu"
                                                                                               , GNUabi64 =
                                                                                                   "gnuabi64"
                                                                                               , GNUeabi =
                                                                                                   "gnueabi"
                                                                                               , GNUeabihf =
                                                                                                   "gnueabihf"
                                                                                               , GNUspe =
                                                                                                   "gnuspe"
                                                                                               , MinGw =
                                                                                                   "mingw32"
                                                                                               }
                                                                                               abi}"
                                                                                   }
                                                                                   tgt.abi}-gcc"
                                , "-DCMAKE_CXX_COMPILER=${merge
                                                            { AArch = "aarch64"
                                                            , Alpha = "alpha"
                                                            , Arm = "arm"
                                                            , HPPA = "hppa"
                                                            , HPPA64 = "hppa64"
                                                            , M68k = "m68k"
                                                            , Mips = "mips"
                                                            , Mips64 = "mips64"
                                                            , Mips64El =
                                                                "mips64el"
                                                            , MipsEl = "mipsel"
                                                            , MipsIsa32r6 =
                                                                "mipsisa32r6"
                                                            , MipsIsa32r6El =
                                                                "mipsisa32r6el"
                                                            , MipsIsa64r6 =
                                                                "mipsisa64r6"
                                                            , MipsIsa64r6El =
                                                                "mipsisa64r6el"
                                                            , PowerPC =
                                                                "powerpc"
                                                            , PowerPC64 =
                                                                "powerpc64"
                                                            , PowerPC64le =
                                                                "powerpc64le"
                                                            , RISCV64 =
                                                                "riscv64"
                                                            , S390x = "s390x"
                                                            , SH4 = "sh4"
                                                            , Sparc64 =
                                                                "sparc64"
                                                            , X64 = "x86_64"
                                                            , X86 = "i686"
                                                            }
                                                            tgt.arch}-${merge
                                                                          { AIX =
                                                                              "aix"
                                                                          , Android =
                                                                              "android"
                                                                          , Darwin =
                                                                              "darwin"
                                                                          , Dragonfly =
                                                                              "dragonfly"
                                                                          , FreeBSD =
                                                                              "freebsd"
                                                                          , Haiku =
                                                                              "haiku"
                                                                          , Hurd =
                                                                              "hurd"
                                                                          , IOS =
                                                                              "darwin"
                                                                          , Linux =
                                                                              "linux"
                                                                          , NetBSD =
                                                                              "netbsd"
                                                                          , NoOs =
                                                                              "none"
                                                                          , OpenBSD =
                                                                              "openbsd"
                                                                          , Redox =
                                                                              "redox"
                                                                          , Solaris =
                                                                              "solaris"
                                                                          , Windows =
                                                                              "w64"
                                                                          }
                                                                          tgt.os}${merge
                                                                                     { None =
                                                                                         ""
                                                                                     , Some =
                                                                                         λ ( abi
                                                                                           : < GNU
                                                                                             | GNUabi64
                                                                                             | GNUeabi
                                                                                             | GNUeabihf
                                                                                             | GNUspe
                                                                                             | MinGw
                                                                                             >
                                                                                           ) →
                                                                                           "-${merge
                                                                                                 { GNU =
                                                                                                     "gnu"
                                                                                                 , GNUabi64 =
                                                                                                     "gnuabi64"
                                                                                                 , GNUeabi =
                                                                                                     "gnueabi"
                                                                                                 , GNUeabihf =
                                                                                                     "gnueabihf"
                                                                                                 , GNUspe =
                                                                                                     "gnuspe"
                                                                                                 , MinGw =
                                                                                                     "mingw32"
                                                                                                 }
                                                                                                 abi}"
                                                                                     }
                                                                                     tgt.abi}-g++"
                                ]
                          }
                          cfg.targetTriple
                      # merge
                          { None = [] : List Text
                          , Some =
                              λ ( tgt
                                : { abi :
                                      Optional
                                        < GNU
                                        | GNUabi64
                                        | GNUeabi
                                        | GNUeabihf
                                        | GNUspe
                                        | MinGw
                                        >
                                  , arch :
                                      < AArch
                                      | Alpha
                                      | Arm
                                      | HPPA
                                      | HPPA64
                                      | M68k
                                      | Mips
                                      | Mips64
                                      | Mips64El
                                      | MipsEl
                                      | MipsIsa32r6
                                      | MipsIsa32r6El
                                      | MipsIsa64r6
                                      | MipsIsa64r6El
                                      | PowerPC
                                      | PowerPC64
                                      | PowerPC64le
                                      | RISCV64
                                      | S390x
                                      | SH4
                                      | Sparc64
                                      | X64
                                      | X86
                                      >
                                  , manufacturer :
                                      Optional < Apple | IBM | PC | Unknown >
                                  , os :
                                      < AIX
                                      | Android
                                      | Darwin
                                      | Dragonfly
                                      | FreeBSD
                                      | Haiku
                                      | Hurd
                                      | IOS
                                      | Linux
                                      | NetBSD
                                      | NoOs
                                      | OpenBSD
                                      | Redox
                                      | Solaris
                                      | Windows
                                      >
                                  }
                                ) →
                                [ "-DCMAKE_SYSTEM_NAME=${merge
                                                           { AIX = "AIX"
                                                           , Android = "Android"
                                                           , Darwin = "Darwin"
                                                           , Dragonfly = "BSD"
                                                           , FreeBSD = "BSD"
                                                           , Haiku = "Haiku"
                                                           , Hurd = "Hurd"
                                                           , IOS = "Darwin"
                                                           , Linux = "Linux"
                                                           , NetBSD = "BSD"
                                                           , NoOs = "Generic"
                                                           , OpenBSD = "BSD"
                                                           , Redox = "Redox"
                                                           , Solaris = "Solaris"
                                                           , Windows = "Windows"
                                                           }
                                                           tgt.os}"
                                ]
                          }
                          cfg.targetTriple
                  , environment = Some
                      (   [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.includeDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "CMAKE_INCLUDE_PATH"
                            }
                          , { value =
                                ( if    cfg.static
                                  then  { value =
                                            "${List/fold
                                                 Text
                                                 cfg.linkDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/lib:/lib:/usr/lib"
                                        , var = "LIBRARY_PATH"
                                        }
                                  else  { value =
                                            merge
                                              { Empty = ""
                                              , NonEmpty = λ(_ : Text) → _
                                              }
                                              ( List/fold
                                                  Text
                                                  cfg.linkDirs
                                                  < Empty | NonEmpty : Text >
                                                  ( λ(_ : Text) →
                                                    λ ( _
                                                      : < Empty
                                                        | NonEmpty : Text
                                                        >
                                                      ) →
                                                      merge
                                                        { Empty =
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              _@1
                                                        , NonEmpty =
                                                            λ(_ : Text) →
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >.NonEmpty
                                                                "${_@2}:${_}"
                                                        }
                                                        _
                                                  )
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.Empty
                                              )
                                        , var = "LD_LIBRARY_PATH"
                                        }
                                ).value
                            , var = "CMAKE_LIBRARY_PATH"
                            }
                          ]
                        # ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                      )
                  , procDir = Some "build"
                  , program = "cmake"
                  }
              ]
        , installCommand =
            λ ( cfg
              : { binDirs : List Text
                , buildArch :
                    < AArch
                    | Alpha
                    | Arm
                    | HPPA
                    | HPPA64
                    | M68k
                    | Mips
                    | Mips64
                    | Mips64El
                    | MipsEl
                    | MipsIsa32r6
                    | MipsIsa32r6El
                    | MipsIsa64r6
                    | MipsIsa64r6El
                    | PowerPC
                    | PowerPC64
                    | PowerPC64le
                    | RISCV64
                    | S390x
                    | SH4
                    | Sparc64
                    | X64
                    | X86
                    >
                , buildOS :
                    < AIX
                    | Android
                    | Darwin
                    | Dragonfly
                    | FreeBSD
                    | Haiku
                    | Hurd
                    | IOS
                    | Linux
                    | NetBSD
                    | NoOs
                    | OpenBSD
                    | Redox
                    | Solaris
                    | Windows
                    >
                , cpus : Natural
                , currentDir : Text
                , includeDirs : List Text
                , installDir : Text
                , isCross : Bool
                , linkDirs : List Text
                , preloadLibs : List Text
                , shareDirs : List Text
                , static : Bool
                , targetTriple :
                    Optional
                      { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                }
              ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                    [ "--build"
                    , "."
                    , "--target"
                    , "install"
                    , "--config"
                    , "Release"
                    ]
                  , environment = Some
                      (   [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.includeDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "CMAKE_INCLUDE_PATH"
                            }
                          , { value =
                                ( if    cfg.static
                                  then  { value =
                                            "${List/fold
                                                 Text
                                                 cfg.linkDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/lib:/lib:/usr/lib"
                                        , var = "LIBRARY_PATH"
                                        }
                                  else  { value =
                                            merge
                                              { Empty = ""
                                              , NonEmpty = λ(_ : Text) → _
                                              }
                                              ( List/fold
                                                  Text
                                                  cfg.linkDirs
                                                  < Empty | NonEmpty : Text >
                                                  ( λ(_ : Text) →
                                                    λ ( _
                                                      : < Empty
                                                        | NonEmpty : Text
                                                        >
                                                      ) →
                                                      merge
                                                        { Empty =
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              _@1
                                                        , NonEmpty =
                                                            λ(_ : Text) →
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >.NonEmpty
                                                                "${_@2}:${_}"
                                                        }
                                                        _
                                                  )
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.Empty
                                              )
                                        , var = "LD_LIBRARY_PATH"
                                        }
                                ).value
                            , var = "CMAKE_LIBRARY_PATH"
                            }
                          ]
                        # ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                      )
                  , procDir = Some "build"
                  , program = "cmake"
                  }
              ]
        , pkgBuildDeps =
          [ { bound =
                < Lower : { lower : List Natural }
                | LowerUpper : { lower : List Natural, upper : List Natural }
                | NoBound
                | Upper : { upper : List Natural }
                >.NoBound
            , name = "cmake"
            }
          ]
        , pkgDeps =
            [] : List
                   { bound :
                       < Lower : { lower : List Natural }
                       | LowerUpper :
                           { lower : List Natural, upper : List Natural }
                       | NoBound
                       | Upper : { upper : List Natural }
                       >
                   , name : Text
                   }
        }
      , cmakeSome =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            Some
              (   [ { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              (cfg.shareDirs # cfg.linkDirs)
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty
                                          "${_@1}/pkgconfig"
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}/pkgconfig:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "PKG_CONFIG_PATH"
                    }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.includeDirs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty _@1
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "CMAKE_INCLUDE_PATH"
                    }
                  , { value =
                        ( if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        ).value
                    , var = "CMAKE_LIBRARY_PATH"
                    }
                  ]
                # ( if    merge
                            { AIX = True
                            , Android = True
                            , Darwin = True
                            , Dragonfly = True
                            , FreeBSD = True
                            , Haiku = False
                            , Hurd = True
                            , IOS = True
                            , Linux = True
                            , NetBSD = True
                            , NoOs = False
                            , OpenBSD = True
                            , Redox = False
                            , Solaris = True
                            , Windows = False
                            }
                            cfg.buildOS
                    then  [ { value =
                                "${List/fold
                                     Text
                                     cfg.binDirs
                                     Text
                                     (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                     ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                            , var = "PATH"
                            }
                          ]
                    else  [] : List { value : Text, var : Text }
                  )
              )
      , configEnv =
          λ(linkLibs : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              ( if    merge
                        { AIX = True
                        , Android = True
                        , Darwin = True
                        , Dragonfly = True
                        , FreeBSD = True
                        , Haiku = False
                        , Hurd = True
                        , IOS = True
                        , Linux = True
                        , NetBSD = True
                        , NoOs = False
                        , OpenBSD = True
                        , Redox = False
                        , Solaris = True
                        , Windows = False
                        }
                        cfg.buildOS
                then  [ { value =
                            "${List/fold
                                 Text
                                 cfg.binDirs
                                 Text
                                 (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                        , var = "PATH"
                        }
                      ]
                else  [] : List { value : Text, var : Text }
              )
            # [ { value =
                    "${merge
                         { Empty = "", NonEmpty = λ(_ : Text) → _ }
                         ( List/fold
                             Text
                             cfg.linkDirs
                             < Empty | NonEmpty : Text >
                             ( λ(_ : Text) →
                               λ(_ : < Empty | NonEmpty : Text >) →
                                 merge
                                   { Empty =
                                       < Empty | NonEmpty : Text >.NonEmpty
                                         "-L${_@1}"
                                   , NonEmpty =
                                       λ(_ : Text) →
                                         < Empty | NonEmpty : Text >.NonEmpty
                                           "-L${_@2} ${_}"
                                   }
                                   _
                             )
                             < Empty | NonEmpty : Text >.Empty
                         )}${List/fold
                               Text
                               linkLibs
                               Text
                               (λ(_ : Text) → λ(_ : Text) → " -l${_@1}${_}")
                               ""}${List/fold
                                      Text
                                      cfg.linkDirs
                                      Text
                                      ( λ(_ : Text) →
                                        λ(_ : Text) →
                                          "${if    merge
                                                     { AIX = False
                                                     , Android = False
                                                     , Darwin = True
                                                     , Dragonfly = False
                                                     , FreeBSD = False
                                                     , Haiku = False
                                                     , Hurd = False
                                                     , IOS = False
                                                     , Linux = False
                                                     , NetBSD = False
                                                     , NoOs = False
                                                     , OpenBSD = False
                                                     , Redox = False
                                                     , Solaris = False
                                                     , Windows = False
                                                     }
                                                     cfg.buildOS
                                             then  ""
                                             else  " -Wl,-rpath-link,${_@1}"}${_}"
                                      )
                                      ""}"
                , var = "LDFLAGS"
                }
              , { value =
                    "${merge
                         { Empty = "", NonEmpty = λ(_ : Text) → _ }
                         ( List/fold
                             Text
                             cfg.includeDirs
                             < Empty | NonEmpty : Text >
                             ( λ(_ : Text) →
                               λ(_ : < Empty | NonEmpty : Text >) →
                                 merge
                                   { Empty =
                                       < Empty | NonEmpty : Text >.NonEmpty
                                         "-I${_@1}"
                                   , NonEmpty =
                                       λ(_ : Text) →
                                         < Empty | NonEmpty : Text >.NonEmpty
                                           "-I${_@2} ${_}"
                                   }
                                   _
                             )
                             < Empty | NonEmpty : Text >.Empty
                         )}${if cfg.static then " -static" else ""}"
                , var = "CPPFLAGS"
                }
              , { value =
                    merge
                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                      ( List/fold
                          Text
                          (cfg.shareDirs # cfg.linkDirs)
                          < Empty | NonEmpty : Text >
                          ( λ(_ : Text) →
                            λ(_ : < Empty | NonEmpty : Text >) →
                              merge
                                { Empty =
                                    < Empty | NonEmpty : Text >.NonEmpty
                                      "${_@1}/pkgconfig"
                                , NonEmpty =
                                    λ(_ : Text) →
                                      < Empty | NonEmpty : Text >.NonEmpty
                                        "${_@2}/pkgconfig:${_}"
                                }
                                _
                          )
                          < Empty | NonEmpty : Text >.Empty
                      )
                , var = "PKG_CONFIG_PATH"
                }
              , if    cfg.static
                then  { value =
                          "${List/fold
                               Text
                               cfg.linkDirs
                               Text
                               (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                               ""}/usr/local/lib:/lib:/usr/lib"
                      , var = "LIBRARY_PATH"
                      }
                else  { value =
                          merge
                            { Empty = "", NonEmpty = λ(_ : Text) → _ }
                            ( List/fold
                                Text
                                cfg.linkDirs
                                < Empty | NonEmpty : Text >
                                ( λ(_ : Text) →
                                  λ(_ : < Empty | NonEmpty : Text >) →
                                    merge
                                      { Empty =
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            _@1
                                      , NonEmpty =
                                          λ(_ : Text) →
                                            < Empty | NonEmpty : Text >.NonEmpty
                                              "${_@2}:${_}"
                                      }
                                      _
                                )
                                < Empty | NonEmpty : Text >.Empty
                            )
                      , var = "LD_LIBRARY_PATH"
                      }
              , { value =
                    merge
                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                      ( List/fold
                          Text
                          cfg.linkDirs
                          < Empty | NonEmpty : Text >
                          ( λ(_ : Text) →
                            λ(_ : < Empty | NonEmpty : Text >) →
                              merge
                                { Empty =
                                    < Empty | NonEmpty : Text >.NonEmpty _@1
                                , NonEmpty =
                                    λ(_ : Text) →
                                      < Empty | NonEmpty : Text >.NonEmpty
                                        "${_@2}:${_}"
                                }
                                _
                          )
                          < Empty | NonEmpty : Text >.Empty
                      )
                , var = "LD_RUN_PATH"
                }
              , { value =
                    merge
                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                      ( List/fold
                          Text
                          cfg.linkDirs
                          < Empty | NonEmpty : Text >
                          ( λ(_ : Text) →
                            λ(_ : < Empty | NonEmpty : Text >) →
                              merge
                                { Empty =
                                    < Empty | NonEmpty : Text >.NonEmpty
                                      "${_@1}/site_perl/5.30.2/${merge
                                                                   { AArch =
                                                                       "aarch64"
                                                                   , Alpha =
                                                                       "alpha"
                                                                   , Arm = "arm"
                                                                   , HPPA =
                                                                       "hppa"
                                                                   , HPPA64 =
                                                                       "hppa64"
                                                                   , M68k =
                                                                       "m68k"
                                                                   , Mips =
                                                                       "mips"
                                                                   , Mips64 =
                                                                       "mips64"
                                                                   , Mips64El =
                                                                       "mips64el"
                                                                   , MipsEl =
                                                                       "mipsel"
                                                                   , MipsIsa32r6 =
                                                                       "mipsisa32r6"
                                                                   , MipsIsa32r6El =
                                                                       "mipsisa32r6el"
                                                                   , MipsIsa64r6 =
                                                                       "mipsisa64r6"
                                                                   , MipsIsa64r6El =
                                                                       "mipsisa64r6el"
                                                                   , PowerPC =
                                                                       "powerpc"
                                                                   , PowerPC64 =
                                                                       "powerpc64"
                                                                   , PowerPC64le =
                                                                       "powerpc64le"
                                                                   , RISCV64 =
                                                                       "riscv64"
                                                                   , S390x =
                                                                       "s390x"
                                                                   , SH4 = "sh4"
                                                                   , Sparc64 =
                                                                       "sparc64"
                                                                   , X64 =
                                                                       "x86_64"
                                                                   , X86 =
                                                                       "i686"
                                                                   }
                                                                   cfg.buildArch}-${merge
                                                                                      { AIX =
                                                                                          "aix"
                                                                                      , Android =
                                                                                          "android"
                                                                                      , Darwin =
                                                                                          "darwin"
                                                                                      , Dragonfly =
                                                                                          "dragonfly"
                                                                                      , FreeBSD =
                                                                                          "freebsd"
                                                                                      , Haiku =
                                                                                          "haiku"
                                                                                      , Hurd =
                                                                                          "hurd"
                                                                                      , IOS =
                                                                                          "darwin"
                                                                                      , Linux =
                                                                                          "linux"
                                                                                      , NetBSD =
                                                                                          "netbsd"
                                                                                      , NoOs =
                                                                                          "none"
                                                                                      , OpenBSD =
                                                                                          "openbsd"
                                                                                      , Redox =
                                                                                          "redox"
                                                                                      , Solaris =
                                                                                          "solaris"
                                                                                      , Windows =
                                                                                          "w64"
                                                                                      }
                                                                                      cfg.buildOS}/"
                                , NonEmpty =
                                    λ(_ : Text) →
                                      < Empty | NonEmpty : Text >.NonEmpty
                                        "${_@2}/site_perl/5.30.2/${merge
                                                                     { AArch =
                                                                         "aarch64"
                                                                     , Alpha =
                                                                         "alpha"
                                                                     , Arm =
                                                                         "arm"
                                                                     , HPPA =
                                                                         "hppa"
                                                                     , HPPA64 =
                                                                         "hppa64"
                                                                     , M68k =
                                                                         "m68k"
                                                                     , Mips =
                                                                         "mips"
                                                                     , Mips64 =
                                                                         "mips64"
                                                                     , Mips64El =
                                                                         "mips64el"
                                                                     , MipsEl =
                                                                         "mipsel"
                                                                     , MipsIsa32r6 =
                                                                         "mipsisa32r6"
                                                                     , MipsIsa32r6El =
                                                                         "mipsisa32r6el"
                                                                     , MipsIsa64r6 =
                                                                         "mipsisa64r6"
                                                                     , MipsIsa64r6El =
                                                                         "mipsisa64r6el"
                                                                     , PowerPC =
                                                                         "powerpc"
                                                                     , PowerPC64 =
                                                                         "powerpc64"
                                                                     , PowerPC64le =
                                                                         "powerpc64le"
                                                                     , RISCV64 =
                                                                         "riscv64"
                                                                     , S390x =
                                                                         "s390x"
                                                                     , SH4 =
                                                                         "sh4"
                                                                     , Sparc64 =
                                                                         "sparc64"
                                                                     , X64 =
                                                                         "x86_64"
                                                                     , X86 =
                                                                         "i686"
                                                                     }
                                                                     cfg.buildArch}-${merge
                                                                                        { AIX =
                                                                                            "aix"
                                                                                        , Android =
                                                                                            "android"
                                                                                        , Darwin =
                                                                                            "darwin"
                                                                                        , Dragonfly =
                                                                                            "dragonfly"
                                                                                        , FreeBSD =
                                                                                            "freebsd"
                                                                                        , Haiku =
                                                                                            "haiku"
                                                                                        , Hurd =
                                                                                            "hurd"
                                                                                        , IOS =
                                                                                            "darwin"
                                                                                        , Linux =
                                                                                            "linux"
                                                                                        , NetBSD =
                                                                                            "netbsd"
                                                                                        , NoOs =
                                                                                            "none"
                                                                                        , OpenBSD =
                                                                                            "openbsd"
                                                                                        , Redox =
                                                                                            "redox"
                                                                                        , Solaris =
                                                                                            "solaris"
                                                                                        , Windows =
                                                                                            "w64"
                                                                                        }
                                                                                        cfg.buildOS}/:${_}"
                                }
                                _
                          )
                          < Empty | NonEmpty : Text >.Empty
                      )
                , var = "PERL5LIB"
                }
              ]
      , configSome =
          λ(linkLibs : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            Some
              (   ( if    merge
                            { AIX = True
                            , Android = True
                            , Darwin = True
                            , Dragonfly = True
                            , FreeBSD = True
                            , Haiku = False
                            , Hurd = True
                            , IOS = True
                            , Linux = True
                            , NetBSD = True
                            , NoOs = False
                            , OpenBSD = True
                            , Redox = False
                            , Solaris = True
                            , Windows = False
                            }
                            cfg.buildOS
                    then  [ { value =
                                "${List/fold
                                     Text
                                     cfg.binDirs
                                     Text
                                     (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                     ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                            , var = "PATH"
                            }
                          ]
                    else  [] : List { value : Text, var : Text }
                  )
                # [ { value =
                        "${merge
                             { Empty = "", NonEmpty = λ(_ : Text) → _ }
                             ( List/fold
                                 Text
                                 cfg.linkDirs
                                 < Empty | NonEmpty : Text >
                                 ( λ(_ : Text) →
                                   λ(_ : < Empty | NonEmpty : Text >) →
                                     merge
                                       { Empty =
                                           < Empty | NonEmpty : Text >.NonEmpty
                                             "-L${_@1}"
                                       , NonEmpty =
                                           λ(_ : Text) →
                                             < Empty
                                             | NonEmpty : Text
                                             >.NonEmpty
                                               "-L${_@2} ${_}"
                                       }
                                       _
                                 )
                                 < Empty | NonEmpty : Text >.Empty
                             )}${List/fold
                                   Text
                                   linkLibs
                                   Text
                                   (λ(_ : Text) → λ(_ : Text) → " -l${_@1}${_}")
                                   ""}${List/fold
                                          Text
                                          cfg.linkDirs
                                          Text
                                          ( λ(_ : Text) →
                                            λ(_ : Text) →
                                              "${if    merge
                                                         { AIX = False
                                                         , Android = False
                                                         , Darwin = True
                                                         , Dragonfly = False
                                                         , FreeBSD = False
                                                         , Haiku = False
                                                         , Hurd = False
                                                         , IOS = False
                                                         , Linux = False
                                                         , NetBSD = False
                                                         , NoOs = False
                                                         , OpenBSD = False
                                                         , Redox = False
                                                         , Solaris = False
                                                         , Windows = False
                                                         }
                                                         cfg.buildOS
                                                 then  ""
                                                 else  " -Wl,-rpath-link,${_@1}"}${_}"
                                          )
                                          ""}"
                    , var = "LDFLAGS"
                    }
                  , { value =
                        "${merge
                             { Empty = "", NonEmpty = λ(_ : Text) → _ }
                             ( List/fold
                                 Text
                                 cfg.includeDirs
                                 < Empty | NonEmpty : Text >
                                 ( λ(_ : Text) →
                                   λ(_ : < Empty | NonEmpty : Text >) →
                                     merge
                                       { Empty =
                                           < Empty | NonEmpty : Text >.NonEmpty
                                             "-I${_@1}"
                                       , NonEmpty =
                                           λ(_ : Text) →
                                             < Empty
                                             | NonEmpty : Text
                                             >.NonEmpty
                                               "-I${_@2} ${_}"
                                       }
                                       _
                                 )
                                 < Empty | NonEmpty : Text >.Empty
                             )}${if cfg.static then " -static" else ""}"
                    , var = "CPPFLAGS"
                    }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              (cfg.shareDirs # cfg.linkDirs)
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty
                                          "${_@1}/pkgconfig"
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}/pkgconfig:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "PKG_CONFIG_PATH"
                    }
                  , if    cfg.static
                    then  { value =
                              "${List/fold
                                   Text
                                   cfg.linkDirs
                                   Text
                                   (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                   ""}/usr/local/lib:/lib:/usr/lib"
                          , var = "LIBRARY_PATH"
                          }
                    else  { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_LIBRARY_PATH"
                          }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.linkDirs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty _@1
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "LD_RUN_PATH"
                    }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.linkDirs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty
                                          "${_@1}/site_perl/5.30.2/${merge
                                                                       { AArch =
                                                                           "aarch64"
                                                                       , Alpha =
                                                                           "alpha"
                                                                       , Arm =
                                                                           "arm"
                                                                       , HPPA =
                                                                           "hppa"
                                                                       , HPPA64 =
                                                                           "hppa64"
                                                                       , M68k =
                                                                           "m68k"
                                                                       , Mips =
                                                                           "mips"
                                                                       , Mips64 =
                                                                           "mips64"
                                                                       , Mips64El =
                                                                           "mips64el"
                                                                       , MipsEl =
                                                                           "mipsel"
                                                                       , MipsIsa32r6 =
                                                                           "mipsisa32r6"
                                                                       , MipsIsa32r6El =
                                                                           "mipsisa32r6el"
                                                                       , MipsIsa64r6 =
                                                                           "mipsisa64r6"
                                                                       , MipsIsa64r6El =
                                                                           "mipsisa64r6el"
                                                                       , PowerPC =
                                                                           "powerpc"
                                                                       , PowerPC64 =
                                                                           "powerpc64"
                                                                       , PowerPC64le =
                                                                           "powerpc64le"
                                                                       , RISCV64 =
                                                                           "riscv64"
                                                                       , S390x =
                                                                           "s390x"
                                                                       , SH4 =
                                                                           "sh4"
                                                                       , Sparc64 =
                                                                           "sparc64"
                                                                       , X64 =
                                                                           "x86_64"
                                                                       , X86 =
                                                                           "i686"
                                                                       }
                                                                       cfg.buildArch}-${merge
                                                                                          { AIX =
                                                                                              "aix"
                                                                                          , Android =
                                                                                              "android"
                                                                                          , Darwin =
                                                                                              "darwin"
                                                                                          , Dragonfly =
                                                                                              "dragonfly"
                                                                                          , FreeBSD =
                                                                                              "freebsd"
                                                                                          , Haiku =
                                                                                              "haiku"
                                                                                          , Hurd =
                                                                                              "hurd"
                                                                                          , IOS =
                                                                                              "darwin"
                                                                                          , Linux =
                                                                                              "linux"
                                                                                          , NetBSD =
                                                                                              "netbsd"
                                                                                          , NoOs =
                                                                                              "none"
                                                                                          , OpenBSD =
                                                                                              "openbsd"
                                                                                          , Redox =
                                                                                              "redox"
                                                                                          , Solaris =
                                                                                              "solaris"
                                                                                          , Windows =
                                                                                              "w64"
                                                                                          }
                                                                                          cfg.buildOS}/"
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}/site_perl/5.30.2/${merge
                                                                         { AArch =
                                                                             "aarch64"
                                                                         , Alpha =
                                                                             "alpha"
                                                                         , Arm =
                                                                             "arm"
                                                                         , HPPA =
                                                                             "hppa"
                                                                         , HPPA64 =
                                                                             "hppa64"
                                                                         , M68k =
                                                                             "m68k"
                                                                         , Mips =
                                                                             "mips"
                                                                         , Mips64 =
                                                                             "mips64"
                                                                         , Mips64El =
                                                                             "mips64el"
                                                                         , MipsEl =
                                                                             "mipsel"
                                                                         , MipsIsa32r6 =
                                                                             "mipsisa32r6"
                                                                         , MipsIsa32r6El =
                                                                             "mipsisa32r6el"
                                                                         , MipsIsa64r6 =
                                                                             "mipsisa64r6"
                                                                         , MipsIsa64r6El =
                                                                             "mipsisa64r6el"
                                                                         , PowerPC =
                                                                             "powerpc"
                                                                         , PowerPC64 =
                                                                             "powerpc64"
                                                                         , PowerPC64le =
                                                                             "powerpc64le"
                                                                         , RISCV64 =
                                                                             "riscv64"
                                                                         , S390x =
                                                                             "s390x"
                                                                         , SH4 =
                                                                             "sh4"
                                                                         , Sparc64 =
                                                                             "sparc64"
                                                                         , X64 =
                                                                             "x86_64"
                                                                         , X86 =
                                                                             "i686"
                                                                         }
                                                                         cfg.buildArch}-${merge
                                                                                            { AIX =
                                                                                                "aix"
                                                                                            , Android =
                                                                                                "android"
                                                                                            , Darwin =
                                                                                                "darwin"
                                                                                            , Dragonfly =
                                                                                                "dragonfly"
                                                                                            , FreeBSD =
                                                                                                "freebsd"
                                                                                            , Haiku =
                                                                                                "haiku"
                                                                                            , Hurd =
                                                                                                "hurd"
                                                                                            , IOS =
                                                                                                "darwin"
                                                                                            , Linux =
                                                                                                "linux"
                                                                                            , NetBSD =
                                                                                                "netbsd"
                                                                                            , NoOs =
                                                                                                "none"
                                                                                            , OpenBSD =
                                                                                                "openbsd"
                                                                                            , Redox =
                                                                                                "redox"
                                                                                            , Solaris =
                                                                                                "solaris"
                                                                                            , Windows =
                                                                                                "w64"
                                                                                            }
                                                                                            cfg.buildOS}/:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "PERL5LIB"
                    }
                  ]
              )
      , configWithEnv =
          λ ( envVars
            : List Text →
              { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              } →
                Optional (List { value : Text, var : Text })
            ) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                    ( if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  λ(x : List Text) → [ "configure" ] # x
                      else  λ(x : List Text) → x
                    )
                      ( merge
                          { None = [ "--prefix=${cfg.installDir}" ]
                          , Some =
                              λ(x : Text) → [ "--prefix=${cfg.installDir}", x ]
                          }
                          ( merge
                              { None = None Text
                              , Some =
                                  λ ( _
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    Some
                                      "--host=${merge
                                                  { AArch = "aarch64"
                                                  , Alpha = "alpha"
                                                  , Arm = "arm"
                                                  , HPPA = "hppa"
                                                  , HPPA64 = "hppa64"
                                                  , M68k = "m68k"
                                                  , Mips = "mips"
                                                  , Mips64 = "mips64"
                                                  , Mips64El = "mips64el"
                                                  , MipsEl = "mipsel"
                                                  , MipsIsa32r6 = "mipsisa32r6"
                                                  , MipsIsa32r6El =
                                                      "mipsisa32r6el"
                                                  , MipsIsa64r6 = "mipsisa64r6"
                                                  , MipsIsa64r6El =
                                                      "mipsisa64r6el"
                                                  , PowerPC = "powerpc"
                                                  , PowerPC64 = "powerpc64"
                                                  , PowerPC64le = "powerpc64le"
                                                  , RISCV64 = "riscv64"
                                                  , S390x = "s390x"
                                                  , SH4 = "sh4"
                                                  , Sparc64 = "sparc64"
                                                  , X64 = "x86_64"
                                                  , X86 = "i686"
                                                  }
                                                  _.arch}-${merge
                                                              { AIX = "aix"
                                                              , Android =
                                                                  "android"
                                                              , Darwin =
                                                                  "darwin"
                                                              , Dragonfly =
                                                                  "dragonfly"
                                                              , FreeBSD =
                                                                  "freebsd"
                                                              , Haiku = "haiku"
                                                              , Hurd = "hurd"
                                                              , IOS = "darwin"
                                                              , Linux = "linux"
                                                              , NetBSD =
                                                                  "netbsd"
                                                              , NoOs = "none"
                                                              , OpenBSD =
                                                                  "openbsd"
                                                              , Redox = "redox"
                                                              , Solaris =
                                                                  "solaris"
                                                              , Windows = "w64"
                                                              }
                                                              _.os}${merge
                                                                       { None =
                                                                           ""
                                                                       , Some =
                                                                           λ ( abi
                                                                             : < GNU
                                                                               | GNUabi64
                                                                               | GNUeabi
                                                                               | GNUeabihf
                                                                               | GNUspe
                                                                               | MinGw
                                                                               >
                                                                             ) →
                                                                             "-${merge
                                                                                   { GNU =
                                                                                       "gnu"
                                                                                   , GNUabi64 =
                                                                                       "gnuabi64"
                                                                                   , GNUeabi =
                                                                                       "gnueabi"
                                                                                   , GNUeabihf =
                                                                                       "gnueabihf"
                                                                                   , GNUspe =
                                                                                       "gnuspe"
                                                                                   , MinGw =
                                                                                       "mingw32"
                                                                                   }
                                                                                   abi}"
                                                                       }
                                                                       _.abi}"
                              }
                              cfg.targetTriple
                          )
                      )
                , environment = envVars ([] : List Text) cfg
                , procDir = None Text
                , program =
                    if    merge
                            { AIX = False
                            , Android = False
                            , Darwin = True
                            , Dragonfly = False
                            , FreeBSD = False
                            , Haiku = False
                            , Hurd = False
                            , IOS = False
                            , Linux = False
                            , NetBSD = False
                            , NoOs = False
                            , OpenBSD = False
                            , Redox = False
                            , Solaris = False
                            , Windows = False
                            }
                            cfg.buildOS
                    then  "sh"
                    else  "./configure"
                }
            ]
      , configureLinkExtraLibs =
          λ(linkLibs : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                    ( if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  λ(x : List Text) → [ "configure" ] # x
                      else  λ(x : List Text) → x
                    )
                      ( merge
                          { None = [ "--prefix=${cfg.installDir}" ]
                          , Some =
                              λ(x : Text) → [ "--prefix=${cfg.installDir}", x ]
                          }
                          ( merge
                              { None = None Text
                              , Some =
                                  λ ( _
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    Some
                                      "--host=${merge
                                                  { AArch = "aarch64"
                                                  , Alpha = "alpha"
                                                  , Arm = "arm"
                                                  , HPPA = "hppa"
                                                  , HPPA64 = "hppa64"
                                                  , M68k = "m68k"
                                                  , Mips = "mips"
                                                  , Mips64 = "mips64"
                                                  , Mips64El = "mips64el"
                                                  , MipsEl = "mipsel"
                                                  , MipsIsa32r6 = "mipsisa32r6"
                                                  , MipsIsa32r6El =
                                                      "mipsisa32r6el"
                                                  , MipsIsa64r6 = "mipsisa64r6"
                                                  , MipsIsa64r6El =
                                                      "mipsisa64r6el"
                                                  , PowerPC = "powerpc"
                                                  , PowerPC64 = "powerpc64"
                                                  , PowerPC64le = "powerpc64le"
                                                  , RISCV64 = "riscv64"
                                                  , S390x = "s390x"
                                                  , SH4 = "sh4"
                                                  , Sparc64 = "sparc64"
                                                  , X64 = "x86_64"
                                                  , X86 = "i686"
                                                  }
                                                  _.arch}-${merge
                                                              { AIX = "aix"
                                                              , Android =
                                                                  "android"
                                                              , Darwin =
                                                                  "darwin"
                                                              , Dragonfly =
                                                                  "dragonfly"
                                                              , FreeBSD =
                                                                  "freebsd"
                                                              , Haiku = "haiku"
                                                              , Hurd = "hurd"
                                                              , IOS = "darwin"
                                                              , Linux = "linux"
                                                              , NetBSD =
                                                                  "netbsd"
                                                              , NoOs = "none"
                                                              , OpenBSD =
                                                                  "openbsd"
                                                              , Redox = "redox"
                                                              , Solaris =
                                                                  "solaris"
                                                              , Windows = "w64"
                                                              }
                                                              _.os}${merge
                                                                       { None =
                                                                           ""
                                                                       , Some =
                                                                           λ ( abi
                                                                             : < GNU
                                                                               | GNUabi64
                                                                               | GNUeabi
                                                                               | GNUeabihf
                                                                               | GNUspe
                                                                               | MinGw
                                                                               >
                                                                             ) →
                                                                             "-${merge
                                                                                   { GNU =
                                                                                       "gnu"
                                                                                   , GNUabi64 =
                                                                                       "gnuabi64"
                                                                                   , GNUeabi =
                                                                                       "gnueabi"
                                                                                   , GNUeabihf =
                                                                                       "gnueabihf"
                                                                                   , GNUspe =
                                                                                       "gnuspe"
                                                                                   , MinGw =
                                                                                       "mingw32"
                                                                                   }
                                                                                   abi}"
                                                                       }
                                                                       _.abi}"
                              }
                              cfg.targetTriple
                          )
                      )
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         linkLibs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             " -l${_@1}${_}"
                                         )
                                         ""}${List/fold
                                                Text
                                                cfg.linkDirs
                                                Text
                                                ( λ(_ : Text) →
                                                  λ(_ : Text) →
                                                    "${if    merge
                                                               { AIX = False
                                                               , Android = False
                                                               , Darwin = True
                                                               , Dragonfly =
                                                                   False
                                                               , FreeBSD = False
                                                               , Haiku = False
                                                               , Hurd = False
                                                               , IOS = False
                                                               , Linux = False
                                                               , NetBSD = False
                                                               , NoOs = False
                                                               , OpenBSD = False
                                                               , Redox = False
                                                               , Solaris = False
                                                               , Windows = False
                                                               }
                                                               cfg.buildOS
                                                       then  ""
                                                       else  " -Wl,-rpath-link,${_@1}"}${_}"
                                                )
                                                ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_RUN_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        ]
                    )
                , procDir = None Text
                , program =
                    if    merge
                            { AIX = False
                            , Android = False
                            , Darwin = True
                            , Dragonfly = False
                            , FreeBSD = False
                            , Haiku = False
                            , Hurd = False
                            , IOS = False
                            , Linux = False
                            , NetBSD = False
                            , NoOs = False
                            , OpenBSD = False
                            , Redox = False
                            , Solaris = False
                            , Windows = False
                            }
                            cfg.buildOS
                    then  "sh"
                    else  "./configure"
                }
            ]
      , configureMkExes =
          λ(bins : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              List/fold
                Text
                bins
                ( List
                    < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >
                )
                ( λ(_ : Text) →
                  λ ( _
                    : List
                        < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >
                    ) →
                      [ < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.MakeExecutable
                          { file = _@1 }
                      ]
                    # _
                )
                ( [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
                )
            # [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                      ( if    merge
                                { AIX = False
                                , Android = False
                                , Darwin = True
                                , Dragonfly = False
                                , FreeBSD = False
                                , Haiku = False
                                , Hurd = False
                                , IOS = False
                                , Linux = False
                                , NetBSD = False
                                , NoOs = False
                                , OpenBSD = False
                                , Redox = False
                                , Solaris = False
                                , Windows = False
                                }
                                cfg.buildOS
                        then  λ(x : List Text) → [ "configure" ] # x
                        else  λ(x : List Text) → x
                      )
                        ( merge
                            { None = [ "--prefix=${cfg.installDir}" ]
                            , Some =
                                λ(x : Text) →
                                  [ "--prefix=${cfg.installDir}", x ]
                            }
                            ( merge
                                { None = None Text
                                , Some =
                                    λ ( _
                                      : { abi :
                                            Optional
                                              < GNU
                                              | GNUabi64
                                              | GNUeabi
                                              | GNUeabihf
                                              | GNUspe
                                              | MinGw
                                              >
                                        , arch :
                                            < AArch
                                            | Alpha
                                            | Arm
                                            | HPPA
                                            | HPPA64
                                            | M68k
                                            | Mips
                                            | Mips64
                                            | Mips64El
                                            | MipsEl
                                            | MipsIsa32r6
                                            | MipsIsa32r6El
                                            | MipsIsa64r6
                                            | MipsIsa64r6El
                                            | PowerPC
                                            | PowerPC64
                                            | PowerPC64le
                                            | RISCV64
                                            | S390x
                                            | SH4
                                            | Sparc64
                                            | X64
                                            | X86
                                            >
                                        , manufacturer :
                                            Optional
                                              < Apple | IBM | PC | Unknown >
                                        , os :
                                            < AIX
                                            | Android
                                            | Darwin
                                            | Dragonfly
                                            | FreeBSD
                                            | Haiku
                                            | Hurd
                                            | IOS
                                            | Linux
                                            | NetBSD
                                            | NoOs
                                            | OpenBSD
                                            | Redox
                                            | Solaris
                                            | Windows
                                            >
                                        }
                                      ) →
                                      Some
                                        "--host=${merge
                                                    { AArch = "aarch64"
                                                    , Alpha = "alpha"
                                                    , Arm = "arm"
                                                    , HPPA = "hppa"
                                                    , HPPA64 = "hppa64"
                                                    , M68k = "m68k"
                                                    , Mips = "mips"
                                                    , Mips64 = "mips64"
                                                    , Mips64El = "mips64el"
                                                    , MipsEl = "mipsel"
                                                    , MipsIsa32r6 =
                                                        "mipsisa32r6"
                                                    , MipsIsa32r6El =
                                                        "mipsisa32r6el"
                                                    , MipsIsa64r6 =
                                                        "mipsisa64r6"
                                                    , MipsIsa64r6El =
                                                        "mipsisa64r6el"
                                                    , PowerPC = "powerpc"
                                                    , PowerPC64 = "powerpc64"
                                                    , PowerPC64le =
                                                        "powerpc64le"
                                                    , RISCV64 = "riscv64"
                                                    , S390x = "s390x"
                                                    , SH4 = "sh4"
                                                    , Sparc64 = "sparc64"
                                                    , X64 = "x86_64"
                                                    , X86 = "i686"
                                                    }
                                                    _.arch}-${merge
                                                                { AIX = "aix"
                                                                , Android =
                                                                    "android"
                                                                , Darwin =
                                                                    "darwin"
                                                                , Dragonfly =
                                                                    "dragonfly"
                                                                , FreeBSD =
                                                                    "freebsd"
                                                                , Haiku =
                                                                    "haiku"
                                                                , Hurd = "hurd"
                                                                , IOS = "darwin"
                                                                , Linux =
                                                                    "linux"
                                                                , NetBSD =
                                                                    "netbsd"
                                                                , NoOs = "none"
                                                                , OpenBSD =
                                                                    "openbsd"
                                                                , Redox =
                                                                    "redox"
                                                                , Solaris =
                                                                    "solaris"
                                                                , Windows =
                                                                    "w64"
                                                                }
                                                                _.os}${merge
                                                                         { None =
                                                                             ""
                                                                         , Some =
                                                                             λ ( abi
                                                                               : < GNU
                                                                                 | GNUabi64
                                                                                 | GNUeabi
                                                                                 | GNUeabihf
                                                                                 | GNUspe
                                                                                 | MinGw
                                                                                 >
                                                                               ) →
                                                                               "-${merge
                                                                                     { GNU =
                                                                                         "gnu"
                                                                                     , GNUabi64 =
                                                                                         "gnuabi64"
                                                                                     , GNUeabi =
                                                                                         "gnueabi"
                                                                                     , GNUeabihf =
                                                                                         "gnueabihf"
                                                                                     , GNUspe =
                                                                                         "gnuspe"
                                                                                     , MinGw =
                                                                                         "mingw32"
                                                                                     }
                                                                                     abi}"
                                                                         }
                                                                         _.abi}"
                                }
                                cfg.targetTriple
                            )
                        )
                  , environment = Some
                      (   ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                        # [ { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          cfg.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.includeDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-I${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${if cfg.static then " -static" else ""}"
                            , var = "CPPFLAGS"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , if    cfg.static
                            then  { value =
                                      "${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/lib:/lib:/usr/lib"
                                  , var = "LIBRARY_PATH"
                                  }
                            else  { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            cfg.linkDirs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        _@1
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "LD_LIBRARY_PATH"
                                  }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_RUN_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/site_perl/5.30.2/${merge
                                                                                 { AArch =
                                                                                     "aarch64"
                                                                                 , Alpha =
                                                                                     "alpha"
                                                                                 , Arm =
                                                                                     "arm"
                                                                                 , HPPA =
                                                                                     "hppa"
                                                                                 , HPPA64 =
                                                                                     "hppa64"
                                                                                 , M68k =
                                                                                     "m68k"
                                                                                 , Mips =
                                                                                     "mips"
                                                                                 , Mips64 =
                                                                                     "mips64"
                                                                                 , Mips64El =
                                                                                     "mips64el"
                                                                                 , MipsEl =
                                                                                     "mipsel"
                                                                                 , MipsIsa32r6 =
                                                                                     "mipsisa32r6"
                                                                                 , MipsIsa32r6El =
                                                                                     "mipsisa32r6el"
                                                                                 , MipsIsa64r6 =
                                                                                     "mipsisa64r6"
                                                                                 , MipsIsa64r6El =
                                                                                     "mipsisa64r6el"
                                                                                 , PowerPC =
                                                                                     "powerpc"
                                                                                 , PowerPC64 =
                                                                                     "powerpc64"
                                                                                 , PowerPC64le =
                                                                                     "powerpc64le"
                                                                                 , RISCV64 =
                                                                                     "riscv64"
                                                                                 , S390x =
                                                                                     "s390x"
                                                                                 , SH4 =
                                                                                     "sh4"
                                                                                 , Sparc64 =
                                                                                     "sparc64"
                                                                                 , X64 =
                                                                                     "x86_64"
                                                                                 , X86 =
                                                                                     "i686"
                                                                                 }
                                                                                 cfg.buildArch}-${merge
                                                                                                    { AIX =
                                                                                                        "aix"
                                                                                                    , Android =
                                                                                                        "android"
                                                                                                    , Darwin =
                                                                                                        "darwin"
                                                                                                    , Dragonfly =
                                                                                                        "dragonfly"
                                                                                                    , FreeBSD =
                                                                                                        "freebsd"
                                                                                                    , Haiku =
                                                                                                        "haiku"
                                                                                                    , Hurd =
                                                                                                        "hurd"
                                                                                                    , IOS =
                                                                                                        "darwin"
                                                                                                    , Linux =
                                                                                                        "linux"
                                                                                                    , NetBSD =
                                                                                                        "netbsd"
                                                                                                    , NoOs =
                                                                                                        "none"
                                                                                                    , OpenBSD =
                                                                                                        "openbsd"
                                                                                                    , Redox =
                                                                                                        "redox"
                                                                                                    , Solaris =
                                                                                                        "solaris"
                                                                                                    , Windows =
                                                                                                        "w64"
                                                                                                    }
                                                                                                    cfg.buildOS}/:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PERL5LIB"
                            }
                          ]
                      )
                  , procDir = None Text
                  , program =
                      if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  "sh"
                      else  "./configure"
                  }
              ]
      , configureMkExesExtraFlags =
          λ(x : { bins : List Text, extraFlags : List Text }) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              List/fold
                Text
                x.bins
                ( List
                    < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >
                )
                ( λ(_ : Text) →
                  λ ( _
                    : List
                        < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >
                    ) →
                      [ < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.MakeExecutable
                          { file = _@1 }
                      ]
                    # _
                )
                ( [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
                )
            # [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                      ( if    merge
                                { AIX = False
                                , Android = False
                                , Darwin = True
                                , Dragonfly = False
                                , FreeBSD = False
                                , Haiku = False
                                , Hurd = False
                                , IOS = False
                                , Linux = False
                                , NetBSD = False
                                , NoOs = False
                                , OpenBSD = False
                                , Redox = False
                                , Solaris = False
                                , Windows = False
                                }
                                cfg.buildOS
                        then  λ(x : List Text) → [ "configure" ] # x
                        else  λ(x : List Text) → x
                      )
                        (   merge
                              { None = [ "--prefix=${cfg.installDir}" ]
                              , Some =
                                  λ(x : Text) →
                                    [ "--prefix=${cfg.installDir}", x ]
                              }
                              ( merge
                                  { None = None Text
                                  , Some =
                                      λ ( _
                                        : { abi :
                                              Optional
                                                < GNU
                                                | GNUabi64
                                                | GNUeabi
                                                | GNUeabihf
                                                | GNUspe
                                                | MinGw
                                                >
                                          , arch :
                                              < AArch
                                              | Alpha
                                              | Arm
                                              | HPPA
                                              | HPPA64
                                              | M68k
                                              | Mips
                                              | Mips64
                                              | Mips64El
                                              | MipsEl
                                              | MipsIsa32r6
                                              | MipsIsa32r6El
                                              | MipsIsa64r6
                                              | MipsIsa64r6El
                                              | PowerPC
                                              | PowerPC64
                                              | PowerPC64le
                                              | RISCV64
                                              | S390x
                                              | SH4
                                              | Sparc64
                                              | X64
                                              | X86
                                              >
                                          , manufacturer :
                                              Optional
                                                < Apple | IBM | PC | Unknown >
                                          , os :
                                              < AIX
                                              | Android
                                              | Darwin
                                              | Dragonfly
                                              | FreeBSD
                                              | Haiku
                                              | Hurd
                                              | IOS
                                              | Linux
                                              | NetBSD
                                              | NoOs
                                              | OpenBSD
                                              | Redox
                                              | Solaris
                                              | Windows
                                              >
                                          }
                                        ) →
                                        Some
                                          "--host=${merge
                                                      { AArch = "aarch64"
                                                      , Alpha = "alpha"
                                                      , Arm = "arm"
                                                      , HPPA = "hppa"
                                                      , HPPA64 = "hppa64"
                                                      , M68k = "m68k"
                                                      , Mips = "mips"
                                                      , Mips64 = "mips64"
                                                      , Mips64El = "mips64el"
                                                      , MipsEl = "mipsel"
                                                      , MipsIsa32r6 =
                                                          "mipsisa32r6"
                                                      , MipsIsa32r6El =
                                                          "mipsisa32r6el"
                                                      , MipsIsa64r6 =
                                                          "mipsisa64r6"
                                                      , MipsIsa64r6El =
                                                          "mipsisa64r6el"
                                                      , PowerPC = "powerpc"
                                                      , PowerPC64 = "powerpc64"
                                                      , PowerPC64le =
                                                          "powerpc64le"
                                                      , RISCV64 = "riscv64"
                                                      , S390x = "s390x"
                                                      , SH4 = "sh4"
                                                      , Sparc64 = "sparc64"
                                                      , X64 = "x86_64"
                                                      , X86 = "i686"
                                                      }
                                                      _.arch}-${merge
                                                                  { AIX = "aix"
                                                                  , Android =
                                                                      "android"
                                                                  , Darwin =
                                                                      "darwin"
                                                                  , Dragonfly =
                                                                      "dragonfly"
                                                                  , FreeBSD =
                                                                      "freebsd"
                                                                  , Haiku =
                                                                      "haiku"
                                                                  , Hurd =
                                                                      "hurd"
                                                                  , IOS =
                                                                      "darwin"
                                                                  , Linux =
                                                                      "linux"
                                                                  , NetBSD =
                                                                      "netbsd"
                                                                  , NoOs =
                                                                      "none"
                                                                  , OpenBSD =
                                                                      "openbsd"
                                                                  , Redox =
                                                                      "redox"
                                                                  , Solaris =
                                                                      "solaris"
                                                                  , Windows =
                                                                      "w64"
                                                                  }
                                                                  _.os}${merge
                                                                           { None =
                                                                               ""
                                                                           , Some =
                                                                               λ ( abi
                                                                                 : < GNU
                                                                                   | GNUabi64
                                                                                   | GNUeabi
                                                                                   | GNUeabihf
                                                                                   | GNUspe
                                                                                   | MinGw
                                                                                   >
                                                                                 ) →
                                                                                 "-${merge
                                                                                       { GNU =
                                                                                           "gnu"
                                                                                       , GNUabi64 =
                                                                                           "gnuabi64"
                                                                                       , GNUeabi =
                                                                                           "gnueabi"
                                                                                       , GNUeabihf =
                                                                                           "gnueabihf"
                                                                                       , GNUspe =
                                                                                           "gnuspe"
                                                                                       , MinGw =
                                                                                           "mingw32"
                                                                                       }
                                                                                       abi}"
                                                                           }
                                                                           _.abi}"
                                  }
                                  cfg.targetTriple
                              )
                          # x.extraFlags
                        )
                  , environment = Some
                      (   ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                        # [ { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          cfg.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.includeDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-I${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${if cfg.static then " -static" else ""}"
                            , var = "CPPFLAGS"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , if    cfg.static
                            then  { value =
                                      "${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/lib:/lib:/usr/lib"
                                  , var = "LIBRARY_PATH"
                                  }
                            else  { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            cfg.linkDirs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        _@1
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "LD_LIBRARY_PATH"
                                  }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_RUN_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/site_perl/5.30.2/${merge
                                                                                 { AArch =
                                                                                     "aarch64"
                                                                                 , Alpha =
                                                                                     "alpha"
                                                                                 , Arm =
                                                                                     "arm"
                                                                                 , HPPA =
                                                                                     "hppa"
                                                                                 , HPPA64 =
                                                                                     "hppa64"
                                                                                 , M68k =
                                                                                     "m68k"
                                                                                 , Mips =
                                                                                     "mips"
                                                                                 , Mips64 =
                                                                                     "mips64"
                                                                                 , Mips64El =
                                                                                     "mips64el"
                                                                                 , MipsEl =
                                                                                     "mipsel"
                                                                                 , MipsIsa32r6 =
                                                                                     "mipsisa32r6"
                                                                                 , MipsIsa32r6El =
                                                                                     "mipsisa32r6el"
                                                                                 , MipsIsa64r6 =
                                                                                     "mipsisa64r6"
                                                                                 , MipsIsa64r6El =
                                                                                     "mipsisa64r6el"
                                                                                 , PowerPC =
                                                                                     "powerpc"
                                                                                 , PowerPC64 =
                                                                                     "powerpc64"
                                                                                 , PowerPC64le =
                                                                                     "powerpc64le"
                                                                                 , RISCV64 =
                                                                                     "riscv64"
                                                                                 , S390x =
                                                                                     "s390x"
                                                                                 , SH4 =
                                                                                     "sh4"
                                                                                 , Sparc64 =
                                                                                     "sparc64"
                                                                                 , X64 =
                                                                                     "x86_64"
                                                                                 , X86 =
                                                                                     "i686"
                                                                                 }
                                                                                 cfg.buildArch}-${merge
                                                                                                    { AIX =
                                                                                                        "aix"
                                                                                                    , Android =
                                                                                                        "android"
                                                                                                    , Darwin =
                                                                                                        "darwin"
                                                                                                    , Dragonfly =
                                                                                                        "dragonfly"
                                                                                                    , FreeBSD =
                                                                                                        "freebsd"
                                                                                                    , Haiku =
                                                                                                        "haiku"
                                                                                                    , Hurd =
                                                                                                        "hurd"
                                                                                                    , IOS =
                                                                                                        "darwin"
                                                                                                    , Linux =
                                                                                                        "linux"
                                                                                                    , NetBSD =
                                                                                                        "netbsd"
                                                                                                    , NoOs =
                                                                                                        "none"
                                                                                                    , OpenBSD =
                                                                                                        "openbsd"
                                                                                                    , Redox =
                                                                                                        "redox"
                                                                                                    , Solaris =
                                                                                                        "solaris"
                                                                                                    , Windows =
                                                                                                        "w64"
                                                                                                    }
                                                                                                    cfg.buildOS}/:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PERL5LIB"
                            }
                          ]
                      )
                  , procDir = None Text
                  , program =
                      if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  "sh"
                      else  "./configure"
                  }
              ]
      , configureWithFlags =
          λ(extraFlags : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                    ( if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  λ(x : List Text) → [ "configure" ] # x
                      else  λ(x : List Text) → x
                    )
                      (   merge
                            { None = [ "--prefix=${cfg.installDir}" ]
                            , Some =
                                λ(x : Text) →
                                  [ "--prefix=${cfg.installDir}", x ]
                            }
                            ( merge
                                { None = None Text
                                , Some =
                                    λ ( _
                                      : { abi :
                                            Optional
                                              < GNU
                                              | GNUabi64
                                              | GNUeabi
                                              | GNUeabihf
                                              | GNUspe
                                              | MinGw
                                              >
                                        , arch :
                                            < AArch
                                            | Alpha
                                            | Arm
                                            | HPPA
                                            | HPPA64
                                            | M68k
                                            | Mips
                                            | Mips64
                                            | Mips64El
                                            | MipsEl
                                            | MipsIsa32r6
                                            | MipsIsa32r6El
                                            | MipsIsa64r6
                                            | MipsIsa64r6El
                                            | PowerPC
                                            | PowerPC64
                                            | PowerPC64le
                                            | RISCV64
                                            | S390x
                                            | SH4
                                            | Sparc64
                                            | X64
                                            | X86
                                            >
                                        , manufacturer :
                                            Optional
                                              < Apple | IBM | PC | Unknown >
                                        , os :
                                            < AIX
                                            | Android
                                            | Darwin
                                            | Dragonfly
                                            | FreeBSD
                                            | Haiku
                                            | Hurd
                                            | IOS
                                            | Linux
                                            | NetBSD
                                            | NoOs
                                            | OpenBSD
                                            | Redox
                                            | Solaris
                                            | Windows
                                            >
                                        }
                                      ) →
                                      Some
                                        "--host=${merge
                                                    { AArch = "aarch64"
                                                    , Alpha = "alpha"
                                                    , Arm = "arm"
                                                    , HPPA = "hppa"
                                                    , HPPA64 = "hppa64"
                                                    , M68k = "m68k"
                                                    , Mips = "mips"
                                                    , Mips64 = "mips64"
                                                    , Mips64El = "mips64el"
                                                    , MipsEl = "mipsel"
                                                    , MipsIsa32r6 =
                                                        "mipsisa32r6"
                                                    , MipsIsa32r6El =
                                                        "mipsisa32r6el"
                                                    , MipsIsa64r6 =
                                                        "mipsisa64r6"
                                                    , MipsIsa64r6El =
                                                        "mipsisa64r6el"
                                                    , PowerPC = "powerpc"
                                                    , PowerPC64 = "powerpc64"
                                                    , PowerPC64le =
                                                        "powerpc64le"
                                                    , RISCV64 = "riscv64"
                                                    , S390x = "s390x"
                                                    , SH4 = "sh4"
                                                    , Sparc64 = "sparc64"
                                                    , X64 = "x86_64"
                                                    , X86 = "i686"
                                                    }
                                                    _.arch}-${merge
                                                                { AIX = "aix"
                                                                , Android =
                                                                    "android"
                                                                , Darwin =
                                                                    "darwin"
                                                                , Dragonfly =
                                                                    "dragonfly"
                                                                , FreeBSD =
                                                                    "freebsd"
                                                                , Haiku =
                                                                    "haiku"
                                                                , Hurd = "hurd"
                                                                , IOS = "darwin"
                                                                , Linux =
                                                                    "linux"
                                                                , NetBSD =
                                                                    "netbsd"
                                                                , NoOs = "none"
                                                                , OpenBSD =
                                                                    "openbsd"
                                                                , Redox =
                                                                    "redox"
                                                                , Solaris =
                                                                    "solaris"
                                                                , Windows =
                                                                    "w64"
                                                                }
                                                                _.os}${merge
                                                                         { None =
                                                                             ""
                                                                         , Some =
                                                                             λ ( abi
                                                                               : < GNU
                                                                                 | GNUabi64
                                                                                 | GNUeabi
                                                                                 | GNUeabihf
                                                                                 | GNUspe
                                                                                 | MinGw
                                                                                 >
                                                                               ) →
                                                                               "-${merge
                                                                                     { GNU =
                                                                                         "gnu"
                                                                                     , GNUabi64 =
                                                                                         "gnuabi64"
                                                                                     , GNUeabi =
                                                                                         "gnueabi"
                                                                                     , GNUeabihf =
                                                                                         "gnueabihf"
                                                                                     , GNUspe =
                                                                                         "gnuspe"
                                                                                     , MinGw =
                                                                                         "mingw32"
                                                                                     }
                                                                                     abi}"
                                                                         }
                                                                         _.abi}"
                                }
                                cfg.targetTriple
                            )
                        # extraFlags
                      )
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_RUN_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        ]
                    )
                , procDir = None Text
                , program =
                    if    merge
                            { AIX = False
                            , Android = False
                            , Darwin = True
                            , Dragonfly = False
                            , FreeBSD = False
                            , Haiku = False
                            , Hurd = False
                            , IOS = False
                            , Linux = False
                            , NetBSD = False
                            , NoOs = False
                            , OpenBSD = False
                            , Redox = False
                            , Solaris = False
                            , Windows = False
                            }
                            cfg.buildOS
                    then  "sh"
                    else  "./configure"
                }
            ]
      , configureWithPatch =
          λ(p : Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Patch
                { patchContents = p }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                    ( if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  λ(x : List Text) → [ "configure" ] # x
                      else  λ(x : List Text) → x
                    )
                      ( merge
                          { None = [ "--prefix=${cfg.installDir}" ]
                          , Some =
                              λ(x : Text) → [ "--prefix=${cfg.installDir}", x ]
                          }
                          ( merge
                              { None = None Text
                              , Some =
                                  λ ( _
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    Some
                                      "--host=${merge
                                                  { AArch = "aarch64"
                                                  , Alpha = "alpha"
                                                  , Arm = "arm"
                                                  , HPPA = "hppa"
                                                  , HPPA64 = "hppa64"
                                                  , M68k = "m68k"
                                                  , Mips = "mips"
                                                  , Mips64 = "mips64"
                                                  , Mips64El = "mips64el"
                                                  , MipsEl = "mipsel"
                                                  , MipsIsa32r6 = "mipsisa32r6"
                                                  , MipsIsa32r6El =
                                                      "mipsisa32r6el"
                                                  , MipsIsa64r6 = "mipsisa64r6"
                                                  , MipsIsa64r6El =
                                                      "mipsisa64r6el"
                                                  , PowerPC = "powerpc"
                                                  , PowerPC64 = "powerpc64"
                                                  , PowerPC64le = "powerpc64le"
                                                  , RISCV64 = "riscv64"
                                                  , S390x = "s390x"
                                                  , SH4 = "sh4"
                                                  , Sparc64 = "sparc64"
                                                  , X64 = "x86_64"
                                                  , X86 = "i686"
                                                  }
                                                  _.arch}-${merge
                                                              { AIX = "aix"
                                                              , Android =
                                                                  "android"
                                                              , Darwin =
                                                                  "darwin"
                                                              , Dragonfly =
                                                                  "dragonfly"
                                                              , FreeBSD =
                                                                  "freebsd"
                                                              , Haiku = "haiku"
                                                              , Hurd = "hurd"
                                                              , IOS = "darwin"
                                                              , Linux = "linux"
                                                              , NetBSD =
                                                                  "netbsd"
                                                              , NoOs = "none"
                                                              , OpenBSD =
                                                                  "openbsd"
                                                              , Redox = "redox"
                                                              , Solaris =
                                                                  "solaris"
                                                              , Windows = "w64"
                                                              }
                                                              _.os}${merge
                                                                       { None =
                                                                           ""
                                                                       , Some =
                                                                           λ ( abi
                                                                             : < GNU
                                                                               | GNUabi64
                                                                               | GNUeabi
                                                                               | GNUeabihf
                                                                               | GNUspe
                                                                               | MinGw
                                                                               >
                                                                             ) →
                                                                             "-${merge
                                                                                   { GNU =
                                                                                       "gnu"
                                                                                   , GNUabi64 =
                                                                                       "gnuabi64"
                                                                                   , GNUeabi =
                                                                                       "gnueabi"
                                                                                   , GNUeabihf =
                                                                                       "gnueabihf"
                                                                                   , GNUspe =
                                                                                       "gnuspe"
                                                                                   , MinGw =
                                                                                       "mingw32"
                                                                                   }
                                                                                   abi}"
                                                                       }
                                                                       _.abi}"
                              }
                              cfg.targetTriple
                          )
                      )
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_RUN_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        ]
                    )
                , procDir = None Text
                , program =
                    if    merge
                            { AIX = False
                            , Android = False
                            , Darwin = True
                            , Dragonfly = False
                            , FreeBSD = False
                            , Haiku = False
                            , Hurd = False
                            , IOS = False
                            , Linux = False
                            , NetBSD = False
                            , NoOs = False
                            , OpenBSD = False
                            , Redox = False
                            , Solaris = False
                            , Windows = False
                            }
                            cfg.buildOS
                    then  "sh"
                    else  "./configure"
                }
            ]
      , configureWithPatches =
          λ(patches : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              List/fold
                Text
                patches
                ( List
                    < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >
                )
                ( λ(_ : Text) →
                  λ ( _
                    : List
                        < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >
                    ) →
                      [ < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.Patch
                          { patchContents = _@1 }
                      ]
                    # _
                )
                ( [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
                )
            # [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                      ( if    merge
                                { AIX = False
                                , Android = False
                                , Darwin = True
                                , Dragonfly = False
                                , FreeBSD = False
                                , Haiku = False
                                , Hurd = False
                                , IOS = False
                                , Linux = False
                                , NetBSD = False
                                , NoOs = False
                                , OpenBSD = False
                                , Redox = False
                                , Solaris = False
                                , Windows = False
                                }
                                cfg.buildOS
                        then  λ(x : List Text) → [ "configure" ] # x
                        else  λ(x : List Text) → x
                      )
                        ( merge
                            { None = [ "--prefix=${cfg.installDir}" ]
                            , Some =
                                λ(x : Text) →
                                  [ "--prefix=${cfg.installDir}", x ]
                            }
                            ( merge
                                { None = None Text
                                , Some =
                                    λ ( _
                                      : { abi :
                                            Optional
                                              < GNU
                                              | GNUabi64
                                              | GNUeabi
                                              | GNUeabihf
                                              | GNUspe
                                              | MinGw
                                              >
                                        , arch :
                                            < AArch
                                            | Alpha
                                            | Arm
                                            | HPPA
                                            | HPPA64
                                            | M68k
                                            | Mips
                                            | Mips64
                                            | Mips64El
                                            | MipsEl
                                            | MipsIsa32r6
                                            | MipsIsa32r6El
                                            | MipsIsa64r6
                                            | MipsIsa64r6El
                                            | PowerPC
                                            | PowerPC64
                                            | PowerPC64le
                                            | RISCV64
                                            | S390x
                                            | SH4
                                            | Sparc64
                                            | X64
                                            | X86
                                            >
                                        , manufacturer :
                                            Optional
                                              < Apple | IBM | PC | Unknown >
                                        , os :
                                            < AIX
                                            | Android
                                            | Darwin
                                            | Dragonfly
                                            | FreeBSD
                                            | Haiku
                                            | Hurd
                                            | IOS
                                            | Linux
                                            | NetBSD
                                            | NoOs
                                            | OpenBSD
                                            | Redox
                                            | Solaris
                                            | Windows
                                            >
                                        }
                                      ) →
                                      Some
                                        "--host=${merge
                                                    { AArch = "aarch64"
                                                    , Alpha = "alpha"
                                                    , Arm = "arm"
                                                    , HPPA = "hppa"
                                                    , HPPA64 = "hppa64"
                                                    , M68k = "m68k"
                                                    , Mips = "mips"
                                                    , Mips64 = "mips64"
                                                    , Mips64El = "mips64el"
                                                    , MipsEl = "mipsel"
                                                    , MipsIsa32r6 =
                                                        "mipsisa32r6"
                                                    , MipsIsa32r6El =
                                                        "mipsisa32r6el"
                                                    , MipsIsa64r6 =
                                                        "mipsisa64r6"
                                                    , MipsIsa64r6El =
                                                        "mipsisa64r6el"
                                                    , PowerPC = "powerpc"
                                                    , PowerPC64 = "powerpc64"
                                                    , PowerPC64le =
                                                        "powerpc64le"
                                                    , RISCV64 = "riscv64"
                                                    , S390x = "s390x"
                                                    , SH4 = "sh4"
                                                    , Sparc64 = "sparc64"
                                                    , X64 = "x86_64"
                                                    , X86 = "i686"
                                                    }
                                                    _.arch}-${merge
                                                                { AIX = "aix"
                                                                , Android =
                                                                    "android"
                                                                , Darwin =
                                                                    "darwin"
                                                                , Dragonfly =
                                                                    "dragonfly"
                                                                , FreeBSD =
                                                                    "freebsd"
                                                                , Haiku =
                                                                    "haiku"
                                                                , Hurd = "hurd"
                                                                , IOS = "darwin"
                                                                , Linux =
                                                                    "linux"
                                                                , NetBSD =
                                                                    "netbsd"
                                                                , NoOs = "none"
                                                                , OpenBSD =
                                                                    "openbsd"
                                                                , Redox =
                                                                    "redox"
                                                                , Solaris =
                                                                    "solaris"
                                                                , Windows =
                                                                    "w64"
                                                                }
                                                                _.os}${merge
                                                                         { None =
                                                                             ""
                                                                         , Some =
                                                                             λ ( abi
                                                                               : < GNU
                                                                                 | GNUabi64
                                                                                 | GNUeabi
                                                                                 | GNUeabihf
                                                                                 | GNUspe
                                                                                 | MinGw
                                                                                 >
                                                                               ) →
                                                                               "-${merge
                                                                                     { GNU =
                                                                                         "gnu"
                                                                                     , GNUabi64 =
                                                                                         "gnuabi64"
                                                                                     , GNUeabi =
                                                                                         "gnueabi"
                                                                                     , GNUeabihf =
                                                                                         "gnueabihf"
                                                                                     , GNUspe =
                                                                                         "gnuspe"
                                                                                     , MinGw =
                                                                                         "mingw32"
                                                                                     }
                                                                                     abi}"
                                                                         }
                                                                         _.abi}"
                                }
                                cfg.targetTriple
                            )
                        )
                  , environment = Some
                      (   ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                        # [ { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          cfg.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.includeDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-I${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${if cfg.static then " -static" else ""}"
                            , var = "CPPFLAGS"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , if    cfg.static
                            then  { value =
                                      "${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/lib:/lib:/usr/lib"
                                  , var = "LIBRARY_PATH"
                                  }
                            else  { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            cfg.linkDirs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        _@1
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "LD_LIBRARY_PATH"
                                  }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_RUN_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/site_perl/5.30.2/${merge
                                                                                 { AArch =
                                                                                     "aarch64"
                                                                                 , Alpha =
                                                                                     "alpha"
                                                                                 , Arm =
                                                                                     "arm"
                                                                                 , HPPA =
                                                                                     "hppa"
                                                                                 , HPPA64 =
                                                                                     "hppa64"
                                                                                 , M68k =
                                                                                     "m68k"
                                                                                 , Mips =
                                                                                     "mips"
                                                                                 , Mips64 =
                                                                                     "mips64"
                                                                                 , Mips64El =
                                                                                     "mips64el"
                                                                                 , MipsEl =
                                                                                     "mipsel"
                                                                                 , MipsIsa32r6 =
                                                                                     "mipsisa32r6"
                                                                                 , MipsIsa32r6El =
                                                                                     "mipsisa32r6el"
                                                                                 , MipsIsa64r6 =
                                                                                     "mipsisa64r6"
                                                                                 , MipsIsa64r6El =
                                                                                     "mipsisa64r6el"
                                                                                 , PowerPC =
                                                                                     "powerpc"
                                                                                 , PowerPC64 =
                                                                                     "powerpc64"
                                                                                 , PowerPC64le =
                                                                                     "powerpc64le"
                                                                                 , RISCV64 =
                                                                                     "riscv64"
                                                                                 , S390x =
                                                                                     "s390x"
                                                                                 , SH4 =
                                                                                     "sh4"
                                                                                 , Sparc64 =
                                                                                     "sparc64"
                                                                                 , X64 =
                                                                                     "x86_64"
                                                                                 , X86 =
                                                                                     "i686"
                                                                                 }
                                                                                 cfg.buildArch}-${merge
                                                                                                    { AIX =
                                                                                                        "aix"
                                                                                                    , Android =
                                                                                                        "android"
                                                                                                    , Darwin =
                                                                                                        "darwin"
                                                                                                    , Dragonfly =
                                                                                                        "dragonfly"
                                                                                                    , FreeBSD =
                                                                                                        "freebsd"
                                                                                                    , Haiku =
                                                                                                        "haiku"
                                                                                                    , Hurd =
                                                                                                        "hurd"
                                                                                                    , IOS =
                                                                                                        "darwin"
                                                                                                    , Linux =
                                                                                                        "linux"
                                                                                                    , NetBSD =
                                                                                                        "netbsd"
                                                                                                    , NoOs =
                                                                                                        "none"
                                                                                                    , OpenBSD =
                                                                                                        "openbsd"
                                                                                                    , Redox =
                                                                                                        "redox"
                                                                                                    , Solaris =
                                                                                                        "solaris"
                                                                                                    , Windows =
                                                                                                        "w64"
                                                                                                    }
                                                                                                    cfg.buildOS}/:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PERL5LIB"
                            }
                          ]
                      )
                  , procDir = None Text
                  , program =
                      if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  "sh"
                      else  "./configure"
                  }
              ]
      , copyFile =
          λ(src : Text) →
          λ(dest : Text) →
            < Call :
                { arguments : List Text
                , environment : Optional (List { value : Text, var : Text })
                , procDir : Optional Text
                , program : Text
                }
            | CopyFile : { dest : Text, src : Text }
            | CreateDirectory : { dir : Text }
            | MakeExecutable : { file : Text }
            | Patch : { patchContents : Text }
            | Symlink : { linkName : Text, tgt : Text }
            | SymlinkBinary : { file : Text }
            | SymlinkManpage : { file : Text, section : Natural }
            | Write : { contents : Text, file : Text }
            >.CopyFile
              { dest, src }
      , copyFiles =
          λ(_ : List { dest : Text, src : Text }) →
            List/fold
              { dest : Text, src : Text }
              _
              ( List
                  < Call :
                      { arguments : List Text
                      , environment :
                          Optional (List { value : Text, var : Text })
                      , procDir : Optional Text
                      , program : Text
                      }
                  | CopyFile : { dest : Text, src : Text }
                  | CreateDirectory : { dir : Text }
                  | MakeExecutable : { file : Text }
                  | Patch : { patchContents : Text }
                  | Symlink : { linkName : Text, tgt : Text }
                  | SymlinkBinary : { file : Text }
                  | SymlinkManpage : { file : Text, section : Natural }
                  | Write : { contents : Text, file : Text }
                  >
              )
              ( λ(_ : { dest : Text, src : Text }) →
                λ ( _
                  : List
                      < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >
                  ) →
                    [ < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.CopyFile
                        _@1
                    ]
                  # _
              )
              ( [] : List
                       < Call :
                           { arguments : List Text
                           , environment :
                               Optional (List { value : Text, var : Text })
                           , procDir : Optional Text
                           , program : Text
                           }
                       | CopyFile : { dest : Text, src : Text }
                       | CreateDirectory : { dir : Text }
                       | MakeExecutable : { file : Text }
                       | Patch : { patchContents : Text }
                       | Symlink : { linkName : Text, tgt : Text }
                       | SymlinkBinary : { file : Text }
                       | SymlinkManpage : { file : Text, section : Natural }
                       | Write : { contents : Text, file : Text }
                       >
              )
      , createDir =
          λ(x : Text) →
            < Call :
                { arguments : List Text
                , environment : Optional (List { value : Text, var : Text })
                , procDir : Optional Text
                , program : Text
                }
            | CopyFile : { dest : Text, src : Text }
            | CreateDirectory : { dir : Text }
            | MakeExecutable : { file : Text }
            | Patch : { patchContents : Text }
            | Symlink : { linkName : Text, tgt : Text }
            | SymlinkBinary : { file : Text }
            | SymlinkManpage : { file : Text, section : Natural }
            | Write : { contents : Text, file : Text }
            >.CreateDirectory
              { dir = x }
      , defaultBuild =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [ "-j${Natural/show cfg.cpus}" ]
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_LIBRARY_PATH"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        ]
                    )
                , procDir = None Text
                , program =
                    merge
                      { AIX = "make"
                      , Android = "make"
                      , Darwin = "make"
                      , Dragonfly = "gmake"
                      , FreeBSD = "gmake"
                      , Haiku = "make"
                      , Hurd = "make"
                      , IOS = "make"
                      , Linux = "make"
                      , NetBSD = "gmake"
                      , NoOs = "make"
                      , OpenBSD = "gmake"
                      , Redox = "make"
                      , Solaris = "gmake"
                      , Windows = "make"
                      }
                      cfg.buildOS
                }
            ]
      , defaultCall =
        { arguments = [] : List Text
        , environment = None (List { value : Text, var : Text })
        , procDir = None Text
        }
      , defaultConfigure =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                    ( if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  λ(x : List Text) → [ "configure" ] # x
                      else  λ(x : List Text) → x
                    )
                      ( merge
                          { None = [ "--prefix=${cfg.installDir}" ]
                          , Some =
                              λ(x : Text) → [ "--prefix=${cfg.installDir}", x ]
                          }
                          ( merge
                              { None = None Text
                              , Some =
                                  λ ( _
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    Some
                                      "--host=${merge
                                                  { AArch = "aarch64"
                                                  , Alpha = "alpha"
                                                  , Arm = "arm"
                                                  , HPPA = "hppa"
                                                  , HPPA64 = "hppa64"
                                                  , M68k = "m68k"
                                                  , Mips = "mips"
                                                  , Mips64 = "mips64"
                                                  , Mips64El = "mips64el"
                                                  , MipsEl = "mipsel"
                                                  , MipsIsa32r6 = "mipsisa32r6"
                                                  , MipsIsa32r6El =
                                                      "mipsisa32r6el"
                                                  , MipsIsa64r6 = "mipsisa64r6"
                                                  , MipsIsa64r6El =
                                                      "mipsisa64r6el"
                                                  , PowerPC = "powerpc"
                                                  , PowerPC64 = "powerpc64"
                                                  , PowerPC64le = "powerpc64le"
                                                  , RISCV64 = "riscv64"
                                                  , S390x = "s390x"
                                                  , SH4 = "sh4"
                                                  , Sparc64 = "sparc64"
                                                  , X64 = "x86_64"
                                                  , X86 = "i686"
                                                  }
                                                  _.arch}-${merge
                                                              { AIX = "aix"
                                                              , Android =
                                                                  "android"
                                                              , Darwin =
                                                                  "darwin"
                                                              , Dragonfly =
                                                                  "dragonfly"
                                                              , FreeBSD =
                                                                  "freebsd"
                                                              , Haiku = "haiku"
                                                              , Hurd = "hurd"
                                                              , IOS = "darwin"
                                                              , Linux = "linux"
                                                              , NetBSD =
                                                                  "netbsd"
                                                              , NoOs = "none"
                                                              , OpenBSD =
                                                                  "openbsd"
                                                              , Redox = "redox"
                                                              , Solaris =
                                                                  "solaris"
                                                              , Windows = "w64"
                                                              }
                                                              _.os}${merge
                                                                       { None =
                                                                           ""
                                                                       , Some =
                                                                           λ ( abi
                                                                             : < GNU
                                                                               | GNUabi64
                                                                               | GNUeabi
                                                                               | GNUeabihf
                                                                               | GNUspe
                                                                               | MinGw
                                                                               >
                                                                             ) →
                                                                             "-${merge
                                                                                   { GNU =
                                                                                       "gnu"
                                                                                   , GNUabi64 =
                                                                                       "gnuabi64"
                                                                                   , GNUeabi =
                                                                                       "gnueabi"
                                                                                   , GNUeabihf =
                                                                                       "gnueabihf"
                                                                                   , GNUspe =
                                                                                       "gnuspe"
                                                                                   , MinGw =
                                                                                       "mingw32"
                                                                                   }
                                                                                   abi}"
                                                                       }
                                                                       _.abi}"
                              }
                              cfg.targetTriple
                          )
                      )
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_RUN_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        ]
                    )
                , procDir = None Text
                , program =
                    if    merge
                            { AIX = False
                            , Android = False
                            , Darwin = True
                            , Dragonfly = False
                            , FreeBSD = False
                            , Haiku = False
                            , Hurd = False
                            , IOS = False
                            , Linux = False
                            , NetBSD = False
                            , NoOs = False
                            , OpenBSD = False
                            , Redox = False
                            , Solaris = False
                            , Windows = False
                            }
                            cfg.buildOS
                    then  "sh"
                    else  "./configure"
                }
            ]
      , defaultCpus =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            cfg.cpus
      , defaultEnv = None (List { value : Text, var : Text })
      , defaultInstall =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [ "install" ]
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_LIBRARY_PATH"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        ]
                    )
                , procDir = None Text
                , program =
                    merge
                      { AIX = "make"
                      , Android = "make"
                      , Darwin = "make"
                      , Dragonfly = "gmake"
                      , FreeBSD = "gmake"
                      , Haiku = "make"
                      , Hurd = "make"
                      , IOS = "make"
                      , Linux = "make"
                      , NetBSD = "gmake"
                      , NoOs = "make"
                      , OpenBSD = "gmake"
                      , Redox = "make"
                      , Solaris = "gmake"
                      , Windows = "make"
                      }
                      cfg.buildOS
                }
            ]
      , defaultPackage =
        { buildCommand =
            λ ( cfg
              : { binDirs : List Text
                , buildArch :
                    < AArch
                    | Alpha
                    | Arm
                    | HPPA
                    | HPPA64
                    | M68k
                    | Mips
                    | Mips64
                    | Mips64El
                    | MipsEl
                    | MipsIsa32r6
                    | MipsIsa32r6El
                    | MipsIsa64r6
                    | MipsIsa64r6El
                    | PowerPC
                    | PowerPC64
                    | PowerPC64le
                    | RISCV64
                    | S390x
                    | SH4
                    | Sparc64
                    | X64
                    | X86
                    >
                , buildOS :
                    < AIX
                    | Android
                    | Darwin
                    | Dragonfly
                    | FreeBSD
                    | Haiku
                    | Hurd
                    | IOS
                    | Linux
                    | NetBSD
                    | NoOs
                    | OpenBSD
                    | Redox
                    | Solaris
                    | Windows
                    >
                , cpus : Natural
                , currentDir : Text
                , includeDirs : List Text
                , installDir : Text
                , isCross : Bool
                , linkDirs : List Text
                , preloadLibs : List Text
                , shareDirs : List Text
                , static : Bool
                , targetTriple :
                    Optional
                      { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                }
              ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments = [ "-j${Natural/show cfg.cpus}" ]
                  , environment = Some
                      (   ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                        # [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/site_perl/5.30.2/${merge
                                                                                 { AArch =
                                                                                     "aarch64"
                                                                                 , Alpha =
                                                                                     "alpha"
                                                                                 , Arm =
                                                                                     "arm"
                                                                                 , HPPA =
                                                                                     "hppa"
                                                                                 , HPPA64 =
                                                                                     "hppa64"
                                                                                 , M68k =
                                                                                     "m68k"
                                                                                 , Mips =
                                                                                     "mips"
                                                                                 , Mips64 =
                                                                                     "mips64"
                                                                                 , Mips64El =
                                                                                     "mips64el"
                                                                                 , MipsEl =
                                                                                     "mipsel"
                                                                                 , MipsIsa32r6 =
                                                                                     "mipsisa32r6"
                                                                                 , MipsIsa32r6El =
                                                                                     "mipsisa32r6el"
                                                                                 , MipsIsa64r6 =
                                                                                     "mipsisa64r6"
                                                                                 , MipsIsa64r6El =
                                                                                     "mipsisa64r6el"
                                                                                 , PowerPC =
                                                                                     "powerpc"
                                                                                 , PowerPC64 =
                                                                                     "powerpc64"
                                                                                 , PowerPC64le =
                                                                                     "powerpc64le"
                                                                                 , RISCV64 =
                                                                                     "riscv64"
                                                                                 , S390x =
                                                                                     "s390x"
                                                                                 , SH4 =
                                                                                     "sh4"
                                                                                 , Sparc64 =
                                                                                     "sparc64"
                                                                                 , X64 =
                                                                                     "x86_64"
                                                                                 , X86 =
                                                                                     "i686"
                                                                                 }
                                                                                 cfg.buildArch}-${merge
                                                                                                    { AIX =
                                                                                                        "aix"
                                                                                                    , Android =
                                                                                                        "android"
                                                                                                    , Darwin =
                                                                                                        "darwin"
                                                                                                    , Dragonfly =
                                                                                                        "dragonfly"
                                                                                                    , FreeBSD =
                                                                                                        "freebsd"
                                                                                                    , Haiku =
                                                                                                        "haiku"
                                                                                                    , Hurd =
                                                                                                        "hurd"
                                                                                                    , IOS =
                                                                                                        "darwin"
                                                                                                    , Linux =
                                                                                                        "linux"
                                                                                                    , NetBSD =
                                                                                                        "netbsd"
                                                                                                    , NoOs =
                                                                                                        "none"
                                                                                                    , OpenBSD =
                                                                                                        "openbsd"
                                                                                                    , Redox =
                                                                                                        "redox"
                                                                                                    , Solaris =
                                                                                                        "solaris"
                                                                                                    , Windows =
                                                                                                        "w64"
                                                                                                    }
                                                                                                    cfg.buildOS}/:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PERL5LIB"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_LIBRARY_PATH"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          cfg.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          ]
                      )
                  , procDir = None Text
                  , program =
                      merge
                        { AIX = "make"
                        , Android = "make"
                        , Darwin = "make"
                        , Dragonfly = "gmake"
                        , FreeBSD = "gmake"
                        , Haiku = "make"
                        , Hurd = "make"
                        , IOS = "make"
                        , Linux = "make"
                        , NetBSD = "gmake"
                        , NoOs = "make"
                        , OpenBSD = "gmake"
                        , Redox = "make"
                        , Solaris = "gmake"
                        , Windows = "make"
                        }
                        cfg.buildOS
                  }
              ]
        , configureCommand =
            λ ( cfg
              : { binDirs : List Text
                , buildArch :
                    < AArch
                    | Alpha
                    | Arm
                    | HPPA
                    | HPPA64
                    | M68k
                    | Mips
                    | Mips64
                    | Mips64El
                    | MipsEl
                    | MipsIsa32r6
                    | MipsIsa32r6El
                    | MipsIsa64r6
                    | MipsIsa64r6El
                    | PowerPC
                    | PowerPC64
                    | PowerPC64le
                    | RISCV64
                    | S390x
                    | SH4
                    | Sparc64
                    | X64
                    | X86
                    >
                , buildOS :
                    < AIX
                    | Android
                    | Darwin
                    | Dragonfly
                    | FreeBSD
                    | Haiku
                    | Hurd
                    | IOS
                    | Linux
                    | NetBSD
                    | NoOs
                    | OpenBSD
                    | Redox
                    | Solaris
                    | Windows
                    >
                , cpus : Natural
                , currentDir : Text
                , includeDirs : List Text
                , installDir : Text
                , isCross : Bool
                , linkDirs : List Text
                , preloadLibs : List Text
                , shareDirs : List Text
                , static : Bool
                , targetTriple :
                    Optional
                      { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                }
              ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                      ( if    merge
                                { AIX = False
                                , Android = False
                                , Darwin = True
                                , Dragonfly = False
                                , FreeBSD = False
                                , Haiku = False
                                , Hurd = False
                                , IOS = False
                                , Linux = False
                                , NetBSD = False
                                , NoOs = False
                                , OpenBSD = False
                                , Redox = False
                                , Solaris = False
                                , Windows = False
                                }
                                cfg.buildOS
                        then  λ(x : List Text) → [ "configure" ] # x
                        else  λ(x : List Text) → x
                      )
                        ( merge
                            { None = [ "--prefix=${cfg.installDir}" ]
                            , Some =
                                λ(x : Text) →
                                  [ "--prefix=${cfg.installDir}", x ]
                            }
                            ( merge
                                { None = None Text
                                , Some =
                                    λ ( _
                                      : { abi :
                                            Optional
                                              < GNU
                                              | GNUabi64
                                              | GNUeabi
                                              | GNUeabihf
                                              | GNUspe
                                              | MinGw
                                              >
                                        , arch :
                                            < AArch
                                            | Alpha
                                            | Arm
                                            | HPPA
                                            | HPPA64
                                            | M68k
                                            | Mips
                                            | Mips64
                                            | Mips64El
                                            | MipsEl
                                            | MipsIsa32r6
                                            | MipsIsa32r6El
                                            | MipsIsa64r6
                                            | MipsIsa64r6El
                                            | PowerPC
                                            | PowerPC64
                                            | PowerPC64le
                                            | RISCV64
                                            | S390x
                                            | SH4
                                            | Sparc64
                                            | X64
                                            | X86
                                            >
                                        , manufacturer :
                                            Optional
                                              < Apple | IBM | PC | Unknown >
                                        , os :
                                            < AIX
                                            | Android
                                            | Darwin
                                            | Dragonfly
                                            | FreeBSD
                                            | Haiku
                                            | Hurd
                                            | IOS
                                            | Linux
                                            | NetBSD
                                            | NoOs
                                            | OpenBSD
                                            | Redox
                                            | Solaris
                                            | Windows
                                            >
                                        }
                                      ) →
                                      Some
                                        "--host=${merge
                                                    { AArch = "aarch64"
                                                    , Alpha = "alpha"
                                                    , Arm = "arm"
                                                    , HPPA = "hppa"
                                                    , HPPA64 = "hppa64"
                                                    , M68k = "m68k"
                                                    , Mips = "mips"
                                                    , Mips64 = "mips64"
                                                    , Mips64El = "mips64el"
                                                    , MipsEl = "mipsel"
                                                    , MipsIsa32r6 =
                                                        "mipsisa32r6"
                                                    , MipsIsa32r6El =
                                                        "mipsisa32r6el"
                                                    , MipsIsa64r6 =
                                                        "mipsisa64r6"
                                                    , MipsIsa64r6El =
                                                        "mipsisa64r6el"
                                                    , PowerPC = "powerpc"
                                                    , PowerPC64 = "powerpc64"
                                                    , PowerPC64le =
                                                        "powerpc64le"
                                                    , RISCV64 = "riscv64"
                                                    , S390x = "s390x"
                                                    , SH4 = "sh4"
                                                    , Sparc64 = "sparc64"
                                                    , X64 = "x86_64"
                                                    , X86 = "i686"
                                                    }
                                                    _.arch}-${merge
                                                                { AIX = "aix"
                                                                , Android =
                                                                    "android"
                                                                , Darwin =
                                                                    "darwin"
                                                                , Dragonfly =
                                                                    "dragonfly"
                                                                , FreeBSD =
                                                                    "freebsd"
                                                                , Haiku =
                                                                    "haiku"
                                                                , Hurd = "hurd"
                                                                , IOS = "darwin"
                                                                , Linux =
                                                                    "linux"
                                                                , NetBSD =
                                                                    "netbsd"
                                                                , NoOs = "none"
                                                                , OpenBSD =
                                                                    "openbsd"
                                                                , Redox =
                                                                    "redox"
                                                                , Solaris =
                                                                    "solaris"
                                                                , Windows =
                                                                    "w64"
                                                                }
                                                                _.os}${merge
                                                                         { None =
                                                                             ""
                                                                         , Some =
                                                                             λ ( abi
                                                                               : < GNU
                                                                                 | GNUabi64
                                                                                 | GNUeabi
                                                                                 | GNUeabihf
                                                                                 | GNUspe
                                                                                 | MinGw
                                                                                 >
                                                                               ) →
                                                                               "-${merge
                                                                                     { GNU =
                                                                                         "gnu"
                                                                                     , GNUabi64 =
                                                                                         "gnuabi64"
                                                                                     , GNUeabi =
                                                                                         "gnueabi"
                                                                                     , GNUeabihf =
                                                                                         "gnueabihf"
                                                                                     , GNUspe =
                                                                                         "gnuspe"
                                                                                     , MinGw =
                                                                                         "mingw32"
                                                                                     }
                                                                                     abi}"
                                                                         }
                                                                         _.abi}"
                                }
                                cfg.targetTriple
                            )
                        )
                  , environment = Some
                      (   ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                        # [ { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          cfg.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.includeDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-I${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${if cfg.static then " -static" else ""}"
                            , var = "CPPFLAGS"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , if    cfg.static
                            then  { value =
                                      "${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/lib:/lib:/usr/lib"
                                  , var = "LIBRARY_PATH"
                                  }
                            else  { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            cfg.linkDirs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        _@1
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "LD_LIBRARY_PATH"
                                  }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_RUN_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/site_perl/5.30.2/${merge
                                                                                 { AArch =
                                                                                     "aarch64"
                                                                                 , Alpha =
                                                                                     "alpha"
                                                                                 , Arm =
                                                                                     "arm"
                                                                                 , HPPA =
                                                                                     "hppa"
                                                                                 , HPPA64 =
                                                                                     "hppa64"
                                                                                 , M68k =
                                                                                     "m68k"
                                                                                 , Mips =
                                                                                     "mips"
                                                                                 , Mips64 =
                                                                                     "mips64"
                                                                                 , Mips64El =
                                                                                     "mips64el"
                                                                                 , MipsEl =
                                                                                     "mipsel"
                                                                                 , MipsIsa32r6 =
                                                                                     "mipsisa32r6"
                                                                                 , MipsIsa32r6El =
                                                                                     "mipsisa32r6el"
                                                                                 , MipsIsa64r6 =
                                                                                     "mipsisa64r6"
                                                                                 , MipsIsa64r6El =
                                                                                     "mipsisa64r6el"
                                                                                 , PowerPC =
                                                                                     "powerpc"
                                                                                 , PowerPC64 =
                                                                                     "powerpc64"
                                                                                 , PowerPC64le =
                                                                                     "powerpc64le"
                                                                                 , RISCV64 =
                                                                                     "riscv64"
                                                                                 , S390x =
                                                                                     "s390x"
                                                                                 , SH4 =
                                                                                     "sh4"
                                                                                 , Sparc64 =
                                                                                     "sparc64"
                                                                                 , X64 =
                                                                                     "x86_64"
                                                                                 , X86 =
                                                                                     "i686"
                                                                                 }
                                                                                 cfg.buildArch}-${merge
                                                                                                    { AIX =
                                                                                                        "aix"
                                                                                                    , Android =
                                                                                                        "android"
                                                                                                    , Darwin =
                                                                                                        "darwin"
                                                                                                    , Dragonfly =
                                                                                                        "dragonfly"
                                                                                                    , FreeBSD =
                                                                                                        "freebsd"
                                                                                                    , Haiku =
                                                                                                        "haiku"
                                                                                                    , Hurd =
                                                                                                        "hurd"
                                                                                                    , IOS =
                                                                                                        "darwin"
                                                                                                    , Linux =
                                                                                                        "linux"
                                                                                                    , NetBSD =
                                                                                                        "netbsd"
                                                                                                    , NoOs =
                                                                                                        "none"
                                                                                                    , OpenBSD =
                                                                                                        "openbsd"
                                                                                                    , Redox =
                                                                                                        "redox"
                                                                                                    , Solaris =
                                                                                                        "solaris"
                                                                                                    , Windows =
                                                                                                        "w64"
                                                                                                    }
                                                                                                    cfg.buildOS}/:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PERL5LIB"
                            }
                          ]
                      )
                  , procDir = None Text
                  , program =
                      if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  "sh"
                      else  "./configure"
                  }
              ]
        , installCommand =
            λ ( cfg
              : { binDirs : List Text
                , buildArch :
                    < AArch
                    | Alpha
                    | Arm
                    | HPPA
                    | HPPA64
                    | M68k
                    | Mips
                    | Mips64
                    | Mips64El
                    | MipsEl
                    | MipsIsa32r6
                    | MipsIsa32r6El
                    | MipsIsa64r6
                    | MipsIsa64r6El
                    | PowerPC
                    | PowerPC64
                    | PowerPC64le
                    | RISCV64
                    | S390x
                    | SH4
                    | Sparc64
                    | X64
                    | X86
                    >
                , buildOS :
                    < AIX
                    | Android
                    | Darwin
                    | Dragonfly
                    | FreeBSD
                    | Haiku
                    | Hurd
                    | IOS
                    | Linux
                    | NetBSD
                    | NoOs
                    | OpenBSD
                    | Redox
                    | Solaris
                    | Windows
                    >
                , cpus : Natural
                , currentDir : Text
                , includeDirs : List Text
                , installDir : Text
                , isCross : Bool
                , linkDirs : List Text
                , preloadLibs : List Text
                , shareDirs : List Text
                , static : Bool
                , targetTriple :
                    Optional
                      { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                }
              ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments = [ "install" ]
                  , environment = Some
                      (   ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                        # [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/site_perl/5.30.2/${merge
                                                                                 { AArch =
                                                                                     "aarch64"
                                                                                 , Alpha =
                                                                                     "alpha"
                                                                                 , Arm =
                                                                                     "arm"
                                                                                 , HPPA =
                                                                                     "hppa"
                                                                                 , HPPA64 =
                                                                                     "hppa64"
                                                                                 , M68k =
                                                                                     "m68k"
                                                                                 , Mips =
                                                                                     "mips"
                                                                                 , Mips64 =
                                                                                     "mips64"
                                                                                 , Mips64El =
                                                                                     "mips64el"
                                                                                 , MipsEl =
                                                                                     "mipsel"
                                                                                 , MipsIsa32r6 =
                                                                                     "mipsisa32r6"
                                                                                 , MipsIsa32r6El =
                                                                                     "mipsisa32r6el"
                                                                                 , MipsIsa64r6 =
                                                                                     "mipsisa64r6"
                                                                                 , MipsIsa64r6El =
                                                                                     "mipsisa64r6el"
                                                                                 , PowerPC =
                                                                                     "powerpc"
                                                                                 , PowerPC64 =
                                                                                     "powerpc64"
                                                                                 , PowerPC64le =
                                                                                     "powerpc64le"
                                                                                 , RISCV64 =
                                                                                     "riscv64"
                                                                                 , S390x =
                                                                                     "s390x"
                                                                                 , SH4 =
                                                                                     "sh4"
                                                                                 , Sparc64 =
                                                                                     "sparc64"
                                                                                 , X64 =
                                                                                     "x86_64"
                                                                                 , X86 =
                                                                                     "i686"
                                                                                 }
                                                                                 cfg.buildArch}-${merge
                                                                                                    { AIX =
                                                                                                        "aix"
                                                                                                    , Android =
                                                                                                        "android"
                                                                                                    , Darwin =
                                                                                                        "darwin"
                                                                                                    , Dragonfly =
                                                                                                        "dragonfly"
                                                                                                    , FreeBSD =
                                                                                                        "freebsd"
                                                                                                    , Haiku =
                                                                                                        "haiku"
                                                                                                    , Hurd =
                                                                                                        "hurd"
                                                                                                    , IOS =
                                                                                                        "darwin"
                                                                                                    , Linux =
                                                                                                        "linux"
                                                                                                    , NetBSD =
                                                                                                        "netbsd"
                                                                                                    , NoOs =
                                                                                                        "none"
                                                                                                    , OpenBSD =
                                                                                                        "openbsd"
                                                                                                    , Redox =
                                                                                                        "redox"
                                                                                                    , Solaris =
                                                                                                        "solaris"
                                                                                                    , Windows =
                                                                                                        "w64"
                                                                                                    }
                                                                                                    cfg.buildOS}/:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PERL5LIB"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_LIBRARY_PATH"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          cfg.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          ]
                      )
                  , procDir = None Text
                  , program =
                      merge
                        { AIX = "make"
                        , Android = "make"
                        , Darwin = "make"
                        , Dragonfly = "gmake"
                        , FreeBSD = "gmake"
                        , Haiku = "make"
                        , Hurd = "make"
                        , IOS = "make"
                        , Linux = "make"
                        , NetBSD = "gmake"
                        , NoOs = "make"
                        , OpenBSD = "gmake"
                        , Redox = "make"
                        , Solaris = "gmake"
                        , Windows = "make"
                        }
                        cfg.buildOS
                  }
              ]
        , pkgBuildDeps =
            [] : List
                   { bound :
                       < Lower : { lower : List Natural }
                       | LowerUpper :
                           { lower : List Natural, upper : List Natural }
                       | NoBound
                       | Upper : { upper : List Natural }
                       >
                   , name : Text
                   }
        , pkgDeps =
            [] : List
                   { bound :
                       < Lower : { lower : List Natural }
                       | LowerUpper :
                           { lower : List Natural, upper : List Natural }
                       | NoBound
                       | Upper : { upper : List Natural }
                       >
                   , name : Text
                   }
        }
      , defaultPath =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            if    merge
                    { AIX = True
                    , Android = True
                    , Darwin = True
                    , Dragonfly = True
                    , FreeBSD = True
                    , Haiku = False
                    , Hurd = True
                    , IOS = True
                    , Linux = True
                    , NetBSD = True
                    , NoOs = False
                    , OpenBSD = True
                    , Redox = False
                    , Solaris = True
                    , Windows = False
                    }
                    cfg.buildOS
            then  [ { value =
                        "${List/fold
                             Text
                             cfg.binDirs
                             Text
                             (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                    , var = "PATH"
                    }
                  ]
            else  [] : List { value : Text, var : Text }
      , doNothing =
          λ ( _
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [] : List
                   < Call :
                       { arguments : List Text
                       , environment :
                           Optional (List { value : Text, var : Text })
                       , procDir : Optional Text
                       , program : Text
                       }
                   | CopyFile : { dest : Text, src : Text }
                   | CreateDirectory : { dir : Text }
                   | MakeExecutable : { file : Text }
                   | Patch : { patchContents : Text }
                   | Symlink : { linkName : Text, tgt : Text }
                   | SymlinkBinary : { file : Text }
                   | SymlinkManpage : { file : Text, section : Natural }
                   | Write : { contents : Text, file : Text }
                   >
      , fullVersion =
          λ(x : { patch : Natural, version : List Natural }) →
            x.version # [ x.patch ]
      , generalBuild =
          λ ( cpus
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              } →
                Natural
            ) →
          λ(envs : List { value : Text, var : Text }) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [ "-j${Natural/show (cpus cfg)}" ]
                , environment = Some envs
                , procDir = None Text
                , program =
                    merge
                      { AIX = "make"
                      , Android = "make"
                      , Darwin = "make"
                      , Dragonfly = "gmake"
                      , FreeBSD = "gmake"
                      , Haiku = "make"
                      , Hurd = "make"
                      , IOS = "make"
                      , Linux = "make"
                      , NetBSD = "gmake"
                      , NoOs = "make"
                      , OpenBSD = "gmake"
                      , Redox = "make"
                      , Solaris = "gmake"
                      , Windows = "make"
                      }
                      cfg.buildOS
                }
            ]
      , generalConfigure =
          λ ( envVars
            : List Text →
              { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              } →
                Optional (List { value : Text, var : Text })
            ) →
          λ(filename : Text) →
          λ(linkLibs : List Text) →
          λ(extraFlags : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                    ( if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  λ(x : List Text) → [ filename ] # x
                      else  λ(x : List Text) → x
                    )
                      (   merge
                            { None = [ "--prefix=${cfg.installDir}" ]
                            , Some =
                                λ(x : Text) →
                                  [ "--prefix=${cfg.installDir}", x ]
                            }
                            ( merge
                                { None = None Text
                                , Some =
                                    λ ( _
                                      : { abi :
                                            Optional
                                              < GNU
                                              | GNUabi64
                                              | GNUeabi
                                              | GNUeabihf
                                              | GNUspe
                                              | MinGw
                                              >
                                        , arch :
                                            < AArch
                                            | Alpha
                                            | Arm
                                            | HPPA
                                            | HPPA64
                                            | M68k
                                            | Mips
                                            | Mips64
                                            | Mips64El
                                            | MipsEl
                                            | MipsIsa32r6
                                            | MipsIsa32r6El
                                            | MipsIsa64r6
                                            | MipsIsa64r6El
                                            | PowerPC
                                            | PowerPC64
                                            | PowerPC64le
                                            | RISCV64
                                            | S390x
                                            | SH4
                                            | Sparc64
                                            | X64
                                            | X86
                                            >
                                        , manufacturer :
                                            Optional
                                              < Apple | IBM | PC | Unknown >
                                        , os :
                                            < AIX
                                            | Android
                                            | Darwin
                                            | Dragonfly
                                            | FreeBSD
                                            | Haiku
                                            | Hurd
                                            | IOS
                                            | Linux
                                            | NetBSD
                                            | NoOs
                                            | OpenBSD
                                            | Redox
                                            | Solaris
                                            | Windows
                                            >
                                        }
                                      ) →
                                      Some
                                        "--host=${merge
                                                    { AArch = "aarch64"
                                                    , Alpha = "alpha"
                                                    , Arm = "arm"
                                                    , HPPA = "hppa"
                                                    , HPPA64 = "hppa64"
                                                    , M68k = "m68k"
                                                    , Mips = "mips"
                                                    , Mips64 = "mips64"
                                                    , Mips64El = "mips64el"
                                                    , MipsEl = "mipsel"
                                                    , MipsIsa32r6 =
                                                        "mipsisa32r6"
                                                    , MipsIsa32r6El =
                                                        "mipsisa32r6el"
                                                    , MipsIsa64r6 =
                                                        "mipsisa64r6"
                                                    , MipsIsa64r6El =
                                                        "mipsisa64r6el"
                                                    , PowerPC = "powerpc"
                                                    , PowerPC64 = "powerpc64"
                                                    , PowerPC64le =
                                                        "powerpc64le"
                                                    , RISCV64 = "riscv64"
                                                    , S390x = "s390x"
                                                    , SH4 = "sh4"
                                                    , Sparc64 = "sparc64"
                                                    , X64 = "x86_64"
                                                    , X86 = "i686"
                                                    }
                                                    _.arch}-${merge
                                                                { AIX = "aix"
                                                                , Android =
                                                                    "android"
                                                                , Darwin =
                                                                    "darwin"
                                                                , Dragonfly =
                                                                    "dragonfly"
                                                                , FreeBSD =
                                                                    "freebsd"
                                                                , Haiku =
                                                                    "haiku"
                                                                , Hurd = "hurd"
                                                                , IOS = "darwin"
                                                                , Linux =
                                                                    "linux"
                                                                , NetBSD =
                                                                    "netbsd"
                                                                , NoOs = "none"
                                                                , OpenBSD =
                                                                    "openbsd"
                                                                , Redox =
                                                                    "redox"
                                                                , Solaris =
                                                                    "solaris"
                                                                , Windows =
                                                                    "w64"
                                                                }
                                                                _.os}${merge
                                                                         { None =
                                                                             ""
                                                                         , Some =
                                                                             λ ( abi
                                                                               : < GNU
                                                                                 | GNUabi64
                                                                                 | GNUeabi
                                                                                 | GNUeabihf
                                                                                 | GNUspe
                                                                                 | MinGw
                                                                                 >
                                                                               ) →
                                                                               "-${merge
                                                                                     { GNU =
                                                                                         "gnu"
                                                                                     , GNUabi64 =
                                                                                         "gnuabi64"
                                                                                     , GNUeabi =
                                                                                         "gnueabi"
                                                                                     , GNUeabihf =
                                                                                         "gnueabihf"
                                                                                     , GNUspe =
                                                                                         "gnuspe"
                                                                                     , MinGw =
                                                                                         "mingw32"
                                                                                     }
                                                                                     abi}"
                                                                         }
                                                                         _.abi}"
                                }
                                cfg.targetTriple
                            )
                        # extraFlags
                      )
                , environment = envVars linkLibs cfg
                , procDir = None Text
                , program =
                    if    merge
                            { AIX = False
                            , Android = False
                            , Darwin = True
                            , Dragonfly = False
                            , FreeBSD = False
                            , Haiku = False
                            , Hurd = False
                            , IOS = False
                            , Linux = False
                            , NetBSD = False
                            , NoOs = False
                            , OpenBSD = False
                            , Redox = False
                            , Solaris = False
                            , Windows = False
                            }
                            cfg.buildOS
                    then  "sh"
                    else  "./${filename}"
                }
            ]
      , installPrefix =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                  [ "prefix=${cfg.installDir}"
                  , "PREFIX=${cfg.installDir}"
                  , "install"
                  ]
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.shareDirs # cfg.linkDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_LIBRARY_PATH"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        ]
                    )
                , procDir = None Text
                , program = "make"
                }
            ]
      , installWith =
          λ(envs : List { value : Text, var : Text }) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [ "install" ]
                , environment = Some envs
                , procDir = None Text
                , program =
                    merge
                      { AIX = "make"
                      , Android = "make"
                      , Darwin = "make"
                      , Dragonfly = "gmake"
                      , FreeBSD = "gmake"
                      , Haiku = "make"
                      , Hurd = "make"
                      , IOS = "make"
                      , Linux = "make"
                      , NetBSD = "gmake"
                      , NoOs = "make"
                      , OpenBSD = "gmake"
                      , Redox = "make"
                      , Solaris = "gmake"
                      , Windows = "make"
                      }
                      cfg.buildOS
                }
            ]
      , installWithBinaries =
          λ(bins : List Text) →
          λ ( installVars
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments = [ "install" ]
                  , environment = Some
                      (   ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    installVars.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             installVars.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                        # [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (   installVars.shareDirs
                                        # installVars.linkDirs
                                      )
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      installVars.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               installVars.buildArch}-${merge
                                                                                                          { AIX =
                                                                                                              "aix"
                                                                                                          , Android =
                                                                                                              "android"
                                                                                                          , Darwin =
                                                                                                              "darwin"
                                                                                                          , Dragonfly =
                                                                                                              "dragonfly"
                                                                                                          , FreeBSD =
                                                                                                              "freebsd"
                                                                                                          , Haiku =
                                                                                                              "haiku"
                                                                                                          , Hurd =
                                                                                                              "hurd"
                                                                                                          , IOS =
                                                                                                              "darwin"
                                                                                                          , Linux =
                                                                                                              "linux"
                                                                                                          , NetBSD =
                                                                                                              "netbsd"
                                                                                                          , NoOs =
                                                                                                              "none"
                                                                                                          , OpenBSD =
                                                                                                              "openbsd"
                                                                                                          , Redox =
                                                                                                              "redox"
                                                                                                          , Solaris =
                                                                                                              "solaris"
                                                                                                          , Windows =
                                                                                                              "w64"
                                                                                                          }
                                                                                                          installVars.buildOS}/"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/site_perl/5.30.2/${merge
                                                                                 { AArch =
                                                                                     "aarch64"
                                                                                 , Alpha =
                                                                                     "alpha"
                                                                                 , Arm =
                                                                                     "arm"
                                                                                 , HPPA =
                                                                                     "hppa"
                                                                                 , HPPA64 =
                                                                                     "hppa64"
                                                                                 , M68k =
                                                                                     "m68k"
                                                                                 , Mips =
                                                                                     "mips"
                                                                                 , Mips64 =
                                                                                     "mips64"
                                                                                 , Mips64El =
                                                                                     "mips64el"
                                                                                 , MipsEl =
                                                                                     "mipsel"
                                                                                 , MipsIsa32r6 =
                                                                                     "mipsisa32r6"
                                                                                 , MipsIsa32r6El =
                                                                                     "mipsisa32r6el"
                                                                                 , MipsIsa64r6 =
                                                                                     "mipsisa64r6"
                                                                                 , MipsIsa64r6El =
                                                                                     "mipsisa64r6el"
                                                                                 , PowerPC =
                                                                                     "powerpc"
                                                                                 , PowerPC64 =
                                                                                     "powerpc64"
                                                                                 , PowerPC64le =
                                                                                     "powerpc64le"
                                                                                 , RISCV64 =
                                                                                     "riscv64"
                                                                                 , S390x =
                                                                                     "s390x"
                                                                                 , SH4 =
                                                                                     "sh4"
                                                                                 , Sparc64 =
                                                                                     "sparc64"
                                                                                 , X64 =
                                                                                     "x86_64"
                                                                                 , X86 =
                                                                                     "i686"
                                                                                 }
                                                                                 installVars.buildArch}-${merge
                                                                                                            { AIX =
                                                                                                                "aix"
                                                                                                            , Android =
                                                                                                                "android"
                                                                                                            , Darwin =
                                                                                                                "darwin"
                                                                                                            , Dragonfly =
                                                                                                                "dragonfly"
                                                                                                            , FreeBSD =
                                                                                                                "freebsd"
                                                                                                            , Haiku =
                                                                                                                "haiku"
                                                                                                            , Hurd =
                                                                                                                "hurd"
                                                                                                            , IOS =
                                                                                                                "darwin"
                                                                                                            , Linux =
                                                                                                                "linux"
                                                                                                            , NetBSD =
                                                                                                                "netbsd"
                                                                                                            , NoOs =
                                                                                                                "none"
                                                                                                            , OpenBSD =
                                                                                                                "openbsd"
                                                                                                            , Redox =
                                                                                                                "redox"
                                                                                                            , Solaris =
                                                                                                                "solaris"
                                                                                                            , Windows =
                                                                                                                "w64"
                                                                                                            }
                                                                                                            installVars.buildOS}/:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PERL5LIB"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      installVars.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_LIBRARY_PATH"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         installVars.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           installVars.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          installVars.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          ]
                      )
                  , procDir = None Text
                  , program =
                      merge
                        { AIX = "make"
                        , Android = "make"
                        , Darwin = "make"
                        , Dragonfly = "gmake"
                        , FreeBSD = "gmake"
                        , Haiku = "make"
                        , Hurd = "make"
                        , IOS = "make"
                        , Linux = "make"
                        , NetBSD = "gmake"
                        , NoOs = "make"
                        , OpenBSD = "gmake"
                        , Redox = "make"
                        , Solaris = "gmake"
                        , Windows = "make"
                        }
                        installVars.buildOS
                  }
              ]
            # ( if    installVars.isCross == False
                then  List/fold
                        Text
                        bins
                        ( List
                            < Call :
                                { arguments : List Text
                                , environment :
                                    Optional (List { value : Text, var : Text })
                                , procDir : Optional Text
                                , program : Text
                                }
                            | CopyFile : { dest : Text, src : Text }
                            | CreateDirectory : { dir : Text }
                            | MakeExecutable : { file : Text }
                            | Patch : { patchContents : Text }
                            | Symlink : { linkName : Text, tgt : Text }
                            | SymlinkBinary : { file : Text }
                            | SymlinkManpage :
                                { file : Text, section : Natural }
                            | Write : { contents : Text, file : Text }
                            >
                        )
                        ( λ(_ : Text) →
                          λ ( _
                            : List
                                < Call :
                                    { arguments : List Text
                                    , environment :
                                        Optional
                                          (List { value : Text, var : Text })
                                    , procDir : Optional Text
                                    , program : Text
                                    }
                                | CopyFile : { dest : Text, src : Text }
                                | CreateDirectory : { dir : Text }
                                | MakeExecutable : { file : Text }
                                | Patch : { patchContents : Text }
                                | Symlink : { linkName : Text, tgt : Text }
                                | SymlinkBinary : { file : Text }
                                | SymlinkManpage :
                                    { file : Text, section : Natural }
                                | Write : { contents : Text, file : Text }
                                >
                            ) →
                              [ < Call :
                                    { arguments : List Text
                                    , environment :
                                        Optional
                                          (List { value : Text, var : Text })
                                    , procDir : Optional Text
                                    , program : Text
                                    }
                                | CopyFile : { dest : Text, src : Text }
                                | CreateDirectory : { dir : Text }
                                | MakeExecutable : { file : Text }
                                | Patch : { patchContents : Text }
                                | Symlink : { linkName : Text, tgt : Text }
                                | SymlinkBinary : { file : Text }
                                | SymlinkManpage :
                                    { file : Text, section : Natural }
                                | Write : { contents : Text, file : Text }
                                >.SymlinkBinary
                                  { file = _@1 }
                              ]
                            # _
                        )
                        ( [] : List
                                 < Call :
                                     { arguments : List Text
                                     , environment :
                                         Optional
                                           (List { value : Text, var : Text })
                                     , procDir : Optional Text
                                     , program : Text
                                     }
                                 | CopyFile : { dest : Text, src : Text }
                                 | CreateDirectory : { dir : Text }
                                 | MakeExecutable : { file : Text }
                                 | Patch : { patchContents : Text }
                                 | Symlink : { linkName : Text, tgt : Text }
                                 | SymlinkBinary : { file : Text }
                                 | SymlinkManpage :
                                     { file : Text, section : Natural }
                                 | Write : { contents : Text, file : Text }
                                 >
                        )
                else  [] : List
                             < Call :
                                 { arguments : List Text
                                 , environment :
                                     Optional
                                       (List { value : Text, var : Text })
                                 , procDir : Optional Text
                                 , program : Text
                                 }
                             | CopyFile : { dest : Text, src : Text }
                             | CreateDirectory : { dir : Text }
                             | MakeExecutable : { file : Text }
                             | Patch : { patchContents : Text }
                             | Symlink : { linkName : Text, tgt : Text }
                             | SymlinkBinary : { file : Text }
                             | SymlinkManpage :
                                 { file : Text, section : Natural }
                             | Write : { contents : Text, file : Text }
                             >
              )
      , installWithManpages =
          λ(mans : List { file : Text, section : Natural }) →
          λ ( installVars
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments = [ "install" ]
                  , environment = Some
                      (   ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    installVars.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             installVars.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                        # [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (   installVars.shareDirs
                                        # installVars.linkDirs
                                      )
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      installVars.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               installVars.buildArch}-${merge
                                                                                                          { AIX =
                                                                                                              "aix"
                                                                                                          , Android =
                                                                                                              "android"
                                                                                                          , Darwin =
                                                                                                              "darwin"
                                                                                                          , Dragonfly =
                                                                                                              "dragonfly"
                                                                                                          , FreeBSD =
                                                                                                              "freebsd"
                                                                                                          , Haiku =
                                                                                                              "haiku"
                                                                                                          , Hurd =
                                                                                                              "hurd"
                                                                                                          , IOS =
                                                                                                              "darwin"
                                                                                                          , Linux =
                                                                                                              "linux"
                                                                                                          , NetBSD =
                                                                                                              "netbsd"
                                                                                                          , NoOs =
                                                                                                              "none"
                                                                                                          , OpenBSD =
                                                                                                              "openbsd"
                                                                                                          , Redox =
                                                                                                              "redox"
                                                                                                          , Solaris =
                                                                                                              "solaris"
                                                                                                          , Windows =
                                                                                                              "w64"
                                                                                                          }
                                                                                                          installVars.buildOS}/"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/site_perl/5.30.2/${merge
                                                                                 { AArch =
                                                                                     "aarch64"
                                                                                 , Alpha =
                                                                                     "alpha"
                                                                                 , Arm =
                                                                                     "arm"
                                                                                 , HPPA =
                                                                                     "hppa"
                                                                                 , HPPA64 =
                                                                                     "hppa64"
                                                                                 , M68k =
                                                                                     "m68k"
                                                                                 , Mips =
                                                                                     "mips"
                                                                                 , Mips64 =
                                                                                     "mips64"
                                                                                 , Mips64El =
                                                                                     "mips64el"
                                                                                 , MipsEl =
                                                                                     "mipsel"
                                                                                 , MipsIsa32r6 =
                                                                                     "mipsisa32r6"
                                                                                 , MipsIsa32r6El =
                                                                                     "mipsisa32r6el"
                                                                                 , MipsIsa64r6 =
                                                                                     "mipsisa64r6"
                                                                                 , MipsIsa64r6El =
                                                                                     "mipsisa64r6el"
                                                                                 , PowerPC =
                                                                                     "powerpc"
                                                                                 , PowerPC64 =
                                                                                     "powerpc64"
                                                                                 , PowerPC64le =
                                                                                     "powerpc64le"
                                                                                 , RISCV64 =
                                                                                     "riscv64"
                                                                                 , S390x =
                                                                                     "s390x"
                                                                                 , SH4 =
                                                                                     "sh4"
                                                                                 , Sparc64 =
                                                                                     "sparc64"
                                                                                 , X64 =
                                                                                     "x86_64"
                                                                                 , X86 =
                                                                                     "i686"
                                                                                 }
                                                                                 installVars.buildArch}-${merge
                                                                                                            { AIX =
                                                                                                                "aix"
                                                                                                            , Android =
                                                                                                                "android"
                                                                                                            , Darwin =
                                                                                                                "darwin"
                                                                                                            , Dragonfly =
                                                                                                                "dragonfly"
                                                                                                            , FreeBSD =
                                                                                                                "freebsd"
                                                                                                            , Haiku =
                                                                                                                "haiku"
                                                                                                            , Hurd =
                                                                                                                "hurd"
                                                                                                            , IOS =
                                                                                                                "darwin"
                                                                                                            , Linux =
                                                                                                                "linux"
                                                                                                            , NetBSD =
                                                                                                                "netbsd"
                                                                                                            , NoOs =
                                                                                                                "none"
                                                                                                            , OpenBSD =
                                                                                                                "openbsd"
                                                                                                            , Redox =
                                                                                                                "redox"
                                                                                                            , Solaris =
                                                                                                                "solaris"
                                                                                                            , Windows =
                                                                                                                "w64"
                                                                                                            }
                                                                                                            installVars.buildOS}/:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PERL5LIB"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      installVars.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_LIBRARY_PATH"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         installVars.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           installVars.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          installVars.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          ]
                      )
                  , procDir = None Text
                  , program =
                      merge
                        { AIX = "make"
                        , Android = "make"
                        , Darwin = "make"
                        , Dragonfly = "gmake"
                        , FreeBSD = "gmake"
                        , Haiku = "make"
                        , Hurd = "make"
                        , IOS = "make"
                        , Linux = "make"
                        , NetBSD = "gmake"
                        , NoOs = "make"
                        , OpenBSD = "gmake"
                        , Redox = "make"
                        , Solaris = "gmake"
                        , Windows = "make"
                        }
                        installVars.buildOS
                  }
              ]
            # ( if    installVars.isCross == False
                then  List/fold
                        { file : Text, section : Natural }
                        mans
                        ( List
                            < Call :
                                { arguments : List Text
                                , environment :
                                    Optional (List { value : Text, var : Text })
                                , procDir : Optional Text
                                , program : Text
                                }
                            | CopyFile : { dest : Text, src : Text }
                            | CreateDirectory : { dir : Text }
                            | MakeExecutable : { file : Text }
                            | Patch : { patchContents : Text }
                            | Symlink : { linkName : Text, tgt : Text }
                            | SymlinkBinary : { file : Text }
                            | SymlinkManpage :
                                { file : Text, section : Natural }
                            | Write : { contents : Text, file : Text }
                            >
                        )
                        ( λ(_ : { file : Text, section : Natural }) →
                          λ ( _
                            : List
                                < Call :
                                    { arguments : List Text
                                    , environment :
                                        Optional
                                          (List { value : Text, var : Text })
                                    , procDir : Optional Text
                                    , program : Text
                                    }
                                | CopyFile : { dest : Text, src : Text }
                                | CreateDirectory : { dir : Text }
                                | MakeExecutable : { file : Text }
                                | Patch : { patchContents : Text }
                                | Symlink : { linkName : Text, tgt : Text }
                                | SymlinkBinary : { file : Text }
                                | SymlinkManpage :
                                    { file : Text, section : Natural }
                                | Write : { contents : Text, file : Text }
                                >
                            ) →
                              [ < Call :
                                    { arguments : List Text
                                    , environment :
                                        Optional
                                          (List { value : Text, var : Text })
                                    , procDir : Optional Text
                                    , program : Text
                                    }
                                | CopyFile : { dest : Text, src : Text }
                                | CreateDirectory : { dir : Text }
                                | MakeExecutable : { file : Text }
                                | Patch : { patchContents : Text }
                                | Symlink : { linkName : Text, tgt : Text }
                                | SymlinkBinary : { file : Text }
                                | SymlinkManpage :
                                    { file : Text, section : Natural }
                                | Write : { contents : Text, file : Text }
                                >.SymlinkManpage
                                  _@1
                              ]
                            # _
                        )
                        ( [] : List
                                 < Call :
                                     { arguments : List Text
                                     , environment :
                                         Optional
                                           (List { value : Text, var : Text })
                                     , procDir : Optional Text
                                     , program : Text
                                     }
                                 | CopyFile : { dest : Text, src : Text }
                                 | CreateDirectory : { dir : Text }
                                 | MakeExecutable : { file : Text }
                                 | Patch : { patchContents : Text }
                                 | Symlink : { linkName : Text, tgt : Text }
                                 | SymlinkBinary : { file : Text }
                                 | SymlinkManpage :
                                     { file : Text, section : Natural }
                                 | Write : { contents : Text, file : Text }
                                 >
                        )
                else  [] : List
                             < Call :
                                 { arguments : List Text
                                 , environment :
                                     Optional
                                       (List { value : Text, var : Text })
                                 , procDir : Optional Text
                                 , program : Text
                                 }
                             | CopyFile : { dest : Text, src : Text }
                             | CreateDirectory : { dir : Text }
                             | MakeExecutable : { file : Text }
                             | Patch : { patchContents : Text }
                             | Symlink : { linkName : Text, tgt : Text }
                             | SymlinkBinary : { file : Text }
                             | SymlinkManpage :
                                 { file : Text, section : Natural }
                             | Write : { contents : Text, file : Text }
                             >
              )
      , installWithPy3Wrappers =
          λ(binNames : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.CreateDirectory
                  { dir = "${cfg.installDir}/lib/python3.8/site-packages" }
              , < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                    [ "setup.py"
                    , "install"
                    , "--prefix=${cfg.installDir}"
                    , "--optimize=1"
                    ]
                  , environment = Some
                      (   [ { value =
                                "${cfg.installDir}/lib/python3.8/site-packages"
                            , var = "PYTHONPATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , if    cfg.static
                            then  { value =
                                      "${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/lib:/lib:/usr/lib"
                                  , var = "LIBRARY_PATH"
                                  }
                            else  { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            cfg.linkDirs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        _@1
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "LD_LIBRARY_PATH"
                                  }
                          ]
                        # ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                      )
                  , procDir = None Text
                  , program = "python3"
                  }
              ]
            # List/fold
                Text
                binNames
                ( List
                    < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >
                )
                ( λ(_ : Text) →
                    List/fold
                      < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >
                      [ < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.CreateDirectory
                          { dir = "wrapper" }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.Write
                          { contents =
                              "${( if    cfg.static
                                   then  { value =
                                             "${List/fold
                                                  Text
                                                  cfg.linkDirs
                                                  Text
                                                  ( λ(_ : Text) →
                                                    λ(_ : Text) →
                                                      "${_@1}:${_}"
                                                  )
                                                  ""}/usr/local/lib:/lib:/usr/lib"
                                         , var = "LIBRARY_PATH"
                                         }
                                   else  { value =
                                             merge
                                               { Empty = ""
                                               , NonEmpty = λ(_ : Text) → _
                                               }
                                               ( List/fold
                                                   Text
                                                   cfg.linkDirs
                                                   < Empty | NonEmpty : Text >
                                                   ( λ(_ : Text) →
                                                     λ ( _
                                                       : < Empty
                                                         | NonEmpty : Text
                                                         >
                                                       ) →
                                                       merge
                                                         { Empty =
                                                             < Empty
                                                             | NonEmpty : Text
                                                             >.NonEmpty
                                                               _@1
                                                         , NonEmpty =
                                                             λ(_ : Text) →
                                                               < Empty
                                                               | NonEmpty : Text
                                                               >.NonEmpty
                                                                 "${_@2}:${_}"
                                                         }
                                                         _
                                                   )
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.Empty
                                               )
                                         , var = "LD_LIBRARY_PATH"
                                         }
                                 ).var}=${( if    cfg.static
                                            then  { value =
                                                      "${List/fold
                                                           Text
                                                           cfg.linkDirs
                                                           Text
                                                           ( λ(_ : Text) →
                                                             λ(_ : Text) →
                                                               "${_@1}:${_}"
                                                           )
                                                           ""}/usr/local/lib:/lib:/usr/lib"
                                                  , var = "LIBRARY_PATH"
                                                  }
                                            else  { value =
                                                      merge
                                                        { Empty = ""
                                                        , NonEmpty =
                                                            λ(_ : Text) → _
                                                        }
                                                        ( List/fold
                                                            Text
                                                            cfg.linkDirs
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >
                                                            ( λ(_ : Text) →
                                                              λ ( _
                                                                : < Empty
                                                                  | NonEmpty :
                                                                      Text
                                                                  >
                                                                ) →
                                                                merge
                                                                  { Empty =
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >.NonEmpty
                                                                        _@1
                                                                  , NonEmpty =
                                                                      λ ( _
                                                                        : Text
                                                                        ) →
                                                                        < Empty
                                                                        | NonEmpty :
                                                                            Text
                                                                        >.NonEmpty
                                                                          "${_@2}:${_}"
                                                                  }
                                                                  _
                                                            )
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.Empty
                                                        )
                                                  , var = "LD_LIBRARY_PATH"
                                                  }
                                          ).value} PYTHONPATH=${merge
                                                                  { Empty = ""
                                                                  , NonEmpty =
                                                                      λ ( _
                                                                        : Text
                                                                        ) →
                                                                        _
                                                                  }
                                                                  ( List/fold
                                                                      Text
                                                                      cfg.linkDirs
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >
                                                                      ( λ ( _
                                                                          : Text
                                                                          ) →
                                                                        λ ( _
                                                                          : < Empty
                                                                            | NonEmpty :
                                                                                Text
                                                                            >
                                                                          ) →
                                                                          merge
                                                                            { Empty =
                                                                                < Empty
                                                                                | NonEmpty :
                                                                                    Text
                                                                                >.NonEmpty
                                                                                  "${_@1}/python3.8/site-packages"
                                                                            , NonEmpty =
                                                                                λ ( _
                                                                                  : Text
                                                                                  ) →
                                                                                  < Empty
                                                                                  | NonEmpty :
                                                                                      Text
                                                                                  >.NonEmpty
                                                                                    "${_@2}/python3.8/site-packages:${_}"
                                                                            }
                                                                            _
                                                                      )
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >.Empty
                                                                  )}:${cfg.installDir}/lib/python3.8/site-packages ${cfg.installDir}/bin/${_} \$@"
                          , file = "wrapper/${_}"
                          }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.MakeExecutable
                          { file = "wrapper/${_}" }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.CopyFile
                          { dest = "wrapper/${_}", src = "wrapper/${_}" }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.SymlinkBinary
                          { file = "wrapper/${_}" }
                      ]
                      ( List
                          < Call :
                              { arguments : List Text
                              , environment :
                                  Optional (List { value : Text, var : Text })
                              , procDir : Optional Text
                              , program : Text
                              }
                          | CopyFile : { dest : Text, src : Text }
                          | CreateDirectory : { dir : Text }
                          | MakeExecutable : { file : Text }
                          | Patch : { patchContents : Text }
                          | Symlink : { linkName : Text, tgt : Text }
                          | SymlinkBinary : { file : Text }
                          | SymlinkManpage : { file : Text, section : Natural }
                          | Write : { contents : Text, file : Text }
                          >
                      )
                      ( λ ( _
                          : < Call :
                                { arguments : List Text
                                , environment :
                                    Optional (List { value : Text, var : Text })
                                , procDir : Optional Text
                                , program : Text
                                }
                            | CopyFile : { dest : Text, src : Text }
                            | CreateDirectory : { dir : Text }
                            | MakeExecutable : { file : Text }
                            | Patch : { patchContents : Text }
                            | Symlink : { linkName : Text, tgt : Text }
                            | SymlinkBinary : { file : Text }
                            | SymlinkManpage :
                                { file : Text, section : Natural }
                            | Write : { contents : Text, file : Text }
                            >
                          ) →
                        λ ( _
                          : List
                              < Call :
                                  { arguments : List Text
                                  , environment :
                                      Optional
                                        (List { value : Text, var : Text })
                                  , procDir : Optional Text
                                  , program : Text
                                  }
                              | CopyFile : { dest : Text, src : Text }
                              | CreateDirectory : { dir : Text }
                              | MakeExecutable : { file : Text }
                              | Patch : { patchContents : Text }
                              | Symlink : { linkName : Text, tgt : Text }
                              | SymlinkBinary : { file : Text }
                              | SymlinkManpage :
                                  { file : Text, section : Natural }
                              | Write : { contents : Text, file : Text }
                              >
                          ) →
                          [ _@1 ] # _
                      )
                )
                ( [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
                )
      , installWithPyWrappers =
          λ(version : List Natural) →
          λ(binNames : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.CreateDirectory
                  { dir =
                      "${cfg.installDir}/lib/python${merge
                                                       { Empty = ""
                                                       , NonEmpty =
                                                           λ(_ : Text) → _
                                                       }
                                                       ( List/fold
                                                           Natural
                                                           version
                                                           < Empty
                                                           | NonEmpty : Text
                                                           >
                                                           ( λ(_ : Natural) →
                                                             λ ( _
                                                               : < Empty
                                                                 | NonEmpty :
                                                                     Text
                                                                 >
                                                               ) →
                                                               merge
                                                                 { Empty =
                                                                     < Empty
                                                                     | NonEmpty :
                                                                         Text
                                                                     >.NonEmpty
                                                                       ( Natural/show
                                                                           _@1
                                                                       )
                                                                 , NonEmpty =
                                                                     λ ( _
                                                                       : Text
                                                                       ) →
                                                                       < Empty
                                                                       | NonEmpty :
                                                                           Text
                                                                       >.NonEmpty
                                                                         "${Natural/show
                                                                              _@2}.${_}"
                                                                 }
                                                                 _
                                                           )
                                                           < Empty
                                                           | NonEmpty : Text
                                                           >.Empty
                                                       )}/site-packages"
                  }
              , < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments =
                    [ "setup.py"
                    , "install"
                    , "--prefix=${cfg.installDir}"
                    , "--optimize=1"
                    ]
                  , environment = Some
                      (   [ { value =
                                "${cfg.installDir}/lib/python${merge
                                                                 { Empty = ""
                                                                 , NonEmpty =
                                                                     λ ( _
                                                                       : Text
                                                                       ) →
                                                                       _
                                                                 }
                                                                 ( List/fold
                                                                     Natural
                                                                     version
                                                                     < Empty
                                                                     | NonEmpty :
                                                                         Text
                                                                     >
                                                                     ( λ ( _
                                                                         : Natural
                                                                         ) →
                                                                       λ ( _
                                                                         : < Empty
                                                                           | NonEmpty :
                                                                               Text
                                                                           >
                                                                         ) →
                                                                         merge
                                                                           { Empty =
                                                                               < Empty
                                                                               | NonEmpty :
                                                                                   Text
                                                                               >.NonEmpty
                                                                                 ( Natural/show
                                                                                     _@1
                                                                                 )
                                                                           , NonEmpty =
                                                                               λ ( _
                                                                                 : Text
                                                                                 ) →
                                                                                 < Empty
                                                                                 | NonEmpty :
                                                                                     Text
                                                                                 >.NonEmpty
                                                                                   "${Natural/show
                                                                                        _@2}.${_}"
                                                                           }
                                                                           _
                                                                     )
                                                                     < Empty
                                                                     | NonEmpty :
                                                                         Text
                                                                     >.Empty
                                                                 )}/site-packages"
                            , var = "PYTHONPATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , if    cfg.static
                            then  { value =
                                      "${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/lib:/lib:/usr/lib"
                                  , var = "LIBRARY_PATH"
                                  }
                            else  { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            cfg.linkDirs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        _@1
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "LD_LIBRARY_PATH"
                                  }
                          ]
                        # ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                      )
                  , procDir = None Text
                  , program =
                      "python${merge
                                 { None = "", Some = Natural/show }
                                 (List/head Natural version)}"
                  }
              ]
            # List/fold
                Text
                binNames
                ( List
                    < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >
                )
                ( λ(_ : Text) →
                    List/fold
                      < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >
                      [ < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.CreateDirectory
                          { dir = "wrapper" }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.Write
                          { contents =
                              "${( if    cfg.static
                                   then  { value =
                                             "${List/fold
                                                  Text
                                                  cfg.linkDirs
                                                  Text
                                                  ( λ(_ : Text) →
                                                    λ(_ : Text) →
                                                      "${_@1}:${_}"
                                                  )
                                                  ""}/usr/local/lib:/lib:/usr/lib"
                                         , var = "LIBRARY_PATH"
                                         }
                                   else  { value =
                                             merge
                                               { Empty = ""
                                               , NonEmpty = λ(_ : Text) → _
                                               }
                                               ( List/fold
                                                   Text
                                                   cfg.linkDirs
                                                   < Empty | NonEmpty : Text >
                                                   ( λ(_ : Text) →
                                                     λ ( _
                                                       : < Empty
                                                         | NonEmpty : Text
                                                         >
                                                       ) →
                                                       merge
                                                         { Empty =
                                                             < Empty
                                                             | NonEmpty : Text
                                                             >.NonEmpty
                                                               _@1
                                                         , NonEmpty =
                                                             λ(_ : Text) →
                                                               < Empty
                                                               | NonEmpty : Text
                                                               >.NonEmpty
                                                                 "${_@2}:${_}"
                                                         }
                                                         _
                                                   )
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.Empty
                                               )
                                         , var = "LD_LIBRARY_PATH"
                                         }
                                 ).var}=${( if    cfg.static
                                            then  { value =
                                                      "${List/fold
                                                           Text
                                                           cfg.linkDirs
                                                           Text
                                                           ( λ(_ : Text) →
                                                             λ(_ : Text) →
                                                               "${_@1}:${_}"
                                                           )
                                                           ""}/usr/local/lib:/lib:/usr/lib"
                                                  , var = "LIBRARY_PATH"
                                                  }
                                            else  { value =
                                                      merge
                                                        { Empty = ""
                                                        , NonEmpty =
                                                            λ(_ : Text) → _
                                                        }
                                                        ( List/fold
                                                            Text
                                                            cfg.linkDirs
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >
                                                            ( λ(_ : Text) →
                                                              λ ( _
                                                                : < Empty
                                                                  | NonEmpty :
                                                                      Text
                                                                  >
                                                                ) →
                                                                merge
                                                                  { Empty =
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >.NonEmpty
                                                                        _@1
                                                                  , NonEmpty =
                                                                      λ ( _
                                                                        : Text
                                                                        ) →
                                                                        < Empty
                                                                        | NonEmpty :
                                                                            Text
                                                                        >.NonEmpty
                                                                          "${_@2}:${_}"
                                                                  }
                                                                  _
                                                            )
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.Empty
                                                        )
                                                  , var = "LD_LIBRARY_PATH"
                                                  }
                                          ).value} PYTHONPATH=${merge
                                                                  { Empty = ""
                                                                  , NonEmpty =
                                                                      λ ( _
                                                                        : Text
                                                                        ) →
                                                                        _
                                                                  }
                                                                  ( List/fold
                                                                      Text
                                                                      cfg.linkDirs
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >
                                                                      ( λ ( _
                                                                          : Text
                                                                          ) →
                                                                        λ ( _
                                                                          : < Empty
                                                                            | NonEmpty :
                                                                                Text
                                                                            >
                                                                          ) →
                                                                          merge
                                                                            { Empty =
                                                                                < Empty
                                                                                | NonEmpty :
                                                                                    Text
                                                                                >.NonEmpty
                                                                                  "${_@1}/python${merge
                                                                                                    { Empty =
                                                                                                        ""
                                                                                                    , NonEmpty =
                                                                                                        λ ( _
                                                                                                          : Text
                                                                                                          ) →
                                                                                                          _
                                                                                                    }
                                                                                                    ( List/fold
                                                                                                        Natural
                                                                                                        version
                                                                                                        < Empty
                                                                                                        | NonEmpty :
                                                                                                            Text
                                                                                                        >
                                                                                                        ( λ ( _
                                                                                                            : Natural
                                                                                                            ) →
                                                                                                          λ ( _
                                                                                                            : < Empty
                                                                                                              | NonEmpty :
                                                                                                                  Text
                                                                                                              >
                                                                                                            ) →
                                                                                                            merge
                                                                                                              { Empty =
                                                                                                                  < Empty
                                                                                                                  | NonEmpty :
                                                                                                                      Text
                                                                                                                  >.NonEmpty
                                                                                                                    ( Natural/show
                                                                                                                        _@1
                                                                                                                    )
                                                                                                              , NonEmpty =
                                                                                                                  λ ( _
                                                                                                                    : Text
                                                                                                                    ) →
                                                                                                                    < Empty
                                                                                                                    | NonEmpty :
                                                                                                                        Text
                                                                                                                    >.NonEmpty
                                                                                                                      "${Natural/show
                                                                                                                           _@2}.${_}"
                                                                                                              }
                                                                                                              _
                                                                                                        )
                                                                                                        < Empty
                                                                                                        | NonEmpty :
                                                                                                            Text
                                                                                                        >.Empty
                                                                                                    )}/site-packages"
                                                                            , NonEmpty =
                                                                                λ ( _
                                                                                  : Text
                                                                                  ) →
                                                                                  < Empty
                                                                                  | NonEmpty :
                                                                                      Text
                                                                                  >.NonEmpty
                                                                                    "${_@2}/python${merge
                                                                                                      { Empty =
                                                                                                          ""
                                                                                                      , NonEmpty =
                                                                                                          λ ( _
                                                                                                            : Text
                                                                                                            ) →
                                                                                                            _
                                                                                                      }
                                                                                                      ( List/fold
                                                                                                          Natural
                                                                                                          version
                                                                                                          < Empty
                                                                                                          | NonEmpty :
                                                                                                              Text
                                                                                                          >
                                                                                                          ( λ ( _
                                                                                                              : Natural
                                                                                                              ) →
                                                                                                            λ ( _
                                                                                                              : < Empty
                                                                                                                | NonEmpty :
                                                                                                                    Text
                                                                                                                >
                                                                                                              ) →
                                                                                                              merge
                                                                                                                { Empty =
                                                                                                                    < Empty
                                                                                                                    | NonEmpty :
                                                                                                                        Text
                                                                                                                    >.NonEmpty
                                                                                                                      ( Natural/show
                                                                                                                          _@1
                                                                                                                      )
                                                                                                                , NonEmpty =
                                                                                                                    λ ( _
                                                                                                                      : Text
                                                                                                                      ) →
                                                                                                                      < Empty
                                                                                                                      | NonEmpty :
                                                                                                                          Text
                                                                                                                      >.NonEmpty
                                                                                                                        "${Natural/show
                                                                                                                             _@2}.${_}"
                                                                                                                }
                                                                                                                _
                                                                                                          )
                                                                                                          < Empty
                                                                                                          | NonEmpty :
                                                                                                              Text
                                                                                                          >.Empty
                                                                                                      )}/site-packages:${_}"
                                                                            }
                                                                            _
                                                                      )
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >.Empty
                                                                  )}:${cfg.installDir}/lib/python${merge
                                                                                                     { Empty =
                                                                                                         ""
                                                                                                     , NonEmpty =
                                                                                                         λ ( _
                                                                                                           : Text
                                                                                                           ) →
                                                                                                           _
                                                                                                     }
                                                                                                     ( List/fold
                                                                                                         Natural
                                                                                                         version
                                                                                                         < Empty
                                                                                                         | NonEmpty :
                                                                                                             Text
                                                                                                         >
                                                                                                         ( λ ( _
                                                                                                             : Natural
                                                                                                             ) →
                                                                                                           λ ( _
                                                                                                             : < Empty
                                                                                                               | NonEmpty :
                                                                                                                   Text
                                                                                                               >
                                                                                                             ) →
                                                                                                             merge
                                                                                                               { Empty =
                                                                                                                   < Empty
                                                                                                                   | NonEmpty :
                                                                                                                       Text
                                                                                                                   >.NonEmpty
                                                                                                                     ( Natural/show
                                                                                                                         _@1
                                                                                                                     )
                                                                                                               , NonEmpty =
                                                                                                                   λ ( _
                                                                                                                     : Text
                                                                                                                     ) →
                                                                                                                     < Empty
                                                                                                                     | NonEmpty :
                                                                                                                         Text
                                                                                                                     >.NonEmpty
                                                                                                                       "${Natural/show
                                                                                                                            _@2}.${_}"
                                                                                                               }
                                                                                                               _
                                                                                                         )
                                                                                                         < Empty
                                                                                                         | NonEmpty :
                                                                                                             Text
                                                                                                         >.Empty
                                                                                                     )}/site-packages ${cfg.installDir}/bin/${_} \$@"
                          , file = "wrapper/${_}"
                          }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.MakeExecutable
                          { file = "wrapper/${_}" }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.CopyFile
                          { dest = "wrapper/${_}", src = "wrapper/${_}" }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.SymlinkBinary
                          { file = "wrapper/${_}" }
                      ]
                      ( List
                          < Call :
                              { arguments : List Text
                              , environment :
                                  Optional (List { value : Text, var : Text })
                              , procDir : Optional Text
                              , program : Text
                              }
                          | CopyFile : { dest : Text, src : Text }
                          | CreateDirectory : { dir : Text }
                          | MakeExecutable : { file : Text }
                          | Patch : { patchContents : Text }
                          | Symlink : { linkName : Text, tgt : Text }
                          | SymlinkBinary : { file : Text }
                          | SymlinkManpage : { file : Text, section : Natural }
                          | Write : { contents : Text, file : Text }
                          >
                      )
                      ( λ ( _
                          : < Call :
                                { arguments : List Text
                                , environment :
                                    Optional (List { value : Text, var : Text })
                                , procDir : Optional Text
                                , program : Text
                                }
                            | CopyFile : { dest : Text, src : Text }
                            | CreateDirectory : { dir : Text }
                            | MakeExecutable : { file : Text }
                            | Patch : { patchContents : Text }
                            | Symlink : { linkName : Text, tgt : Text }
                            | SymlinkBinary : { file : Text }
                            | SymlinkManpage :
                                { file : Text, section : Natural }
                            | Write : { contents : Text, file : Text }
                            >
                          ) →
                        λ ( _
                          : List
                              < Call :
                                  { arguments : List Text
                                  , environment :
                                      Optional
                                        (List { value : Text, var : Text })
                                  , procDir : Optional Text
                                  , program : Text
                                  }
                              | CopyFile : { dest : Text, src : Text }
                              | CreateDirectory : { dir : Text }
                              | MakeExecutable : { file : Text }
                              | Patch : { patchContents : Text }
                              | Symlink : { linkName : Text, tgt : Text }
                              | SymlinkBinary : { file : Text }
                              | SymlinkManpage :
                                  { file : Text, section : Natural }
                              | Write : { contents : Text, file : Text }
                              >
                          ) →
                          [ _@1 ] # _
                      )
                )
                ( [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
                )
      , installWithWrappers =
          λ(bins : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments = [ "install" ]
                  , environment = Some
                      (   ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                        # [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      (cfg.shareDirs # cfg.linkDirs)
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/site_perl/5.30.2/${merge
                                                                                 { AArch =
                                                                                     "aarch64"
                                                                                 , Alpha =
                                                                                     "alpha"
                                                                                 , Arm =
                                                                                     "arm"
                                                                                 , HPPA =
                                                                                     "hppa"
                                                                                 , HPPA64 =
                                                                                     "hppa64"
                                                                                 , M68k =
                                                                                     "m68k"
                                                                                 , Mips =
                                                                                     "mips"
                                                                                 , Mips64 =
                                                                                     "mips64"
                                                                                 , Mips64El =
                                                                                     "mips64el"
                                                                                 , MipsEl =
                                                                                     "mipsel"
                                                                                 , MipsIsa32r6 =
                                                                                     "mipsisa32r6"
                                                                                 , MipsIsa32r6El =
                                                                                     "mipsisa32r6el"
                                                                                 , MipsIsa64r6 =
                                                                                     "mipsisa64r6"
                                                                                 , MipsIsa64r6El =
                                                                                     "mipsisa64r6el"
                                                                                 , PowerPC =
                                                                                     "powerpc"
                                                                                 , PowerPC64 =
                                                                                     "powerpc64"
                                                                                 , PowerPC64le =
                                                                                     "powerpc64le"
                                                                                 , RISCV64 =
                                                                                     "riscv64"
                                                                                 , S390x =
                                                                                     "s390x"
                                                                                 , SH4 =
                                                                                     "sh4"
                                                                                 , Sparc64 =
                                                                                     "sparc64"
                                                                                 , X64 =
                                                                                     "x86_64"
                                                                                 , X86 =
                                                                                     "i686"
                                                                                 }
                                                                                 cfg.buildArch}-${merge
                                                                                                    { AIX =
                                                                                                        "aix"
                                                                                                    , Android =
                                                                                                        "android"
                                                                                                    , Darwin =
                                                                                                        "darwin"
                                                                                                    , Dragonfly =
                                                                                                        "dragonfly"
                                                                                                    , FreeBSD =
                                                                                                        "freebsd"
                                                                                                    , Haiku =
                                                                                                        "haiku"
                                                                                                    , Hurd =
                                                                                                        "hurd"
                                                                                                    , IOS =
                                                                                                        "darwin"
                                                                                                    , Linux =
                                                                                                        "linux"
                                                                                                    , NetBSD =
                                                                                                        "netbsd"
                                                                                                    , NoOs =
                                                                                                        "none"
                                                                                                    , OpenBSD =
                                                                                                        "openbsd"
                                                                                                    , Redox =
                                                                                                        "redox"
                                                                                                    , Solaris =
                                                                                                        "solaris"
                                                                                                    , Windows =
                                                                                                        "w64"
                                                                                                    }
                                                                                                    cfg.buildOS}/:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PERL5LIB"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_LIBRARY_PATH"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          cfg.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          ]
                      )
                  , procDir = None Text
                  , program =
                      merge
                        { AIX = "make"
                        , Android = "make"
                        , Darwin = "make"
                        , Dragonfly = "gmake"
                        , FreeBSD = "gmake"
                        , Haiku = "make"
                        , Hurd = "make"
                        , IOS = "make"
                        , Linux = "make"
                        , NetBSD = "gmake"
                        , NoOs = "make"
                        , OpenBSD = "gmake"
                        , Redox = "make"
                        , Solaris = "gmake"
                        , Windows = "make"
                        }
                        cfg.buildOS
                  }
              ]
            # List/fold
                Text
                bins
                ( List
                    < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >
                )
                ( λ(_ : Text) →
                    List/fold
                      < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >
                      [ < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.CreateDirectory
                          { dir = "wrapper" }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.Write
                          { contents =
                              "LD_LIBRARY_PATH=${merge
                                                   { Empty = ""
                                                   , NonEmpty = λ(_ : Text) → _
                                                   }
                                                   ( List/fold
                                                       Text
                                                       cfg.linkDirs
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >
                                                       ( λ(_ : Text) →
                                                         λ ( _
                                                           : < Empty
                                                             | NonEmpty : Text
                                                             >
                                                           ) →
                                                           merge
                                                             { Empty =
                                                                 < Empty
                                                                 | NonEmpty :
                                                                     Text
                                                                 >.NonEmpty
                                                                   _@1
                                                             , NonEmpty =
                                                                 λ(_ : Text) →
                                                                   < Empty
                                                                   | NonEmpty :
                                                                       Text
                                                                   >.NonEmpty
                                                                     "${_@2}:${_}"
                                                             }
                                                             _
                                                       )
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.Empty
                                                   )}:${cfg.installDir}/lib LD_PRELOAD='${merge
                                                                                            { Empty =
                                                                                                ""
                                                                                            , NonEmpty =
                                                                                                λ ( _
                                                                                                  : Text
                                                                                                  ) →
                                                                                                  _
                                                                                            }
                                                                                            ( List/fold
                                                                                                Text
                                                                                                cfg.preloadLibs
                                                                                                < Empty
                                                                                                | NonEmpty :
                                                                                                    Text
                                                                                                >
                                                                                                ( λ ( _
                                                                                                    : Text
                                                                                                    ) →
                                                                                                  λ ( _
                                                                                                    : < Empty
                                                                                                      | NonEmpty :
                                                                                                          Text
                                                                                                      >
                                                                                                    ) →
                                                                                                    merge
                                                                                                      { Empty =
                                                                                                          < Empty
                                                                                                          | NonEmpty :
                                                                                                              Text
                                                                                                          >.NonEmpty
                                                                                                            _@1
                                                                                                      , NonEmpty =
                                                                                                          λ ( _
                                                                                                            : Text
                                                                                                            ) →
                                                                                                            < Empty
                                                                                                            | NonEmpty :
                                                                                                                Text
                                                                                                            >.NonEmpty
                                                                                                              "${_@2} ${_}"
                                                                                                      }
                                                                                                      _
                                                                                                )
                                                                                                < Empty
                                                                                                | NonEmpty :
                                                                                                    Text
                                                                                                >.Empty
                                                                                            )}' ${cfg.installDir}/bin/${_} \$@"
                          , file = "wrapper/${_}"
                          }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.MakeExecutable
                          { file = "wrapper/${_}" }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.CopyFile
                          { dest = "wrapper/${_}", src = "wrapper/${_}" }
                      , < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.SymlinkBinary
                          { file = "wrapper/${_}" }
                      ]
                      ( List
                          < Call :
                              { arguments : List Text
                              , environment :
                                  Optional (List { value : Text, var : Text })
                              , procDir : Optional Text
                              , program : Text
                              }
                          | CopyFile : { dest : Text, src : Text }
                          | CreateDirectory : { dir : Text }
                          | MakeExecutable : { file : Text }
                          | Patch : { patchContents : Text }
                          | Symlink : { linkName : Text, tgt : Text }
                          | SymlinkBinary : { file : Text }
                          | SymlinkManpage : { file : Text, section : Natural }
                          | Write : { contents : Text, file : Text }
                          >
                      )
                      ( λ ( _
                          : < Call :
                                { arguments : List Text
                                , environment :
                                    Optional (List { value : Text, var : Text })
                                , procDir : Optional Text
                                , program : Text
                                }
                            | CopyFile : { dest : Text, src : Text }
                            | CreateDirectory : { dir : Text }
                            | MakeExecutable : { file : Text }
                            | Patch : { patchContents : Text }
                            | Symlink : { linkName : Text, tgt : Text }
                            | SymlinkBinary : { file : Text }
                            | SymlinkManpage :
                                { file : Text, section : Natural }
                            | Write : { contents : Text, file : Text }
                            >
                          ) →
                        λ ( _
                          : List
                              < Call :
                                  { arguments : List Text
                                  , environment :
                                      Optional
                                        (List { value : Text, var : Text })
                                  , procDir : Optional Text
                                  , program : Text
                                  }
                              | CopyFile : { dest : Text, src : Text }
                              | CreateDirectory : { dir : Text }
                              | MakeExecutable : { file : Text }
                              | Patch : { patchContents : Text }
                              | Symlink : { linkName : Text, tgt : Text }
                              | SymlinkBinary : { file : Text }
                              | SymlinkManpage :
                                  { file : Text, section : Natural }
                              | Write : { contents : Text, file : Text }
                              >
                          ) →
                          [ _@1 ] # _
                      )
                )
                ( [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
                )
      , isUnix =
          λ ( os
            : < AIX
              | Android
              | Darwin
              | Dragonfly
              | FreeBSD
              | Haiku
              | Hurd
              | IOS
              | Linux
              | NetBSD
              | NoOs
              | OpenBSD
              | Redox
              | Solaris
              | Windows
              >
            ) →
            merge
              { AIX = True
              , Android = True
              , Darwin = True
              , Dragonfly = True
              , FreeBSD = True
              , Haiku = False
              , Hurd = True
              , IOS = True
              , Linux = True
              , NetBSD = True
              , NoOs = False
              , OpenBSD = True
              , Redox = False
              , Solaris = True
              , Windows = False
              }
              os
      , isX64 =
          λ ( arch
            : < AArch
              | Alpha
              | Arm
              | HPPA
              | HPPA64
              | M68k
              | Mips
              | Mips64
              | Mips64El
              | MipsEl
              | MipsIsa32r6
              | MipsIsa32r6El
              | MipsIsa64r6
              | MipsIsa64r6El
              | PowerPC
              | PowerPC64
              | PowerPC64le
              | RISCV64
              | S390x
              | SH4
              | Sparc64
              | X64
              | X86
              >
            ) →
            merge
              { AArch = False
              , Alpha = False
              , Arm = False
              , HPPA = False
              , HPPA64 = False
              , M68k = False
              , Mips = False
              , Mips64 = False
              , Mips64El = False
              , MipsEl = False
              , MipsIsa32r6 = False
              , MipsIsa32r6El = False
              , MipsIsa64r6 = False
              , MipsIsa64r6El = False
              , PowerPC = False
              , PowerPC64 = False
              , PowerPC64le = False
              , RISCV64 = False
              , S390x = False
              , SH4 = False
              , Sparc64 = False
              , X64 = True
              , X86 = False
              }
              arch
      , libPath =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            if    cfg.static
            then  { value =
                      "${List/fold
                           Text
                           cfg.linkDirs
                           Text
                           (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                           ""}/usr/local/lib:/lib:/usr/lib"
                  , var = "LIBRARY_PATH"
                  }
            else  { value =
                      merge
                        { Empty = "", NonEmpty = λ(_ : Text) → _ }
                        ( List/fold
                            Text
                            cfg.linkDirs
                            < Empty | NonEmpty : Text >
                            ( λ(_ : Text) →
                              λ(_ : < Empty | NonEmpty : Text >) →
                                merge
                                  { Empty =
                                      < Empty | NonEmpty : Text >.NonEmpty _@1
                                  , NonEmpty =
                                      λ(_ : Text) →
                                        < Empty | NonEmpty : Text >.NonEmpty
                                          "${_@2}:${_}"
                                  }
                                  _
                            )
                            < Empty | NonEmpty : Text >.Empty
                        )
                  , var = "LD_LIBRARY_PATH"
                  }
      , libSuffix =
          λ ( os
            : < AIX
              | Android
              | Darwin
              | Dragonfly
              | FreeBSD
              | Haiku
              | Hurd
              | IOS
              | Linux
              | NetBSD
              | NoOs
              | OpenBSD
              | Redox
              | Solaris
              | Windows
              >
            ) →
            merge
              { AIX = "so"
              , Android = "so"
              , Darwin = "dylib"
              , Dragonfly = "so"
              , FreeBSD = "so"
              , Haiku = "so"
              , Hurd = "so"
              , IOS = "dylib"
              , Linux = "so"
              , NetBSD = "so"
              , NoOs = "so"
              , OpenBSD = "so"
              , Redox = "so"
              , Solaris = "so"
              , Windows = "so"
              }
              os
      , lowerBound =
          λ(pkg : { lower : List Natural, name : Text }) →
            { bound =
                < Lower : { lower : List Natural }
                | LowerUpper : { lower : List Natural, upper : List Natural }
                | NoBound
                | Upper : { upper : List Natural }
                >.Lower
                  { lower = pkg.lower }
            , name = pkg.name
            }
      , makeExe =
          λ ( os
            : < AIX
              | Android
              | Darwin
              | Dragonfly
              | FreeBSD
              | Haiku
              | Hurd
              | IOS
              | Linux
              | NetBSD
              | NoOs
              | OpenBSD
              | Redox
              | Solaris
              | Windows
              >
            ) →
            merge
              { AIX = "make"
              , Android = "make"
              , Darwin = "make"
              , Dragonfly = "gmake"
              , FreeBSD = "gmake"
              , Haiku = "make"
              , Hurd = "make"
              , IOS = "make"
              , Linux = "make"
              , NetBSD = "gmake"
              , NoOs = "make"
              , OpenBSD = "gmake"
              , Redox = "make"
              , Solaris = "gmake"
              , Windows = "make"
              }
              os
      , makeGnuExe =
          λ(pkg : { name : Text, version : List Natural }) →
            { buildCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments = [ "-j${Natural/show cfg.cpus}" ]
                      , environment = Some
                          (   ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                            # [ { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          (cfg.shareDirs # cfg.linkDirs)
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/site_perl/5.30.2/${merge
                                                                                   { AArch =
                                                                                       "aarch64"
                                                                                   , Alpha =
                                                                                       "alpha"
                                                                                   , Arm =
                                                                                       "arm"
                                                                                   , HPPA =
                                                                                       "hppa"
                                                                                   , HPPA64 =
                                                                                       "hppa64"
                                                                                   , M68k =
                                                                                       "m68k"
                                                                                   , Mips =
                                                                                       "mips"
                                                                                   , Mips64 =
                                                                                       "mips64"
                                                                                   , Mips64El =
                                                                                       "mips64el"
                                                                                   , MipsEl =
                                                                                       "mipsel"
                                                                                   , MipsIsa32r6 =
                                                                                       "mipsisa32r6"
                                                                                   , MipsIsa32r6El =
                                                                                       "mipsisa32r6el"
                                                                                   , MipsIsa64r6 =
                                                                                       "mipsisa64r6"
                                                                                   , MipsIsa64r6El =
                                                                                       "mipsisa64r6el"
                                                                                   , PowerPC =
                                                                                       "powerpc"
                                                                                   , PowerPC64 =
                                                                                       "powerpc64"
                                                                                   , PowerPC64le =
                                                                                       "powerpc64le"
                                                                                   , RISCV64 =
                                                                                       "riscv64"
                                                                                   , S390x =
                                                                                       "s390x"
                                                                                   , SH4 =
                                                                                       "sh4"
                                                                                   , Sparc64 =
                                                                                       "sparc64"
                                                                                   , X64 =
                                                                                       "x86_64"
                                                                                   , X86 =
                                                                                       "i686"
                                                                                   }
                                                                                   cfg.buildArch}-${merge
                                                                                                      { AIX =
                                                                                                          "aix"
                                                                                                      , Android =
                                                                                                          "android"
                                                                                                      , Darwin =
                                                                                                          "darwin"
                                                                                                      , Dragonfly =
                                                                                                          "dragonfly"
                                                                                                      , FreeBSD =
                                                                                                          "freebsd"
                                                                                                      , Haiku =
                                                                                                          "haiku"
                                                                                                      , Hurd =
                                                                                                          "hurd"
                                                                                                      , IOS =
                                                                                                          "darwin"
                                                                                                      , Linux =
                                                                                                          "linux"
                                                                                                      , NetBSD =
                                                                                                          "netbsd"
                                                                                                      , NoOs =
                                                                                                          "none"
                                                                                                      , OpenBSD =
                                                                                                          "openbsd"
                                                                                                      , Redox =
                                                                                                          "redox"
                                                                                                      , Solaris =
                                                                                                          "solaris"
                                                                                                      , Windows =
                                                                                                          "w64"
                                                                                                      }
                                                                                                      cfg.buildOS}/"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/site_perl/5.30.2/${merge
                                                                                     { AArch =
                                                                                         "aarch64"
                                                                                     , Alpha =
                                                                                         "alpha"
                                                                                     , Arm =
                                                                                         "arm"
                                                                                     , HPPA =
                                                                                         "hppa"
                                                                                     , HPPA64 =
                                                                                         "hppa64"
                                                                                     , M68k =
                                                                                         "m68k"
                                                                                     , Mips =
                                                                                         "mips"
                                                                                     , Mips64 =
                                                                                         "mips64"
                                                                                     , Mips64El =
                                                                                         "mips64el"
                                                                                     , MipsEl =
                                                                                         "mipsel"
                                                                                     , MipsIsa32r6 =
                                                                                         "mipsisa32r6"
                                                                                     , MipsIsa32r6El =
                                                                                         "mipsisa32r6el"
                                                                                     , MipsIsa64r6 =
                                                                                         "mipsisa64r6"
                                                                                     , MipsIsa64r6El =
                                                                                         "mipsisa64r6el"
                                                                                     , PowerPC =
                                                                                         "powerpc"
                                                                                     , PowerPC64 =
                                                                                         "powerpc64"
                                                                                     , PowerPC64le =
                                                                                         "powerpc64le"
                                                                                     , RISCV64 =
                                                                                         "riscv64"
                                                                                     , S390x =
                                                                                         "s390x"
                                                                                     , SH4 =
                                                                                         "sh4"
                                                                                     , Sparc64 =
                                                                                         "sparc64"
                                                                                     , X64 =
                                                                                         "x86_64"
                                                                                     , X86 =
                                                                                         "i686"
                                                                                     }
                                                                                     cfg.buildArch}-${merge
                                                                                                        { AIX =
                                                                                                            "aix"
                                                                                                        , Android =
                                                                                                            "android"
                                                                                                        , Darwin =
                                                                                                            "darwin"
                                                                                                        , Dragonfly =
                                                                                                            "dragonfly"
                                                                                                        , FreeBSD =
                                                                                                            "freebsd"
                                                                                                        , Haiku =
                                                                                                            "haiku"
                                                                                                        , Hurd =
                                                                                                            "hurd"
                                                                                                        , IOS =
                                                                                                            "darwin"
                                                                                                        , Linux =
                                                                                                            "linux"
                                                                                                        , NetBSD =
                                                                                                            "netbsd"
                                                                                                        , NoOs =
                                                                                                            "none"
                                                                                                        , OpenBSD =
                                                                                                            "openbsd"
                                                                                                        , Redox =
                                                                                                            "redox"
                                                                                                        , Solaris =
                                                                                                            "solaris"
                                                                                                        , Windows =
                                                                                                            "w64"
                                                                                                        }
                                                                                                        cfg.buildOS}/:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PERL5LIB"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              ]
                          )
                      , procDir = None Text
                      , program =
                          merge
                            { AIX = "make"
                            , Android = "make"
                            , Darwin = "make"
                            , Dragonfly = "gmake"
                            , FreeBSD = "gmake"
                            , Haiku = "make"
                            , Hurd = "make"
                            , IOS = "make"
                            , Linux = "make"
                            , NetBSD = "gmake"
                            , NoOs = "make"
                            , OpenBSD = "gmake"
                            , Redox = "make"
                            , Solaris = "gmake"
                            , Windows = "make"
                            }
                            cfg.buildOS
                      }
                  ]
            , configureCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments =
                          ( if    merge
                                    { AIX = False
                                    , Android = False
                                    , Darwin = True
                                    , Dragonfly = False
                                    , FreeBSD = False
                                    , Haiku = False
                                    , Hurd = False
                                    , IOS = False
                                    , Linux = False
                                    , NetBSD = False
                                    , NoOs = False
                                    , OpenBSD = False
                                    , Redox = False
                                    , Solaris = False
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  λ(x : List Text) → [ "configure" ] # x
                            else  λ(x : List Text) → x
                          )
                            ( merge
                                { None = [ "--prefix=${cfg.installDir}" ]
                                , Some =
                                    λ(x : Text) →
                                      [ "--prefix=${cfg.installDir}", x ]
                                }
                                ( merge
                                    { None = None Text
                                    , Some =
                                        λ ( _
                                          : { abi :
                                                Optional
                                                  < GNU
                                                  | GNUabi64
                                                  | GNUeabi
                                                  | GNUeabihf
                                                  | GNUspe
                                                  | MinGw
                                                  >
                                            , arch :
                                                < AArch
                                                | Alpha
                                                | Arm
                                                | HPPA
                                                | HPPA64
                                                | M68k
                                                | Mips
                                                | Mips64
                                                | Mips64El
                                                | MipsEl
                                                | MipsIsa32r6
                                                | MipsIsa32r6El
                                                | MipsIsa64r6
                                                | MipsIsa64r6El
                                                | PowerPC
                                                | PowerPC64
                                                | PowerPC64le
                                                | RISCV64
                                                | S390x
                                                | SH4
                                                | Sparc64
                                                | X64
                                                | X86
                                                >
                                            , manufacturer :
                                                Optional
                                                  < Apple | IBM | PC | Unknown >
                                            , os :
                                                < AIX
                                                | Android
                                                | Darwin
                                                | Dragonfly
                                                | FreeBSD
                                                | Haiku
                                                | Hurd
                                                | IOS
                                                | Linux
                                                | NetBSD
                                                | NoOs
                                                | OpenBSD
                                                | Redox
                                                | Solaris
                                                | Windows
                                                >
                                            }
                                          ) →
                                          Some
                                            "--host=${merge
                                                        { AArch = "aarch64"
                                                        , Alpha = "alpha"
                                                        , Arm = "arm"
                                                        , HPPA = "hppa"
                                                        , HPPA64 = "hppa64"
                                                        , M68k = "m68k"
                                                        , Mips = "mips"
                                                        , Mips64 = "mips64"
                                                        , Mips64El = "mips64el"
                                                        , MipsEl = "mipsel"
                                                        , MipsIsa32r6 =
                                                            "mipsisa32r6"
                                                        , MipsIsa32r6El =
                                                            "mipsisa32r6el"
                                                        , MipsIsa64r6 =
                                                            "mipsisa64r6"
                                                        , MipsIsa64r6El =
                                                            "mipsisa64r6el"
                                                        , PowerPC = "powerpc"
                                                        , PowerPC64 =
                                                            "powerpc64"
                                                        , PowerPC64le =
                                                            "powerpc64le"
                                                        , RISCV64 = "riscv64"
                                                        , S390x = "s390x"
                                                        , SH4 = "sh4"
                                                        , Sparc64 = "sparc64"
                                                        , X64 = "x86_64"
                                                        , X86 = "i686"
                                                        }
                                                        _.arch}-${merge
                                                                    { AIX =
                                                                        "aix"
                                                                    , Android =
                                                                        "android"
                                                                    , Darwin =
                                                                        "darwin"
                                                                    , Dragonfly =
                                                                        "dragonfly"
                                                                    , FreeBSD =
                                                                        "freebsd"
                                                                    , Haiku =
                                                                        "haiku"
                                                                    , Hurd =
                                                                        "hurd"
                                                                    , IOS =
                                                                        "darwin"
                                                                    , Linux =
                                                                        "linux"
                                                                    , NetBSD =
                                                                        "netbsd"
                                                                    , NoOs =
                                                                        "none"
                                                                    , OpenBSD =
                                                                        "openbsd"
                                                                    , Redox =
                                                                        "redox"
                                                                    , Solaris =
                                                                        "solaris"
                                                                    , Windows =
                                                                        "w64"
                                                                    }
                                                                    _.os}${merge
                                                                             { None =
                                                                                 ""
                                                                             , Some =
                                                                                 λ ( abi
                                                                                   : < GNU
                                                                                     | GNUabi64
                                                                                     | GNUeabi
                                                                                     | GNUeabihf
                                                                                     | GNUspe
                                                                                     | MinGw
                                                                                     >
                                                                                   ) →
                                                                                   "-${merge
                                                                                         { GNU =
                                                                                             "gnu"
                                                                                         , GNUabi64 =
                                                                                             "gnuabi64"
                                                                                         , GNUeabi =
                                                                                             "gnueabi"
                                                                                         , GNUeabihf =
                                                                                             "gnueabihf"
                                                                                         , GNUspe =
                                                                                             "gnuspe"
                                                                                         , MinGw =
                                                                                             "mingw32"
                                                                                         }
                                                                                         abi}"
                                                                             }
                                                                             _.abi}"
                                    }
                                    cfg.targetTriple
                                )
                            )
                      , environment = Some
                          (   ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                            # [ { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.includeDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-I${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-I${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${if    cfg.static
                                             then  " -static"
                                             else  ""}"
                                , var = "CPPFLAGS"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          (cfg.shareDirs # cfg.linkDirs)
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_RUN_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/site_perl/5.30.2/${merge
                                                                                   { AArch =
                                                                                       "aarch64"
                                                                                   , Alpha =
                                                                                       "alpha"
                                                                                   , Arm =
                                                                                       "arm"
                                                                                   , HPPA =
                                                                                       "hppa"
                                                                                   , HPPA64 =
                                                                                       "hppa64"
                                                                                   , M68k =
                                                                                       "m68k"
                                                                                   , Mips =
                                                                                       "mips"
                                                                                   , Mips64 =
                                                                                       "mips64"
                                                                                   , Mips64El =
                                                                                       "mips64el"
                                                                                   , MipsEl =
                                                                                       "mipsel"
                                                                                   , MipsIsa32r6 =
                                                                                       "mipsisa32r6"
                                                                                   , MipsIsa32r6El =
                                                                                       "mipsisa32r6el"
                                                                                   , MipsIsa64r6 =
                                                                                       "mipsisa64r6"
                                                                                   , MipsIsa64r6El =
                                                                                       "mipsisa64r6el"
                                                                                   , PowerPC =
                                                                                       "powerpc"
                                                                                   , PowerPC64 =
                                                                                       "powerpc64"
                                                                                   , PowerPC64le =
                                                                                       "powerpc64le"
                                                                                   , RISCV64 =
                                                                                       "riscv64"
                                                                                   , S390x =
                                                                                       "s390x"
                                                                                   , SH4 =
                                                                                       "sh4"
                                                                                   , Sparc64 =
                                                                                       "sparc64"
                                                                                   , X64 =
                                                                                       "x86_64"
                                                                                   , X86 =
                                                                                       "i686"
                                                                                   }
                                                                                   cfg.buildArch}-${merge
                                                                                                      { AIX =
                                                                                                          "aix"
                                                                                                      , Android =
                                                                                                          "android"
                                                                                                      , Darwin =
                                                                                                          "darwin"
                                                                                                      , Dragonfly =
                                                                                                          "dragonfly"
                                                                                                      , FreeBSD =
                                                                                                          "freebsd"
                                                                                                      , Haiku =
                                                                                                          "haiku"
                                                                                                      , Hurd =
                                                                                                          "hurd"
                                                                                                      , IOS =
                                                                                                          "darwin"
                                                                                                      , Linux =
                                                                                                          "linux"
                                                                                                      , NetBSD =
                                                                                                          "netbsd"
                                                                                                      , NoOs =
                                                                                                          "none"
                                                                                                      , OpenBSD =
                                                                                                          "openbsd"
                                                                                                      , Redox =
                                                                                                          "redox"
                                                                                                      , Solaris =
                                                                                                          "solaris"
                                                                                                      , Windows =
                                                                                                          "w64"
                                                                                                      }
                                                                                                      cfg.buildOS}/"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/site_perl/5.30.2/${merge
                                                                                     { AArch =
                                                                                         "aarch64"
                                                                                     , Alpha =
                                                                                         "alpha"
                                                                                     , Arm =
                                                                                         "arm"
                                                                                     , HPPA =
                                                                                         "hppa"
                                                                                     , HPPA64 =
                                                                                         "hppa64"
                                                                                     , M68k =
                                                                                         "m68k"
                                                                                     , Mips =
                                                                                         "mips"
                                                                                     , Mips64 =
                                                                                         "mips64"
                                                                                     , Mips64El =
                                                                                         "mips64el"
                                                                                     , MipsEl =
                                                                                         "mipsel"
                                                                                     , MipsIsa32r6 =
                                                                                         "mipsisa32r6"
                                                                                     , MipsIsa32r6El =
                                                                                         "mipsisa32r6el"
                                                                                     , MipsIsa64r6 =
                                                                                         "mipsisa64r6"
                                                                                     , MipsIsa64r6El =
                                                                                         "mipsisa64r6el"
                                                                                     , PowerPC =
                                                                                         "powerpc"
                                                                                     , PowerPC64 =
                                                                                         "powerpc64"
                                                                                     , PowerPC64le =
                                                                                         "powerpc64le"
                                                                                     , RISCV64 =
                                                                                         "riscv64"
                                                                                     , S390x =
                                                                                         "s390x"
                                                                                     , SH4 =
                                                                                         "sh4"
                                                                                     , Sparc64 =
                                                                                         "sparc64"
                                                                                     , X64 =
                                                                                         "x86_64"
                                                                                     , X86 =
                                                                                         "i686"
                                                                                     }
                                                                                     cfg.buildArch}-${merge
                                                                                                        { AIX =
                                                                                                            "aix"
                                                                                                        , Android =
                                                                                                            "android"
                                                                                                        , Darwin =
                                                                                                            "darwin"
                                                                                                        , Dragonfly =
                                                                                                            "dragonfly"
                                                                                                        , FreeBSD =
                                                                                                            "freebsd"
                                                                                                        , Haiku =
                                                                                                            "haiku"
                                                                                                        , Hurd =
                                                                                                            "hurd"
                                                                                                        , IOS =
                                                                                                            "darwin"
                                                                                                        , Linux =
                                                                                                            "linux"
                                                                                                        , NetBSD =
                                                                                                            "netbsd"
                                                                                                        , NoOs =
                                                                                                            "none"
                                                                                                        , OpenBSD =
                                                                                                            "openbsd"
                                                                                                        , Redox =
                                                                                                            "redox"
                                                                                                        , Solaris =
                                                                                                            "solaris"
                                                                                                        , Windows =
                                                                                                            "w64"
                                                                                                        }
                                                                                                        cfg.buildOS}/:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PERL5LIB"
                                }
                              ]
                          )
                      , procDir = None Text
                      , program =
                          if    merge
                                  { AIX = False
                                  , Android = False
                                  , Darwin = True
                                  , Dragonfly = False
                                  , FreeBSD = False
                                  , Haiku = False
                                  , Hurd = False
                                  , IOS = False
                                  , Linux = False
                                  , NetBSD = False
                                  , NoOs = False
                                  , OpenBSD = False
                                  , Redox = False
                                  , Solaris = False
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  "sh"
                          else  "./configure"
                      }
                  ]
            , installCommand =
                λ ( installVars
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                    [ < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.Call
                        { arguments = [ "install" ]
                        , environment = Some
                            (   ( if    merge
                                          { AIX = True
                                          , Android = True
                                          , Darwin = True
                                          , Dragonfly = True
                                          , FreeBSD = True
                                          , Haiku = False
                                          , Hurd = True
                                          , IOS = True
                                          , Linux = True
                                          , NetBSD = True
                                          , NoOs = False
                                          , OpenBSD = True
                                          , Redox = False
                                          , Solaris = True
                                          , Windows = False
                                          }
                                          installVars.buildOS
                                  then  [ { value =
                                              "${List/fold
                                                   Text
                                                   installVars.binDirs
                                                   Text
                                                   ( λ(_ : Text) →
                                                     λ(_ : Text) →
                                                       "${_@1}:${_}"
                                                   )
                                                   ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                          , var = "PATH"
                                          }
                                        ]
                                  else  [] : List { value : Text, var : Text }
                                )
                              # [ { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            (   installVars.shareDirs
                                              # installVars.linkDirs
                                            )
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@1}/pkgconfig"
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}/pkgconfig:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "PKG_CONFIG_PATH"
                                  }
                                , { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            installVars.linkDirs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@1}/site_perl/5.30.2/${merge
                                                                                     { AArch =
                                                                                         "aarch64"
                                                                                     , Alpha =
                                                                                         "alpha"
                                                                                     , Arm =
                                                                                         "arm"
                                                                                     , HPPA =
                                                                                         "hppa"
                                                                                     , HPPA64 =
                                                                                         "hppa64"
                                                                                     , M68k =
                                                                                         "m68k"
                                                                                     , Mips =
                                                                                         "mips"
                                                                                     , Mips64 =
                                                                                         "mips64"
                                                                                     , Mips64El =
                                                                                         "mips64el"
                                                                                     , MipsEl =
                                                                                         "mipsel"
                                                                                     , MipsIsa32r6 =
                                                                                         "mipsisa32r6"
                                                                                     , MipsIsa32r6El =
                                                                                         "mipsisa32r6el"
                                                                                     , MipsIsa64r6 =
                                                                                         "mipsisa64r6"
                                                                                     , MipsIsa64r6El =
                                                                                         "mipsisa64r6el"
                                                                                     , PowerPC =
                                                                                         "powerpc"
                                                                                     , PowerPC64 =
                                                                                         "powerpc64"
                                                                                     , PowerPC64le =
                                                                                         "powerpc64le"
                                                                                     , RISCV64 =
                                                                                         "riscv64"
                                                                                     , S390x =
                                                                                         "s390x"
                                                                                     , SH4 =
                                                                                         "sh4"
                                                                                     , Sparc64 =
                                                                                         "sparc64"
                                                                                     , X64 =
                                                                                         "x86_64"
                                                                                     , X86 =
                                                                                         "i686"
                                                                                     }
                                                                                     installVars.buildArch}-${merge
                                                                                                                { AIX =
                                                                                                                    "aix"
                                                                                                                , Android =
                                                                                                                    "android"
                                                                                                                , Darwin =
                                                                                                                    "darwin"
                                                                                                                , Dragonfly =
                                                                                                                    "dragonfly"
                                                                                                                , FreeBSD =
                                                                                                                    "freebsd"
                                                                                                                , Haiku =
                                                                                                                    "haiku"
                                                                                                                , Hurd =
                                                                                                                    "hurd"
                                                                                                                , IOS =
                                                                                                                    "darwin"
                                                                                                                , Linux =
                                                                                                                    "linux"
                                                                                                                , NetBSD =
                                                                                                                    "netbsd"
                                                                                                                , NoOs =
                                                                                                                    "none"
                                                                                                                , OpenBSD =
                                                                                                                    "openbsd"
                                                                                                                , Redox =
                                                                                                                    "redox"
                                                                                                                , Solaris =
                                                                                                                    "solaris"
                                                                                                                , Windows =
                                                                                                                    "w64"
                                                                                                                }
                                                                                                                installVars.buildOS}/"
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}/site_perl/5.30.2/${merge
                                                                                       { AArch =
                                                                                           "aarch64"
                                                                                       , Alpha =
                                                                                           "alpha"
                                                                                       , Arm =
                                                                                           "arm"
                                                                                       , HPPA =
                                                                                           "hppa"
                                                                                       , HPPA64 =
                                                                                           "hppa64"
                                                                                       , M68k =
                                                                                           "m68k"
                                                                                       , Mips =
                                                                                           "mips"
                                                                                       , Mips64 =
                                                                                           "mips64"
                                                                                       , Mips64El =
                                                                                           "mips64el"
                                                                                       , MipsEl =
                                                                                           "mipsel"
                                                                                       , MipsIsa32r6 =
                                                                                           "mipsisa32r6"
                                                                                       , MipsIsa32r6El =
                                                                                           "mipsisa32r6el"
                                                                                       , MipsIsa64r6 =
                                                                                           "mipsisa64r6"
                                                                                       , MipsIsa64r6El =
                                                                                           "mipsisa64r6el"
                                                                                       , PowerPC =
                                                                                           "powerpc"
                                                                                       , PowerPC64 =
                                                                                           "powerpc64"
                                                                                       , PowerPC64le =
                                                                                           "powerpc64le"
                                                                                       , RISCV64 =
                                                                                           "riscv64"
                                                                                       , S390x =
                                                                                           "s390x"
                                                                                       , SH4 =
                                                                                           "sh4"
                                                                                       , Sparc64 =
                                                                                           "sparc64"
                                                                                       , X64 =
                                                                                           "x86_64"
                                                                                       , X86 =
                                                                                           "i686"
                                                                                       }
                                                                                       installVars.buildArch}-${merge
                                                                                                                  { AIX =
                                                                                                                      "aix"
                                                                                                                  , Android =
                                                                                                                      "android"
                                                                                                                  , Darwin =
                                                                                                                      "darwin"
                                                                                                                  , Dragonfly =
                                                                                                                      "dragonfly"
                                                                                                                  , FreeBSD =
                                                                                                                      "freebsd"
                                                                                                                  , Haiku =
                                                                                                                      "haiku"
                                                                                                                  , Hurd =
                                                                                                                      "hurd"
                                                                                                                  , IOS =
                                                                                                                      "darwin"
                                                                                                                  , Linux =
                                                                                                                      "linux"
                                                                                                                  , NetBSD =
                                                                                                                      "netbsd"
                                                                                                                  , NoOs =
                                                                                                                      "none"
                                                                                                                  , OpenBSD =
                                                                                                                      "openbsd"
                                                                                                                  , Redox =
                                                                                                                      "redox"
                                                                                                                  , Solaris =
                                                                                                                      "solaris"
                                                                                                                  , Windows =
                                                                                                                      "w64"
                                                                                                                  }
                                                                                                                  installVars.buildOS}/:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "PERL5LIB"
                                  }
                                , { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            installVars.linkDirs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        _@1
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "LD_LIBRARY_PATH"
                                  }
                                , { value =
                                      "${merge
                                           { Empty = ""
                                           , NonEmpty = λ(_ : Text) → _
                                           }
                                           ( List/fold
                                               Text
                                               installVars.linkDirs
                                               < Empty | NonEmpty : Text >
                                               ( λ(_ : Text) →
                                                 λ ( _
                                                   : < Empty | NonEmpty : Text >
                                                   ) →
                                                   merge
                                                     { Empty =
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@1}"
                                                     , NonEmpty =
                                                         λ(_ : Text) →
                                                           < Empty
                                                           | NonEmpty : Text
                                                           >.NonEmpty
                                                             "-L${_@2} ${_}"
                                                     }
                                                     _
                                               )
                                               < Empty | NonEmpty : Text >.Empty
                                           )}${List/fold
                                                 Text
                                                 installVars.linkDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${if    merge
                                                                { AIX = False
                                                                , Android =
                                                                    False
                                                                , Darwin = True
                                                                , Dragonfly =
                                                                    False
                                                                , FreeBSD =
                                                                    False
                                                                , Haiku = False
                                                                , Hurd = False
                                                                , IOS = False
                                                                , Linux = False
                                                                , NetBSD = False
                                                                , NoOs = False
                                                                , OpenBSD =
                                                                    False
                                                                , Redox = False
                                                                , Solaris =
                                                                    False
                                                                , Windows =
                                                                    False
                                                                }
                                                                installVars.buildOS
                                                        then  ""
                                                        else  " -Wl,-rpath-link,${_@1}"}${_}"
                                                 )
                                                 ""}"
                                  , var = "LDFLAGS"
                                  }
                                ]
                            )
                        , procDir = None Text
                        , program =
                            merge
                              { AIX = "make"
                              , Android = "make"
                              , Darwin = "make"
                              , Dragonfly = "gmake"
                              , FreeBSD = "gmake"
                              , Haiku = "make"
                              , Hurd = "make"
                              , IOS = "make"
                              , Linux = "make"
                              , NetBSD = "gmake"
                              , NoOs = "make"
                              , OpenBSD = "gmake"
                              , Redox = "make"
                              , Solaris = "gmake"
                              , Windows = "make"
                              }
                              installVars.buildOS
                        }
                    ]
                  # ( if    installVars.isCross == False
                      then  [ < Call :
                                  { arguments : List Text
                                  , environment :
                                      Optional
                                        (List { value : Text, var : Text })
                                  , procDir : Optional Text
                                  , program : Text
                                  }
                              | CopyFile : { dest : Text, src : Text }
                              | CreateDirectory : { dir : Text }
                              | MakeExecutable : { file : Text }
                              | Patch : { patchContents : Text }
                              | Symlink : { linkName : Text, tgt : Text }
                              | SymlinkBinary : { file : Text }
                              | SymlinkManpage :
                                  { file : Text, section : Natural }
                              | Write : { contents : Text, file : Text }
                              >.SymlinkBinary
                                { file = "bin/${pkg.name}" }
                            ]
                      else  [] : List
                                   < Call :
                                       { arguments : List Text
                                       , environment :
                                           Optional
                                             (List { value : Text, var : Text })
                                       , procDir : Optional Text
                                       , program : Text
                                       }
                                   | CopyFile : { dest : Text, src : Text }
                                   | CreateDirectory : { dir : Text }
                                   | MakeExecutable : { file : Text }
                                   | Patch : { patchContents : Text }
                                   | Symlink : { linkName : Text, tgt : Text }
                                   | SymlinkBinary : { file : Text }
                                   | SymlinkManpage :
                                       { file : Text, section : Natural }
                                   | Write : { contents : Text, file : Text }
                                   >
                    )
            , pkgBuildDeps =
                [] : List
                       { bound :
                           < Lower : { lower : List Natural }
                           | LowerUpper :
                               { lower : List Natural, upper : List Natural }
                           | NoBound
                           | Upper : { upper : List Natural }
                           >
                       , name : Text
                       }
            , pkgDeps =
                [] : List
                       { bound :
                           < Lower : { lower : List Natural }
                           | LowerUpper :
                               { lower : List Natural, upper : List Natural }
                           | NoBound
                           | Upper : { upper : List Natural }
                           >
                       , name : Text
                       }
            , pkgName = pkg.name
            , pkgSubdir =
                "${pkg.name}-${merge
                                 { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                 ( List/fold
                                     Natural
                                     pkg.version
                                     < Empty | NonEmpty : Text >
                                     ( λ(_ : Natural) →
                                       λ(_ : < Empty | NonEmpty : Text >) →
                                         merge
                                           { Empty =
                                               < Empty
                                               | NonEmpty : Text
                                               >.NonEmpty
                                                 (Natural/show _@1)
                                           , NonEmpty =
                                               λ(_ : Text) →
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "${Natural/show _@2}.${_}"
                                           }
                                           _
                                     )
                                     < Empty | NonEmpty : Text >.Empty
                                 )}"
            , pkgUrl =
                "https://ftp.gnu.org/gnu/${pkg.name}/${pkg.name}-${merge
                                                                     { Empty =
                                                                         ""
                                                                     , NonEmpty =
                                                                         λ ( _
                                                                           : Text
                                                                           ) →
                                                                           _
                                                                     }
                                                                     ( List/fold
                                                                         Natural
                                                                         pkg.version
                                                                         < Empty
                                                                         | NonEmpty :
                                                                             Text
                                                                         >
                                                                         ( λ ( _
                                                                             : Natural
                                                                             ) →
                                                                           λ ( _
                                                                             : < Empty
                                                                               | NonEmpty :
                                                                                   Text
                                                                               >
                                                                             ) →
                                                                             merge
                                                                               { Empty =
                                                                                   < Empty
                                                                                   | NonEmpty :
                                                                                       Text
                                                                                   >.NonEmpty
                                                                                     ( Natural/show
                                                                                         _@1
                                                                                     )
                                                                               , NonEmpty =
                                                                                   λ ( _
                                                                                     : Text
                                                                                     ) →
                                                                                     < Empty
                                                                                     | NonEmpty :
                                                                                         Text
                                                                                     >.NonEmpty
                                                                                       "${Natural/show
                                                                                            _@2}.${_}"
                                                                               }
                                                                               _
                                                                         )
                                                                         < Empty
                                                                         | NonEmpty :
                                                                             Text
                                                                         >.Empty
                                                                     )}.tar.xz"
            , pkgVersion = pkg.version
            }
      , makeGnuLibrary =
          λ(pkg : { name : Text, version : List Natural }) →
            { buildCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments = [ "-j${Natural/show cfg.cpus}" ]
                      , environment = Some
                          (   ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                            # [ { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          (cfg.shareDirs # cfg.linkDirs)
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/site_perl/5.30.2/${merge
                                                                                   { AArch =
                                                                                       "aarch64"
                                                                                   , Alpha =
                                                                                       "alpha"
                                                                                   , Arm =
                                                                                       "arm"
                                                                                   , HPPA =
                                                                                       "hppa"
                                                                                   , HPPA64 =
                                                                                       "hppa64"
                                                                                   , M68k =
                                                                                       "m68k"
                                                                                   , Mips =
                                                                                       "mips"
                                                                                   , Mips64 =
                                                                                       "mips64"
                                                                                   , Mips64El =
                                                                                       "mips64el"
                                                                                   , MipsEl =
                                                                                       "mipsel"
                                                                                   , MipsIsa32r6 =
                                                                                       "mipsisa32r6"
                                                                                   , MipsIsa32r6El =
                                                                                       "mipsisa32r6el"
                                                                                   , MipsIsa64r6 =
                                                                                       "mipsisa64r6"
                                                                                   , MipsIsa64r6El =
                                                                                       "mipsisa64r6el"
                                                                                   , PowerPC =
                                                                                       "powerpc"
                                                                                   , PowerPC64 =
                                                                                       "powerpc64"
                                                                                   , PowerPC64le =
                                                                                       "powerpc64le"
                                                                                   , RISCV64 =
                                                                                       "riscv64"
                                                                                   , S390x =
                                                                                       "s390x"
                                                                                   , SH4 =
                                                                                       "sh4"
                                                                                   , Sparc64 =
                                                                                       "sparc64"
                                                                                   , X64 =
                                                                                       "x86_64"
                                                                                   , X86 =
                                                                                       "i686"
                                                                                   }
                                                                                   cfg.buildArch}-${merge
                                                                                                      { AIX =
                                                                                                          "aix"
                                                                                                      , Android =
                                                                                                          "android"
                                                                                                      , Darwin =
                                                                                                          "darwin"
                                                                                                      , Dragonfly =
                                                                                                          "dragonfly"
                                                                                                      , FreeBSD =
                                                                                                          "freebsd"
                                                                                                      , Haiku =
                                                                                                          "haiku"
                                                                                                      , Hurd =
                                                                                                          "hurd"
                                                                                                      , IOS =
                                                                                                          "darwin"
                                                                                                      , Linux =
                                                                                                          "linux"
                                                                                                      , NetBSD =
                                                                                                          "netbsd"
                                                                                                      , NoOs =
                                                                                                          "none"
                                                                                                      , OpenBSD =
                                                                                                          "openbsd"
                                                                                                      , Redox =
                                                                                                          "redox"
                                                                                                      , Solaris =
                                                                                                          "solaris"
                                                                                                      , Windows =
                                                                                                          "w64"
                                                                                                      }
                                                                                                      cfg.buildOS}/"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/site_perl/5.30.2/${merge
                                                                                     { AArch =
                                                                                         "aarch64"
                                                                                     , Alpha =
                                                                                         "alpha"
                                                                                     , Arm =
                                                                                         "arm"
                                                                                     , HPPA =
                                                                                         "hppa"
                                                                                     , HPPA64 =
                                                                                         "hppa64"
                                                                                     , M68k =
                                                                                         "m68k"
                                                                                     , Mips =
                                                                                         "mips"
                                                                                     , Mips64 =
                                                                                         "mips64"
                                                                                     , Mips64El =
                                                                                         "mips64el"
                                                                                     , MipsEl =
                                                                                         "mipsel"
                                                                                     , MipsIsa32r6 =
                                                                                         "mipsisa32r6"
                                                                                     , MipsIsa32r6El =
                                                                                         "mipsisa32r6el"
                                                                                     , MipsIsa64r6 =
                                                                                         "mipsisa64r6"
                                                                                     , MipsIsa64r6El =
                                                                                         "mipsisa64r6el"
                                                                                     , PowerPC =
                                                                                         "powerpc"
                                                                                     , PowerPC64 =
                                                                                         "powerpc64"
                                                                                     , PowerPC64le =
                                                                                         "powerpc64le"
                                                                                     , RISCV64 =
                                                                                         "riscv64"
                                                                                     , S390x =
                                                                                         "s390x"
                                                                                     , SH4 =
                                                                                         "sh4"
                                                                                     , Sparc64 =
                                                                                         "sparc64"
                                                                                     , X64 =
                                                                                         "x86_64"
                                                                                     , X86 =
                                                                                         "i686"
                                                                                     }
                                                                                     cfg.buildArch}-${merge
                                                                                                        { AIX =
                                                                                                            "aix"
                                                                                                        , Android =
                                                                                                            "android"
                                                                                                        , Darwin =
                                                                                                            "darwin"
                                                                                                        , Dragonfly =
                                                                                                            "dragonfly"
                                                                                                        , FreeBSD =
                                                                                                            "freebsd"
                                                                                                        , Haiku =
                                                                                                            "haiku"
                                                                                                        , Hurd =
                                                                                                            "hurd"
                                                                                                        , IOS =
                                                                                                            "darwin"
                                                                                                        , Linux =
                                                                                                            "linux"
                                                                                                        , NetBSD =
                                                                                                            "netbsd"
                                                                                                        , NoOs =
                                                                                                            "none"
                                                                                                        , OpenBSD =
                                                                                                            "openbsd"
                                                                                                        , Redox =
                                                                                                            "redox"
                                                                                                        , Solaris =
                                                                                                            "solaris"
                                                                                                        , Windows =
                                                                                                            "w64"
                                                                                                        }
                                                                                                        cfg.buildOS}/:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PERL5LIB"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              ]
                          )
                      , procDir = None Text
                      , program =
                          merge
                            { AIX = "make"
                            , Android = "make"
                            , Darwin = "make"
                            , Dragonfly = "gmake"
                            , FreeBSD = "gmake"
                            , Haiku = "make"
                            , Hurd = "make"
                            , IOS = "make"
                            , Linux = "make"
                            , NetBSD = "gmake"
                            , NoOs = "make"
                            , OpenBSD = "gmake"
                            , Redox = "make"
                            , Solaris = "gmake"
                            , Windows = "make"
                            }
                            cfg.buildOS
                      }
                  ]
            , configureCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments =
                          ( if    merge
                                    { AIX = False
                                    , Android = False
                                    , Darwin = True
                                    , Dragonfly = False
                                    , FreeBSD = False
                                    , Haiku = False
                                    , Hurd = False
                                    , IOS = False
                                    , Linux = False
                                    , NetBSD = False
                                    , NoOs = False
                                    , OpenBSD = False
                                    , Redox = False
                                    , Solaris = False
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  λ(x : List Text) → [ "configure" ] # x
                            else  λ(x : List Text) → x
                          )
                            ( merge
                                { None = [ "--prefix=${cfg.installDir}" ]
                                , Some =
                                    λ(x : Text) →
                                      [ "--prefix=${cfg.installDir}", x ]
                                }
                                ( merge
                                    { None = None Text
                                    , Some =
                                        λ ( _
                                          : { abi :
                                                Optional
                                                  < GNU
                                                  | GNUabi64
                                                  | GNUeabi
                                                  | GNUeabihf
                                                  | GNUspe
                                                  | MinGw
                                                  >
                                            , arch :
                                                < AArch
                                                | Alpha
                                                | Arm
                                                | HPPA
                                                | HPPA64
                                                | M68k
                                                | Mips
                                                | Mips64
                                                | Mips64El
                                                | MipsEl
                                                | MipsIsa32r6
                                                | MipsIsa32r6El
                                                | MipsIsa64r6
                                                | MipsIsa64r6El
                                                | PowerPC
                                                | PowerPC64
                                                | PowerPC64le
                                                | RISCV64
                                                | S390x
                                                | SH4
                                                | Sparc64
                                                | X64
                                                | X86
                                                >
                                            , manufacturer :
                                                Optional
                                                  < Apple | IBM | PC | Unknown >
                                            , os :
                                                < AIX
                                                | Android
                                                | Darwin
                                                | Dragonfly
                                                | FreeBSD
                                                | Haiku
                                                | Hurd
                                                | IOS
                                                | Linux
                                                | NetBSD
                                                | NoOs
                                                | OpenBSD
                                                | Redox
                                                | Solaris
                                                | Windows
                                                >
                                            }
                                          ) →
                                          Some
                                            "--host=${merge
                                                        { AArch = "aarch64"
                                                        , Alpha = "alpha"
                                                        , Arm = "arm"
                                                        , HPPA = "hppa"
                                                        , HPPA64 = "hppa64"
                                                        , M68k = "m68k"
                                                        , Mips = "mips"
                                                        , Mips64 = "mips64"
                                                        , Mips64El = "mips64el"
                                                        , MipsEl = "mipsel"
                                                        , MipsIsa32r6 =
                                                            "mipsisa32r6"
                                                        , MipsIsa32r6El =
                                                            "mipsisa32r6el"
                                                        , MipsIsa64r6 =
                                                            "mipsisa64r6"
                                                        , MipsIsa64r6El =
                                                            "mipsisa64r6el"
                                                        , PowerPC = "powerpc"
                                                        , PowerPC64 =
                                                            "powerpc64"
                                                        , PowerPC64le =
                                                            "powerpc64le"
                                                        , RISCV64 = "riscv64"
                                                        , S390x = "s390x"
                                                        , SH4 = "sh4"
                                                        , Sparc64 = "sparc64"
                                                        , X64 = "x86_64"
                                                        , X86 = "i686"
                                                        }
                                                        _.arch}-${merge
                                                                    { AIX =
                                                                        "aix"
                                                                    , Android =
                                                                        "android"
                                                                    , Darwin =
                                                                        "darwin"
                                                                    , Dragonfly =
                                                                        "dragonfly"
                                                                    , FreeBSD =
                                                                        "freebsd"
                                                                    , Haiku =
                                                                        "haiku"
                                                                    , Hurd =
                                                                        "hurd"
                                                                    , IOS =
                                                                        "darwin"
                                                                    , Linux =
                                                                        "linux"
                                                                    , NetBSD =
                                                                        "netbsd"
                                                                    , NoOs =
                                                                        "none"
                                                                    , OpenBSD =
                                                                        "openbsd"
                                                                    , Redox =
                                                                        "redox"
                                                                    , Solaris =
                                                                        "solaris"
                                                                    , Windows =
                                                                        "w64"
                                                                    }
                                                                    _.os}${merge
                                                                             { None =
                                                                                 ""
                                                                             , Some =
                                                                                 λ ( abi
                                                                                   : < GNU
                                                                                     | GNUabi64
                                                                                     | GNUeabi
                                                                                     | GNUeabihf
                                                                                     | GNUspe
                                                                                     | MinGw
                                                                                     >
                                                                                   ) →
                                                                                   "-${merge
                                                                                         { GNU =
                                                                                             "gnu"
                                                                                         , GNUabi64 =
                                                                                             "gnuabi64"
                                                                                         , GNUeabi =
                                                                                             "gnueabi"
                                                                                         , GNUeabihf =
                                                                                             "gnueabihf"
                                                                                         , GNUspe =
                                                                                             "gnuspe"
                                                                                         , MinGw =
                                                                                             "mingw32"
                                                                                         }
                                                                                         abi}"
                                                                             }
                                                                             _.abi}"
                                    }
                                    cfg.targetTriple
                                )
                            )
                      , environment = Some
                          (   ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                            # [ { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.includeDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-I${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-I${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${if    cfg.static
                                             then  " -static"
                                             else  ""}"
                                , var = "CPPFLAGS"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          (cfg.shareDirs # cfg.linkDirs)
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_RUN_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/site_perl/5.30.2/${merge
                                                                                   { AArch =
                                                                                       "aarch64"
                                                                                   , Alpha =
                                                                                       "alpha"
                                                                                   , Arm =
                                                                                       "arm"
                                                                                   , HPPA =
                                                                                       "hppa"
                                                                                   , HPPA64 =
                                                                                       "hppa64"
                                                                                   , M68k =
                                                                                       "m68k"
                                                                                   , Mips =
                                                                                       "mips"
                                                                                   , Mips64 =
                                                                                       "mips64"
                                                                                   , Mips64El =
                                                                                       "mips64el"
                                                                                   , MipsEl =
                                                                                       "mipsel"
                                                                                   , MipsIsa32r6 =
                                                                                       "mipsisa32r6"
                                                                                   , MipsIsa32r6El =
                                                                                       "mipsisa32r6el"
                                                                                   , MipsIsa64r6 =
                                                                                       "mipsisa64r6"
                                                                                   , MipsIsa64r6El =
                                                                                       "mipsisa64r6el"
                                                                                   , PowerPC =
                                                                                       "powerpc"
                                                                                   , PowerPC64 =
                                                                                       "powerpc64"
                                                                                   , PowerPC64le =
                                                                                       "powerpc64le"
                                                                                   , RISCV64 =
                                                                                       "riscv64"
                                                                                   , S390x =
                                                                                       "s390x"
                                                                                   , SH4 =
                                                                                       "sh4"
                                                                                   , Sparc64 =
                                                                                       "sparc64"
                                                                                   , X64 =
                                                                                       "x86_64"
                                                                                   , X86 =
                                                                                       "i686"
                                                                                   }
                                                                                   cfg.buildArch}-${merge
                                                                                                      { AIX =
                                                                                                          "aix"
                                                                                                      , Android =
                                                                                                          "android"
                                                                                                      , Darwin =
                                                                                                          "darwin"
                                                                                                      , Dragonfly =
                                                                                                          "dragonfly"
                                                                                                      , FreeBSD =
                                                                                                          "freebsd"
                                                                                                      , Haiku =
                                                                                                          "haiku"
                                                                                                      , Hurd =
                                                                                                          "hurd"
                                                                                                      , IOS =
                                                                                                          "darwin"
                                                                                                      , Linux =
                                                                                                          "linux"
                                                                                                      , NetBSD =
                                                                                                          "netbsd"
                                                                                                      , NoOs =
                                                                                                          "none"
                                                                                                      , OpenBSD =
                                                                                                          "openbsd"
                                                                                                      , Redox =
                                                                                                          "redox"
                                                                                                      , Solaris =
                                                                                                          "solaris"
                                                                                                      , Windows =
                                                                                                          "w64"
                                                                                                      }
                                                                                                      cfg.buildOS}/"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/site_perl/5.30.2/${merge
                                                                                     { AArch =
                                                                                         "aarch64"
                                                                                     , Alpha =
                                                                                         "alpha"
                                                                                     , Arm =
                                                                                         "arm"
                                                                                     , HPPA =
                                                                                         "hppa"
                                                                                     , HPPA64 =
                                                                                         "hppa64"
                                                                                     , M68k =
                                                                                         "m68k"
                                                                                     , Mips =
                                                                                         "mips"
                                                                                     , Mips64 =
                                                                                         "mips64"
                                                                                     , Mips64El =
                                                                                         "mips64el"
                                                                                     , MipsEl =
                                                                                         "mipsel"
                                                                                     , MipsIsa32r6 =
                                                                                         "mipsisa32r6"
                                                                                     , MipsIsa32r6El =
                                                                                         "mipsisa32r6el"
                                                                                     , MipsIsa64r6 =
                                                                                         "mipsisa64r6"
                                                                                     , MipsIsa64r6El =
                                                                                         "mipsisa64r6el"
                                                                                     , PowerPC =
                                                                                         "powerpc"
                                                                                     , PowerPC64 =
                                                                                         "powerpc64"
                                                                                     , PowerPC64le =
                                                                                         "powerpc64le"
                                                                                     , RISCV64 =
                                                                                         "riscv64"
                                                                                     , S390x =
                                                                                         "s390x"
                                                                                     , SH4 =
                                                                                         "sh4"
                                                                                     , Sparc64 =
                                                                                         "sparc64"
                                                                                     , X64 =
                                                                                         "x86_64"
                                                                                     , X86 =
                                                                                         "i686"
                                                                                     }
                                                                                     cfg.buildArch}-${merge
                                                                                                        { AIX =
                                                                                                            "aix"
                                                                                                        , Android =
                                                                                                            "android"
                                                                                                        , Darwin =
                                                                                                            "darwin"
                                                                                                        , Dragonfly =
                                                                                                            "dragonfly"
                                                                                                        , FreeBSD =
                                                                                                            "freebsd"
                                                                                                        , Haiku =
                                                                                                            "haiku"
                                                                                                        , Hurd =
                                                                                                            "hurd"
                                                                                                        , IOS =
                                                                                                            "darwin"
                                                                                                        , Linux =
                                                                                                            "linux"
                                                                                                        , NetBSD =
                                                                                                            "netbsd"
                                                                                                        , NoOs =
                                                                                                            "none"
                                                                                                        , OpenBSD =
                                                                                                            "openbsd"
                                                                                                        , Redox =
                                                                                                            "redox"
                                                                                                        , Solaris =
                                                                                                            "solaris"
                                                                                                        , Windows =
                                                                                                            "w64"
                                                                                                        }
                                                                                                        cfg.buildOS}/:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PERL5LIB"
                                }
                              ]
                          )
                      , procDir = None Text
                      , program =
                          if    merge
                                  { AIX = False
                                  , Android = False
                                  , Darwin = True
                                  , Dragonfly = False
                                  , FreeBSD = False
                                  , Haiku = False
                                  , Hurd = False
                                  , IOS = False
                                  , Linux = False
                                  , NetBSD = False
                                  , NoOs = False
                                  , OpenBSD = False
                                  , Redox = False
                                  , Solaris = False
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  "sh"
                          else  "./configure"
                      }
                  ]
            , installCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments = [ "install" ]
                      , environment = Some
                          (   ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                            # [ { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          (cfg.shareDirs # cfg.linkDirs)
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/site_perl/5.30.2/${merge
                                                                                   { AArch =
                                                                                       "aarch64"
                                                                                   , Alpha =
                                                                                       "alpha"
                                                                                   , Arm =
                                                                                       "arm"
                                                                                   , HPPA =
                                                                                       "hppa"
                                                                                   , HPPA64 =
                                                                                       "hppa64"
                                                                                   , M68k =
                                                                                       "m68k"
                                                                                   , Mips =
                                                                                       "mips"
                                                                                   , Mips64 =
                                                                                       "mips64"
                                                                                   , Mips64El =
                                                                                       "mips64el"
                                                                                   , MipsEl =
                                                                                       "mipsel"
                                                                                   , MipsIsa32r6 =
                                                                                       "mipsisa32r6"
                                                                                   , MipsIsa32r6El =
                                                                                       "mipsisa32r6el"
                                                                                   , MipsIsa64r6 =
                                                                                       "mipsisa64r6"
                                                                                   , MipsIsa64r6El =
                                                                                       "mipsisa64r6el"
                                                                                   , PowerPC =
                                                                                       "powerpc"
                                                                                   , PowerPC64 =
                                                                                       "powerpc64"
                                                                                   , PowerPC64le =
                                                                                       "powerpc64le"
                                                                                   , RISCV64 =
                                                                                       "riscv64"
                                                                                   , S390x =
                                                                                       "s390x"
                                                                                   , SH4 =
                                                                                       "sh4"
                                                                                   , Sparc64 =
                                                                                       "sparc64"
                                                                                   , X64 =
                                                                                       "x86_64"
                                                                                   , X86 =
                                                                                       "i686"
                                                                                   }
                                                                                   cfg.buildArch}-${merge
                                                                                                      { AIX =
                                                                                                          "aix"
                                                                                                      , Android =
                                                                                                          "android"
                                                                                                      , Darwin =
                                                                                                          "darwin"
                                                                                                      , Dragonfly =
                                                                                                          "dragonfly"
                                                                                                      , FreeBSD =
                                                                                                          "freebsd"
                                                                                                      , Haiku =
                                                                                                          "haiku"
                                                                                                      , Hurd =
                                                                                                          "hurd"
                                                                                                      , IOS =
                                                                                                          "darwin"
                                                                                                      , Linux =
                                                                                                          "linux"
                                                                                                      , NetBSD =
                                                                                                          "netbsd"
                                                                                                      , NoOs =
                                                                                                          "none"
                                                                                                      , OpenBSD =
                                                                                                          "openbsd"
                                                                                                      , Redox =
                                                                                                          "redox"
                                                                                                      , Solaris =
                                                                                                          "solaris"
                                                                                                      , Windows =
                                                                                                          "w64"
                                                                                                      }
                                                                                                      cfg.buildOS}/"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/site_perl/5.30.2/${merge
                                                                                     { AArch =
                                                                                         "aarch64"
                                                                                     , Alpha =
                                                                                         "alpha"
                                                                                     , Arm =
                                                                                         "arm"
                                                                                     , HPPA =
                                                                                         "hppa"
                                                                                     , HPPA64 =
                                                                                         "hppa64"
                                                                                     , M68k =
                                                                                         "m68k"
                                                                                     , Mips =
                                                                                         "mips"
                                                                                     , Mips64 =
                                                                                         "mips64"
                                                                                     , Mips64El =
                                                                                         "mips64el"
                                                                                     , MipsEl =
                                                                                         "mipsel"
                                                                                     , MipsIsa32r6 =
                                                                                         "mipsisa32r6"
                                                                                     , MipsIsa32r6El =
                                                                                         "mipsisa32r6el"
                                                                                     , MipsIsa64r6 =
                                                                                         "mipsisa64r6"
                                                                                     , MipsIsa64r6El =
                                                                                         "mipsisa64r6el"
                                                                                     , PowerPC =
                                                                                         "powerpc"
                                                                                     , PowerPC64 =
                                                                                         "powerpc64"
                                                                                     , PowerPC64le =
                                                                                         "powerpc64le"
                                                                                     , RISCV64 =
                                                                                         "riscv64"
                                                                                     , S390x =
                                                                                         "s390x"
                                                                                     , SH4 =
                                                                                         "sh4"
                                                                                     , Sparc64 =
                                                                                         "sparc64"
                                                                                     , X64 =
                                                                                         "x86_64"
                                                                                     , X86 =
                                                                                         "i686"
                                                                                     }
                                                                                     cfg.buildArch}-${merge
                                                                                                        { AIX =
                                                                                                            "aix"
                                                                                                        , Android =
                                                                                                            "android"
                                                                                                        , Darwin =
                                                                                                            "darwin"
                                                                                                        , Dragonfly =
                                                                                                            "dragonfly"
                                                                                                        , FreeBSD =
                                                                                                            "freebsd"
                                                                                                        , Haiku =
                                                                                                            "haiku"
                                                                                                        , Hurd =
                                                                                                            "hurd"
                                                                                                        , IOS =
                                                                                                            "darwin"
                                                                                                        , Linux =
                                                                                                            "linux"
                                                                                                        , NetBSD =
                                                                                                            "netbsd"
                                                                                                        , NoOs =
                                                                                                            "none"
                                                                                                        , OpenBSD =
                                                                                                            "openbsd"
                                                                                                        , Redox =
                                                                                                            "redox"
                                                                                                        , Solaris =
                                                                                                            "solaris"
                                                                                                        , Windows =
                                                                                                            "w64"
                                                                                                        }
                                                                                                        cfg.buildOS}/:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PERL5LIB"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              ]
                          )
                      , procDir = None Text
                      , program =
                          merge
                            { AIX = "make"
                            , Android = "make"
                            , Darwin = "make"
                            , Dragonfly = "gmake"
                            , FreeBSD = "gmake"
                            , Haiku = "make"
                            , Hurd = "make"
                            , IOS = "make"
                            , Linux = "make"
                            , NetBSD = "gmake"
                            , NoOs = "make"
                            , OpenBSD = "gmake"
                            , Redox = "make"
                            , Solaris = "gmake"
                            , Windows = "make"
                            }
                            cfg.buildOS
                      }
                  ]
            , pkgBuildDeps =
                [] : List
                       { bound :
                           < Lower : { lower : List Natural }
                           | LowerUpper :
                               { lower : List Natural, upper : List Natural }
                           | NoBound
                           | Upper : { upper : List Natural }
                           >
                       , name : Text
                       }
            , pkgDeps =
                [] : List
                       { bound :
                           < Lower : { lower : List Natural }
                           | LowerUpper :
                               { lower : List Natural, upper : List Natural }
                           | NoBound
                           | Upper : { upper : List Natural }
                           >
                       , name : Text
                       }
            , pkgName = pkg.name
            , pkgSubdir =
                "lib${pkg.name}-${merge
                                    { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                    ( List/fold
                                        Natural
                                        pkg.version
                                        < Empty | NonEmpty : Text >
                                        ( λ(_ : Natural) →
                                          λ(_ : < Empty | NonEmpty : Text >) →
                                            merge
                                              { Empty =
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    (Natural/show _@1)
                                              , NonEmpty =
                                                  λ(_ : Text) →
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${Natural/show _@2}.${_}"
                                              }
                                              _
                                        )
                                        < Empty | NonEmpty : Text >.Empty
                                    )}"
            , pkgUrl =
                "https://ftp.gnu.org/pub/gnu/lib${pkg.name}/lib${pkg.name}-${merge
                                                                               { Empty =
                                                                                   ""
                                                                               , NonEmpty =
                                                                                   λ ( _
                                                                                     : Text
                                                                                     ) →
                                                                                     _
                                                                               }
                                                                               ( List/fold
                                                                                   Natural
                                                                                   pkg.version
                                                                                   < Empty
                                                                                   | NonEmpty :
                                                                                       Text
                                                                                   >
                                                                                   ( λ ( _
                                                                                       : Natural
                                                                                       ) →
                                                                                     λ ( _
                                                                                       : < Empty
                                                                                         | NonEmpty :
                                                                                             Text
                                                                                         >
                                                                                       ) →
                                                                                       merge
                                                                                         { Empty =
                                                                                             < Empty
                                                                                             | NonEmpty :
                                                                                                 Text
                                                                                             >.NonEmpty
                                                                                               ( Natural/show
                                                                                                   _@1
                                                                                               )
                                                                                         , NonEmpty =
                                                                                             λ ( _
                                                                                               : Text
                                                                                               ) →
                                                                                               < Empty
                                                                                               | NonEmpty :
                                                                                                   Text
                                                                                               >.NonEmpty
                                                                                                 "${Natural/show
                                                                                                      _@2}.${_}"
                                                                                         }
                                                                                         _
                                                                                   )
                                                                                   < Empty
                                                                                   | NonEmpty :
                                                                                       Text
                                                                                   >.Empty
                                                                               )}.tar.xz"
            , pkgVersion = pkg.version
            }
      , maybeAppend =
          λ(a : Type) →
          λ(x : Optional a) →
          λ(xs : List a) →
            merge { None = xs, Some = λ(x : a) → xs # [ x ] } x
      , mesonCfgFile =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            ''
            [binaries]
            c = '${merge
                     { None = ""
                     , Some =
                         λ ( tgt
                           : { abi :
                                 Optional
                                   < GNU
                                   | GNUabi64
                                   | GNUeabi
                                   | GNUeabihf
                                   | GNUspe
                                   | MinGw
                                   >
                             , arch :
                                 < AArch
                                 | Alpha
                                 | Arm
                                 | HPPA
                                 | HPPA64
                                 | M68k
                                 | Mips
                                 | Mips64
                                 | Mips64El
                                 | MipsEl
                                 | MipsIsa32r6
                                 | MipsIsa32r6El
                                 | MipsIsa64r6
                                 | MipsIsa64r6El
                                 | PowerPC
                                 | PowerPC64
                                 | PowerPC64le
                                 | RISCV64
                                 | S390x
                                 | SH4
                                 | Sparc64
                                 | X64
                                 | X86
                                 >
                             , manufacturer :
                                 Optional < Apple | IBM | PC | Unknown >
                             , os :
                                 < AIX
                                 | Android
                                 | Darwin
                                 | Dragonfly
                                 | FreeBSD
                                 | Haiku
                                 | Hurd
                                 | IOS
                                 | Linux
                                 | NetBSD
                                 | NoOs
                                 | OpenBSD
                                 | Redox
                                 | Solaris
                                 | Windows
                                 >
                             }
                           ) →
                           "${merge
                                { AArch = "aarch64"
                                , Alpha = "alpha"
                                , Arm = "arm"
                                , HPPA = "hppa"
                                , HPPA64 = "hppa64"
                                , M68k = "m68k"
                                , Mips = "mips"
                                , Mips64 = "mips64"
                                , Mips64El = "mips64el"
                                , MipsEl = "mipsel"
                                , MipsIsa32r6 = "mipsisa32r6"
                                , MipsIsa32r6El = "mipsisa32r6el"
                                , MipsIsa64r6 = "mipsisa64r6"
                                , MipsIsa64r6El = "mipsisa64r6el"
                                , PowerPC = "powerpc"
                                , PowerPC64 = "powerpc64"
                                , PowerPC64le = "powerpc64le"
                                , RISCV64 = "riscv64"
                                , S390x = "s390x"
                                , SH4 = "sh4"
                                , Sparc64 = "sparc64"
                                , X64 = "x86_64"
                                , X86 = "i686"
                                }
                                tgt.arch}-${merge
                                              { AIX = "aix"
                                              , Android = "android"
                                              , Darwin = "darwin"
                                              , Dragonfly = "dragonfly"
                                              , FreeBSD = "freebsd"
                                              , Haiku = "haiku"
                                              , Hurd = "hurd"
                                              , IOS = "darwin"
                                              , Linux = "linux"
                                              , NetBSD = "netbsd"
                                              , NoOs = "none"
                                              , OpenBSD = "openbsd"
                                              , Redox = "redox"
                                              , Solaris = "solaris"
                                              , Windows = "w64"
                                              }
                                              tgt.os}${merge
                                                         { None = ""
                                                         , Some =
                                                             λ ( abi
                                                               : < GNU
                                                                 | GNUabi64
                                                                 | GNUeabi
                                                                 | GNUeabihf
                                                                 | GNUspe
                                                                 | MinGw
                                                                 >
                                                               ) →
                                                               "-${merge
                                                                     { GNU =
                                                                         "gnu"
                                                                     , GNUabi64 =
                                                                         "gnuabi64"
                                                                     , GNUeabi =
                                                                         "gnueabi"
                                                                     , GNUeabihf =
                                                                         "gnueabihf"
                                                                     , GNUspe =
                                                                         "gnuspe"
                                                                     , MinGw =
                                                                         "mingw32"
                                                                     }
                                                                     abi}"
                                                         }
                                                         tgt.abi}-"
                     }
                     cfg.targetTriple}gcc'
            cpp = '${merge
                       { None = ""
                       , Some =
                           λ ( tgt
                             : { abi :
                                   Optional
                                     < GNU
                                     | GNUabi64
                                     | GNUeabi
                                     | GNUeabihf
                                     | GNUspe
                                     | MinGw
                                     >
                               , arch :
                                   < AArch
                                   | Alpha
                                   | Arm
                                   | HPPA
                                   | HPPA64
                                   | M68k
                                   | Mips
                                   | Mips64
                                   | Mips64El
                                   | MipsEl
                                   | MipsIsa32r6
                                   | MipsIsa32r6El
                                   | MipsIsa64r6
                                   | MipsIsa64r6El
                                   | PowerPC
                                   | PowerPC64
                                   | PowerPC64le
                                   | RISCV64
                                   | S390x
                                   | SH4
                                   | Sparc64
                                   | X64
                                   | X86
                                   >
                               , manufacturer :
                                   Optional < Apple | IBM | PC | Unknown >
                               , os :
                                   < AIX
                                   | Android
                                   | Darwin
                                   | Dragonfly
                                   | FreeBSD
                                   | Haiku
                                   | Hurd
                                   | IOS
                                   | Linux
                                   | NetBSD
                                   | NoOs
                                   | OpenBSD
                                   | Redox
                                   | Solaris
                                   | Windows
                                   >
                               }
                             ) →
                             "${merge
                                  { AArch = "aarch64"
                                  , Alpha = "alpha"
                                  , Arm = "arm"
                                  , HPPA = "hppa"
                                  , HPPA64 = "hppa64"
                                  , M68k = "m68k"
                                  , Mips = "mips"
                                  , Mips64 = "mips64"
                                  , Mips64El = "mips64el"
                                  , MipsEl = "mipsel"
                                  , MipsIsa32r6 = "mipsisa32r6"
                                  , MipsIsa32r6El = "mipsisa32r6el"
                                  , MipsIsa64r6 = "mipsisa64r6"
                                  , MipsIsa64r6El = "mipsisa64r6el"
                                  , PowerPC = "powerpc"
                                  , PowerPC64 = "powerpc64"
                                  , PowerPC64le = "powerpc64le"
                                  , RISCV64 = "riscv64"
                                  , S390x = "s390x"
                                  , SH4 = "sh4"
                                  , Sparc64 = "sparc64"
                                  , X64 = "x86_64"
                                  , X86 = "i686"
                                  }
                                  tgt.arch}-${merge
                                                { AIX = "aix"
                                                , Android = "android"
                                                , Darwin = "darwin"
                                                , Dragonfly = "dragonfly"
                                                , FreeBSD = "freebsd"
                                                , Haiku = "haiku"
                                                , Hurd = "hurd"
                                                , IOS = "darwin"
                                                , Linux = "linux"
                                                , NetBSD = "netbsd"
                                                , NoOs = "none"
                                                , OpenBSD = "openbsd"
                                                , Redox = "redox"
                                                , Solaris = "solaris"
                                                , Windows = "w64"
                                                }
                                                tgt.os}${merge
                                                           { None = ""
                                                           , Some =
                                                               λ ( abi
                                                                 : < GNU
                                                                   | GNUabi64
                                                                   | GNUeabi
                                                                   | GNUeabihf
                                                                   | GNUspe
                                                                   | MinGw
                                                                   >
                                                                 ) →
                                                                 "-${merge
                                                                       { GNU =
                                                                           "gnu"
                                                                       , GNUabi64 =
                                                                           "gnuabi64"
                                                                       , GNUeabi =
                                                                           "gnueabi"
                                                                       , GNUeabihf =
                                                                           "gnueabihf"
                                                                       , GNUspe =
                                                                           "gnuspe"
                                                                       , MinGw =
                                                                           "mingw32"
                                                                       }
                                                                       abi}"
                                                           }
                                                           tgt.abi}-"
                       }
                       cfg.targetTriple}g++'
            ar = '${merge
                      { None = ""
                      , Some =
                          λ ( tgt
                            : { abi :
                                  Optional
                                    < GNU
                                    | GNUabi64
                                    | GNUeabi
                                    | GNUeabihf
                                    | GNUspe
                                    | MinGw
                                    >
                              , arch :
                                  < AArch
                                  | Alpha
                                  | Arm
                                  | HPPA
                                  | HPPA64
                                  | M68k
                                  | Mips
                                  | Mips64
                                  | Mips64El
                                  | MipsEl
                                  | MipsIsa32r6
                                  | MipsIsa32r6El
                                  | MipsIsa64r6
                                  | MipsIsa64r6El
                                  | PowerPC
                                  | PowerPC64
                                  | PowerPC64le
                                  | RISCV64
                                  | S390x
                                  | SH4
                                  | Sparc64
                                  | X64
                                  | X86
                                  >
                              , manufacturer :
                                  Optional < Apple | IBM | PC | Unknown >
                              , os :
                                  < AIX
                                  | Android
                                  | Darwin
                                  | Dragonfly
                                  | FreeBSD
                                  | Haiku
                                  | Hurd
                                  | IOS
                                  | Linux
                                  | NetBSD
                                  | NoOs
                                  | OpenBSD
                                  | Redox
                                  | Solaris
                                  | Windows
                                  >
                              }
                            ) →
                            "${merge
                                 { AArch = "aarch64"
                                 , Alpha = "alpha"
                                 , Arm = "arm"
                                 , HPPA = "hppa"
                                 , HPPA64 = "hppa64"
                                 , M68k = "m68k"
                                 , Mips = "mips"
                                 , Mips64 = "mips64"
                                 , Mips64El = "mips64el"
                                 , MipsEl = "mipsel"
                                 , MipsIsa32r6 = "mipsisa32r6"
                                 , MipsIsa32r6El = "mipsisa32r6el"
                                 , MipsIsa64r6 = "mipsisa64r6"
                                 , MipsIsa64r6El = "mipsisa64r6el"
                                 , PowerPC = "powerpc"
                                 , PowerPC64 = "powerpc64"
                                 , PowerPC64le = "powerpc64le"
                                 , RISCV64 = "riscv64"
                                 , S390x = "s390x"
                                 , SH4 = "sh4"
                                 , Sparc64 = "sparc64"
                                 , X64 = "x86_64"
                                 , X86 = "i686"
                                 }
                                 tgt.arch}-${merge
                                               { AIX = "aix"
                                               , Android = "android"
                                               , Darwin = "darwin"
                                               , Dragonfly = "dragonfly"
                                               , FreeBSD = "freebsd"
                                               , Haiku = "haiku"
                                               , Hurd = "hurd"
                                               , IOS = "darwin"
                                               , Linux = "linux"
                                               , NetBSD = "netbsd"
                                               , NoOs = "none"
                                               , OpenBSD = "openbsd"
                                               , Redox = "redox"
                                               , Solaris = "solaris"
                                               , Windows = "w64"
                                               }
                                               tgt.os}${merge
                                                          { None = ""
                                                          , Some =
                                                              λ ( abi
                                                                : < GNU
                                                                  | GNUabi64
                                                                  | GNUeabi
                                                                  | GNUeabihf
                                                                  | GNUspe
                                                                  | MinGw
                                                                  >
                                                                ) →
                                                                "-${merge
                                                                      { GNU =
                                                                          "gnu"
                                                                      , GNUabi64 =
                                                                          "gnuabi64"
                                                                      , GNUeabi =
                                                                          "gnueabi"
                                                                      , GNUeabihf =
                                                                          "gnueabihf"
                                                                      , GNUspe =
                                                                          "gnuspe"
                                                                      , MinGw =
                                                                          "mingw32"
                                                                      }
                                                                      abi}"
                                                          }
                                                          tgt.abi}-"
                      }
                      cfg.targetTriple}ar'
            strip = '${merge
                         { None = ""
                         , Some =
                             λ ( tgt
                               : { abi :
                                     Optional
                                       < GNU
                                       | GNUabi64
                                       | GNUeabi
                                       | GNUeabihf
                                       | GNUspe
                                       | MinGw
                                       >
                                 , arch :
                                     < AArch
                                     | Alpha
                                     | Arm
                                     | HPPA
                                     | HPPA64
                                     | M68k
                                     | Mips
                                     | Mips64
                                     | Mips64El
                                     | MipsEl
                                     | MipsIsa32r6
                                     | MipsIsa32r6El
                                     | MipsIsa64r6
                                     | MipsIsa64r6El
                                     | PowerPC
                                     | PowerPC64
                                     | PowerPC64le
                                     | RISCV64
                                     | S390x
                                     | SH4
                                     | Sparc64
                                     | X64
                                     | X86
                                     >
                                 , manufacturer :
                                     Optional < Apple | IBM | PC | Unknown >
                                 , os :
                                     < AIX
                                     | Android
                                     | Darwin
                                     | Dragonfly
                                     | FreeBSD
                                     | Haiku
                                     | Hurd
                                     | IOS
                                     | Linux
                                     | NetBSD
                                     | NoOs
                                     | OpenBSD
                                     | Redox
                                     | Solaris
                                     | Windows
                                     >
                                 }
                               ) →
                               "${merge
                                    { AArch = "aarch64"
                                    , Alpha = "alpha"
                                    , Arm = "arm"
                                    , HPPA = "hppa"
                                    , HPPA64 = "hppa64"
                                    , M68k = "m68k"
                                    , Mips = "mips"
                                    , Mips64 = "mips64"
                                    , Mips64El = "mips64el"
                                    , MipsEl = "mipsel"
                                    , MipsIsa32r6 = "mipsisa32r6"
                                    , MipsIsa32r6El = "mipsisa32r6el"
                                    , MipsIsa64r6 = "mipsisa64r6"
                                    , MipsIsa64r6El = "mipsisa64r6el"
                                    , PowerPC = "powerpc"
                                    , PowerPC64 = "powerpc64"
                                    , PowerPC64le = "powerpc64le"
                                    , RISCV64 = "riscv64"
                                    , S390x = "s390x"
                                    , SH4 = "sh4"
                                    , Sparc64 = "sparc64"
                                    , X64 = "x86_64"
                                    , X86 = "i686"
                                    }
                                    tgt.arch}-${merge
                                                  { AIX = "aix"
                                                  , Android = "android"
                                                  , Darwin = "darwin"
                                                  , Dragonfly = "dragonfly"
                                                  , FreeBSD = "freebsd"
                                                  , Haiku = "haiku"
                                                  , Hurd = "hurd"
                                                  , IOS = "darwin"
                                                  , Linux = "linux"
                                                  , NetBSD = "netbsd"
                                                  , NoOs = "none"
                                                  , OpenBSD = "openbsd"
                                                  , Redox = "redox"
                                                  , Solaris = "solaris"
                                                  , Windows = "w64"
                                                  }
                                                  tgt.os}${merge
                                                             { None = ""
                                                             , Some =
                                                                 λ ( abi
                                                                   : < GNU
                                                                     | GNUabi64
                                                                     | GNUeabi
                                                                     | GNUeabihf
                                                                     | GNUspe
                                                                     | MinGw
                                                                     >
                                                                   ) →
                                                                   "-${merge
                                                                         { GNU =
                                                                             "gnu"
                                                                         , GNUabi64 =
                                                                             "gnuabi64"
                                                                         , GNUeabi =
                                                                             "gnueabi"
                                                                         , GNUeabihf =
                                                                             "gnueabihf"
                                                                         , GNUspe =
                                                                             "gnuspe"
                                                                         , MinGw =
                                                                             "mingw32"
                                                                         }
                                                                         abi}"
                                                             }
                                                             tgt.abi}-"
                         }
                         cfg.targetTriple}strip'
            pkgconfig = 'pkg-config'
            [host_machine]
            system = '${merge
                          { AIX = "aix"
                          , Android = "android"
                          , Darwin = "darwin"
                          , Dragonfly = "dragonfly"
                          , FreeBSD = "freebsd"
                          , Haiku = "haiku"
                          , Hurd = "hurd"
                          , IOS = "darwin"
                          , Linux = "linux"
                          , NetBSD = "netbsd"
                          , NoOs = "none"
                          , OpenBSD = "openbsd"
                          , Redox = "redox"
                          , Solaris = "solaris"
                          , Windows = "w64"
                          }
                          ( merge
                              { None = cfg.buildOS
                              , Some =
                                  λ ( tgt
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    tgt.os
                              }
                              cfg.targetTriple
                          )}'
            cpu_family = '${merge
                              { AArch = "aarch64"
                              , Alpha = "alpha"
                              , Arm = "arm"
                              , HPPA = "hppa"
                              , HPPA64 = "hppa64"
                              , M68k = "m68k"
                              , Mips = "mips"
                              , Mips64 = "mips64"
                              , Mips64El = "mips64el"
                              , MipsEl = "mipsel"
                              , MipsIsa32r6 = "mipsisa32r6"
                              , MipsIsa32r6El = "mipsisa32r6el"
                              , MipsIsa64r6 = "mipsisa64r6"
                              , MipsIsa64r6El = "mipsisa64r6el"
                              , PowerPC = "powerpc"
                              , PowerPC64 = "powerpc64"
                              , PowerPC64le = "powerpc64le"
                              , RISCV64 = "riscv64"
                              , S390x = "s390x"
                              , SH4 = "sh4"
                              , Sparc64 = "sparc64"
                              , X64 = "x86_64"
                              , X86 = "i686"
                              }
                              ( merge
                                  { None = cfg.buildArch
                                  , Some =
                                      λ ( tgt
                                        : { abi :
                                              Optional
                                                < GNU
                                                | GNUabi64
                                                | GNUeabi
                                                | GNUeabihf
                                                | GNUspe
                                                | MinGw
                                                >
                                          , arch :
                                              < AArch
                                              | Alpha
                                              | Arm
                                              | HPPA
                                              | HPPA64
                                              | M68k
                                              | Mips
                                              | Mips64
                                              | Mips64El
                                              | MipsEl
                                              | MipsIsa32r6
                                              | MipsIsa32r6El
                                              | MipsIsa64r6
                                              | MipsIsa64r6El
                                              | PowerPC
                                              | PowerPC64
                                              | PowerPC64le
                                              | RISCV64
                                              | S390x
                                              | SH4
                                              | Sparc64
                                              | X64
                                              | X86
                                              >
                                          , manufacturer :
                                              Optional
                                                < Apple | IBM | PC | Unknown >
                                          , os :
                                              < AIX
                                              | Android
                                              | Darwin
                                              | Dragonfly
                                              | FreeBSD
                                              | Haiku
                                              | Hurd
                                              | IOS
                                              | Linux
                                              | NetBSD
                                              | NoOs
                                              | OpenBSD
                                              | Redox
                                              | Solaris
                                              | Windows
                                              >
                                          }
                                        ) →
                                        tgt.arch
                                  }
                                  cfg.targetTriple
                              )}'
            cpu = '${merge
                       { AArch = "aarch64"
                       , Alpha = "alpha"
                       , Arm = "arm"
                       , HPPA = "hppa"
                       , HPPA64 = "hppa64"
                       , M68k = "m68k"
                       , Mips = "mips"
                       , Mips64 = "mips64"
                       , Mips64El = "mips64el"
                       , MipsEl = "mipsel"
                       , MipsIsa32r6 = "mipsisa32r6"
                       , MipsIsa32r6El = "mipsisa32r6el"
                       , MipsIsa64r6 = "mipsisa64r6"
                       , MipsIsa64r6El = "mipsisa64r6el"
                       , PowerPC = "powerpc"
                       , PowerPC64 = "powerpc64"
                       , PowerPC64le = "powerpc64le"
                       , RISCV64 = "riscv64"
                       , S390x = "s390x"
                       , SH4 = "sh4"
                       , Sparc64 = "sparc64"
                       , X64 = "x86_64"
                       , X86 = "i686"
                       }
                       ( merge
                           { None = cfg.buildArch
                           , Some =
                               λ ( tgt
                                 : { abi :
                                       Optional
                                         < GNU
                                         | GNUabi64
                                         | GNUeabi
                                         | GNUeabihf
                                         | GNUspe
                                         | MinGw
                                         >
                                   , arch :
                                       < AArch
                                       | Alpha
                                       | Arm
                                       | HPPA
                                       | HPPA64
                                       | M68k
                                       | Mips
                                       | Mips64
                                       | Mips64El
                                       | MipsEl
                                       | MipsIsa32r6
                                       | MipsIsa32r6El
                                       | MipsIsa64r6
                                       | MipsIsa64r6El
                                       | PowerPC
                                       | PowerPC64
                                       | PowerPC64le
                                       | RISCV64
                                       | S390x
                                       | SH4
                                       | Sparc64
                                       | X64
                                       | X86
                                       >
                                   , manufacturer :
                                       Optional < Apple | IBM | PC | Unknown >
                                   , os :
                                       < AIX
                                       | Android
                                       | Darwin
                                       | Dragonfly
                                       | FreeBSD
                                       | Haiku
                                       | Hurd
                                       | IOS
                                       | Linux
                                       | NetBSD
                                       | NoOs
                                       | OpenBSD
                                       | Redox
                                       | Solaris
                                       | Windows
                                       >
                                   }
                                 ) →
                                 tgt.arch
                           }
                           cfg.targetTriple
                       )}'
            endian = 'little${"'"}''
      , mesonConfigure =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "build" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Write
                { contents =
                    ''
                    [binaries]
                    c = '${merge
                             { None = ""
                             , Some =
                                 λ ( tgt
                                   : { abi :
                                         Optional
                                           < GNU
                                           | GNUabi64
                                           | GNUeabi
                                           | GNUeabihf
                                           | GNUspe
                                           | MinGw
                                           >
                                     , arch :
                                         < AArch
                                         | Alpha
                                         | Arm
                                         | HPPA
                                         | HPPA64
                                         | M68k
                                         | Mips
                                         | Mips64
                                         | Mips64El
                                         | MipsEl
                                         | MipsIsa32r6
                                         | MipsIsa32r6El
                                         | MipsIsa64r6
                                         | MipsIsa64r6El
                                         | PowerPC
                                         | PowerPC64
                                         | PowerPC64le
                                         | RISCV64
                                         | S390x
                                         | SH4
                                         | Sparc64
                                         | X64
                                         | X86
                                         >
                                     , manufacturer :
                                         Optional < Apple | IBM | PC | Unknown >
                                     , os :
                                         < AIX
                                         | Android
                                         | Darwin
                                         | Dragonfly
                                         | FreeBSD
                                         | Haiku
                                         | Hurd
                                         | IOS
                                         | Linux
                                         | NetBSD
                                         | NoOs
                                         | OpenBSD
                                         | Redox
                                         | Solaris
                                         | Windows
                                         >
                                     }
                                   ) →
                                   "${merge
                                        { AArch = "aarch64"
                                        , Alpha = "alpha"
                                        , Arm = "arm"
                                        , HPPA = "hppa"
                                        , HPPA64 = "hppa64"
                                        , M68k = "m68k"
                                        , Mips = "mips"
                                        , Mips64 = "mips64"
                                        , Mips64El = "mips64el"
                                        , MipsEl = "mipsel"
                                        , MipsIsa32r6 = "mipsisa32r6"
                                        , MipsIsa32r6El = "mipsisa32r6el"
                                        , MipsIsa64r6 = "mipsisa64r6"
                                        , MipsIsa64r6El = "mipsisa64r6el"
                                        , PowerPC = "powerpc"
                                        , PowerPC64 = "powerpc64"
                                        , PowerPC64le = "powerpc64le"
                                        , RISCV64 = "riscv64"
                                        , S390x = "s390x"
                                        , SH4 = "sh4"
                                        , Sparc64 = "sparc64"
                                        , X64 = "x86_64"
                                        , X86 = "i686"
                                        }
                                        tgt.arch}-${merge
                                                      { AIX = "aix"
                                                      , Android = "android"
                                                      , Darwin = "darwin"
                                                      , Dragonfly = "dragonfly"
                                                      , FreeBSD = "freebsd"
                                                      , Haiku = "haiku"
                                                      , Hurd = "hurd"
                                                      , IOS = "darwin"
                                                      , Linux = "linux"
                                                      , NetBSD = "netbsd"
                                                      , NoOs = "none"
                                                      , OpenBSD = "openbsd"
                                                      , Redox = "redox"
                                                      , Solaris = "solaris"
                                                      , Windows = "w64"
                                                      }
                                                      tgt.os}${merge
                                                                 { None = ""
                                                                 , Some =
                                                                     λ ( abi
                                                                       : < GNU
                                                                         | GNUabi64
                                                                         | GNUeabi
                                                                         | GNUeabihf
                                                                         | GNUspe
                                                                         | MinGw
                                                                         >
                                                                       ) →
                                                                       "-${merge
                                                                             { GNU =
                                                                                 "gnu"
                                                                             , GNUabi64 =
                                                                                 "gnuabi64"
                                                                             , GNUeabi =
                                                                                 "gnueabi"
                                                                             , GNUeabihf =
                                                                                 "gnueabihf"
                                                                             , GNUspe =
                                                                                 "gnuspe"
                                                                             , MinGw =
                                                                                 "mingw32"
                                                                             }
                                                                             abi}"
                                                                 }
                                                                 tgt.abi}-"
                             }
                             cfg.targetTriple}gcc'
                    cpp = '${merge
                               { None = ""
                               , Some =
                                   λ ( tgt
                                     : { abi :
                                           Optional
                                             < GNU
                                             | GNUabi64
                                             | GNUeabi
                                             | GNUeabihf
                                             | GNUspe
                                             | MinGw
                                             >
                                       , arch :
                                           < AArch
                                           | Alpha
                                           | Arm
                                           | HPPA
                                           | HPPA64
                                           | M68k
                                           | Mips
                                           | Mips64
                                           | Mips64El
                                           | MipsEl
                                           | MipsIsa32r6
                                           | MipsIsa32r6El
                                           | MipsIsa64r6
                                           | MipsIsa64r6El
                                           | PowerPC
                                           | PowerPC64
                                           | PowerPC64le
                                           | RISCV64
                                           | S390x
                                           | SH4
                                           | Sparc64
                                           | X64
                                           | X86
                                           >
                                       , manufacturer :
                                           Optional
                                             < Apple | IBM | PC | Unknown >
                                       , os :
                                           < AIX
                                           | Android
                                           | Darwin
                                           | Dragonfly
                                           | FreeBSD
                                           | Haiku
                                           | Hurd
                                           | IOS
                                           | Linux
                                           | NetBSD
                                           | NoOs
                                           | OpenBSD
                                           | Redox
                                           | Solaris
                                           | Windows
                                           >
                                       }
                                     ) →
                                     "${merge
                                          { AArch = "aarch64"
                                          , Alpha = "alpha"
                                          , Arm = "arm"
                                          , HPPA = "hppa"
                                          , HPPA64 = "hppa64"
                                          , M68k = "m68k"
                                          , Mips = "mips"
                                          , Mips64 = "mips64"
                                          , Mips64El = "mips64el"
                                          , MipsEl = "mipsel"
                                          , MipsIsa32r6 = "mipsisa32r6"
                                          , MipsIsa32r6El = "mipsisa32r6el"
                                          , MipsIsa64r6 = "mipsisa64r6"
                                          , MipsIsa64r6El = "mipsisa64r6el"
                                          , PowerPC = "powerpc"
                                          , PowerPC64 = "powerpc64"
                                          , PowerPC64le = "powerpc64le"
                                          , RISCV64 = "riscv64"
                                          , S390x = "s390x"
                                          , SH4 = "sh4"
                                          , Sparc64 = "sparc64"
                                          , X64 = "x86_64"
                                          , X86 = "i686"
                                          }
                                          tgt.arch}-${merge
                                                        { AIX = "aix"
                                                        , Android = "android"
                                                        , Darwin = "darwin"
                                                        , Dragonfly =
                                                            "dragonfly"
                                                        , FreeBSD = "freebsd"
                                                        , Haiku = "haiku"
                                                        , Hurd = "hurd"
                                                        , IOS = "darwin"
                                                        , Linux = "linux"
                                                        , NetBSD = "netbsd"
                                                        , NoOs = "none"
                                                        , OpenBSD = "openbsd"
                                                        , Redox = "redox"
                                                        , Solaris = "solaris"
                                                        , Windows = "w64"
                                                        }
                                                        tgt.os}${merge
                                                                   { None = ""
                                                                   , Some =
                                                                       λ ( abi
                                                                         : < GNU
                                                                           | GNUabi64
                                                                           | GNUeabi
                                                                           | GNUeabihf
                                                                           | GNUspe
                                                                           | MinGw
                                                                           >
                                                                         ) →
                                                                         "-${merge
                                                                               { GNU =
                                                                                   "gnu"
                                                                               , GNUabi64 =
                                                                                   "gnuabi64"
                                                                               , GNUeabi =
                                                                                   "gnueabi"
                                                                               , GNUeabihf =
                                                                                   "gnueabihf"
                                                                               , GNUspe =
                                                                                   "gnuspe"
                                                                               , MinGw =
                                                                                   "mingw32"
                                                                               }
                                                                               abi}"
                                                                   }
                                                                   tgt.abi}-"
                               }
                               cfg.targetTriple}g++'
                    ar = '${merge
                              { None = ""
                              , Some =
                                  λ ( tgt
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    "${merge
                                         { AArch = "aarch64"
                                         , Alpha = "alpha"
                                         , Arm = "arm"
                                         , HPPA = "hppa"
                                         , HPPA64 = "hppa64"
                                         , M68k = "m68k"
                                         , Mips = "mips"
                                         , Mips64 = "mips64"
                                         , Mips64El = "mips64el"
                                         , MipsEl = "mipsel"
                                         , MipsIsa32r6 = "mipsisa32r6"
                                         , MipsIsa32r6El = "mipsisa32r6el"
                                         , MipsIsa64r6 = "mipsisa64r6"
                                         , MipsIsa64r6El = "mipsisa64r6el"
                                         , PowerPC = "powerpc"
                                         , PowerPC64 = "powerpc64"
                                         , PowerPC64le = "powerpc64le"
                                         , RISCV64 = "riscv64"
                                         , S390x = "s390x"
                                         , SH4 = "sh4"
                                         , Sparc64 = "sparc64"
                                         , X64 = "x86_64"
                                         , X86 = "i686"
                                         }
                                         tgt.arch}-${merge
                                                       { AIX = "aix"
                                                       , Android = "android"
                                                       , Darwin = "darwin"
                                                       , Dragonfly = "dragonfly"
                                                       , FreeBSD = "freebsd"
                                                       , Haiku = "haiku"
                                                       , Hurd = "hurd"
                                                       , IOS = "darwin"
                                                       , Linux = "linux"
                                                       , NetBSD = "netbsd"
                                                       , NoOs = "none"
                                                       , OpenBSD = "openbsd"
                                                       , Redox = "redox"
                                                       , Solaris = "solaris"
                                                       , Windows = "w64"
                                                       }
                                                       tgt.os}${merge
                                                                  { None = ""
                                                                  , Some =
                                                                      λ ( abi
                                                                        : < GNU
                                                                          | GNUabi64
                                                                          | GNUeabi
                                                                          | GNUeabihf
                                                                          | GNUspe
                                                                          | MinGw
                                                                          >
                                                                        ) →
                                                                        "-${merge
                                                                              { GNU =
                                                                                  "gnu"
                                                                              , GNUabi64 =
                                                                                  "gnuabi64"
                                                                              , GNUeabi =
                                                                                  "gnueabi"
                                                                              , GNUeabihf =
                                                                                  "gnueabihf"
                                                                              , GNUspe =
                                                                                  "gnuspe"
                                                                              , MinGw =
                                                                                  "mingw32"
                                                                              }
                                                                              abi}"
                                                                  }
                                                                  tgt.abi}-"
                              }
                              cfg.targetTriple}ar'
                    strip = '${merge
                                 { None = ""
                                 , Some =
                                     λ ( tgt
                                       : { abi :
                                             Optional
                                               < GNU
                                               | GNUabi64
                                               | GNUeabi
                                               | GNUeabihf
                                               | GNUspe
                                               | MinGw
                                               >
                                         , arch :
                                             < AArch
                                             | Alpha
                                             | Arm
                                             | HPPA
                                             | HPPA64
                                             | M68k
                                             | Mips
                                             | Mips64
                                             | Mips64El
                                             | MipsEl
                                             | MipsIsa32r6
                                             | MipsIsa32r6El
                                             | MipsIsa64r6
                                             | MipsIsa64r6El
                                             | PowerPC
                                             | PowerPC64
                                             | PowerPC64le
                                             | RISCV64
                                             | S390x
                                             | SH4
                                             | Sparc64
                                             | X64
                                             | X86
                                             >
                                         , manufacturer :
                                             Optional
                                               < Apple | IBM | PC | Unknown >
                                         , os :
                                             < AIX
                                             | Android
                                             | Darwin
                                             | Dragonfly
                                             | FreeBSD
                                             | Haiku
                                             | Hurd
                                             | IOS
                                             | Linux
                                             | NetBSD
                                             | NoOs
                                             | OpenBSD
                                             | Redox
                                             | Solaris
                                             | Windows
                                             >
                                         }
                                       ) →
                                       "${merge
                                            { AArch = "aarch64"
                                            , Alpha = "alpha"
                                            , Arm = "arm"
                                            , HPPA = "hppa"
                                            , HPPA64 = "hppa64"
                                            , M68k = "m68k"
                                            , Mips = "mips"
                                            , Mips64 = "mips64"
                                            , Mips64El = "mips64el"
                                            , MipsEl = "mipsel"
                                            , MipsIsa32r6 = "mipsisa32r6"
                                            , MipsIsa32r6El = "mipsisa32r6el"
                                            , MipsIsa64r6 = "mipsisa64r6"
                                            , MipsIsa64r6El = "mipsisa64r6el"
                                            , PowerPC = "powerpc"
                                            , PowerPC64 = "powerpc64"
                                            , PowerPC64le = "powerpc64le"
                                            , RISCV64 = "riscv64"
                                            , S390x = "s390x"
                                            , SH4 = "sh4"
                                            , Sparc64 = "sparc64"
                                            , X64 = "x86_64"
                                            , X86 = "i686"
                                            }
                                            tgt.arch}-${merge
                                                          { AIX = "aix"
                                                          , Android = "android"
                                                          , Darwin = "darwin"
                                                          , Dragonfly =
                                                              "dragonfly"
                                                          , FreeBSD = "freebsd"
                                                          , Haiku = "haiku"
                                                          , Hurd = "hurd"
                                                          , IOS = "darwin"
                                                          , Linux = "linux"
                                                          , NetBSD = "netbsd"
                                                          , NoOs = "none"
                                                          , OpenBSD = "openbsd"
                                                          , Redox = "redox"
                                                          , Solaris = "solaris"
                                                          , Windows = "w64"
                                                          }
                                                          tgt.os}${merge
                                                                     { None = ""
                                                                     , Some =
                                                                         λ ( abi
                                                                           : < GNU
                                                                             | GNUabi64
                                                                             | GNUeabi
                                                                             | GNUeabihf
                                                                             | GNUspe
                                                                             | MinGw
                                                                             >
                                                                           ) →
                                                                           "-${merge
                                                                                 { GNU =
                                                                                     "gnu"
                                                                                 , GNUabi64 =
                                                                                     "gnuabi64"
                                                                                 , GNUeabi =
                                                                                     "gnueabi"
                                                                                 , GNUeabihf =
                                                                                     "gnueabihf"
                                                                                 , GNUspe =
                                                                                     "gnuspe"
                                                                                 , MinGw =
                                                                                     "mingw32"
                                                                                 }
                                                                                 abi}"
                                                                     }
                                                                     tgt.abi}-"
                                 }
                                 cfg.targetTriple}strip'
                    pkgconfig = 'pkg-config'
                    [host_machine]
                    system = '${merge
                                  { AIX = "aix"
                                  , Android = "android"
                                  , Darwin = "darwin"
                                  , Dragonfly = "dragonfly"
                                  , FreeBSD = "freebsd"
                                  , Haiku = "haiku"
                                  , Hurd = "hurd"
                                  , IOS = "darwin"
                                  , Linux = "linux"
                                  , NetBSD = "netbsd"
                                  , NoOs = "none"
                                  , OpenBSD = "openbsd"
                                  , Redox = "redox"
                                  , Solaris = "solaris"
                                  , Windows = "w64"
                                  }
                                  ( merge
                                      { None = cfg.buildOS
                                      , Some =
                                          λ ( tgt
                                            : { abi :
                                                  Optional
                                                    < GNU
                                                    | GNUabi64
                                                    | GNUeabi
                                                    | GNUeabihf
                                                    | GNUspe
                                                    | MinGw
                                                    >
                                              , arch :
                                                  < AArch
                                                  | Alpha
                                                  | Arm
                                                  | HPPA
                                                  | HPPA64
                                                  | M68k
                                                  | Mips
                                                  | Mips64
                                                  | Mips64El
                                                  | MipsEl
                                                  | MipsIsa32r6
                                                  | MipsIsa32r6El
                                                  | MipsIsa64r6
                                                  | MipsIsa64r6El
                                                  | PowerPC
                                                  | PowerPC64
                                                  | PowerPC64le
                                                  | RISCV64
                                                  | S390x
                                                  | SH4
                                                  | Sparc64
                                                  | X64
                                                  | X86
                                                  >
                                              , manufacturer :
                                                  Optional
                                                    < Apple
                                                    | IBM
                                                    | PC
                                                    | Unknown
                                                    >
                                              , os :
                                                  < AIX
                                                  | Android
                                                  | Darwin
                                                  | Dragonfly
                                                  | FreeBSD
                                                  | Haiku
                                                  | Hurd
                                                  | IOS
                                                  | Linux
                                                  | NetBSD
                                                  | NoOs
                                                  | OpenBSD
                                                  | Redox
                                                  | Solaris
                                                  | Windows
                                                  >
                                              }
                                            ) →
                                            tgt.os
                                      }
                                      cfg.targetTriple
                                  )}'
                    cpu_family = '${merge
                                      { AArch = "aarch64"
                                      , Alpha = "alpha"
                                      , Arm = "arm"
                                      , HPPA = "hppa"
                                      , HPPA64 = "hppa64"
                                      , M68k = "m68k"
                                      , Mips = "mips"
                                      , Mips64 = "mips64"
                                      , Mips64El = "mips64el"
                                      , MipsEl = "mipsel"
                                      , MipsIsa32r6 = "mipsisa32r6"
                                      , MipsIsa32r6El = "mipsisa32r6el"
                                      , MipsIsa64r6 = "mipsisa64r6"
                                      , MipsIsa64r6El = "mipsisa64r6el"
                                      , PowerPC = "powerpc"
                                      , PowerPC64 = "powerpc64"
                                      , PowerPC64le = "powerpc64le"
                                      , RISCV64 = "riscv64"
                                      , S390x = "s390x"
                                      , SH4 = "sh4"
                                      , Sparc64 = "sparc64"
                                      , X64 = "x86_64"
                                      , X86 = "i686"
                                      }
                                      ( merge
                                          { None = cfg.buildArch
                                          , Some =
                                              λ ( tgt
                                                : { abi :
                                                      Optional
                                                        < GNU
                                                        | GNUabi64
                                                        | GNUeabi
                                                        | GNUeabihf
                                                        | GNUspe
                                                        | MinGw
                                                        >
                                                  , arch :
                                                      < AArch
                                                      | Alpha
                                                      | Arm
                                                      | HPPA
                                                      | HPPA64
                                                      | M68k
                                                      | Mips
                                                      | Mips64
                                                      | Mips64El
                                                      | MipsEl
                                                      | MipsIsa32r6
                                                      | MipsIsa32r6El
                                                      | MipsIsa64r6
                                                      | MipsIsa64r6El
                                                      | PowerPC
                                                      | PowerPC64
                                                      | PowerPC64le
                                                      | RISCV64
                                                      | S390x
                                                      | SH4
                                                      | Sparc64
                                                      | X64
                                                      | X86
                                                      >
                                                  , manufacturer :
                                                      Optional
                                                        < Apple
                                                        | IBM
                                                        | PC
                                                        | Unknown
                                                        >
                                                  , os :
                                                      < AIX
                                                      | Android
                                                      | Darwin
                                                      | Dragonfly
                                                      | FreeBSD
                                                      | Haiku
                                                      | Hurd
                                                      | IOS
                                                      | Linux
                                                      | NetBSD
                                                      | NoOs
                                                      | OpenBSD
                                                      | Redox
                                                      | Solaris
                                                      | Windows
                                                      >
                                                  }
                                                ) →
                                                tgt.arch
                                          }
                                          cfg.targetTriple
                                      )}'
                    cpu = '${merge
                               { AArch = "aarch64"
                               , Alpha = "alpha"
                               , Arm = "arm"
                               , HPPA = "hppa"
                               , HPPA64 = "hppa64"
                               , M68k = "m68k"
                               , Mips = "mips"
                               , Mips64 = "mips64"
                               , Mips64El = "mips64el"
                               , MipsEl = "mipsel"
                               , MipsIsa32r6 = "mipsisa32r6"
                               , MipsIsa32r6El = "mipsisa32r6el"
                               , MipsIsa64r6 = "mipsisa64r6"
                               , MipsIsa64r6El = "mipsisa64r6el"
                               , PowerPC = "powerpc"
                               , PowerPC64 = "powerpc64"
                               , PowerPC64le = "powerpc64le"
                               , RISCV64 = "riscv64"
                               , S390x = "s390x"
                               , SH4 = "sh4"
                               , Sparc64 = "sparc64"
                               , X64 = "x86_64"
                               , X86 = "i686"
                               }
                               ( merge
                                   { None = cfg.buildArch
                                   , Some =
                                       λ ( tgt
                                         : { abi :
                                               Optional
                                                 < GNU
                                                 | GNUabi64
                                                 | GNUeabi
                                                 | GNUeabihf
                                                 | GNUspe
                                                 | MinGw
                                                 >
                                           , arch :
                                               < AArch
                                               | Alpha
                                               | Arm
                                               | HPPA
                                               | HPPA64
                                               | M68k
                                               | Mips
                                               | Mips64
                                               | Mips64El
                                               | MipsEl
                                               | MipsIsa32r6
                                               | MipsIsa32r6El
                                               | MipsIsa64r6
                                               | MipsIsa64r6El
                                               | PowerPC
                                               | PowerPC64
                                               | PowerPC64le
                                               | RISCV64
                                               | S390x
                                               | SH4
                                               | Sparc64
                                               | X64
                                               | X86
                                               >
                                           , manufacturer :
                                               Optional
                                                 < Apple | IBM | PC | Unknown >
                                           , os :
                                               < AIX
                                               | Android
                                               | Darwin
                                               | Dragonfly
                                               | FreeBSD
                                               | Haiku
                                               | Hurd
                                               | IOS
                                               | Linux
                                               | NetBSD
                                               | NoOs
                                               | OpenBSD
                                               | Redox
                                               | Solaris
                                               | Windows
                                               >
                                           }
                                         ) →
                                         tgt.arch
                                   }
                                   cfg.targetTriple
                               )}'
                    endian = 'little${"'"}''
                , file = "build/cross.txt"
                }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                      [ "--prefix=${cfg.installDir}", ".." ]
                    # ( if    cfg.isCross
                        then  [ "--cross-file", "cross.txt" ]
                        else  [] : List Text
                      )
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.linkDirs # cfg.shareDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/python3.8/site-packages"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/python3.8/site-packages:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PYTHONPATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_RUN_PATH"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.preloadLibs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2} ${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_PRELOAD"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = Some "build"
                , program = "meson"
                }
            ]
      , mesonConfigureGeneral =
          λ ( envs
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              } →
                Optional (List { value : Text, var : Text })
            ) →
          λ(flags : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "build" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Write
                { contents =
                    ''
                    [binaries]
                    c = '${merge
                             { None = ""
                             , Some =
                                 λ ( tgt
                                   : { abi :
                                         Optional
                                           < GNU
                                           | GNUabi64
                                           | GNUeabi
                                           | GNUeabihf
                                           | GNUspe
                                           | MinGw
                                           >
                                     , arch :
                                         < AArch
                                         | Alpha
                                         | Arm
                                         | HPPA
                                         | HPPA64
                                         | M68k
                                         | Mips
                                         | Mips64
                                         | Mips64El
                                         | MipsEl
                                         | MipsIsa32r6
                                         | MipsIsa32r6El
                                         | MipsIsa64r6
                                         | MipsIsa64r6El
                                         | PowerPC
                                         | PowerPC64
                                         | PowerPC64le
                                         | RISCV64
                                         | S390x
                                         | SH4
                                         | Sparc64
                                         | X64
                                         | X86
                                         >
                                     , manufacturer :
                                         Optional < Apple | IBM | PC | Unknown >
                                     , os :
                                         < AIX
                                         | Android
                                         | Darwin
                                         | Dragonfly
                                         | FreeBSD
                                         | Haiku
                                         | Hurd
                                         | IOS
                                         | Linux
                                         | NetBSD
                                         | NoOs
                                         | OpenBSD
                                         | Redox
                                         | Solaris
                                         | Windows
                                         >
                                     }
                                   ) →
                                   "${merge
                                        { AArch = "aarch64"
                                        , Alpha = "alpha"
                                        , Arm = "arm"
                                        , HPPA = "hppa"
                                        , HPPA64 = "hppa64"
                                        , M68k = "m68k"
                                        , Mips = "mips"
                                        , Mips64 = "mips64"
                                        , Mips64El = "mips64el"
                                        , MipsEl = "mipsel"
                                        , MipsIsa32r6 = "mipsisa32r6"
                                        , MipsIsa32r6El = "mipsisa32r6el"
                                        , MipsIsa64r6 = "mipsisa64r6"
                                        , MipsIsa64r6El = "mipsisa64r6el"
                                        , PowerPC = "powerpc"
                                        , PowerPC64 = "powerpc64"
                                        , PowerPC64le = "powerpc64le"
                                        , RISCV64 = "riscv64"
                                        , S390x = "s390x"
                                        , SH4 = "sh4"
                                        , Sparc64 = "sparc64"
                                        , X64 = "x86_64"
                                        , X86 = "i686"
                                        }
                                        tgt.arch}-${merge
                                                      { AIX = "aix"
                                                      , Android = "android"
                                                      , Darwin = "darwin"
                                                      , Dragonfly = "dragonfly"
                                                      , FreeBSD = "freebsd"
                                                      , Haiku = "haiku"
                                                      , Hurd = "hurd"
                                                      , IOS = "darwin"
                                                      , Linux = "linux"
                                                      , NetBSD = "netbsd"
                                                      , NoOs = "none"
                                                      , OpenBSD = "openbsd"
                                                      , Redox = "redox"
                                                      , Solaris = "solaris"
                                                      , Windows = "w64"
                                                      }
                                                      tgt.os}${merge
                                                                 { None = ""
                                                                 , Some =
                                                                     λ ( abi
                                                                       : < GNU
                                                                         | GNUabi64
                                                                         | GNUeabi
                                                                         | GNUeabihf
                                                                         | GNUspe
                                                                         | MinGw
                                                                         >
                                                                       ) →
                                                                       "-${merge
                                                                             { GNU =
                                                                                 "gnu"
                                                                             , GNUabi64 =
                                                                                 "gnuabi64"
                                                                             , GNUeabi =
                                                                                 "gnueabi"
                                                                             , GNUeabihf =
                                                                                 "gnueabihf"
                                                                             , GNUspe =
                                                                                 "gnuspe"
                                                                             , MinGw =
                                                                                 "mingw32"
                                                                             }
                                                                             abi}"
                                                                 }
                                                                 tgt.abi}-"
                             }
                             cfg.targetTriple}gcc'
                    cpp = '${merge
                               { None = ""
                               , Some =
                                   λ ( tgt
                                     : { abi :
                                           Optional
                                             < GNU
                                             | GNUabi64
                                             | GNUeabi
                                             | GNUeabihf
                                             | GNUspe
                                             | MinGw
                                             >
                                       , arch :
                                           < AArch
                                           | Alpha
                                           | Arm
                                           | HPPA
                                           | HPPA64
                                           | M68k
                                           | Mips
                                           | Mips64
                                           | Mips64El
                                           | MipsEl
                                           | MipsIsa32r6
                                           | MipsIsa32r6El
                                           | MipsIsa64r6
                                           | MipsIsa64r6El
                                           | PowerPC
                                           | PowerPC64
                                           | PowerPC64le
                                           | RISCV64
                                           | S390x
                                           | SH4
                                           | Sparc64
                                           | X64
                                           | X86
                                           >
                                       , manufacturer :
                                           Optional
                                             < Apple | IBM | PC | Unknown >
                                       , os :
                                           < AIX
                                           | Android
                                           | Darwin
                                           | Dragonfly
                                           | FreeBSD
                                           | Haiku
                                           | Hurd
                                           | IOS
                                           | Linux
                                           | NetBSD
                                           | NoOs
                                           | OpenBSD
                                           | Redox
                                           | Solaris
                                           | Windows
                                           >
                                       }
                                     ) →
                                     "${merge
                                          { AArch = "aarch64"
                                          , Alpha = "alpha"
                                          , Arm = "arm"
                                          , HPPA = "hppa"
                                          , HPPA64 = "hppa64"
                                          , M68k = "m68k"
                                          , Mips = "mips"
                                          , Mips64 = "mips64"
                                          , Mips64El = "mips64el"
                                          , MipsEl = "mipsel"
                                          , MipsIsa32r6 = "mipsisa32r6"
                                          , MipsIsa32r6El = "mipsisa32r6el"
                                          , MipsIsa64r6 = "mipsisa64r6"
                                          , MipsIsa64r6El = "mipsisa64r6el"
                                          , PowerPC = "powerpc"
                                          , PowerPC64 = "powerpc64"
                                          , PowerPC64le = "powerpc64le"
                                          , RISCV64 = "riscv64"
                                          , S390x = "s390x"
                                          , SH4 = "sh4"
                                          , Sparc64 = "sparc64"
                                          , X64 = "x86_64"
                                          , X86 = "i686"
                                          }
                                          tgt.arch}-${merge
                                                        { AIX = "aix"
                                                        , Android = "android"
                                                        , Darwin = "darwin"
                                                        , Dragonfly =
                                                            "dragonfly"
                                                        , FreeBSD = "freebsd"
                                                        , Haiku = "haiku"
                                                        , Hurd = "hurd"
                                                        , IOS = "darwin"
                                                        , Linux = "linux"
                                                        , NetBSD = "netbsd"
                                                        , NoOs = "none"
                                                        , OpenBSD = "openbsd"
                                                        , Redox = "redox"
                                                        , Solaris = "solaris"
                                                        , Windows = "w64"
                                                        }
                                                        tgt.os}${merge
                                                                   { None = ""
                                                                   , Some =
                                                                       λ ( abi
                                                                         : < GNU
                                                                           | GNUabi64
                                                                           | GNUeabi
                                                                           | GNUeabihf
                                                                           | GNUspe
                                                                           | MinGw
                                                                           >
                                                                         ) →
                                                                         "-${merge
                                                                               { GNU =
                                                                                   "gnu"
                                                                               , GNUabi64 =
                                                                                   "gnuabi64"
                                                                               , GNUeabi =
                                                                                   "gnueabi"
                                                                               , GNUeabihf =
                                                                                   "gnueabihf"
                                                                               , GNUspe =
                                                                                   "gnuspe"
                                                                               , MinGw =
                                                                                   "mingw32"
                                                                               }
                                                                               abi}"
                                                                   }
                                                                   tgt.abi}-"
                               }
                               cfg.targetTriple}g++'
                    ar = '${merge
                              { None = ""
                              , Some =
                                  λ ( tgt
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    "${merge
                                         { AArch = "aarch64"
                                         , Alpha = "alpha"
                                         , Arm = "arm"
                                         , HPPA = "hppa"
                                         , HPPA64 = "hppa64"
                                         , M68k = "m68k"
                                         , Mips = "mips"
                                         , Mips64 = "mips64"
                                         , Mips64El = "mips64el"
                                         , MipsEl = "mipsel"
                                         , MipsIsa32r6 = "mipsisa32r6"
                                         , MipsIsa32r6El = "mipsisa32r6el"
                                         , MipsIsa64r6 = "mipsisa64r6"
                                         , MipsIsa64r6El = "mipsisa64r6el"
                                         , PowerPC = "powerpc"
                                         , PowerPC64 = "powerpc64"
                                         , PowerPC64le = "powerpc64le"
                                         , RISCV64 = "riscv64"
                                         , S390x = "s390x"
                                         , SH4 = "sh4"
                                         , Sparc64 = "sparc64"
                                         , X64 = "x86_64"
                                         , X86 = "i686"
                                         }
                                         tgt.arch}-${merge
                                                       { AIX = "aix"
                                                       , Android = "android"
                                                       , Darwin = "darwin"
                                                       , Dragonfly = "dragonfly"
                                                       , FreeBSD = "freebsd"
                                                       , Haiku = "haiku"
                                                       , Hurd = "hurd"
                                                       , IOS = "darwin"
                                                       , Linux = "linux"
                                                       , NetBSD = "netbsd"
                                                       , NoOs = "none"
                                                       , OpenBSD = "openbsd"
                                                       , Redox = "redox"
                                                       , Solaris = "solaris"
                                                       , Windows = "w64"
                                                       }
                                                       tgt.os}${merge
                                                                  { None = ""
                                                                  , Some =
                                                                      λ ( abi
                                                                        : < GNU
                                                                          | GNUabi64
                                                                          | GNUeabi
                                                                          | GNUeabihf
                                                                          | GNUspe
                                                                          | MinGw
                                                                          >
                                                                        ) →
                                                                        "-${merge
                                                                              { GNU =
                                                                                  "gnu"
                                                                              , GNUabi64 =
                                                                                  "gnuabi64"
                                                                              , GNUeabi =
                                                                                  "gnueabi"
                                                                              , GNUeabihf =
                                                                                  "gnueabihf"
                                                                              , GNUspe =
                                                                                  "gnuspe"
                                                                              , MinGw =
                                                                                  "mingw32"
                                                                              }
                                                                              abi}"
                                                                  }
                                                                  tgt.abi}-"
                              }
                              cfg.targetTriple}ar'
                    strip = '${merge
                                 { None = ""
                                 , Some =
                                     λ ( tgt
                                       : { abi :
                                             Optional
                                               < GNU
                                               | GNUabi64
                                               | GNUeabi
                                               | GNUeabihf
                                               | GNUspe
                                               | MinGw
                                               >
                                         , arch :
                                             < AArch
                                             | Alpha
                                             | Arm
                                             | HPPA
                                             | HPPA64
                                             | M68k
                                             | Mips
                                             | Mips64
                                             | Mips64El
                                             | MipsEl
                                             | MipsIsa32r6
                                             | MipsIsa32r6El
                                             | MipsIsa64r6
                                             | MipsIsa64r6El
                                             | PowerPC
                                             | PowerPC64
                                             | PowerPC64le
                                             | RISCV64
                                             | S390x
                                             | SH4
                                             | Sparc64
                                             | X64
                                             | X86
                                             >
                                         , manufacturer :
                                             Optional
                                               < Apple | IBM | PC | Unknown >
                                         , os :
                                             < AIX
                                             | Android
                                             | Darwin
                                             | Dragonfly
                                             | FreeBSD
                                             | Haiku
                                             | Hurd
                                             | IOS
                                             | Linux
                                             | NetBSD
                                             | NoOs
                                             | OpenBSD
                                             | Redox
                                             | Solaris
                                             | Windows
                                             >
                                         }
                                       ) →
                                       "${merge
                                            { AArch = "aarch64"
                                            , Alpha = "alpha"
                                            , Arm = "arm"
                                            , HPPA = "hppa"
                                            , HPPA64 = "hppa64"
                                            , M68k = "m68k"
                                            , Mips = "mips"
                                            , Mips64 = "mips64"
                                            , Mips64El = "mips64el"
                                            , MipsEl = "mipsel"
                                            , MipsIsa32r6 = "mipsisa32r6"
                                            , MipsIsa32r6El = "mipsisa32r6el"
                                            , MipsIsa64r6 = "mipsisa64r6"
                                            , MipsIsa64r6El = "mipsisa64r6el"
                                            , PowerPC = "powerpc"
                                            , PowerPC64 = "powerpc64"
                                            , PowerPC64le = "powerpc64le"
                                            , RISCV64 = "riscv64"
                                            , S390x = "s390x"
                                            , SH4 = "sh4"
                                            , Sparc64 = "sparc64"
                                            , X64 = "x86_64"
                                            , X86 = "i686"
                                            }
                                            tgt.arch}-${merge
                                                          { AIX = "aix"
                                                          , Android = "android"
                                                          , Darwin = "darwin"
                                                          , Dragonfly =
                                                              "dragonfly"
                                                          , FreeBSD = "freebsd"
                                                          , Haiku = "haiku"
                                                          , Hurd = "hurd"
                                                          , IOS = "darwin"
                                                          , Linux = "linux"
                                                          , NetBSD = "netbsd"
                                                          , NoOs = "none"
                                                          , OpenBSD = "openbsd"
                                                          , Redox = "redox"
                                                          , Solaris = "solaris"
                                                          , Windows = "w64"
                                                          }
                                                          tgt.os}${merge
                                                                     { None = ""
                                                                     , Some =
                                                                         λ ( abi
                                                                           : < GNU
                                                                             | GNUabi64
                                                                             | GNUeabi
                                                                             | GNUeabihf
                                                                             | GNUspe
                                                                             | MinGw
                                                                             >
                                                                           ) →
                                                                           "-${merge
                                                                                 { GNU =
                                                                                     "gnu"
                                                                                 , GNUabi64 =
                                                                                     "gnuabi64"
                                                                                 , GNUeabi =
                                                                                     "gnueabi"
                                                                                 , GNUeabihf =
                                                                                     "gnueabihf"
                                                                                 , GNUspe =
                                                                                     "gnuspe"
                                                                                 , MinGw =
                                                                                     "mingw32"
                                                                                 }
                                                                                 abi}"
                                                                     }
                                                                     tgt.abi}-"
                                 }
                                 cfg.targetTriple}strip'
                    pkgconfig = 'pkg-config'
                    [host_machine]
                    system = '${merge
                                  { AIX = "aix"
                                  , Android = "android"
                                  , Darwin = "darwin"
                                  , Dragonfly = "dragonfly"
                                  , FreeBSD = "freebsd"
                                  , Haiku = "haiku"
                                  , Hurd = "hurd"
                                  , IOS = "darwin"
                                  , Linux = "linux"
                                  , NetBSD = "netbsd"
                                  , NoOs = "none"
                                  , OpenBSD = "openbsd"
                                  , Redox = "redox"
                                  , Solaris = "solaris"
                                  , Windows = "w64"
                                  }
                                  ( merge
                                      { None = cfg.buildOS
                                      , Some =
                                          λ ( tgt
                                            : { abi :
                                                  Optional
                                                    < GNU
                                                    | GNUabi64
                                                    | GNUeabi
                                                    | GNUeabihf
                                                    | GNUspe
                                                    | MinGw
                                                    >
                                              , arch :
                                                  < AArch
                                                  | Alpha
                                                  | Arm
                                                  | HPPA
                                                  | HPPA64
                                                  | M68k
                                                  | Mips
                                                  | Mips64
                                                  | Mips64El
                                                  | MipsEl
                                                  | MipsIsa32r6
                                                  | MipsIsa32r6El
                                                  | MipsIsa64r6
                                                  | MipsIsa64r6El
                                                  | PowerPC
                                                  | PowerPC64
                                                  | PowerPC64le
                                                  | RISCV64
                                                  | S390x
                                                  | SH4
                                                  | Sparc64
                                                  | X64
                                                  | X86
                                                  >
                                              , manufacturer :
                                                  Optional
                                                    < Apple
                                                    | IBM
                                                    | PC
                                                    | Unknown
                                                    >
                                              , os :
                                                  < AIX
                                                  | Android
                                                  | Darwin
                                                  | Dragonfly
                                                  | FreeBSD
                                                  | Haiku
                                                  | Hurd
                                                  | IOS
                                                  | Linux
                                                  | NetBSD
                                                  | NoOs
                                                  | OpenBSD
                                                  | Redox
                                                  | Solaris
                                                  | Windows
                                                  >
                                              }
                                            ) →
                                            tgt.os
                                      }
                                      cfg.targetTriple
                                  )}'
                    cpu_family = '${merge
                                      { AArch = "aarch64"
                                      , Alpha = "alpha"
                                      , Arm = "arm"
                                      , HPPA = "hppa"
                                      , HPPA64 = "hppa64"
                                      , M68k = "m68k"
                                      , Mips = "mips"
                                      , Mips64 = "mips64"
                                      , Mips64El = "mips64el"
                                      , MipsEl = "mipsel"
                                      , MipsIsa32r6 = "mipsisa32r6"
                                      , MipsIsa32r6El = "mipsisa32r6el"
                                      , MipsIsa64r6 = "mipsisa64r6"
                                      , MipsIsa64r6El = "mipsisa64r6el"
                                      , PowerPC = "powerpc"
                                      , PowerPC64 = "powerpc64"
                                      , PowerPC64le = "powerpc64le"
                                      , RISCV64 = "riscv64"
                                      , S390x = "s390x"
                                      , SH4 = "sh4"
                                      , Sparc64 = "sparc64"
                                      , X64 = "x86_64"
                                      , X86 = "i686"
                                      }
                                      ( merge
                                          { None = cfg.buildArch
                                          , Some =
                                              λ ( tgt
                                                : { abi :
                                                      Optional
                                                        < GNU
                                                        | GNUabi64
                                                        | GNUeabi
                                                        | GNUeabihf
                                                        | GNUspe
                                                        | MinGw
                                                        >
                                                  , arch :
                                                      < AArch
                                                      | Alpha
                                                      | Arm
                                                      | HPPA
                                                      | HPPA64
                                                      | M68k
                                                      | Mips
                                                      | Mips64
                                                      | Mips64El
                                                      | MipsEl
                                                      | MipsIsa32r6
                                                      | MipsIsa32r6El
                                                      | MipsIsa64r6
                                                      | MipsIsa64r6El
                                                      | PowerPC
                                                      | PowerPC64
                                                      | PowerPC64le
                                                      | RISCV64
                                                      | S390x
                                                      | SH4
                                                      | Sparc64
                                                      | X64
                                                      | X86
                                                      >
                                                  , manufacturer :
                                                      Optional
                                                        < Apple
                                                        | IBM
                                                        | PC
                                                        | Unknown
                                                        >
                                                  , os :
                                                      < AIX
                                                      | Android
                                                      | Darwin
                                                      | Dragonfly
                                                      | FreeBSD
                                                      | Haiku
                                                      | Hurd
                                                      | IOS
                                                      | Linux
                                                      | NetBSD
                                                      | NoOs
                                                      | OpenBSD
                                                      | Redox
                                                      | Solaris
                                                      | Windows
                                                      >
                                                  }
                                                ) →
                                                tgt.arch
                                          }
                                          cfg.targetTriple
                                      )}'
                    cpu = '${merge
                               { AArch = "aarch64"
                               , Alpha = "alpha"
                               , Arm = "arm"
                               , HPPA = "hppa"
                               , HPPA64 = "hppa64"
                               , M68k = "m68k"
                               , Mips = "mips"
                               , Mips64 = "mips64"
                               , Mips64El = "mips64el"
                               , MipsEl = "mipsel"
                               , MipsIsa32r6 = "mipsisa32r6"
                               , MipsIsa32r6El = "mipsisa32r6el"
                               , MipsIsa64r6 = "mipsisa64r6"
                               , MipsIsa64r6El = "mipsisa64r6el"
                               , PowerPC = "powerpc"
                               , PowerPC64 = "powerpc64"
                               , PowerPC64le = "powerpc64le"
                               , RISCV64 = "riscv64"
                               , S390x = "s390x"
                               , SH4 = "sh4"
                               , Sparc64 = "sparc64"
                               , X64 = "x86_64"
                               , X86 = "i686"
                               }
                               ( merge
                                   { None = cfg.buildArch
                                   , Some =
                                       λ ( tgt
                                         : { abi :
                                               Optional
                                                 < GNU
                                                 | GNUabi64
                                                 | GNUeabi
                                                 | GNUeabihf
                                                 | GNUspe
                                                 | MinGw
                                                 >
                                           , arch :
                                               < AArch
                                               | Alpha
                                               | Arm
                                               | HPPA
                                               | HPPA64
                                               | M68k
                                               | Mips
                                               | Mips64
                                               | Mips64El
                                               | MipsEl
                                               | MipsIsa32r6
                                               | MipsIsa32r6El
                                               | MipsIsa64r6
                                               | MipsIsa64r6El
                                               | PowerPC
                                               | PowerPC64
                                               | PowerPC64le
                                               | RISCV64
                                               | S390x
                                               | SH4
                                               | Sparc64
                                               | X64
                                               | X86
                                               >
                                           , manufacturer :
                                               Optional
                                                 < Apple | IBM | PC | Unknown >
                                           , os :
                                               < AIX
                                               | Android
                                               | Darwin
                                               | Dragonfly
                                               | FreeBSD
                                               | Haiku
                                               | Hurd
                                               | IOS
                                               | Linux
                                               | NetBSD
                                               | NoOs
                                               | OpenBSD
                                               | Redox
                                               | Solaris
                                               | Windows
                                               >
                                           }
                                         ) →
                                         tgt.arch
                                   }
                                   cfg.targetTriple
                               )}'
                    endian = 'little${"'"}''
                , file = "build/cross.txt"
                }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                      [ "--prefix=${cfg.installDir}", ".." ]
                    # ( if    cfg.isCross
                        then  [ "--cross-file", "cross.txt" ]
                        else  [] : List Text
                      )
                    # flags
                , environment = envs cfg
                , procDir = Some "build"
                , program = "meson"
                }
            ]
      , mesonConfigureWithFlags =
          λ(flags : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "build" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Write
                { contents =
                    ''
                    [binaries]
                    c = '${merge
                             { None = ""
                             , Some =
                                 λ ( tgt
                                   : { abi :
                                         Optional
                                           < GNU
                                           | GNUabi64
                                           | GNUeabi
                                           | GNUeabihf
                                           | GNUspe
                                           | MinGw
                                           >
                                     , arch :
                                         < AArch
                                         | Alpha
                                         | Arm
                                         | HPPA
                                         | HPPA64
                                         | M68k
                                         | Mips
                                         | Mips64
                                         | Mips64El
                                         | MipsEl
                                         | MipsIsa32r6
                                         | MipsIsa32r6El
                                         | MipsIsa64r6
                                         | MipsIsa64r6El
                                         | PowerPC
                                         | PowerPC64
                                         | PowerPC64le
                                         | RISCV64
                                         | S390x
                                         | SH4
                                         | Sparc64
                                         | X64
                                         | X86
                                         >
                                     , manufacturer :
                                         Optional < Apple | IBM | PC | Unknown >
                                     , os :
                                         < AIX
                                         | Android
                                         | Darwin
                                         | Dragonfly
                                         | FreeBSD
                                         | Haiku
                                         | Hurd
                                         | IOS
                                         | Linux
                                         | NetBSD
                                         | NoOs
                                         | OpenBSD
                                         | Redox
                                         | Solaris
                                         | Windows
                                         >
                                     }
                                   ) →
                                   "${merge
                                        { AArch = "aarch64"
                                        , Alpha = "alpha"
                                        , Arm = "arm"
                                        , HPPA = "hppa"
                                        , HPPA64 = "hppa64"
                                        , M68k = "m68k"
                                        , Mips = "mips"
                                        , Mips64 = "mips64"
                                        , Mips64El = "mips64el"
                                        , MipsEl = "mipsel"
                                        , MipsIsa32r6 = "mipsisa32r6"
                                        , MipsIsa32r6El = "mipsisa32r6el"
                                        , MipsIsa64r6 = "mipsisa64r6"
                                        , MipsIsa64r6El = "mipsisa64r6el"
                                        , PowerPC = "powerpc"
                                        , PowerPC64 = "powerpc64"
                                        , PowerPC64le = "powerpc64le"
                                        , RISCV64 = "riscv64"
                                        , S390x = "s390x"
                                        , SH4 = "sh4"
                                        , Sparc64 = "sparc64"
                                        , X64 = "x86_64"
                                        , X86 = "i686"
                                        }
                                        tgt.arch}-${merge
                                                      { AIX = "aix"
                                                      , Android = "android"
                                                      , Darwin = "darwin"
                                                      , Dragonfly = "dragonfly"
                                                      , FreeBSD = "freebsd"
                                                      , Haiku = "haiku"
                                                      , Hurd = "hurd"
                                                      , IOS = "darwin"
                                                      , Linux = "linux"
                                                      , NetBSD = "netbsd"
                                                      , NoOs = "none"
                                                      , OpenBSD = "openbsd"
                                                      , Redox = "redox"
                                                      , Solaris = "solaris"
                                                      , Windows = "w64"
                                                      }
                                                      tgt.os}${merge
                                                                 { None = ""
                                                                 , Some =
                                                                     λ ( abi
                                                                       : < GNU
                                                                         | GNUabi64
                                                                         | GNUeabi
                                                                         | GNUeabihf
                                                                         | GNUspe
                                                                         | MinGw
                                                                         >
                                                                       ) →
                                                                       "-${merge
                                                                             { GNU =
                                                                                 "gnu"
                                                                             , GNUabi64 =
                                                                                 "gnuabi64"
                                                                             , GNUeabi =
                                                                                 "gnueabi"
                                                                             , GNUeabihf =
                                                                                 "gnueabihf"
                                                                             , GNUspe =
                                                                                 "gnuspe"
                                                                             , MinGw =
                                                                                 "mingw32"
                                                                             }
                                                                             abi}"
                                                                 }
                                                                 tgt.abi}-"
                             }
                             cfg.targetTriple}gcc'
                    cpp = '${merge
                               { None = ""
                               , Some =
                                   λ ( tgt
                                     : { abi :
                                           Optional
                                             < GNU
                                             | GNUabi64
                                             | GNUeabi
                                             | GNUeabihf
                                             | GNUspe
                                             | MinGw
                                             >
                                       , arch :
                                           < AArch
                                           | Alpha
                                           | Arm
                                           | HPPA
                                           | HPPA64
                                           | M68k
                                           | Mips
                                           | Mips64
                                           | Mips64El
                                           | MipsEl
                                           | MipsIsa32r6
                                           | MipsIsa32r6El
                                           | MipsIsa64r6
                                           | MipsIsa64r6El
                                           | PowerPC
                                           | PowerPC64
                                           | PowerPC64le
                                           | RISCV64
                                           | S390x
                                           | SH4
                                           | Sparc64
                                           | X64
                                           | X86
                                           >
                                       , manufacturer :
                                           Optional
                                             < Apple | IBM | PC | Unknown >
                                       , os :
                                           < AIX
                                           | Android
                                           | Darwin
                                           | Dragonfly
                                           | FreeBSD
                                           | Haiku
                                           | Hurd
                                           | IOS
                                           | Linux
                                           | NetBSD
                                           | NoOs
                                           | OpenBSD
                                           | Redox
                                           | Solaris
                                           | Windows
                                           >
                                       }
                                     ) →
                                     "${merge
                                          { AArch = "aarch64"
                                          , Alpha = "alpha"
                                          , Arm = "arm"
                                          , HPPA = "hppa"
                                          , HPPA64 = "hppa64"
                                          , M68k = "m68k"
                                          , Mips = "mips"
                                          , Mips64 = "mips64"
                                          , Mips64El = "mips64el"
                                          , MipsEl = "mipsel"
                                          , MipsIsa32r6 = "mipsisa32r6"
                                          , MipsIsa32r6El = "mipsisa32r6el"
                                          , MipsIsa64r6 = "mipsisa64r6"
                                          , MipsIsa64r6El = "mipsisa64r6el"
                                          , PowerPC = "powerpc"
                                          , PowerPC64 = "powerpc64"
                                          , PowerPC64le = "powerpc64le"
                                          , RISCV64 = "riscv64"
                                          , S390x = "s390x"
                                          , SH4 = "sh4"
                                          , Sparc64 = "sparc64"
                                          , X64 = "x86_64"
                                          , X86 = "i686"
                                          }
                                          tgt.arch}-${merge
                                                        { AIX = "aix"
                                                        , Android = "android"
                                                        , Darwin = "darwin"
                                                        , Dragonfly =
                                                            "dragonfly"
                                                        , FreeBSD = "freebsd"
                                                        , Haiku = "haiku"
                                                        , Hurd = "hurd"
                                                        , IOS = "darwin"
                                                        , Linux = "linux"
                                                        , NetBSD = "netbsd"
                                                        , NoOs = "none"
                                                        , OpenBSD = "openbsd"
                                                        , Redox = "redox"
                                                        , Solaris = "solaris"
                                                        , Windows = "w64"
                                                        }
                                                        tgt.os}${merge
                                                                   { None = ""
                                                                   , Some =
                                                                       λ ( abi
                                                                         : < GNU
                                                                           | GNUabi64
                                                                           | GNUeabi
                                                                           | GNUeabihf
                                                                           | GNUspe
                                                                           | MinGw
                                                                           >
                                                                         ) →
                                                                         "-${merge
                                                                               { GNU =
                                                                                   "gnu"
                                                                               , GNUabi64 =
                                                                                   "gnuabi64"
                                                                               , GNUeabi =
                                                                                   "gnueabi"
                                                                               , GNUeabihf =
                                                                                   "gnueabihf"
                                                                               , GNUspe =
                                                                                   "gnuspe"
                                                                               , MinGw =
                                                                                   "mingw32"
                                                                               }
                                                                               abi}"
                                                                   }
                                                                   tgt.abi}-"
                               }
                               cfg.targetTriple}g++'
                    ar = '${merge
                              { None = ""
                              , Some =
                                  λ ( tgt
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    "${merge
                                         { AArch = "aarch64"
                                         , Alpha = "alpha"
                                         , Arm = "arm"
                                         , HPPA = "hppa"
                                         , HPPA64 = "hppa64"
                                         , M68k = "m68k"
                                         , Mips = "mips"
                                         , Mips64 = "mips64"
                                         , Mips64El = "mips64el"
                                         , MipsEl = "mipsel"
                                         , MipsIsa32r6 = "mipsisa32r6"
                                         , MipsIsa32r6El = "mipsisa32r6el"
                                         , MipsIsa64r6 = "mipsisa64r6"
                                         , MipsIsa64r6El = "mipsisa64r6el"
                                         , PowerPC = "powerpc"
                                         , PowerPC64 = "powerpc64"
                                         , PowerPC64le = "powerpc64le"
                                         , RISCV64 = "riscv64"
                                         , S390x = "s390x"
                                         , SH4 = "sh4"
                                         , Sparc64 = "sparc64"
                                         , X64 = "x86_64"
                                         , X86 = "i686"
                                         }
                                         tgt.arch}-${merge
                                                       { AIX = "aix"
                                                       , Android = "android"
                                                       , Darwin = "darwin"
                                                       , Dragonfly = "dragonfly"
                                                       , FreeBSD = "freebsd"
                                                       , Haiku = "haiku"
                                                       , Hurd = "hurd"
                                                       , IOS = "darwin"
                                                       , Linux = "linux"
                                                       , NetBSD = "netbsd"
                                                       , NoOs = "none"
                                                       , OpenBSD = "openbsd"
                                                       , Redox = "redox"
                                                       , Solaris = "solaris"
                                                       , Windows = "w64"
                                                       }
                                                       tgt.os}${merge
                                                                  { None = ""
                                                                  , Some =
                                                                      λ ( abi
                                                                        : < GNU
                                                                          | GNUabi64
                                                                          | GNUeabi
                                                                          | GNUeabihf
                                                                          | GNUspe
                                                                          | MinGw
                                                                          >
                                                                        ) →
                                                                        "-${merge
                                                                              { GNU =
                                                                                  "gnu"
                                                                              , GNUabi64 =
                                                                                  "gnuabi64"
                                                                              , GNUeabi =
                                                                                  "gnueabi"
                                                                              , GNUeabihf =
                                                                                  "gnueabihf"
                                                                              , GNUspe =
                                                                                  "gnuspe"
                                                                              , MinGw =
                                                                                  "mingw32"
                                                                              }
                                                                              abi}"
                                                                  }
                                                                  tgt.abi}-"
                              }
                              cfg.targetTriple}ar'
                    strip = '${merge
                                 { None = ""
                                 , Some =
                                     λ ( tgt
                                       : { abi :
                                             Optional
                                               < GNU
                                               | GNUabi64
                                               | GNUeabi
                                               | GNUeabihf
                                               | GNUspe
                                               | MinGw
                                               >
                                         , arch :
                                             < AArch
                                             | Alpha
                                             | Arm
                                             | HPPA
                                             | HPPA64
                                             | M68k
                                             | Mips
                                             | Mips64
                                             | Mips64El
                                             | MipsEl
                                             | MipsIsa32r6
                                             | MipsIsa32r6El
                                             | MipsIsa64r6
                                             | MipsIsa64r6El
                                             | PowerPC
                                             | PowerPC64
                                             | PowerPC64le
                                             | RISCV64
                                             | S390x
                                             | SH4
                                             | Sparc64
                                             | X64
                                             | X86
                                             >
                                         , manufacturer :
                                             Optional
                                               < Apple | IBM | PC | Unknown >
                                         , os :
                                             < AIX
                                             | Android
                                             | Darwin
                                             | Dragonfly
                                             | FreeBSD
                                             | Haiku
                                             | Hurd
                                             | IOS
                                             | Linux
                                             | NetBSD
                                             | NoOs
                                             | OpenBSD
                                             | Redox
                                             | Solaris
                                             | Windows
                                             >
                                         }
                                       ) →
                                       "${merge
                                            { AArch = "aarch64"
                                            , Alpha = "alpha"
                                            , Arm = "arm"
                                            , HPPA = "hppa"
                                            , HPPA64 = "hppa64"
                                            , M68k = "m68k"
                                            , Mips = "mips"
                                            , Mips64 = "mips64"
                                            , Mips64El = "mips64el"
                                            , MipsEl = "mipsel"
                                            , MipsIsa32r6 = "mipsisa32r6"
                                            , MipsIsa32r6El = "mipsisa32r6el"
                                            , MipsIsa64r6 = "mipsisa64r6"
                                            , MipsIsa64r6El = "mipsisa64r6el"
                                            , PowerPC = "powerpc"
                                            , PowerPC64 = "powerpc64"
                                            , PowerPC64le = "powerpc64le"
                                            , RISCV64 = "riscv64"
                                            , S390x = "s390x"
                                            , SH4 = "sh4"
                                            , Sparc64 = "sparc64"
                                            , X64 = "x86_64"
                                            , X86 = "i686"
                                            }
                                            tgt.arch}-${merge
                                                          { AIX = "aix"
                                                          , Android = "android"
                                                          , Darwin = "darwin"
                                                          , Dragonfly =
                                                              "dragonfly"
                                                          , FreeBSD = "freebsd"
                                                          , Haiku = "haiku"
                                                          , Hurd = "hurd"
                                                          , IOS = "darwin"
                                                          , Linux = "linux"
                                                          , NetBSD = "netbsd"
                                                          , NoOs = "none"
                                                          , OpenBSD = "openbsd"
                                                          , Redox = "redox"
                                                          , Solaris = "solaris"
                                                          , Windows = "w64"
                                                          }
                                                          tgt.os}${merge
                                                                     { None = ""
                                                                     , Some =
                                                                         λ ( abi
                                                                           : < GNU
                                                                             | GNUabi64
                                                                             | GNUeabi
                                                                             | GNUeabihf
                                                                             | GNUspe
                                                                             | MinGw
                                                                             >
                                                                           ) →
                                                                           "-${merge
                                                                                 { GNU =
                                                                                     "gnu"
                                                                                 , GNUabi64 =
                                                                                     "gnuabi64"
                                                                                 , GNUeabi =
                                                                                     "gnueabi"
                                                                                 , GNUeabihf =
                                                                                     "gnueabihf"
                                                                                 , GNUspe =
                                                                                     "gnuspe"
                                                                                 , MinGw =
                                                                                     "mingw32"
                                                                                 }
                                                                                 abi}"
                                                                     }
                                                                     tgt.abi}-"
                                 }
                                 cfg.targetTriple}strip'
                    pkgconfig = 'pkg-config'
                    [host_machine]
                    system = '${merge
                                  { AIX = "aix"
                                  , Android = "android"
                                  , Darwin = "darwin"
                                  , Dragonfly = "dragonfly"
                                  , FreeBSD = "freebsd"
                                  , Haiku = "haiku"
                                  , Hurd = "hurd"
                                  , IOS = "darwin"
                                  , Linux = "linux"
                                  , NetBSD = "netbsd"
                                  , NoOs = "none"
                                  , OpenBSD = "openbsd"
                                  , Redox = "redox"
                                  , Solaris = "solaris"
                                  , Windows = "w64"
                                  }
                                  ( merge
                                      { None = cfg.buildOS
                                      , Some =
                                          λ ( tgt
                                            : { abi :
                                                  Optional
                                                    < GNU
                                                    | GNUabi64
                                                    | GNUeabi
                                                    | GNUeabihf
                                                    | GNUspe
                                                    | MinGw
                                                    >
                                              , arch :
                                                  < AArch
                                                  | Alpha
                                                  | Arm
                                                  | HPPA
                                                  | HPPA64
                                                  | M68k
                                                  | Mips
                                                  | Mips64
                                                  | Mips64El
                                                  | MipsEl
                                                  | MipsIsa32r6
                                                  | MipsIsa32r6El
                                                  | MipsIsa64r6
                                                  | MipsIsa64r6El
                                                  | PowerPC
                                                  | PowerPC64
                                                  | PowerPC64le
                                                  | RISCV64
                                                  | S390x
                                                  | SH4
                                                  | Sparc64
                                                  | X64
                                                  | X86
                                                  >
                                              , manufacturer :
                                                  Optional
                                                    < Apple
                                                    | IBM
                                                    | PC
                                                    | Unknown
                                                    >
                                              , os :
                                                  < AIX
                                                  | Android
                                                  | Darwin
                                                  | Dragonfly
                                                  | FreeBSD
                                                  | Haiku
                                                  | Hurd
                                                  | IOS
                                                  | Linux
                                                  | NetBSD
                                                  | NoOs
                                                  | OpenBSD
                                                  | Redox
                                                  | Solaris
                                                  | Windows
                                                  >
                                              }
                                            ) →
                                            tgt.os
                                      }
                                      cfg.targetTriple
                                  )}'
                    cpu_family = '${merge
                                      { AArch = "aarch64"
                                      , Alpha = "alpha"
                                      , Arm = "arm"
                                      , HPPA = "hppa"
                                      , HPPA64 = "hppa64"
                                      , M68k = "m68k"
                                      , Mips = "mips"
                                      , Mips64 = "mips64"
                                      , Mips64El = "mips64el"
                                      , MipsEl = "mipsel"
                                      , MipsIsa32r6 = "mipsisa32r6"
                                      , MipsIsa32r6El = "mipsisa32r6el"
                                      , MipsIsa64r6 = "mipsisa64r6"
                                      , MipsIsa64r6El = "mipsisa64r6el"
                                      , PowerPC = "powerpc"
                                      , PowerPC64 = "powerpc64"
                                      , PowerPC64le = "powerpc64le"
                                      , RISCV64 = "riscv64"
                                      , S390x = "s390x"
                                      , SH4 = "sh4"
                                      , Sparc64 = "sparc64"
                                      , X64 = "x86_64"
                                      , X86 = "i686"
                                      }
                                      ( merge
                                          { None = cfg.buildArch
                                          , Some =
                                              λ ( tgt
                                                : { abi :
                                                      Optional
                                                        < GNU
                                                        | GNUabi64
                                                        | GNUeabi
                                                        | GNUeabihf
                                                        | GNUspe
                                                        | MinGw
                                                        >
                                                  , arch :
                                                      < AArch
                                                      | Alpha
                                                      | Arm
                                                      | HPPA
                                                      | HPPA64
                                                      | M68k
                                                      | Mips
                                                      | Mips64
                                                      | Mips64El
                                                      | MipsEl
                                                      | MipsIsa32r6
                                                      | MipsIsa32r6El
                                                      | MipsIsa64r6
                                                      | MipsIsa64r6El
                                                      | PowerPC
                                                      | PowerPC64
                                                      | PowerPC64le
                                                      | RISCV64
                                                      | S390x
                                                      | SH4
                                                      | Sparc64
                                                      | X64
                                                      | X86
                                                      >
                                                  , manufacturer :
                                                      Optional
                                                        < Apple
                                                        | IBM
                                                        | PC
                                                        | Unknown
                                                        >
                                                  , os :
                                                      < AIX
                                                      | Android
                                                      | Darwin
                                                      | Dragonfly
                                                      | FreeBSD
                                                      | Haiku
                                                      | Hurd
                                                      | IOS
                                                      | Linux
                                                      | NetBSD
                                                      | NoOs
                                                      | OpenBSD
                                                      | Redox
                                                      | Solaris
                                                      | Windows
                                                      >
                                                  }
                                                ) →
                                                tgt.arch
                                          }
                                          cfg.targetTriple
                                      )}'
                    cpu = '${merge
                               { AArch = "aarch64"
                               , Alpha = "alpha"
                               , Arm = "arm"
                               , HPPA = "hppa"
                               , HPPA64 = "hppa64"
                               , M68k = "m68k"
                               , Mips = "mips"
                               , Mips64 = "mips64"
                               , Mips64El = "mips64el"
                               , MipsEl = "mipsel"
                               , MipsIsa32r6 = "mipsisa32r6"
                               , MipsIsa32r6El = "mipsisa32r6el"
                               , MipsIsa64r6 = "mipsisa64r6"
                               , MipsIsa64r6El = "mipsisa64r6el"
                               , PowerPC = "powerpc"
                               , PowerPC64 = "powerpc64"
                               , PowerPC64le = "powerpc64le"
                               , RISCV64 = "riscv64"
                               , S390x = "s390x"
                               , SH4 = "sh4"
                               , Sparc64 = "sparc64"
                               , X64 = "x86_64"
                               , X86 = "i686"
                               }
                               ( merge
                                   { None = cfg.buildArch
                                   , Some =
                                       λ ( tgt
                                         : { abi :
                                               Optional
                                                 < GNU
                                                 | GNUabi64
                                                 | GNUeabi
                                                 | GNUeabihf
                                                 | GNUspe
                                                 | MinGw
                                                 >
                                           , arch :
                                               < AArch
                                               | Alpha
                                               | Arm
                                               | HPPA
                                               | HPPA64
                                               | M68k
                                               | Mips
                                               | Mips64
                                               | Mips64El
                                               | MipsEl
                                               | MipsIsa32r6
                                               | MipsIsa32r6El
                                               | MipsIsa64r6
                                               | MipsIsa64r6El
                                               | PowerPC
                                               | PowerPC64
                                               | PowerPC64le
                                               | RISCV64
                                               | S390x
                                               | SH4
                                               | Sparc64
                                               | X64
                                               | X86
                                               >
                                           , manufacturer :
                                               Optional
                                                 < Apple | IBM | PC | Unknown >
                                           , os :
                                               < AIX
                                               | Android
                                               | Darwin
                                               | Dragonfly
                                               | FreeBSD
                                               | Haiku
                                               | Hurd
                                               | IOS
                                               | Linux
                                               | NetBSD
                                               | NoOs
                                               | OpenBSD
                                               | Redox
                                               | Solaris
                                               | Windows
                                               >
                                           }
                                         ) →
                                         tgt.arch
                                   }
                                   cfg.targetTriple
                               )}'
                    endian = 'little${"'"}''
                , file = "build/cross.txt"
                }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                      [ "--prefix=${cfg.installDir}", ".." ]
                    # ( if    cfg.isCross
                        then  [ "--cross-file", "cross.txt" ]
                        else  [] : List Text
                      )
                    # flags
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    (cfg.linkDirs # cfg.shareDirs)
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/python3.8/site-packages"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/python3.8/site-packages:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PYTHONPATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_RUN_PATH"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.preloadLibs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2} ${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_PRELOAD"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = Some "build"
                , program = "meson"
                }
            ]
      , mesonEnv =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            Some
              (   [ { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              (cfg.linkDirs # cfg.shareDirs)
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty
                                          "${_@1}/pkgconfig"
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}/pkgconfig:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "PKG_CONFIG_PATH"
                    }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.linkDirs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty
                                          "${_@1}/python3.8/site-packages"
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}/python3.8/site-packages:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "PYTHONPATH"
                    }
                  , if    cfg.static
                    then  { value =
                              "${List/fold
                                   Text
                                   cfg.linkDirs
                                   Text
                                   (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                   ""}/usr/local/lib:/lib:/usr/lib"
                          , var = "LIBRARY_PATH"
                          }
                    else  { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_LIBRARY_PATH"
                          }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.linkDirs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty _@1
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "LD_RUN_PATH"
                    }
                  , { value =
                        "${merge
                             { Empty = "", NonEmpty = λ(_ : Text) → _ }
                             ( List/fold
                                 Text
                                 cfg.linkDirs
                                 < Empty | NonEmpty : Text >
                                 ( λ(_ : Text) →
                                   λ(_ : < Empty | NonEmpty : Text >) →
                                     merge
                                       { Empty =
                                           < Empty | NonEmpty : Text >.NonEmpty
                                             "-L${_@1}"
                                       , NonEmpty =
                                           λ(_ : Text) →
                                             < Empty
                                             | NonEmpty : Text
                                             >.NonEmpty
                                               "-L${_@2} ${_}"
                                       }
                                       _
                                 )
                                 < Empty | NonEmpty : Text >.Empty
                             )}${List/fold
                                   Text
                                   cfg.linkDirs
                                   Text
                                   ( λ(_ : Text) →
                                     λ(_ : Text) →
                                       "${if    merge
                                                  { AIX = False
                                                  , Android = False
                                                  , Darwin = True
                                                  , Dragonfly = False
                                                  , FreeBSD = False
                                                  , Haiku = False
                                                  , Hurd = False
                                                  , IOS = False
                                                  , Linux = False
                                                  , NetBSD = False
                                                  , NoOs = False
                                                  , OpenBSD = False
                                                  , Redox = False
                                                  , Solaris = False
                                                  , Windows = False
                                                  }
                                                  cfg.buildOS
                                          then  ""
                                          else  " -Wl,-rpath-link,${_@1}"}${_}"
                                   )
                                   ""}"
                    , var = "LDFLAGS"
                    }
                  , { value =
                        "${merge
                             { Empty = "", NonEmpty = λ(_ : Text) → _ }
                             ( List/fold
                                 Text
                                 cfg.includeDirs
                                 < Empty | NonEmpty : Text >
                                 ( λ(_ : Text) →
                                   λ(_ : < Empty | NonEmpty : Text >) →
                                     merge
                                       { Empty =
                                           < Empty | NonEmpty : Text >.NonEmpty
                                             "-I${_@1}"
                                       , NonEmpty =
                                           λ(_ : Text) →
                                             < Empty
                                             | NonEmpty : Text
                                             >.NonEmpty
                                               "-I${_@2} ${_}"
                                       }
                                       _
                                 )
                                 < Empty | NonEmpty : Text >.Empty
                             )}${if cfg.static then " -static" else ""}"
                    , var = "CPPFLAGS"
                    }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.preloadLibs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty _@1
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2} ${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "LD_PRELOAD"
                    }
                  ]
                # ( if    merge
                            { AIX = True
                            , Android = True
                            , Darwin = True
                            , Dragonfly = True
                            , FreeBSD = True
                            , Haiku = False
                            , Hurd = True
                            , IOS = True
                            , Linux = True
                            , NetBSD = True
                            , NoOs = False
                            , OpenBSD = True
                            , Redox = False
                            , Solaris = True
                            , Windows = False
                            }
                            cfg.buildOS
                    then  [ { value =
                                "${List/fold
                                     Text
                                     cfg.binDirs
                                     Text
                                     (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                     ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                            , var = "PATH"
                            }
                          ]
                    else  [] : List { value : Text, var : Text }
                  )
              )
      , mesonMoves =
          λ(_ : List Text) →
            List/fold
              Text
              _
              (List { dest : Text, src : Text })
              ( λ(_ : Text) →
                λ(_ : List { dest : Text, src : Text }) →
                    [ { dest = "lib/pkgconfig/${_@1}"
                      , src = "build/meson-private/${_@1}"
                      }
                    ]
                  # _
              )
              ([] : List { dest : Text, src : Text })
      , mkAclocalPath =
          λ(shareDirs : List Text) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      shareDirs
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty =
                                < Empty | NonEmpty : Text >.NonEmpty
                                  "${_@1}/aclocal:${_@1}/autoconf"
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2}/aclocal:${_@2}/autoconf:${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var = "ACLOCAL_PATH"
            }
      , mkCCArg =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            merge
              { None = [] : List Text
              , Some =
                  λ ( tgt
                    : { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                    ) →
                    [ "CC=${merge
                              { AArch = "aarch64"
                              , Alpha = "alpha"
                              , Arm = "arm"
                              , HPPA = "hppa"
                              , HPPA64 = "hppa64"
                              , M68k = "m68k"
                              , Mips = "mips"
                              , Mips64 = "mips64"
                              , Mips64El = "mips64el"
                              , MipsEl = "mipsel"
                              , MipsIsa32r6 = "mipsisa32r6"
                              , MipsIsa32r6El = "mipsisa32r6el"
                              , MipsIsa64r6 = "mipsisa64r6"
                              , MipsIsa64r6El = "mipsisa64r6el"
                              , PowerPC = "powerpc"
                              , PowerPC64 = "powerpc64"
                              , PowerPC64le = "powerpc64le"
                              , RISCV64 = "riscv64"
                              , S390x = "s390x"
                              , SH4 = "sh4"
                              , Sparc64 = "sparc64"
                              , X64 = "x86_64"
                              , X86 = "i686"
                              }
                              tgt.arch}-${merge
                                            { AIX = "aix"
                                            , Android = "android"
                                            , Darwin = "darwin"
                                            , Dragonfly = "dragonfly"
                                            , FreeBSD = "freebsd"
                                            , Haiku = "haiku"
                                            , Hurd = "hurd"
                                            , IOS = "darwin"
                                            , Linux = "linux"
                                            , NetBSD = "netbsd"
                                            , NoOs = "none"
                                            , OpenBSD = "openbsd"
                                            , Redox = "redox"
                                            , Solaris = "solaris"
                                            , Windows = "w64"
                                            }
                                            tgt.os}${merge
                                                       { None = ""
                                                       , Some =
                                                           λ ( abi
                                                             : < GNU
                                                               | GNUabi64
                                                               | GNUeabi
                                                               | GNUeabihf
                                                               | GNUspe
                                                               | MinGw
                                                               >
                                                             ) →
                                                             "-${merge
                                                                   { GNU = "gnu"
                                                                   , GNUabi64 =
                                                                       "gnuabi64"
                                                                   , GNUeabi =
                                                                       "gnueabi"
                                                                   , GNUeabihf =
                                                                       "gnueabihf"
                                                                   , GNUspe =
                                                                       "gnuspe"
                                                                   , MinGw =
                                                                       "mingw32"
                                                                   }
                                                                   abi}"
                                                       }
                                                       tgt.abi}-gcc"
                    ]
              }
              cfg.targetTriple
      , mkCCVar =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            merge
              { None = [] : List { value : Text, var : Text }
              , Some =
                  λ ( tgt
                    : { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                    ) →
                    [ { value =
                          "${merge
                               { AArch = "aarch64"
                               , Alpha = "alpha"
                               , Arm = "arm"
                               , HPPA = "hppa"
                               , HPPA64 = "hppa64"
                               , M68k = "m68k"
                               , Mips = "mips"
                               , Mips64 = "mips64"
                               , Mips64El = "mips64el"
                               , MipsEl = "mipsel"
                               , MipsIsa32r6 = "mipsisa32r6"
                               , MipsIsa32r6El = "mipsisa32r6el"
                               , MipsIsa64r6 = "mipsisa64r6"
                               , MipsIsa64r6El = "mipsisa64r6el"
                               , PowerPC = "powerpc"
                               , PowerPC64 = "powerpc64"
                               , PowerPC64le = "powerpc64le"
                               , RISCV64 = "riscv64"
                               , S390x = "s390x"
                               , SH4 = "sh4"
                               , Sparc64 = "sparc64"
                               , X64 = "x86_64"
                               , X86 = "i686"
                               }
                               tgt.arch}-${merge
                                             { AIX = "aix"
                                             , Android = "android"
                                             , Darwin = "darwin"
                                             , Dragonfly = "dragonfly"
                                             , FreeBSD = "freebsd"
                                             , Haiku = "haiku"
                                             , Hurd = "hurd"
                                             , IOS = "darwin"
                                             , Linux = "linux"
                                             , NetBSD = "netbsd"
                                             , NoOs = "none"
                                             , OpenBSD = "openbsd"
                                             , Redox = "redox"
                                             , Solaris = "solaris"
                                             , Windows = "w64"
                                             }
                                             tgt.os}${merge
                                                        { None = ""
                                                        , Some =
                                                            λ ( abi
                                                              : < GNU
                                                                | GNUabi64
                                                                | GNUeabi
                                                                | GNUeabihf
                                                                | GNUspe
                                                                | MinGw
                                                                >
                                                              ) →
                                                              "-${merge
                                                                    { GNU =
                                                                        "gnu"
                                                                    , GNUabi64 =
                                                                        "gnuabi64"
                                                                    , GNUeabi =
                                                                        "gnueabi"
                                                                    , GNUeabihf =
                                                                        "gnueabihf"
                                                                    , GNUspe =
                                                                        "gnuspe"
                                                                    , MinGw =
                                                                        "mingw32"
                                                                    }
                                                                    abi}"
                                                        }
                                                        tgt.abi}-gcc"
                      , var = "CC"
                      }
                    ]
              }
              cfg.targetTriple
      , mkCFlags =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            { value =
                "${merge
                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                     ( List/fold
                         Text
                         cfg.includeDirs
                         < Empty | NonEmpty : Text >
                         ( λ(_ : Text) →
                           λ(_ : < Empty | NonEmpty : Text >) →
                             merge
                               { Empty =
                                   < Empty | NonEmpty : Text >.NonEmpty
                                     "-I${_@1}"
                               , NonEmpty =
                                   λ(_ : Text) →
                                     < Empty | NonEmpty : Text >.NonEmpty
                                       "-I${_@2} ${_}"
                               }
                               _
                         )
                         < Empty | NonEmpty : Text >.Empty
                     )}${if cfg.static then " -static" else ""}"
            , var = "CPPFLAGS"
            }
      , mkExe =
          λ(x : Text) →
            < Call :
                { arguments : List Text
                , environment : Optional (List { value : Text, var : Text })
                , procDir : Optional Text
                , program : Text
                }
            | CopyFile : { dest : Text, src : Text }
            | CreateDirectory : { dir : Text }
            | MakeExecutable : { file : Text }
            | Patch : { patchContents : Text }
            | Symlink : { linkName : Text, tgt : Text }
            | SymlinkBinary : { file : Text }
            | SymlinkManpage : { file : Text, section : Natural }
            | Write : { contents : Text, file : Text }
            >.MakeExecutable
              { file = x }
      , mkExes =
          λ(_ : List Text) →
            List/fold
              Text
              _
              ( List
                  < Call :
                      { arguments : List Text
                      , environment :
                          Optional (List { value : Text, var : Text })
                      , procDir : Optional Text
                      , program : Text
                      }
                  | CopyFile : { dest : Text, src : Text }
                  | CreateDirectory : { dir : Text }
                  | MakeExecutable : { file : Text }
                  | Patch : { patchContents : Text }
                  | Symlink : { linkName : Text, tgt : Text }
                  | SymlinkBinary : { file : Text }
                  | SymlinkManpage : { file : Text, section : Natural }
                  | Write : { contents : Text, file : Text }
                  >
              )
              ( λ(_ : Text) →
                λ ( _
                  : List
                      < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >
                  ) →
                    [ < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.MakeExecutable
                        { file = _@1 }
                    ]
                  # _
              )
              ( [] : List
                       < Call :
                           { arguments : List Text
                           , environment :
                               Optional (List { value : Text, var : Text })
                           , procDir : Optional Text
                           , program : Text
                           }
                       | CopyFile : { dest : Text, src : Text }
                       | CreateDirectory : { dir : Text }
                       | MakeExecutable : { file : Text }
                       | Patch : { patchContents : Text }
                       | Symlink : { linkName : Text, tgt : Text }
                       | SymlinkBinary : { file : Text }
                       | SymlinkManpage : { file : Text, section : Natural }
                       | Write : { contents : Text, file : Text }
                       >
              )
      , mkFRCArg =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            merge
              { None = [] : List Text
              , Some =
                  λ ( tgt
                    : { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                    ) →
                    [ "CC=${merge
                              { AArch = "aarch64"
                              , Alpha = "alpha"
                              , Arm = "arm"
                              , HPPA = "hppa"
                              , HPPA64 = "hppa64"
                              , M68k = "m68k"
                              , Mips = "mips"
                              , Mips64 = "mips64"
                              , Mips64El = "mips64el"
                              , MipsEl = "mipsel"
                              , MipsIsa32r6 = "mipsisa32r6"
                              , MipsIsa32r6El = "mipsisa32r6el"
                              , MipsIsa64r6 = "mipsisa64r6"
                              , MipsIsa64r6El = "mipsisa64r6el"
                              , PowerPC = "powerpc"
                              , PowerPC64 = "powerpc64"
                              , PowerPC64le = "powerpc64le"
                              , RISCV64 = "riscv64"
                              , S390x = "s390x"
                              , SH4 = "sh4"
                              , Sparc64 = "sparc64"
                              , X64 = "x86_64"
                              , X86 = "i686"
                              }
                              tgt.arch}-${merge
                                            { AIX = "aix"
                                            , Android = "android"
                                            , Darwin = "darwin"
                                            , Dragonfly = "dragonfly"
                                            , FreeBSD = "freebsd"
                                            , Haiku = "haiku"
                                            , Hurd = "hurd"
                                            , IOS = "darwin"
                                            , Linux = "linux"
                                            , NetBSD = "netbsd"
                                            , NoOs = "none"
                                            , OpenBSD = "openbsd"
                                            , Redox = "redox"
                                            , Solaris = "solaris"
                                            , Windows = "w64"
                                            }
                                            tgt.os}${merge
                                                       { None = ""
                                                       , Some =
                                                           λ ( abi
                                                             : < GNU
                                                               | GNUabi64
                                                               | GNUeabi
                                                               | GNUeabihf
                                                               | GNUspe
                                                               | MinGw
                                                               >
                                                             ) →
                                                             "-${merge
                                                                   { GNU = "gnu"
                                                                   , GNUabi64 =
                                                                       "gnuabi64"
                                                                   , GNUeabi =
                                                                       "gnueabi"
                                                                   , GNUeabihf =
                                                                       "gnueabihf"
                                                                   , GNUspe =
                                                                       "gnuspe"
                                                                   , MinGw =
                                                                       "mingw32"
                                                                   }
                                                                   abi}"
                                                       }
                                                       tgt.abi}-gcc"
                    ]
              }
              cfg.targetTriple
      , mkHost =
          λ ( _
            : Optional
                { abi :
                    Optional
                      < GNU | GNUabi64 | GNUeabi | GNUeabihf | GNUspe | MinGw >
                , arch :
                    < AArch
                    | Alpha
                    | Arm
                    | HPPA
                    | HPPA64
                    | M68k
                    | Mips
                    | Mips64
                    | Mips64El
                    | MipsEl
                    | MipsIsa32r6
                    | MipsIsa32r6El
                    | MipsIsa64r6
                    | MipsIsa64r6El
                    | PowerPC
                    | PowerPC64
                    | PowerPC64le
                    | RISCV64
                    | S390x
                    | SH4
                    | Sparc64
                    | X64
                    | X86
                    >
                , manufacturer : Optional < Apple | IBM | PC | Unknown >
                , os :
                    < AIX
                    | Android
                    | Darwin
                    | Dragonfly
                    | FreeBSD
                    | Haiku
                    | Hurd
                    | IOS
                    | Linux
                    | NetBSD
                    | NoOs
                    | OpenBSD
                    | Redox
                    | Solaris
                    | Windows
                    >
                }
            ) →
            merge
              { None = None Text
              , Some =
                  λ ( _
                    : { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                    ) →
                    Some
                      "--host=${merge
                                  { AArch = "aarch64"
                                  , Alpha = "alpha"
                                  , Arm = "arm"
                                  , HPPA = "hppa"
                                  , HPPA64 = "hppa64"
                                  , M68k = "m68k"
                                  , Mips = "mips"
                                  , Mips64 = "mips64"
                                  , Mips64El = "mips64el"
                                  , MipsEl = "mipsel"
                                  , MipsIsa32r6 = "mipsisa32r6"
                                  , MipsIsa32r6El = "mipsisa32r6el"
                                  , MipsIsa64r6 = "mipsisa64r6"
                                  , MipsIsa64r6El = "mipsisa64r6el"
                                  , PowerPC = "powerpc"
                                  , PowerPC64 = "powerpc64"
                                  , PowerPC64le = "powerpc64le"
                                  , RISCV64 = "riscv64"
                                  , S390x = "s390x"
                                  , SH4 = "sh4"
                                  , Sparc64 = "sparc64"
                                  , X64 = "x86_64"
                                  , X86 = "i686"
                                  }
                                  _.arch}-${merge
                                              { AIX = "aix"
                                              , Android = "android"
                                              , Darwin = "darwin"
                                              , Dragonfly = "dragonfly"
                                              , FreeBSD = "freebsd"
                                              , Haiku = "haiku"
                                              , Hurd = "hurd"
                                              , IOS = "darwin"
                                              , Linux = "linux"
                                              , NetBSD = "netbsd"
                                              , NoOs = "none"
                                              , OpenBSD = "openbsd"
                                              , Redox = "redox"
                                              , Solaris = "solaris"
                                              , Windows = "w64"
                                              }
                                              _.os}${merge
                                                       { None = ""
                                                       , Some =
                                                           λ ( abi
                                                             : < GNU
                                                               | GNUabi64
                                                               | GNUeabi
                                                               | GNUeabihf
                                                               | GNUspe
                                                               | MinGw
                                                               >
                                                             ) →
                                                             "-${merge
                                                                   { GNU = "gnu"
                                                                   , GNUabi64 =
                                                                       "gnuabi64"
                                                                   , GNUeabi =
                                                                       "gnueabi"
                                                                   , GNUeabihf =
                                                                       "gnueabihf"
                                                                   , GNUspe =
                                                                       "gnuspe"
                                                                   , MinGw =
                                                                       "mingw32"
                                                                   }
                                                                   abi}"
                                                       }
                                                       _.abi}"
              }
              _
      , mkIncludePath =
          λ(incls : List Text) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      incls
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty = < Empty | NonEmpty : Text >.NonEmpty _@1
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2}:${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var = "C_INCLUDE_PATH"
            }
      , mkLDFlags =
          λ(libDirs : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            { value =
                "${merge
                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                     ( List/fold
                         Text
                         libDirs
                         < Empty | NonEmpty : Text >
                         ( λ(_ : Text) →
                           λ(_ : < Empty | NonEmpty : Text >) →
                             merge
                               { Empty =
                                   < Empty | NonEmpty : Text >.NonEmpty
                                     "-L${_@1}"
                               , NonEmpty =
                                   λ(_ : Text) →
                                     < Empty | NonEmpty : Text >.NonEmpty
                                       "-L${_@2} ${_}"
                               }
                               _
                         )
                         < Empty | NonEmpty : Text >.Empty
                     )}${List/fold
                           Text
                           libDirs
                           Text
                           ( λ(_ : Text) →
                             λ(_ : Text) →
                               "${if    merge
                                          { AIX = False
                                          , Android = False
                                          , Darwin = True
                                          , Dragonfly = False
                                          , FreeBSD = False
                                          , Haiku = False
                                          , Hurd = False
                                          , IOS = False
                                          , Linux = False
                                          , NetBSD = False
                                          , NoOs = False
                                          , OpenBSD = False
                                          , Redox = False
                                          , Solaris = False
                                          , Windows = False
                                          }
                                          cfg.buildOS
                                  then  ""
                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                           )
                           ""}"
            , var = "LDFLAGS"
            }
      , mkLDFlagsGeneral =
          λ(libDirs : List Text) →
          λ(linkLibs : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            { value =
                "${merge
                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                     ( List/fold
                         Text
                         libDirs
                         < Empty | NonEmpty : Text >
                         ( λ(_ : Text) →
                           λ(_ : < Empty | NonEmpty : Text >) →
                             merge
                               { Empty =
                                   < Empty | NonEmpty : Text >.NonEmpty
                                     "-L${_@1}"
                               , NonEmpty =
                                   λ(_ : Text) →
                                     < Empty | NonEmpty : Text >.NonEmpty
                                       "-L${_@2} ${_}"
                               }
                               _
                         )
                         < Empty | NonEmpty : Text >.Empty
                     )}${List/fold
                           Text
                           linkLibs
                           Text
                           (λ(_ : Text) → λ(_ : Text) → " -l${_@1}${_}")
                           ""}${List/fold
                                  Text
                                  libDirs
                                  Text
                                  ( λ(_ : Text) →
                                    λ(_ : Text) →
                                      "${if    merge
                                                 { AIX = False
                                                 , Android = False
                                                 , Darwin = True
                                                 , Dragonfly = False
                                                 , FreeBSD = False
                                                 , Haiku = False
                                                 , Hurd = False
                                                 , IOS = False
                                                 , Linux = False
                                                 , NetBSD = False
                                                 , NoOs = False
                                                 , OpenBSD = False
                                                 , Redox = False
                                                 , Solaris = False
                                                 , Windows = False
                                                 }
                                                 cfg.buildOS
                                         then  ""
                                         else  " -Wl,-rpath-link,${_@1}"}${_}"
                                  )
                                  ""}"
            , var = "LDFLAGS"
            }
      , mkLDPath =
          λ(libDirs : List Text) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      libDirs
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty = < Empty | NonEmpty : Text >.NonEmpty _@1
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2}:${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var = "LD_LIBRARY_PATH"
            }
      , mkLDPathWrapper =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
          λ(binName : Text) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "wrapper" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Write
                { contents =
                    "LD_LIBRARY_PATH=${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         _@1
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "${_@2}:${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}:${cfg.installDir}/lib LD_PRELOAD='${merge
                                                                                  { Empty =
                                                                                      ""
                                                                                  , NonEmpty =
                                                                                      λ ( _
                                                                                        : Text
                                                                                        ) →
                                                                                        _
                                                                                  }
                                                                                  ( List/fold
                                                                                      Text
                                                                                      cfg.preloadLibs
                                                                                      < Empty
                                                                                      | NonEmpty :
                                                                                          Text
                                                                                      >
                                                                                      ( λ ( _
                                                                                          : Text
                                                                                          ) →
                                                                                        λ ( _
                                                                                          : < Empty
                                                                                            | NonEmpty :
                                                                                                Text
                                                                                            >
                                                                                          ) →
                                                                                          merge
                                                                                            { Empty =
                                                                                                < Empty
                                                                                                | NonEmpty :
                                                                                                    Text
                                                                                                >.NonEmpty
                                                                                                  _@1
                                                                                            , NonEmpty =
                                                                                                λ ( _
                                                                                                  : Text
                                                                                                  ) →
                                                                                                  < Empty
                                                                                                  | NonEmpty :
                                                                                                      Text
                                                                                                  >.NonEmpty
                                                                                                    "${_@2} ${_}"
                                                                                            }
                                                                                            _
                                                                                      )
                                                                                      < Empty
                                                                                      | NonEmpty :
                                                                                          Text
                                                                                      >.Empty
                                                                                  )}' ${cfg.installDir}/bin/${binName} \$@"
                , file = "wrapper/${binName}"
                }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.MakeExecutable
                { file = "wrapper/${binName}" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CopyFile
                { dest = "wrapper/${binName}", src = "wrapper/${binName}" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.SymlinkBinary
                { file = "wrapper/${binName}" }
            ]
      , mkLDPathWrappers =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
          λ(bins : List Text) →
            List/fold
              Text
              bins
              ( List
                  < Call :
                      { arguments : List Text
                      , environment :
                          Optional (List { value : Text, var : Text })
                      , procDir : Optional Text
                      , program : Text
                      }
                  | CopyFile : { dest : Text, src : Text }
                  | CreateDirectory : { dir : Text }
                  | MakeExecutable : { file : Text }
                  | Patch : { patchContents : Text }
                  | Symlink : { linkName : Text, tgt : Text }
                  | SymlinkBinary : { file : Text }
                  | SymlinkManpage : { file : Text, section : Natural }
                  | Write : { contents : Text, file : Text }
                  >
              )
              ( λ(_ : Text) →
                  List/fold
                    < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >
                    [ < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.CreateDirectory
                        { dir = "wrapper" }
                    , < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.Write
                        { contents =
                            "LD_LIBRARY_PATH=${merge
                                                 { Empty = ""
                                                 , NonEmpty = λ(_ : Text) → _
                                                 }
                                                 ( List/fold
                                                     Text
                                                     cfg.linkDirs
                                                     < Empty | NonEmpty : Text >
                                                     ( λ(_ : Text) →
                                                       λ ( _
                                                         : < Empty
                                                           | NonEmpty : Text
                                                           >
                                                         ) →
                                                         merge
                                                           { Empty =
                                                               < Empty
                                                               | NonEmpty : Text
                                                               >.NonEmpty
                                                                 _@1
                                                           , NonEmpty =
                                                               λ(_ : Text) →
                                                                 < Empty
                                                                 | NonEmpty :
                                                                     Text
                                                                 >.NonEmpty
                                                                   "${_@2}:${_}"
                                                           }
                                                           _
                                                     )
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.Empty
                                                 )}:${cfg.installDir}/lib LD_PRELOAD='${merge
                                                                                          { Empty =
                                                                                              ""
                                                                                          , NonEmpty =
                                                                                              λ ( _
                                                                                                : Text
                                                                                                ) →
                                                                                                _
                                                                                          }
                                                                                          ( List/fold
                                                                                              Text
                                                                                              cfg.preloadLibs
                                                                                              < Empty
                                                                                              | NonEmpty :
                                                                                                  Text
                                                                                              >
                                                                                              ( λ ( _
                                                                                                  : Text
                                                                                                  ) →
                                                                                                λ ( _
                                                                                                  : < Empty
                                                                                                    | NonEmpty :
                                                                                                        Text
                                                                                                    >
                                                                                                  ) →
                                                                                                  merge
                                                                                                    { Empty =
                                                                                                        < Empty
                                                                                                        | NonEmpty :
                                                                                                            Text
                                                                                                        >.NonEmpty
                                                                                                          _@1
                                                                                                    , NonEmpty =
                                                                                                        λ ( _
                                                                                                          : Text
                                                                                                          ) →
                                                                                                          < Empty
                                                                                                          | NonEmpty :
                                                                                                              Text
                                                                                                          >.NonEmpty
                                                                                                            "${_@2} ${_}"
                                                                                                    }
                                                                                                    _
                                                                                              )
                                                                                              < Empty
                                                                                              | NonEmpty :
                                                                                                  Text
                                                                                              >.Empty
                                                                                          )}' ${cfg.installDir}/bin/${_} \$@"
                        , file = "wrapper/${_}"
                        }
                    , < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.MakeExecutable
                        { file = "wrapper/${_}" }
                    , < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.CopyFile
                        { dest = "wrapper/${_}", src = "wrapper/${_}" }
                    , < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.SymlinkBinary
                        { file = "wrapper/${_}" }
                    ]
                    ( List
                        < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >
                    )
                    ( λ ( _
                        : < Call :
                              { arguments : List Text
                              , environment :
                                  Optional (List { value : Text, var : Text })
                              , procDir : Optional Text
                              , program : Text
                              }
                          | CopyFile : { dest : Text, src : Text }
                          | CreateDirectory : { dir : Text }
                          | MakeExecutable : { file : Text }
                          | Patch : { patchContents : Text }
                          | Symlink : { linkName : Text, tgt : Text }
                          | SymlinkBinary : { file : Text }
                          | SymlinkManpage : { file : Text, section : Natural }
                          | Write : { contents : Text, file : Text }
                          >
                        ) →
                      λ ( _
                        : List
                            < Call :
                                { arguments : List Text
                                , environment :
                                    Optional (List { value : Text, var : Text })
                                , procDir : Optional Text
                                , program : Text
                                }
                            | CopyFile : { dest : Text, src : Text }
                            | CreateDirectory : { dir : Text }
                            | MakeExecutable : { file : Text }
                            | Patch : { patchContents : Text }
                            | Symlink : { linkName : Text, tgt : Text }
                            | SymlinkBinary : { file : Text }
                            | SymlinkManpage :
                                { file : Text, section : Natural }
                            | Write : { contents : Text, file : Text }
                            >
                        ) →
                        [ _@1 ] # _
                    )
              )
              ( [] : List
                       < Call :
                           { arguments : List Text
                           , environment :
                               Optional (List { value : Text, var : Text })
                           , procDir : Optional Text
                           , program : Text
                           }
                       | CopyFile : { dest : Text, src : Text }
                       | CreateDirectory : { dir : Text }
                       | MakeExecutable : { file : Text }
                       | Patch : { patchContents : Text }
                       | Symlink : { linkName : Text, tgt : Text }
                       | SymlinkBinary : { file : Text }
                       | SymlinkManpage : { file : Text, section : Natural }
                       | Write : { contents : Text, file : Text }
                       >
              )
      , mkLDPreload =
          λ(libs : List Text) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      libs
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty = < Empty | NonEmpty : Text >.NonEmpty _@1
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2} ${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var = "LD_PRELOAD"
            }
      , mkLDRunPath =
          λ(libDirs : List Text) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      libDirs
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty = < Empty | NonEmpty : Text >.NonEmpty _@1
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2}:${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var = "LD_RUN_PATH"
            }
      , mkPathVar =
          λ(binDirs : List Text) →
            List/fold
              Text
              binDirs
              Text
              (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
              ""
      , mkPerlLib =
          λ ( x
            : { cfg :
                  { binDirs : List Text
                  , buildArch :
                      < AArch
                      | Alpha
                      | Arm
                      | HPPA
                      | HPPA64
                      | M68k
                      | Mips
                      | Mips64
                      | Mips64El
                      | MipsEl
                      | MipsIsa32r6
                      | MipsIsa32r6El
                      | MipsIsa64r6
                      | MipsIsa64r6El
                      | PowerPC
                      | PowerPC64
                      | PowerPC64le
                      | RISCV64
                      | S390x
                      | SH4
                      | Sparc64
                      | X64
                      | X86
                      >
                  , buildOS :
                      < AIX
                      | Android
                      | Darwin
                      | Dragonfly
                      | FreeBSD
                      | Haiku
                      | Hurd
                      | IOS
                      | Linux
                      | NetBSD
                      | NoOs
                      | OpenBSD
                      | Redox
                      | Solaris
                      | Windows
                      >
                  , cpus : Natural
                  , currentDir : Text
                  , includeDirs : List Text
                  , installDir : Text
                  , isCross : Bool
                  , linkDirs : List Text
                  , preloadLibs : List Text
                  , shareDirs : List Text
                  , static : Bool
                  , targetTriple :
                      Optional
                        { abi :
                            Optional
                              < GNU
                              | GNUabi64
                              | GNUeabi
                              | GNUeabihf
                              | GNUspe
                              | MinGw
                              >
                        , arch :
                            < AArch
                            | Alpha
                            | Arm
                            | HPPA
                            | HPPA64
                            | M68k
                            | Mips
                            | Mips64
                            | Mips64El
                            | MipsEl
                            | MipsIsa32r6
                            | MipsIsa32r6El
                            | MipsIsa64r6
                            | MipsIsa64r6El
                            | PowerPC
                            | PowerPC64
                            | PowerPC64le
                            | RISCV64
                            | S390x
                            | SH4
                            | Sparc64
                            | X64
                            | X86
                            >
                        , manufacturer : Optional < Apple | IBM | PC | Unknown >
                        , os :
                            < AIX
                            | Android
                            | Darwin
                            | Dragonfly
                            | FreeBSD
                            | Haiku
                            | Hurd
                            | IOS
                            | Linux
                            | NetBSD
                            | NoOs
                            | OpenBSD
                            | Redox
                            | Solaris
                            | Windows
                            >
                        }
                  }
              , libDirs : List Text
              , perlVersion : List Natural
              }
            ) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      x.libDirs
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty =
                                < Empty | NonEmpty : Text >.NonEmpty
                                  "${_@1}/site_perl/${merge
                                                        { Empty = ""
                                                        , NonEmpty =
                                                            λ(_ : Text) → _
                                                        }
                                                        ( List/fold
                                                            Natural
                                                            x.perlVersion
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >
                                                            ( λ(_ : Natural) →
                                                              λ ( _
                                                                : < Empty
                                                                  | NonEmpty :
                                                                      Text
                                                                  >
                                                                ) →
                                                                merge
                                                                  { Empty =
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >.NonEmpty
                                                                        ( Natural/show
                                                                            _@1
                                                                        )
                                                                  , NonEmpty =
                                                                      λ ( _
                                                                        : Text
                                                                        ) →
                                                                        < Empty
                                                                        | NonEmpty :
                                                                            Text
                                                                        >.NonEmpty
                                                                          "${Natural/show
                                                                               _@2}.${_}"
                                                                  }
                                                                  _
                                                            )
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.Empty
                                                        )}/${merge
                                                               { AArch =
                                                                   "aarch64"
                                                               , Alpha = "alpha"
                                                               , Arm = "arm"
                                                               , HPPA = "hppa"
                                                               , HPPA64 =
                                                                   "hppa64"
                                                               , M68k = "m68k"
                                                               , Mips = "mips"
                                                               , Mips64 =
                                                                   "mips64"
                                                               , Mips64El =
                                                                   "mips64el"
                                                               , MipsEl =
                                                                   "mipsel"
                                                               , MipsIsa32r6 =
                                                                   "mipsisa32r6"
                                                               , MipsIsa32r6El =
                                                                   "mipsisa32r6el"
                                                               , MipsIsa64r6 =
                                                                   "mipsisa64r6"
                                                               , MipsIsa64r6El =
                                                                   "mipsisa64r6el"
                                                               , PowerPC =
                                                                   "powerpc"
                                                               , PowerPC64 =
                                                                   "powerpc64"
                                                               , PowerPC64le =
                                                                   "powerpc64le"
                                                               , RISCV64 =
                                                                   "riscv64"
                                                               , S390x = "s390x"
                                                               , SH4 = "sh4"
                                                               , Sparc64 =
                                                                   "sparc64"
                                                               , X64 = "x86_64"
                                                               , X86 = "i686"
                                                               }
                                                               x.cfg.buildArch}-${merge
                                                                                    { AIX =
                                                                                        "aix"
                                                                                    , Android =
                                                                                        "android"
                                                                                    , Darwin =
                                                                                        "darwin"
                                                                                    , Dragonfly =
                                                                                        "dragonfly"
                                                                                    , FreeBSD =
                                                                                        "freebsd"
                                                                                    , Haiku =
                                                                                        "haiku"
                                                                                    , Hurd =
                                                                                        "hurd"
                                                                                    , IOS =
                                                                                        "darwin"
                                                                                    , Linux =
                                                                                        "linux"
                                                                                    , NetBSD =
                                                                                        "netbsd"
                                                                                    , NoOs =
                                                                                        "none"
                                                                                    , OpenBSD =
                                                                                        "openbsd"
                                                                                    , Redox =
                                                                                        "redox"
                                                                                    , Solaris =
                                                                                        "solaris"
                                                                                    , Windows =
                                                                                        "w64"
                                                                                    }
                                                                                    x.cfg.buildOS}/"
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2}/site_perl/${merge
                                                          { Empty = ""
                                                          , NonEmpty =
                                                              λ(_ : Text) → _
                                                          }
                                                          ( List/fold
                                                              Natural
                                                              x.perlVersion
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >
                                                              ( λ(_ : Natural) →
                                                                λ ( _
                                                                  : < Empty
                                                                    | NonEmpty :
                                                                        Text
                                                                    >
                                                                  ) →
                                                                  merge
                                                                    { Empty =
                                                                        < Empty
                                                                        | NonEmpty :
                                                                            Text
                                                                        >.NonEmpty
                                                                          ( Natural/show
                                                                              _@1
                                                                          )
                                                                    , NonEmpty =
                                                                        λ ( _
                                                                          : Text
                                                                          ) →
                                                                          < Empty
                                                                          | NonEmpty :
                                                                              Text
                                                                          >.NonEmpty
                                                                            "${Natural/show
                                                                                 _@2}.${_}"
                                                                    }
                                                                    _
                                                              )
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >.Empty
                                                          )}/${merge
                                                                 { AArch =
                                                                     "aarch64"
                                                                 , Alpha =
                                                                     "alpha"
                                                                 , Arm = "arm"
                                                                 , HPPA = "hppa"
                                                                 , HPPA64 =
                                                                     "hppa64"
                                                                 , M68k = "m68k"
                                                                 , Mips = "mips"
                                                                 , Mips64 =
                                                                     "mips64"
                                                                 , Mips64El =
                                                                     "mips64el"
                                                                 , MipsEl =
                                                                     "mipsel"
                                                                 , MipsIsa32r6 =
                                                                     "mipsisa32r6"
                                                                 , MipsIsa32r6El =
                                                                     "mipsisa32r6el"
                                                                 , MipsIsa64r6 =
                                                                     "mipsisa64r6"
                                                                 , MipsIsa64r6El =
                                                                     "mipsisa64r6el"
                                                                 , PowerPC =
                                                                     "powerpc"
                                                                 , PowerPC64 =
                                                                     "powerpc64"
                                                                 , PowerPC64le =
                                                                     "powerpc64le"
                                                                 , RISCV64 =
                                                                     "riscv64"
                                                                 , S390x =
                                                                     "s390x"
                                                                 , SH4 = "sh4"
                                                                 , Sparc64 =
                                                                     "sparc64"
                                                                 , X64 =
                                                                     "x86_64"
                                                                 , X86 = "i686"
                                                                 }
                                                                 x.cfg.buildArch}-${merge
                                                                                      { AIX =
                                                                                          "aix"
                                                                                      , Android =
                                                                                          "android"
                                                                                      , Darwin =
                                                                                          "darwin"
                                                                                      , Dragonfly =
                                                                                          "dragonfly"
                                                                                      , FreeBSD =
                                                                                          "freebsd"
                                                                                      , Haiku =
                                                                                          "haiku"
                                                                                      , Hurd =
                                                                                          "hurd"
                                                                                      , IOS =
                                                                                          "darwin"
                                                                                      , Linux =
                                                                                          "linux"
                                                                                      , NetBSD =
                                                                                          "netbsd"
                                                                                      , NoOs =
                                                                                          "none"
                                                                                      , OpenBSD =
                                                                                          "openbsd"
                                                                                      , Redox =
                                                                                          "redox"
                                                                                      , Solaris =
                                                                                          "solaris"
                                                                                      , Windows =
                                                                                          "w64"
                                                                                      }
                                                                                      x.cfg.buildOS}/:${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var =
                "PERL${merge
                         { None = "", Some = Natural/show }
                         (List/head Natural x.perlVersion)}LIB"
            }
      , mkPkgConfigVar =
          λ(libDirs : List Text) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      libDirs
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty =
                                < Empty | NonEmpty : Text >.NonEmpty
                                  "${_@1}/pkgconfig"
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2}/pkgconfig:${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var = "PKG_CONFIG_PATH"
            }
      , mkPy2Wrapper =
          λ(binName : Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "wrapper" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Write
                { contents =
                    "${( if    cfg.static
                         then  { value =
                                   "${List/fold
                                        Text
                                        cfg.linkDirs
                                        Text
                                        ( λ(_ : Text) →
                                          λ(_ : Text) →
                                            "${_@1}:${_}"
                                        )
                                        ""}/usr/local/lib:/lib:/usr/lib"
                               , var = "LIBRARY_PATH"
                               }
                         else  { value =
                                   merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     _@1
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "${_@2}:${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )
                               , var = "LD_LIBRARY_PATH"
                               }
                       ).var}=${( if    cfg.static
                                  then  { value =
                                            "${List/fold
                                                 Text
                                                 cfg.linkDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/lib:/lib:/usr/lib"
                                        , var = "LIBRARY_PATH"
                                        }
                                  else  { value =
                                            merge
                                              { Empty = ""
                                              , NonEmpty = λ(_ : Text) → _
                                              }
                                              ( List/fold
                                                  Text
                                                  cfg.linkDirs
                                                  < Empty | NonEmpty : Text >
                                                  ( λ(_ : Text) →
                                                    λ ( _
                                                      : < Empty
                                                        | NonEmpty : Text
                                                        >
                                                      ) →
                                                      merge
                                                        { Empty =
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              _@1
                                                        , NonEmpty =
                                                            λ(_ : Text) →
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >.NonEmpty
                                                                "${_@2}:${_}"
                                                        }
                                                        _
                                                  )
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.Empty
                                              )
                                        , var = "LD_LIBRARY_PATH"
                                        }
                                ).value} PYTHONPATH=${merge
                                                        { Empty = ""
                                                        , NonEmpty =
                                                            λ(_ : Text) → _
                                                        }
                                                        ( List/fold
                                                            Text
                                                            cfg.linkDirs
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >
                                                            ( λ(_ : Text) →
                                                              λ ( _
                                                                : < Empty
                                                                  | NonEmpty :
                                                                      Text
                                                                  >
                                                                ) →
                                                                merge
                                                                  { Empty =
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >.NonEmpty
                                                                        "${_@1}/python2.7/site-packages"
                                                                  , NonEmpty =
                                                                      λ ( _
                                                                        : Text
                                                                        ) →
                                                                        < Empty
                                                                        | NonEmpty :
                                                                            Text
                                                                        >.NonEmpty
                                                                          "${_@2}/python2.7/site-packages:${_}"
                                                                  }
                                                                  _
                                                            )
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.Empty
                                                        )}:${cfg.installDir}/lib/python2.7/site-packages ${cfg.installDir}/bin/${binName} \$@"
                , file = "wrapper/${binName}"
                }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.MakeExecutable
                { file = "wrapper/${binName}" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CopyFile
                { dest = "wrapper/${binName}", src = "wrapper/${binName}" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.SymlinkBinary
                { file = "wrapper/${binName}" }
            ]
      , mkPy3Path =
          λ(libDirs : List Text) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      libDirs
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty =
                                < Empty | NonEmpty : Text >.NonEmpty
                                  "${_@1}/python3.8/site-packages"
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2}/python3.8/site-packages:${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var = "PYTHONPATH"
            }
      , mkPy3Wrapper =
          λ(binName : Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "wrapper" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Write
                { contents =
                    "${( if    cfg.static
                         then  { value =
                                   "${List/fold
                                        Text
                                        cfg.linkDirs
                                        Text
                                        ( λ(_ : Text) →
                                          λ(_ : Text) →
                                            "${_@1}:${_}"
                                        )
                                        ""}/usr/local/lib:/lib:/usr/lib"
                               , var = "LIBRARY_PATH"
                               }
                         else  { value =
                                   merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     _@1
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "${_@2}:${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )
                               , var = "LD_LIBRARY_PATH"
                               }
                       ).var}=${( if    cfg.static
                                  then  { value =
                                            "${List/fold
                                                 Text
                                                 cfg.linkDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/lib:/lib:/usr/lib"
                                        , var = "LIBRARY_PATH"
                                        }
                                  else  { value =
                                            merge
                                              { Empty = ""
                                              , NonEmpty = λ(_ : Text) → _
                                              }
                                              ( List/fold
                                                  Text
                                                  cfg.linkDirs
                                                  < Empty | NonEmpty : Text >
                                                  ( λ(_ : Text) →
                                                    λ ( _
                                                      : < Empty
                                                        | NonEmpty : Text
                                                        >
                                                      ) →
                                                      merge
                                                        { Empty =
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              _@1
                                                        , NonEmpty =
                                                            λ(_ : Text) →
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >.NonEmpty
                                                                "${_@2}:${_}"
                                                        }
                                                        _
                                                  )
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.Empty
                                              )
                                        , var = "LD_LIBRARY_PATH"
                                        }
                                ).value} PYTHONPATH=${merge
                                                        { Empty = ""
                                                        , NonEmpty =
                                                            λ(_ : Text) → _
                                                        }
                                                        ( List/fold
                                                            Text
                                                            cfg.linkDirs
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >
                                                            ( λ(_ : Text) →
                                                              λ ( _
                                                                : < Empty
                                                                  | NonEmpty :
                                                                      Text
                                                                  >
                                                                ) →
                                                                merge
                                                                  { Empty =
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >.NonEmpty
                                                                        "${_@1}/python3.8/site-packages"
                                                                  , NonEmpty =
                                                                      λ ( _
                                                                        : Text
                                                                        ) →
                                                                        < Empty
                                                                        | NonEmpty :
                                                                            Text
                                                                        >.NonEmpty
                                                                          "${_@2}/python3.8/site-packages:${_}"
                                                                  }
                                                                  _
                                                            )
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.Empty
                                                        )}:${cfg.installDir}/lib/python3.8/site-packages ${cfg.installDir}/bin/${binName} \$@"
                , file = "wrapper/${binName}"
                }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.MakeExecutable
                { file = "wrapper/${binName}" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CopyFile
                { dest = "wrapper/${binName}", src = "wrapper/${binName}" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.SymlinkBinary
                { file = "wrapper/${binName}" }
            ]
      , mkPyPath =
          λ(version : List Natural) →
          λ(libDirs : List Text) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      libDirs
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty =
                                < Empty | NonEmpty : Text >.NonEmpty
                                  "${_@1}/python${merge
                                                    { Empty = ""
                                                    , NonEmpty = λ(_ : Text) → _
                                                    }
                                                    ( List/fold
                                                        Natural
                                                        version
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >
                                                        ( λ(_ : Natural) →
                                                          λ ( _
                                                            : < Empty
                                                              | NonEmpty : Text
                                                              >
                                                            ) →
                                                            merge
                                                              { Empty =
                                                                  < Empty
                                                                  | NonEmpty :
                                                                      Text
                                                                  >.NonEmpty
                                                                    ( Natural/show
                                                                        _@1
                                                                    )
                                                              , NonEmpty =
                                                                  λ(_ : Text) →
                                                                    < Empty
                                                                    | NonEmpty :
                                                                        Text
                                                                    >.NonEmpty
                                                                      "${Natural/show
                                                                           _@2}.${_}"
                                                              }
                                                              _
                                                        )
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.Empty
                                                    )}/site-packages"
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2}/python${merge
                                                      { Empty = ""
                                                      , NonEmpty =
                                                          λ(_ : Text) → _
                                                      }
                                                      ( List/fold
                                                          Natural
                                                          version
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >
                                                          ( λ(_ : Natural) →
                                                            λ ( _
                                                              : < Empty
                                                                | NonEmpty :
                                                                    Text
                                                                >
                                                              ) →
                                                              merge
                                                                { Empty =
                                                                    < Empty
                                                                    | NonEmpty :
                                                                        Text
                                                                    >.NonEmpty
                                                                      ( Natural/show
                                                                          _@1
                                                                      )
                                                                , NonEmpty =
                                                                    λ ( _
                                                                      : Text
                                                                      ) →
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >.NonEmpty
                                                                        "${Natural/show
                                                                             _@2}.${_}"
                                                                }
                                                                _
                                                          )
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.Empty
                                                      )}/site-packages:${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var = "PYTHONPATH"
            }
      , mkPyWrapper =
          λ(version : List Natural) →
          λ(binName : Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "wrapper" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Write
                { contents =
                    "${( if    cfg.static
                         then  { value =
                                   "${List/fold
                                        Text
                                        cfg.linkDirs
                                        Text
                                        ( λ(_ : Text) →
                                          λ(_ : Text) →
                                            "${_@1}:${_}"
                                        )
                                        ""}/usr/local/lib:/lib:/usr/lib"
                               , var = "LIBRARY_PATH"
                               }
                         else  { value =
                                   merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     _@1
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "${_@2}:${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )
                               , var = "LD_LIBRARY_PATH"
                               }
                       ).var}=${( if    cfg.static
                                  then  { value =
                                            "${List/fold
                                                 Text
                                                 cfg.linkDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/lib:/lib:/usr/lib"
                                        , var = "LIBRARY_PATH"
                                        }
                                  else  { value =
                                            merge
                                              { Empty = ""
                                              , NonEmpty = λ(_ : Text) → _
                                              }
                                              ( List/fold
                                                  Text
                                                  cfg.linkDirs
                                                  < Empty | NonEmpty : Text >
                                                  ( λ(_ : Text) →
                                                    λ ( _
                                                      : < Empty
                                                        | NonEmpty : Text
                                                        >
                                                      ) →
                                                      merge
                                                        { Empty =
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              _@1
                                                        , NonEmpty =
                                                            λ(_ : Text) →
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >.NonEmpty
                                                                "${_@2}:${_}"
                                                        }
                                                        _
                                                  )
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.Empty
                                              )
                                        , var = "LD_LIBRARY_PATH"
                                        }
                                ).value} PYTHONPATH=${merge
                                                        { Empty = ""
                                                        , NonEmpty =
                                                            λ(_ : Text) → _
                                                        }
                                                        ( List/fold
                                                            Text
                                                            cfg.linkDirs
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >
                                                            ( λ(_ : Text) →
                                                              λ ( _
                                                                : < Empty
                                                                  | NonEmpty :
                                                                      Text
                                                                  >
                                                                ) →
                                                                merge
                                                                  { Empty =
                                                                      < Empty
                                                                      | NonEmpty :
                                                                          Text
                                                                      >.NonEmpty
                                                                        "${_@1}/python${merge
                                                                                          { Empty =
                                                                                              ""
                                                                                          , NonEmpty =
                                                                                              λ ( _
                                                                                                : Text
                                                                                                ) →
                                                                                                _
                                                                                          }
                                                                                          ( List/fold
                                                                                              Natural
                                                                                              version
                                                                                              < Empty
                                                                                              | NonEmpty :
                                                                                                  Text
                                                                                              >
                                                                                              ( λ ( _
                                                                                                  : Natural
                                                                                                  ) →
                                                                                                λ ( _
                                                                                                  : < Empty
                                                                                                    | NonEmpty :
                                                                                                        Text
                                                                                                    >
                                                                                                  ) →
                                                                                                  merge
                                                                                                    { Empty =
                                                                                                        < Empty
                                                                                                        | NonEmpty :
                                                                                                            Text
                                                                                                        >.NonEmpty
                                                                                                          ( Natural/show
                                                                                                              _@1
                                                                                                          )
                                                                                                    , NonEmpty =
                                                                                                        λ ( _
                                                                                                          : Text
                                                                                                          ) →
                                                                                                          < Empty
                                                                                                          | NonEmpty :
                                                                                                              Text
                                                                                                          >.NonEmpty
                                                                                                            "${Natural/show
                                                                                                                 _@2}.${_}"
                                                                                                    }
                                                                                                    _
                                                                                              )
                                                                                              < Empty
                                                                                              | NonEmpty :
                                                                                                  Text
                                                                                              >.Empty
                                                                                          )}/site-packages"
                                                                  , NonEmpty =
                                                                      λ ( _
                                                                        : Text
                                                                        ) →
                                                                        < Empty
                                                                        | NonEmpty :
                                                                            Text
                                                                        >.NonEmpty
                                                                          "${_@2}/python${merge
                                                                                            { Empty =
                                                                                                ""
                                                                                            , NonEmpty =
                                                                                                λ ( _
                                                                                                  : Text
                                                                                                  ) →
                                                                                                  _
                                                                                            }
                                                                                            ( List/fold
                                                                                                Natural
                                                                                                version
                                                                                                < Empty
                                                                                                | NonEmpty :
                                                                                                    Text
                                                                                                >
                                                                                                ( λ ( _
                                                                                                    : Natural
                                                                                                    ) →
                                                                                                  λ ( _
                                                                                                    : < Empty
                                                                                                      | NonEmpty :
                                                                                                          Text
                                                                                                      >
                                                                                                    ) →
                                                                                                    merge
                                                                                                      { Empty =
                                                                                                          < Empty
                                                                                                          | NonEmpty :
                                                                                                              Text
                                                                                                          >.NonEmpty
                                                                                                            ( Natural/show
                                                                                                                _@1
                                                                                                            )
                                                                                                      , NonEmpty =
                                                                                                          λ ( _
                                                                                                            : Text
                                                                                                            ) →
                                                                                                            < Empty
                                                                                                            | NonEmpty :
                                                                                                                Text
                                                                                                            >.NonEmpty
                                                                                                              "${Natural/show
                                                                                                                   _@2}.${_}"
                                                                                                      }
                                                                                                      _
                                                                                                )
                                                                                                < Empty
                                                                                                | NonEmpty :
                                                                                                    Text
                                                                                                >.Empty
                                                                                            )}/site-packages:${_}"
                                                                  }
                                                                  _
                                                            )
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.Empty
                                                        )}:${cfg.installDir}/lib/python${merge
                                                                                           { Empty =
                                                                                               ""
                                                                                           , NonEmpty =
                                                                                               λ ( _
                                                                                                 : Text
                                                                                                 ) →
                                                                                                 _
                                                                                           }
                                                                                           ( List/fold
                                                                                               Natural
                                                                                               version
                                                                                               < Empty
                                                                                               | NonEmpty :
                                                                                                   Text
                                                                                               >
                                                                                               ( λ ( _
                                                                                                   : Natural
                                                                                                   ) →
                                                                                                 λ ( _
                                                                                                   : < Empty
                                                                                                     | NonEmpty :
                                                                                                         Text
                                                                                                     >
                                                                                                   ) →
                                                                                                   merge
                                                                                                     { Empty =
                                                                                                         < Empty
                                                                                                         | NonEmpty :
                                                                                                             Text
                                                                                                         >.NonEmpty
                                                                                                           ( Natural/show
                                                                                                               _@1
                                                                                                           )
                                                                                                     , NonEmpty =
                                                                                                         λ ( _
                                                                                                           : Text
                                                                                                           ) →
                                                                                                           < Empty
                                                                                                           | NonEmpty :
                                                                                                               Text
                                                                                                           >.NonEmpty
                                                                                                             "${Natural/show
                                                                                                                  _@2}.${_}"
                                                                                                     }
                                                                                                     _
                                                                                               )
                                                                                               < Empty
                                                                                               | NonEmpty :
                                                                                                   Text
                                                                                               >.Empty
                                                                                           )}/site-packages ${cfg.installDir}/bin/${binName} \$@"
                , file = "wrapper/${binName}"
                }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.MakeExecutable
                { file = "wrapper/${binName}" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CopyFile
                { dest = "wrapper/${binName}", src = "wrapper/${binName}" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.SymlinkBinary
                { file = "wrapper/${binName}" }
            ]
      , mkStaPath =
          λ(libDirs : List Text) →
            { value =
                "${List/fold
                     Text
                     libDirs
                     Text
                     (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                     ""}/usr/local/lib:/lib:/usr/lib"
            , var = "LIBRARY_PATH"
            }
      , mkXdgDataDirs =
          λ(shareDirs : List Text) →
            { value =
                merge
                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                  ( List/fold
                      Text
                      shareDirs
                      < Empty | NonEmpty : Text >
                      ( λ(_ : Text) →
                        λ(_ : < Empty | NonEmpty : Text >) →
                          merge
                            { Empty = < Empty | NonEmpty : Text >.NonEmpty _@1
                            , NonEmpty =
                                λ(_ : Text) →
                                  < Empty | NonEmpty : Text >.NonEmpty
                                    "${_@2}:${_}"
                            }
                            _
                      )
                      < Empty | NonEmpty : Text >.Empty
                  )
            , var = "XDG_DATA_DIRS"
            }
      , ninjaBuild =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [] : List Text
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/python3.8/site-packages"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/python3.8/site-packages:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PYTHONPATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_RUN_PATH"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # ( if    cfg.isCross
                          then  [] : List { value : Text, var : Text }
                          else  [ { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            cfg.preloadLibs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        _@1
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2} ${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "LD_PRELOAD"
                                  }
                                ]
                        )
                    )
                , procDir = Some "build"
                , program = "ninja"
                }
            ]
      , ninjaInstall =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [ "install" ]
                , environment = Some
                    (   [ { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/python3.8/site-packages"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/python3.8/site-packages:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PYTHONPATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_RUN_PATH"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = Some "build"
                , program = "ninja"
                }
            ]
      , ninjaInstallWithPkgConfig =
          λ(fs : List { dest : Text, src : Text }) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
              [ < Call :
                    { arguments : List Text
                    , environment : Optional (List { value : Text, var : Text })
                    , procDir : Optional Text
                    , program : Text
                    }
                | CopyFile : { dest : Text, src : Text }
                | CreateDirectory : { dir : Text }
                | MakeExecutable : { file : Text }
                | Patch : { patchContents : Text }
                | Symlink : { linkName : Text, tgt : Text }
                | SymlinkBinary : { file : Text }
                | SymlinkManpage : { file : Text, section : Natural }
                | Write : { contents : Text, file : Text }
                >.Call
                  { arguments = [ "install" ]
                  , environment = Some
                      (   [ { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/pkgconfig"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/pkgconfig:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PKG_CONFIG_PATH"
                            }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@1}/python3.8/site-packages"
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}/python3.8/site-packages:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "PYTHONPATH"
                            }
                          , if    cfg.static
                            then  { value =
                                      "${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/lib:/lib:/usr/lib"
                                  , var = "LIBRARY_PATH"
                                  }
                            else  { value =
                                      merge
                                        { Empty = ""
                                        , NonEmpty = λ(_ : Text) → _
                                        }
                                        ( List/fold
                                            Text
                                            cfg.linkDirs
                                            < Empty | NonEmpty : Text >
                                            ( λ(_ : Text) →
                                              λ ( _
                                                : < Empty | NonEmpty : Text >
                                                ) →
                                                merge
                                                  { Empty =
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        _@1
                                                  , NonEmpty =
                                                      λ(_ : Text) →
                                                        < Empty
                                                        | NonEmpty : Text
                                                        >.NonEmpty
                                                          "${_@2}:${_}"
                                                  }
                                                  _
                                            )
                                            < Empty | NonEmpty : Text >.Empty
                                        )
                                  , var = "LD_LIBRARY_PATH"
                                  }
                          , { value =
                                merge
                                  { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                  ( List/fold
                                      Text
                                      cfg.linkDirs
                                      < Empty | NonEmpty : Text >
                                      ( λ(_ : Text) →
                                        λ(_ : < Empty | NonEmpty : Text >) →
                                          merge
                                            { Empty =
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  _@1
                                            , NonEmpty =
                                                λ(_ : Text) →
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.NonEmpty
                                                    "${_@2}:${_}"
                                            }
                                            _
                                      )
                                      < Empty | NonEmpty : Text >.Empty
                                  )
                            , var = "LD_RUN_PATH"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.linkDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-L${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${List/fold
                                           Text
                                           cfg.linkDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${if    merge
                                                          { AIX = False
                                                          , Android = False
                                                          , Darwin = True
                                                          , Dragonfly = False
                                                          , FreeBSD = False
                                                          , Haiku = False
                                                          , Hurd = False
                                                          , IOS = False
                                                          , Linux = False
                                                          , NetBSD = False
                                                          , NoOs = False
                                                          , OpenBSD = False
                                                          , Redox = False
                                                          , Solaris = False
                                                          , Windows = False
                                                          }
                                                          cfg.buildOS
                                                  then  ""
                                                  else  " -Wl,-rpath-link,${_@1}"}${_}"
                                           )
                                           ""}"
                            , var = "LDFLAGS"
                            }
                          , { value =
                                "${merge
                                     { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                     ( List/fold
                                         Text
                                         cfg.includeDirs
                                         < Empty | NonEmpty : Text >
                                         ( λ(_ : Text) →
                                           λ(_ : < Empty | NonEmpty : Text >) →
                                             merge
                                               { Empty =
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@1}"
                                               , NonEmpty =
                                                   λ(_ : Text) →
                                                     < Empty
                                                     | NonEmpty : Text
                                                     >.NonEmpty
                                                       "-I${_@2} ${_}"
                                               }
                                               _
                                         )
                                         < Empty | NonEmpty : Text >.Empty
                                     )}${if cfg.static then " -static" else ""}"
                            , var = "CPPFLAGS"
                            }
                          ]
                        # ( if    merge
                                    { AIX = True
                                    , Android = True
                                    , Darwin = True
                                    , Dragonfly = True
                                    , FreeBSD = True
                                    , Haiku = False
                                    , Hurd = True
                                    , IOS = True
                                    , Linux = True
                                    , NetBSD = True
                                    , NoOs = False
                                    , OpenBSD = True
                                    , Redox = False
                                    , Solaris = True
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  [ { value =
                                        "${List/fold
                                             Text
                                             cfg.binDirs
                                             Text
                                             ( λ(_ : Text) →
                                               λ(_ : Text) →
                                                 "${_@1}:${_}"
                                             )
                                             ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                    , var = "PATH"
                                    }
                                  ]
                            else  [] : List { value : Text, var : Text }
                          )
                      )
                  , procDir = Some "build"
                  , program = "ninja"
                  }
              ]
            # List/fold
                { dest : Text, src : Text }
                fs
                ( List
                    < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >
                )
                ( λ(_ : { dest : Text, src : Text }) →
                  λ ( _
                    : List
                        < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >
                    ) →
                      [ < Call :
                            { arguments : List Text
                            , environment :
                                Optional (List { value : Text, var : Text })
                            , procDir : Optional Text
                            , program : Text
                            }
                        | CopyFile : { dest : Text, src : Text }
                        | CreateDirectory : { dir : Text }
                        | MakeExecutable : { file : Text }
                        | Patch : { patchContents : Text }
                        | Symlink : { linkName : Text, tgt : Text }
                        | SymlinkBinary : { file : Text }
                        | SymlinkManpage : { file : Text, section : Natural }
                        | Write : { contents : Text, file : Text }
                        >.CopyFile
                          _@1
                      ]
                    # _
                )
                ( [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
                )
      , ninjaPackage =
          λ(x : { name : Text, version : List Natural }) →
            { buildCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments = [] : List Text
                      , environment = Some
                          (   [ { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/python3.8/site-packages"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/python3.8/site-packages:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PYTHONPATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_RUN_PATH"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.includeDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-I${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-I${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${if    cfg.static
                                             then  " -static"
                                             else  ""}"
                                , var = "CPPFLAGS"
                                }
                              ]
                            # ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                            # ( if    cfg.isCross
                                then  [] : List { value : Text, var : Text }
                                else  [ { value =
                                            merge
                                              { Empty = ""
                                              , NonEmpty = λ(_ : Text) → _
                                              }
                                              ( List/fold
                                                  Text
                                                  cfg.preloadLibs
                                                  < Empty | NonEmpty : Text >
                                                  ( λ(_ : Text) →
                                                    λ ( _
                                                      : < Empty
                                                        | NonEmpty : Text
                                                        >
                                                      ) →
                                                      merge
                                                        { Empty =
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              _@1
                                                        , NonEmpty =
                                                            λ(_ : Text) →
                                                              < Empty
                                                              | NonEmpty : Text
                                                              >.NonEmpty
                                                                "${_@2} ${_}"
                                                        }
                                                        _
                                                  )
                                                  < Empty
                                                  | NonEmpty : Text
                                                  >.Empty
                                              )
                                        , var = "LD_PRELOAD"
                                        }
                                      ]
                              )
                          )
                      , procDir = Some "build"
                      , program = "ninja"
                      }
                  ]
            , configureCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.CreateDirectory
                      { dir = "build" }
                  , < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Write
                      { contents =
                          ''
                          [binaries]
                          c = '${merge
                                   { None = ""
                                   , Some =
                                       λ ( tgt
                                         : { abi :
                                               Optional
                                                 < GNU
                                                 | GNUabi64
                                                 | GNUeabi
                                                 | GNUeabihf
                                                 | GNUspe
                                                 | MinGw
                                                 >
                                           , arch :
                                               < AArch
                                               | Alpha
                                               | Arm
                                               | HPPA
                                               | HPPA64
                                               | M68k
                                               | Mips
                                               | Mips64
                                               | Mips64El
                                               | MipsEl
                                               | MipsIsa32r6
                                               | MipsIsa32r6El
                                               | MipsIsa64r6
                                               | MipsIsa64r6El
                                               | PowerPC
                                               | PowerPC64
                                               | PowerPC64le
                                               | RISCV64
                                               | S390x
                                               | SH4
                                               | Sparc64
                                               | X64
                                               | X86
                                               >
                                           , manufacturer :
                                               Optional
                                                 < Apple | IBM | PC | Unknown >
                                           , os :
                                               < AIX
                                               | Android
                                               | Darwin
                                               | Dragonfly
                                               | FreeBSD
                                               | Haiku
                                               | Hurd
                                               | IOS
                                               | Linux
                                               | NetBSD
                                               | NoOs
                                               | OpenBSD
                                               | Redox
                                               | Solaris
                                               | Windows
                                               >
                                           }
                                         ) →
                                         "${merge
                                              { AArch = "aarch64"
                                              , Alpha = "alpha"
                                              , Arm = "arm"
                                              , HPPA = "hppa"
                                              , HPPA64 = "hppa64"
                                              , M68k = "m68k"
                                              , Mips = "mips"
                                              , Mips64 = "mips64"
                                              , Mips64El = "mips64el"
                                              , MipsEl = "mipsel"
                                              , MipsIsa32r6 = "mipsisa32r6"
                                              , MipsIsa32r6El = "mipsisa32r6el"
                                              , MipsIsa64r6 = "mipsisa64r6"
                                              , MipsIsa64r6El = "mipsisa64r6el"
                                              , PowerPC = "powerpc"
                                              , PowerPC64 = "powerpc64"
                                              , PowerPC64le = "powerpc64le"
                                              , RISCV64 = "riscv64"
                                              , S390x = "s390x"
                                              , SH4 = "sh4"
                                              , Sparc64 = "sparc64"
                                              , X64 = "x86_64"
                                              , X86 = "i686"
                                              }
                                              tgt.arch}-${merge
                                                            { AIX = "aix"
                                                            , Android =
                                                                "android"
                                                            , Darwin = "darwin"
                                                            , Dragonfly =
                                                                "dragonfly"
                                                            , FreeBSD =
                                                                "freebsd"
                                                            , Haiku = "haiku"
                                                            , Hurd = "hurd"
                                                            , IOS = "darwin"
                                                            , Linux = "linux"
                                                            , NetBSD = "netbsd"
                                                            , NoOs = "none"
                                                            , OpenBSD =
                                                                "openbsd"
                                                            , Redox = "redox"
                                                            , Solaris =
                                                                "solaris"
                                                            , Windows = "w64"
                                                            }
                                                            tgt.os}${merge
                                                                       { None =
                                                                           ""
                                                                       , Some =
                                                                           λ ( abi
                                                                             : < GNU
                                                                               | GNUabi64
                                                                               | GNUeabi
                                                                               | GNUeabihf
                                                                               | GNUspe
                                                                               | MinGw
                                                                               >
                                                                             ) →
                                                                             "-${merge
                                                                                   { GNU =
                                                                                       "gnu"
                                                                                   , GNUabi64 =
                                                                                       "gnuabi64"
                                                                                   , GNUeabi =
                                                                                       "gnueabi"
                                                                                   , GNUeabihf =
                                                                                       "gnueabihf"
                                                                                   , GNUspe =
                                                                                       "gnuspe"
                                                                                   , MinGw =
                                                                                       "mingw32"
                                                                                   }
                                                                                   abi}"
                                                                       }
                                                                       tgt.abi}-"
                                   }
                                   cfg.targetTriple}gcc'
                          cpp = '${merge
                                     { None = ""
                                     , Some =
                                         λ ( tgt
                                           : { abi :
                                                 Optional
                                                   < GNU
                                                   | GNUabi64
                                                   | GNUeabi
                                                   | GNUeabihf
                                                   | GNUspe
                                                   | MinGw
                                                   >
                                             , arch :
                                                 < AArch
                                                 | Alpha
                                                 | Arm
                                                 | HPPA
                                                 | HPPA64
                                                 | M68k
                                                 | Mips
                                                 | Mips64
                                                 | Mips64El
                                                 | MipsEl
                                                 | MipsIsa32r6
                                                 | MipsIsa32r6El
                                                 | MipsIsa64r6
                                                 | MipsIsa64r6El
                                                 | PowerPC
                                                 | PowerPC64
                                                 | PowerPC64le
                                                 | RISCV64
                                                 | S390x
                                                 | SH4
                                                 | Sparc64
                                                 | X64
                                                 | X86
                                                 >
                                             , manufacturer :
                                                 Optional
                                                   < Apple
                                                   | IBM
                                                   | PC
                                                   | Unknown
                                                   >
                                             , os :
                                                 < AIX
                                                 | Android
                                                 | Darwin
                                                 | Dragonfly
                                                 | FreeBSD
                                                 | Haiku
                                                 | Hurd
                                                 | IOS
                                                 | Linux
                                                 | NetBSD
                                                 | NoOs
                                                 | OpenBSD
                                                 | Redox
                                                 | Solaris
                                                 | Windows
                                                 >
                                             }
                                           ) →
                                           "${merge
                                                { AArch = "aarch64"
                                                , Alpha = "alpha"
                                                , Arm = "arm"
                                                , HPPA = "hppa"
                                                , HPPA64 = "hppa64"
                                                , M68k = "m68k"
                                                , Mips = "mips"
                                                , Mips64 = "mips64"
                                                , Mips64El = "mips64el"
                                                , MipsEl = "mipsel"
                                                , MipsIsa32r6 = "mipsisa32r6"
                                                , MipsIsa32r6El =
                                                    "mipsisa32r6el"
                                                , MipsIsa64r6 = "mipsisa64r6"
                                                , MipsIsa64r6El =
                                                    "mipsisa64r6el"
                                                , PowerPC = "powerpc"
                                                , PowerPC64 = "powerpc64"
                                                , PowerPC64le = "powerpc64le"
                                                , RISCV64 = "riscv64"
                                                , S390x = "s390x"
                                                , SH4 = "sh4"
                                                , Sparc64 = "sparc64"
                                                , X64 = "x86_64"
                                                , X86 = "i686"
                                                }
                                                tgt.arch}-${merge
                                                              { AIX = "aix"
                                                              , Android =
                                                                  "android"
                                                              , Darwin =
                                                                  "darwin"
                                                              , Dragonfly =
                                                                  "dragonfly"
                                                              , FreeBSD =
                                                                  "freebsd"
                                                              , Haiku = "haiku"
                                                              , Hurd = "hurd"
                                                              , IOS = "darwin"
                                                              , Linux = "linux"
                                                              , NetBSD =
                                                                  "netbsd"
                                                              , NoOs = "none"
                                                              , OpenBSD =
                                                                  "openbsd"
                                                              , Redox = "redox"
                                                              , Solaris =
                                                                  "solaris"
                                                              , Windows = "w64"
                                                              }
                                                              tgt.os}${merge
                                                                         { None =
                                                                             ""
                                                                         , Some =
                                                                             λ ( abi
                                                                               : < GNU
                                                                                 | GNUabi64
                                                                                 | GNUeabi
                                                                                 | GNUeabihf
                                                                                 | GNUspe
                                                                                 | MinGw
                                                                                 >
                                                                               ) →
                                                                               "-${merge
                                                                                     { GNU =
                                                                                         "gnu"
                                                                                     , GNUabi64 =
                                                                                         "gnuabi64"
                                                                                     , GNUeabi =
                                                                                         "gnueabi"
                                                                                     , GNUeabihf =
                                                                                         "gnueabihf"
                                                                                     , GNUspe =
                                                                                         "gnuspe"
                                                                                     , MinGw =
                                                                                         "mingw32"
                                                                                     }
                                                                                     abi}"
                                                                         }
                                                                         tgt.abi}-"
                                     }
                                     cfg.targetTriple}g++'
                          ar = '${merge
                                    { None = ""
                                    , Some =
                                        λ ( tgt
                                          : { abi :
                                                Optional
                                                  < GNU
                                                  | GNUabi64
                                                  | GNUeabi
                                                  | GNUeabihf
                                                  | GNUspe
                                                  | MinGw
                                                  >
                                            , arch :
                                                < AArch
                                                | Alpha
                                                | Arm
                                                | HPPA
                                                | HPPA64
                                                | M68k
                                                | Mips
                                                | Mips64
                                                | Mips64El
                                                | MipsEl
                                                | MipsIsa32r6
                                                | MipsIsa32r6El
                                                | MipsIsa64r6
                                                | MipsIsa64r6El
                                                | PowerPC
                                                | PowerPC64
                                                | PowerPC64le
                                                | RISCV64
                                                | S390x
                                                | SH4
                                                | Sparc64
                                                | X64
                                                | X86
                                                >
                                            , manufacturer :
                                                Optional
                                                  < Apple | IBM | PC | Unknown >
                                            , os :
                                                < AIX
                                                | Android
                                                | Darwin
                                                | Dragonfly
                                                | FreeBSD
                                                | Haiku
                                                | Hurd
                                                | IOS
                                                | Linux
                                                | NetBSD
                                                | NoOs
                                                | OpenBSD
                                                | Redox
                                                | Solaris
                                                | Windows
                                                >
                                            }
                                          ) →
                                          "${merge
                                               { AArch = "aarch64"
                                               , Alpha = "alpha"
                                               , Arm = "arm"
                                               , HPPA = "hppa"
                                               , HPPA64 = "hppa64"
                                               , M68k = "m68k"
                                               , Mips = "mips"
                                               , Mips64 = "mips64"
                                               , Mips64El = "mips64el"
                                               , MipsEl = "mipsel"
                                               , MipsIsa32r6 = "mipsisa32r6"
                                               , MipsIsa32r6El = "mipsisa32r6el"
                                               , MipsIsa64r6 = "mipsisa64r6"
                                               , MipsIsa64r6El = "mipsisa64r6el"
                                               , PowerPC = "powerpc"
                                               , PowerPC64 = "powerpc64"
                                               , PowerPC64le = "powerpc64le"
                                               , RISCV64 = "riscv64"
                                               , S390x = "s390x"
                                               , SH4 = "sh4"
                                               , Sparc64 = "sparc64"
                                               , X64 = "x86_64"
                                               , X86 = "i686"
                                               }
                                               tgt.arch}-${merge
                                                             { AIX = "aix"
                                                             , Android =
                                                                 "android"
                                                             , Darwin = "darwin"
                                                             , Dragonfly =
                                                                 "dragonfly"
                                                             , FreeBSD =
                                                                 "freebsd"
                                                             , Haiku = "haiku"
                                                             , Hurd = "hurd"
                                                             , IOS = "darwin"
                                                             , Linux = "linux"
                                                             , NetBSD = "netbsd"
                                                             , NoOs = "none"
                                                             , OpenBSD =
                                                                 "openbsd"
                                                             , Redox = "redox"
                                                             , Solaris =
                                                                 "solaris"
                                                             , Windows = "w64"
                                                             }
                                                             tgt.os}${merge
                                                                        { None =
                                                                            ""
                                                                        , Some =
                                                                            λ ( abi
                                                                              : < GNU
                                                                                | GNUabi64
                                                                                | GNUeabi
                                                                                | GNUeabihf
                                                                                | GNUspe
                                                                                | MinGw
                                                                                >
                                                                              ) →
                                                                              "-${merge
                                                                                    { GNU =
                                                                                        "gnu"
                                                                                    , GNUabi64 =
                                                                                        "gnuabi64"
                                                                                    , GNUeabi =
                                                                                        "gnueabi"
                                                                                    , GNUeabihf =
                                                                                        "gnueabihf"
                                                                                    , GNUspe =
                                                                                        "gnuspe"
                                                                                    , MinGw =
                                                                                        "mingw32"
                                                                                    }
                                                                                    abi}"
                                                                        }
                                                                        tgt.abi}-"
                                    }
                                    cfg.targetTriple}ar'
                          strip = '${merge
                                       { None = ""
                                       , Some =
                                           λ ( tgt
                                             : { abi :
                                                   Optional
                                                     < GNU
                                                     | GNUabi64
                                                     | GNUeabi
                                                     | GNUeabihf
                                                     | GNUspe
                                                     | MinGw
                                                     >
                                               , arch :
                                                   < AArch
                                                   | Alpha
                                                   | Arm
                                                   | HPPA
                                                   | HPPA64
                                                   | M68k
                                                   | Mips
                                                   | Mips64
                                                   | Mips64El
                                                   | MipsEl
                                                   | MipsIsa32r6
                                                   | MipsIsa32r6El
                                                   | MipsIsa64r6
                                                   | MipsIsa64r6El
                                                   | PowerPC
                                                   | PowerPC64
                                                   | PowerPC64le
                                                   | RISCV64
                                                   | S390x
                                                   | SH4
                                                   | Sparc64
                                                   | X64
                                                   | X86
                                                   >
                                               , manufacturer :
                                                   Optional
                                                     < Apple
                                                     | IBM
                                                     | PC
                                                     | Unknown
                                                     >
                                               , os :
                                                   < AIX
                                                   | Android
                                                   | Darwin
                                                   | Dragonfly
                                                   | FreeBSD
                                                   | Haiku
                                                   | Hurd
                                                   | IOS
                                                   | Linux
                                                   | NetBSD
                                                   | NoOs
                                                   | OpenBSD
                                                   | Redox
                                                   | Solaris
                                                   | Windows
                                                   >
                                               }
                                             ) →
                                             "${merge
                                                  { AArch = "aarch64"
                                                  , Alpha = "alpha"
                                                  , Arm = "arm"
                                                  , HPPA = "hppa"
                                                  , HPPA64 = "hppa64"
                                                  , M68k = "m68k"
                                                  , Mips = "mips"
                                                  , Mips64 = "mips64"
                                                  , Mips64El = "mips64el"
                                                  , MipsEl = "mipsel"
                                                  , MipsIsa32r6 = "mipsisa32r6"
                                                  , MipsIsa32r6El =
                                                      "mipsisa32r6el"
                                                  , MipsIsa64r6 = "mipsisa64r6"
                                                  , MipsIsa64r6El =
                                                      "mipsisa64r6el"
                                                  , PowerPC = "powerpc"
                                                  , PowerPC64 = "powerpc64"
                                                  , PowerPC64le = "powerpc64le"
                                                  , RISCV64 = "riscv64"
                                                  , S390x = "s390x"
                                                  , SH4 = "sh4"
                                                  , Sparc64 = "sparc64"
                                                  , X64 = "x86_64"
                                                  , X86 = "i686"
                                                  }
                                                  tgt.arch}-${merge
                                                                { AIX = "aix"
                                                                , Android =
                                                                    "android"
                                                                , Darwin =
                                                                    "darwin"
                                                                , Dragonfly =
                                                                    "dragonfly"
                                                                , FreeBSD =
                                                                    "freebsd"
                                                                , Haiku =
                                                                    "haiku"
                                                                , Hurd = "hurd"
                                                                , IOS = "darwin"
                                                                , Linux =
                                                                    "linux"
                                                                , NetBSD =
                                                                    "netbsd"
                                                                , NoOs = "none"
                                                                , OpenBSD =
                                                                    "openbsd"
                                                                , Redox =
                                                                    "redox"
                                                                , Solaris =
                                                                    "solaris"
                                                                , Windows =
                                                                    "w64"
                                                                }
                                                                tgt.os}${merge
                                                                           { None =
                                                                               ""
                                                                           , Some =
                                                                               λ ( abi
                                                                                 : < GNU
                                                                                   | GNUabi64
                                                                                   | GNUeabi
                                                                                   | GNUeabihf
                                                                                   | GNUspe
                                                                                   | MinGw
                                                                                   >
                                                                                 ) →
                                                                                 "-${merge
                                                                                       { GNU =
                                                                                           "gnu"
                                                                                       , GNUabi64 =
                                                                                           "gnuabi64"
                                                                                       , GNUeabi =
                                                                                           "gnueabi"
                                                                                       , GNUeabihf =
                                                                                           "gnueabihf"
                                                                                       , GNUspe =
                                                                                           "gnuspe"
                                                                                       , MinGw =
                                                                                           "mingw32"
                                                                                       }
                                                                                       abi}"
                                                                           }
                                                                           tgt.abi}-"
                                       }
                                       cfg.targetTriple}strip'
                          pkgconfig = 'pkg-config'
                          [host_machine]
                          system = '${merge
                                        { AIX = "aix"
                                        , Android = "android"
                                        , Darwin = "darwin"
                                        , Dragonfly = "dragonfly"
                                        , FreeBSD = "freebsd"
                                        , Haiku = "haiku"
                                        , Hurd = "hurd"
                                        , IOS = "darwin"
                                        , Linux = "linux"
                                        , NetBSD = "netbsd"
                                        , NoOs = "none"
                                        , OpenBSD = "openbsd"
                                        , Redox = "redox"
                                        , Solaris = "solaris"
                                        , Windows = "w64"
                                        }
                                        ( merge
                                            { None = cfg.buildOS
                                            , Some =
                                                λ ( tgt
                                                  : { abi :
                                                        Optional
                                                          < GNU
                                                          | GNUabi64
                                                          | GNUeabi
                                                          | GNUeabihf
                                                          | GNUspe
                                                          | MinGw
                                                          >
                                                    , arch :
                                                        < AArch
                                                        | Alpha
                                                        | Arm
                                                        | HPPA
                                                        | HPPA64
                                                        | M68k
                                                        | Mips
                                                        | Mips64
                                                        | Mips64El
                                                        | MipsEl
                                                        | MipsIsa32r6
                                                        | MipsIsa32r6El
                                                        | MipsIsa64r6
                                                        | MipsIsa64r6El
                                                        | PowerPC
                                                        | PowerPC64
                                                        | PowerPC64le
                                                        | RISCV64
                                                        | S390x
                                                        | SH4
                                                        | Sparc64
                                                        | X64
                                                        | X86
                                                        >
                                                    , manufacturer :
                                                        Optional
                                                          < Apple
                                                          | IBM
                                                          | PC
                                                          | Unknown
                                                          >
                                                    , os :
                                                        < AIX
                                                        | Android
                                                        | Darwin
                                                        | Dragonfly
                                                        | FreeBSD
                                                        | Haiku
                                                        | Hurd
                                                        | IOS
                                                        | Linux
                                                        | NetBSD
                                                        | NoOs
                                                        | OpenBSD
                                                        | Redox
                                                        | Solaris
                                                        | Windows
                                                        >
                                                    }
                                                  ) →
                                                  tgt.os
                                            }
                                            cfg.targetTriple
                                        )}'
                          cpu_family = '${merge
                                            { AArch = "aarch64"
                                            , Alpha = "alpha"
                                            , Arm = "arm"
                                            , HPPA = "hppa"
                                            , HPPA64 = "hppa64"
                                            , M68k = "m68k"
                                            , Mips = "mips"
                                            , Mips64 = "mips64"
                                            , Mips64El = "mips64el"
                                            , MipsEl = "mipsel"
                                            , MipsIsa32r6 = "mipsisa32r6"
                                            , MipsIsa32r6El = "mipsisa32r6el"
                                            , MipsIsa64r6 = "mipsisa64r6"
                                            , MipsIsa64r6El = "mipsisa64r6el"
                                            , PowerPC = "powerpc"
                                            , PowerPC64 = "powerpc64"
                                            , PowerPC64le = "powerpc64le"
                                            , RISCV64 = "riscv64"
                                            , S390x = "s390x"
                                            , SH4 = "sh4"
                                            , Sparc64 = "sparc64"
                                            , X64 = "x86_64"
                                            , X86 = "i686"
                                            }
                                            ( merge
                                                { None = cfg.buildArch
                                                , Some =
                                                    λ ( tgt
                                                      : { abi :
                                                            Optional
                                                              < GNU
                                                              | GNUabi64
                                                              | GNUeabi
                                                              | GNUeabihf
                                                              | GNUspe
                                                              | MinGw
                                                              >
                                                        , arch :
                                                            < AArch
                                                            | Alpha
                                                            | Arm
                                                            | HPPA
                                                            | HPPA64
                                                            | M68k
                                                            | Mips
                                                            | Mips64
                                                            | Mips64El
                                                            | MipsEl
                                                            | MipsIsa32r6
                                                            | MipsIsa32r6El
                                                            | MipsIsa64r6
                                                            | MipsIsa64r6El
                                                            | PowerPC
                                                            | PowerPC64
                                                            | PowerPC64le
                                                            | RISCV64
                                                            | S390x
                                                            | SH4
                                                            | Sparc64
                                                            | X64
                                                            | X86
                                                            >
                                                        , manufacturer :
                                                            Optional
                                                              < Apple
                                                              | IBM
                                                              | PC
                                                              | Unknown
                                                              >
                                                        , os :
                                                            < AIX
                                                            | Android
                                                            | Darwin
                                                            | Dragonfly
                                                            | FreeBSD
                                                            | Haiku
                                                            | Hurd
                                                            | IOS
                                                            | Linux
                                                            | NetBSD
                                                            | NoOs
                                                            | OpenBSD
                                                            | Redox
                                                            | Solaris
                                                            | Windows
                                                            >
                                                        }
                                                      ) →
                                                      tgt.arch
                                                }
                                                cfg.targetTriple
                                            )}'
                          cpu = '${merge
                                     { AArch = "aarch64"
                                     , Alpha = "alpha"
                                     , Arm = "arm"
                                     , HPPA = "hppa"
                                     , HPPA64 = "hppa64"
                                     , M68k = "m68k"
                                     , Mips = "mips"
                                     , Mips64 = "mips64"
                                     , Mips64El = "mips64el"
                                     , MipsEl = "mipsel"
                                     , MipsIsa32r6 = "mipsisa32r6"
                                     , MipsIsa32r6El = "mipsisa32r6el"
                                     , MipsIsa64r6 = "mipsisa64r6"
                                     , MipsIsa64r6El = "mipsisa64r6el"
                                     , PowerPC = "powerpc"
                                     , PowerPC64 = "powerpc64"
                                     , PowerPC64le = "powerpc64le"
                                     , RISCV64 = "riscv64"
                                     , S390x = "s390x"
                                     , SH4 = "sh4"
                                     , Sparc64 = "sparc64"
                                     , X64 = "x86_64"
                                     , X86 = "i686"
                                     }
                                     ( merge
                                         { None = cfg.buildArch
                                         , Some =
                                             λ ( tgt
                                               : { abi :
                                                     Optional
                                                       < GNU
                                                       | GNUabi64
                                                       | GNUeabi
                                                       | GNUeabihf
                                                       | GNUspe
                                                       | MinGw
                                                       >
                                                 , arch :
                                                     < AArch
                                                     | Alpha
                                                     | Arm
                                                     | HPPA
                                                     | HPPA64
                                                     | M68k
                                                     | Mips
                                                     | Mips64
                                                     | Mips64El
                                                     | MipsEl
                                                     | MipsIsa32r6
                                                     | MipsIsa32r6El
                                                     | MipsIsa64r6
                                                     | MipsIsa64r6El
                                                     | PowerPC
                                                     | PowerPC64
                                                     | PowerPC64le
                                                     | RISCV64
                                                     | S390x
                                                     | SH4
                                                     | Sparc64
                                                     | X64
                                                     | X86
                                                     >
                                                 , manufacturer :
                                                     Optional
                                                       < Apple
                                                       | IBM
                                                       | PC
                                                       | Unknown
                                                       >
                                                 , os :
                                                     < AIX
                                                     | Android
                                                     | Darwin
                                                     | Dragonfly
                                                     | FreeBSD
                                                     | Haiku
                                                     | Hurd
                                                     | IOS
                                                     | Linux
                                                     | NetBSD
                                                     | NoOs
                                                     | OpenBSD
                                                     | Redox
                                                     | Solaris
                                                     | Windows
                                                     >
                                                 }
                                               ) →
                                               tgt.arch
                                         }
                                         cfg.targetTriple
                                     )}'
                          endian = 'little${"'"}''
                      , file = "build/cross.txt"
                      }
                  , < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments =
                            [ "--prefix=${cfg.installDir}", ".." ]
                          # ( if    cfg.isCross
                              then  [ "--cross-file", "cross.txt" ]
                              else  [] : List Text
                            )
                      , environment = Some
                          (   [ { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          (cfg.linkDirs # cfg.shareDirs)
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/python3.8/site-packages"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/python3.8/site-packages:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PYTHONPATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_RUN_PATH"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.includeDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-I${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-I${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${if    cfg.static
                                             then  " -static"
                                             else  ""}"
                                , var = "CPPFLAGS"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.preloadLibs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2} ${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_PRELOAD"
                                }
                              ]
                            # ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                          )
                      , procDir = Some "build"
                      , program = "meson"
                      }
                  ]
            , installCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments = [ "install" ]
                      , environment = Some
                          (   [ { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/python3.8/site-packages"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/python3.8/site-packages:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PYTHONPATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_RUN_PATH"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.includeDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-I${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-I${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${if    cfg.static
                                             then  " -static"
                                             else  ""}"
                                , var = "CPPFLAGS"
                                }
                              ]
                            # ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                          )
                      , procDir = Some "build"
                      , program = "ninja"
                      }
                  ]
            , pkgBuildDeps =
              [ { bound =
                    < Lower : { lower : List Natural }
                    | LowerUpper :
                        { lower : List Natural, upper : List Natural }
                    | NoBound
                    | Upper : { upper : List Natural }
                    >.NoBound
                , name = "meson"
                }
              , { bound =
                    < Lower : { lower : List Natural }
                    | LowerUpper :
                        { lower : List Natural, upper : List Natural }
                    | NoBound
                    | Upper : { upper : List Natural }
                    >.NoBound
                , name = "ninja"
                }
              ]
            , pkgDeps =
                [] : List
                       { bound :
                           < Lower : { lower : List Natural }
                           | LowerUpper :
                               { lower : List Natural, upper : List Natural }
                           | NoBound
                           | Upper : { upper : List Natural }
                           >
                       , name : Text
                       }
            , pkgName = x.name
            , pkgSubdir =
                "${x.name}-${merge
                               { Empty = "", NonEmpty = λ(_ : Text) → _ }
                               ( List/fold
                                   Natural
                                   x.version
                                   < Empty | NonEmpty : Text >
                                   ( λ(_ : Natural) →
                                     λ(_ : < Empty | NonEmpty : Text >) →
                                       merge
                                         { Empty =
                                             < Empty
                                             | NonEmpty : Text
                                             >.NonEmpty
                                               (Natural/show _@1)
                                         , NonEmpty =
                                             λ(_ : Text) →
                                               < Empty
                                               | NonEmpty : Text
                                               >.NonEmpty
                                                 "${Natural/show _@2}.${_}"
                                         }
                                         _
                                   )
                                   < Empty | NonEmpty : Text >.Empty
                               )}"
            , pkgVersion = x.version
            }
      , osCfg =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            merge
              { None = cfg.buildOS
              , Some =
                  λ ( tgt
                    : { abi :
                          Optional
                            < GNU
                            | GNUabi64
                            | GNUeabi
                            | GNUeabihf
                            | GNUspe
                            | MinGw
                            >
                      , arch :
                          < AArch
                          | Alpha
                          | Arm
                          | HPPA
                          | HPPA64
                          | M68k
                          | Mips
                          | Mips64
                          | Mips64El
                          | MipsEl
                          | MipsIsa32r6
                          | MipsIsa32r6El
                          | MipsIsa64r6
                          | MipsIsa64r6El
                          | PowerPC
                          | PowerPC64
                          | PowerPC64le
                          | RISCV64
                          | S390x
                          | SH4
                          | Sparc64
                          | X64
                          | X86
                          >
                      , manufacturer : Optional < Apple | IBM | PC | Unknown >
                      , os :
                          < AIX
                          | Android
                          | Darwin
                          | Dragonfly
                          | FreeBSD
                          | Haiku
                          | Hurd
                          | IOS
                          | Linux
                          | NetBSD
                          | NoOs
                          | OpenBSD
                          | Redox
                          | Solaris
                          | Windows
                          >
                      }
                    ) →
                    tgt.os
              }
              cfg.targetTriple
      , patch =
          λ(x : Text) →
            < Call :
                { arguments : List Text
                , environment : Optional (List { value : Text, var : Text })
                , procDir : Optional Text
                , program : Text
                }
            | CopyFile : { dest : Text, src : Text }
            | CreateDirectory : { dir : Text }
            | MakeExecutable : { file : Text }
            | Patch : { patchContents : Text }
            | Symlink : { linkName : Text, tgt : Text }
            | SymlinkBinary : { file : Text }
            | SymlinkManpage : { file : Text, section : Natural }
            | Write : { contents : Text, file : Text }
            >.Patch
              { patchContents = x }
      , perlConfigure =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [ "Makefile.PL", "PREFIX=${cfg.installDir}" ]
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.shareDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "XDG_DATA_DIRS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.preloadLibs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2} ${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_PRELOAD"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        ]
                    )
                , procDir = None Text
                , program = "perl"
                }
            ]
      , preloadCfg =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                    ( if    merge
                              { AIX = False
                              , Android = False
                              , Darwin = True
                              , Dragonfly = False
                              , FreeBSD = False
                              , Haiku = False
                              , Hurd = False
                              , IOS = False
                              , Linux = False
                              , NetBSD = False
                              , NoOs = False
                              , OpenBSD = False
                              , Redox = False
                              , Solaris = False
                              , Windows = False
                              }
                              cfg.buildOS
                      then  λ(x : List Text) → [ "configure" ] # x
                      else  λ(x : List Text) → x
                    )
                      ( merge
                          { None = [ "--prefix=${cfg.installDir}" ]
                          , Some =
                              λ(x : Text) → [ "--prefix=${cfg.installDir}", x ]
                          }
                          ( merge
                              { None = None Text
                              , Some =
                                  λ ( _
                                    : { abi :
                                          Optional
                                            < GNU
                                            | GNUabi64
                                            | GNUeabi
                                            | GNUeabihf
                                            | GNUspe
                                            | MinGw
                                            >
                                      , arch :
                                          < AArch
                                          | Alpha
                                          | Arm
                                          | HPPA
                                          | HPPA64
                                          | M68k
                                          | Mips
                                          | Mips64
                                          | Mips64El
                                          | MipsEl
                                          | MipsIsa32r6
                                          | MipsIsa32r6El
                                          | MipsIsa64r6
                                          | MipsIsa64r6El
                                          | PowerPC
                                          | PowerPC64
                                          | PowerPC64le
                                          | RISCV64
                                          | S390x
                                          | SH4
                                          | Sparc64
                                          | X64
                                          | X86
                                          >
                                      , manufacturer :
                                          Optional
                                            < Apple | IBM | PC | Unknown >
                                      , os :
                                          < AIX
                                          | Android
                                          | Darwin
                                          | Dragonfly
                                          | FreeBSD
                                          | Haiku
                                          | Hurd
                                          | IOS
                                          | Linux
                                          | NetBSD
                                          | NoOs
                                          | OpenBSD
                                          | Redox
                                          | Solaris
                                          | Windows
                                          >
                                      }
                                    ) →
                                    Some
                                      "--host=${merge
                                                  { AArch = "aarch64"
                                                  , Alpha = "alpha"
                                                  , Arm = "arm"
                                                  , HPPA = "hppa"
                                                  , HPPA64 = "hppa64"
                                                  , M68k = "m68k"
                                                  , Mips = "mips"
                                                  , Mips64 = "mips64"
                                                  , Mips64El = "mips64el"
                                                  , MipsEl = "mipsel"
                                                  , MipsIsa32r6 = "mipsisa32r6"
                                                  , MipsIsa32r6El =
                                                      "mipsisa32r6el"
                                                  , MipsIsa64r6 = "mipsisa64r6"
                                                  , MipsIsa64r6El =
                                                      "mipsisa64r6el"
                                                  , PowerPC = "powerpc"
                                                  , PowerPC64 = "powerpc64"
                                                  , PowerPC64le = "powerpc64le"
                                                  , RISCV64 = "riscv64"
                                                  , S390x = "s390x"
                                                  , SH4 = "sh4"
                                                  , Sparc64 = "sparc64"
                                                  , X64 = "x86_64"
                                                  , X86 = "i686"
                                                  }
                                                  _.arch}-${merge
                                                              { AIX = "aix"
                                                              , Android =
                                                                  "android"
                                                              , Darwin =
                                                                  "darwin"
                                                              , Dragonfly =
                                                                  "dragonfly"
                                                              , FreeBSD =
                                                                  "freebsd"
                                                              , Haiku = "haiku"
                                                              , Hurd = "hurd"
                                                              , IOS = "darwin"
                                                              , Linux = "linux"
                                                              , NetBSD =
                                                                  "netbsd"
                                                              , NoOs = "none"
                                                              , OpenBSD =
                                                                  "openbsd"
                                                              , Redox = "redox"
                                                              , Solaris =
                                                                  "solaris"
                                                              , Windows = "w64"
                                                              }
                                                              _.os}${merge
                                                                       { None =
                                                                           ""
                                                                       , Some =
                                                                           λ ( abi
                                                                             : < GNU
                                                                               | GNUabi64
                                                                               | GNUeabi
                                                                               | GNUeabihf
                                                                               | GNUspe
                                                                               | MinGw
                                                                               >
                                                                             ) →
                                                                             "-${merge
                                                                                   { GNU =
                                                                                       "gnu"
                                                                                   , GNUabi64 =
                                                                                       "gnuabi64"
                                                                                   , GNUeabi =
                                                                                       "gnueabi"
                                                                                   , GNUeabihf =
                                                                                       "gnueabihf"
                                                                                   , GNUspe =
                                                                                       "gnuspe"
                                                                                   , MinGw =
                                                                                       "mingw32"
                                                                                   }
                                                                                   abi}"
                                                                       }
                                                                       _.abi}"
                              }
                              cfg.targetTriple
                          )
                      )
                , environment = Some
                    (   ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                      # [ { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.linkDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-L${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-L${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${if    merge
                                                        { AIX = False
                                                        , Android = False
                                                        , Darwin = True
                                                        , Dragonfly = False
                                                        , FreeBSD = False
                                                        , Haiku = False
                                                        , Hurd = False
                                                        , IOS = False
                                                        , Linux = False
                                                        , NetBSD = False
                                                        , NoOs = False
                                                        , OpenBSD = False
                                                        , Redox = False
                                                        , Solaris = False
                                                        , Windows = False
                                                        }
                                                        cfg.buildOS
                                                then  ""
                                                else  " -Wl,-rpath-link,${_@1}"}${_}"
                                         )
                                         ""}"
                          , var = "LDFLAGS"
                          }
                        , { value =
                              "${merge
                                   { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                   ( List/fold
                                       Text
                                       cfg.includeDirs
                                       < Empty | NonEmpty : Text >
                                       ( λ(_ : Text) →
                                         λ(_ : < Empty | NonEmpty : Text >) →
                                           merge
                                             { Empty =
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "-I${_@1}"
                                             , NonEmpty =
                                                 λ(_ : Text) →
                                                   < Empty
                                                   | NonEmpty : Text
                                                   >.NonEmpty
                                                     "-I${_@2} ${_}"
                                             }
                                             _
                                       )
                                       < Empty | NonEmpty : Text >.Empty
                                   )}${if cfg.static then " -static" else ""}"
                          , var = "CPPFLAGS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.shareDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "XDG_DATA_DIRS"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.preloadLibs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2} ${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_PRELOAD"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/site_perl/5.30.2/${merge
                                                                             { AArch =
                                                                                 "aarch64"
                                                                             , Alpha =
                                                                                 "alpha"
                                                                             , Arm =
                                                                                 "arm"
                                                                             , HPPA =
                                                                                 "hppa"
                                                                             , HPPA64 =
                                                                                 "hppa64"
                                                                             , M68k =
                                                                                 "m68k"
                                                                             , Mips =
                                                                                 "mips"
                                                                             , Mips64 =
                                                                                 "mips64"
                                                                             , Mips64El =
                                                                                 "mips64el"
                                                                             , MipsEl =
                                                                                 "mipsel"
                                                                             , MipsIsa32r6 =
                                                                                 "mipsisa32r6"
                                                                             , MipsIsa32r6El =
                                                                                 "mipsisa32r6el"
                                                                             , MipsIsa64r6 =
                                                                                 "mipsisa64r6"
                                                                             , MipsIsa64r6El =
                                                                                 "mipsisa64r6el"
                                                                             , PowerPC =
                                                                                 "powerpc"
                                                                             , PowerPC64 =
                                                                                 "powerpc64"
                                                                             , PowerPC64le =
                                                                                 "powerpc64le"
                                                                             , RISCV64 =
                                                                                 "riscv64"
                                                                             , S390x =
                                                                                 "s390x"
                                                                             , SH4 =
                                                                                 "sh4"
                                                                             , Sparc64 =
                                                                                 "sparc64"
                                                                             , X64 =
                                                                                 "x86_64"
                                                                             , X86 =
                                                                                 "i686"
                                                                             }
                                                                             cfg.buildArch}-${merge
                                                                                                { AIX =
                                                                                                    "aix"
                                                                                                , Android =
                                                                                                    "android"
                                                                                                , Darwin =
                                                                                                    "darwin"
                                                                                                , Dragonfly =
                                                                                                    "dragonfly"
                                                                                                , FreeBSD =
                                                                                                    "freebsd"
                                                                                                , Haiku =
                                                                                                    "haiku"
                                                                                                , Hurd =
                                                                                                    "hurd"
                                                                                                , IOS =
                                                                                                    "darwin"
                                                                                                , Linux =
                                                                                                    "linux"
                                                                                                , NetBSD =
                                                                                                    "netbsd"
                                                                                                , NoOs =
                                                                                                    "none"
                                                                                                , OpenBSD =
                                                                                                    "openbsd"
                                                                                                , Redox =
                                                                                                    "redox"
                                                                                                , Solaris =
                                                                                                    "solaris"
                                                                                                , Windows =
                                                                                                    "w64"
                                                                                                }
                                                                                                cfg.buildOS}/"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/site_perl/5.30.2/${merge
                                                                               { AArch =
                                                                                   "aarch64"
                                                                               , Alpha =
                                                                                   "alpha"
                                                                               , Arm =
                                                                                   "arm"
                                                                               , HPPA =
                                                                                   "hppa"
                                                                               , HPPA64 =
                                                                                   "hppa64"
                                                                               , M68k =
                                                                                   "m68k"
                                                                               , Mips =
                                                                                   "mips"
                                                                               , Mips64 =
                                                                                   "mips64"
                                                                               , Mips64El =
                                                                                   "mips64el"
                                                                               , MipsEl =
                                                                                   "mipsel"
                                                                               , MipsIsa32r6 =
                                                                                   "mipsisa32r6"
                                                                               , MipsIsa32r6El =
                                                                                   "mipsisa32r6el"
                                                                               , MipsIsa64r6 =
                                                                                   "mipsisa64r6"
                                                                               , MipsIsa64r6El =
                                                                                   "mipsisa64r6el"
                                                                               , PowerPC =
                                                                                   "powerpc"
                                                                               , PowerPC64 =
                                                                                   "powerpc64"
                                                                               , PowerPC64le =
                                                                                   "powerpc64le"
                                                                               , RISCV64 =
                                                                                   "riscv64"
                                                                               , S390x =
                                                                                   "s390x"
                                                                               , SH4 =
                                                                                   "sh4"
                                                                               , Sparc64 =
                                                                                   "sparc64"
                                                                               , X64 =
                                                                                   "x86_64"
                                                                               , X86 =
                                                                                   "i686"
                                                                               }
                                                                               cfg.buildArch}-${merge
                                                                                                  { AIX =
                                                                                                      "aix"
                                                                                                  , Android =
                                                                                                      "android"
                                                                                                  , Darwin =
                                                                                                      "darwin"
                                                                                                  , Dragonfly =
                                                                                                      "dragonfly"
                                                                                                  , FreeBSD =
                                                                                                      "freebsd"
                                                                                                  , Haiku =
                                                                                                      "haiku"
                                                                                                  , Hurd =
                                                                                                      "hurd"
                                                                                                  , IOS =
                                                                                                      "darwin"
                                                                                                  , Linux =
                                                                                                      "linux"
                                                                                                  , NetBSD =
                                                                                                      "netbsd"
                                                                                                  , NoOs =
                                                                                                      "none"
                                                                                                  , OpenBSD =
                                                                                                      "openbsd"
                                                                                                  , Redox =
                                                                                                      "redox"
                                                                                                  , Solaris =
                                                                                                      "solaris"
                                                                                                  , Windows =
                                                                                                      "w64"
                                                                                                  }
                                                                                                  cfg.buildOS}/:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PERL5LIB"
                          }
                        ]
                    )
                , procDir = None Text
                , program =
                    if    merge
                            { AIX = False
                            , Android = False
                            , Darwin = True
                            , Dragonfly = False
                            , FreeBSD = False
                            , Haiku = False
                            , Hurd = False
                            , IOS = False
                            , Linux = False
                            , NetBSD = False
                            , NoOs = False
                            , OpenBSD = False
                            , Redox = False
                            , Solaris = False
                            , Windows = False
                            }
                            cfg.buildOS
                    then  "sh"
                    else  "./configure"
                }
            ]
      , preloadEnv =
          λ(_ : List Text) →
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            Some
              (   ( if    merge
                            { AIX = True
                            , Android = True
                            , Darwin = True
                            , Dragonfly = True
                            , FreeBSD = True
                            , Haiku = False
                            , Hurd = True
                            , IOS = True
                            , Linux = True
                            , NetBSD = True
                            , NoOs = False
                            , OpenBSD = True
                            , Redox = False
                            , Solaris = True
                            , Windows = False
                            }
                            cfg.buildOS
                    then  [ { value =
                                "${List/fold
                                     Text
                                     cfg.binDirs
                                     Text
                                     (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                     ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                            , var = "PATH"
                            }
                          ]
                    else  [] : List { value : Text, var : Text }
                  )
                # [ { value =
                        "${merge
                             { Empty = "", NonEmpty = λ(_ : Text) → _ }
                             ( List/fold
                                 Text
                                 cfg.linkDirs
                                 < Empty | NonEmpty : Text >
                                 ( λ(_ : Text) →
                                   λ(_ : < Empty | NonEmpty : Text >) →
                                     merge
                                       { Empty =
                                           < Empty | NonEmpty : Text >.NonEmpty
                                             "-L${_@1}"
                                       , NonEmpty =
                                           λ(_ : Text) →
                                             < Empty
                                             | NonEmpty : Text
                                             >.NonEmpty
                                               "-L${_@2} ${_}"
                                       }
                                       _
                                 )
                                 < Empty | NonEmpty : Text >.Empty
                             )}${List/fold
                                   Text
                                   cfg.linkDirs
                                   Text
                                   ( λ(_ : Text) →
                                     λ(_ : Text) →
                                       "${if    merge
                                                  { AIX = False
                                                  , Android = False
                                                  , Darwin = True
                                                  , Dragonfly = False
                                                  , FreeBSD = False
                                                  , Haiku = False
                                                  , Hurd = False
                                                  , IOS = False
                                                  , Linux = False
                                                  , NetBSD = False
                                                  , NoOs = False
                                                  , OpenBSD = False
                                                  , Redox = False
                                                  , Solaris = False
                                                  , Windows = False
                                                  }
                                                  cfg.buildOS
                                          then  ""
                                          else  " -Wl,-rpath-link,${_@1}"}${_}"
                                   )
                                   ""}"
                    , var = "LDFLAGS"
                    }
                  , { value =
                        "${merge
                             { Empty = "", NonEmpty = λ(_ : Text) → _ }
                             ( List/fold
                                 Text
                                 cfg.includeDirs
                                 < Empty | NonEmpty : Text >
                                 ( λ(_ : Text) →
                                   λ(_ : < Empty | NonEmpty : Text >) →
                                     merge
                                       { Empty =
                                           < Empty | NonEmpty : Text >.NonEmpty
                                             "-I${_@1}"
                                       , NonEmpty =
                                           λ(_ : Text) →
                                             < Empty
                                             | NonEmpty : Text
                                             >.NonEmpty
                                               "-I${_@2} ${_}"
                                       }
                                       _
                                 )
                                 < Empty | NonEmpty : Text >.Empty
                             )}${if cfg.static then " -static" else ""}"
                    , var = "CPPFLAGS"
                    }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.linkDirs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty
                                          "${_@1}/pkgconfig"
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}/pkgconfig:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "PKG_CONFIG_PATH"
                    }
                  , if    cfg.static
                    then  { value =
                              "${List/fold
                                   Text
                                   cfg.linkDirs
                                   Text
                                   (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                                   ""}/usr/local/lib:/lib:/usr/lib"
                          , var = "LIBRARY_PATH"
                          }
                    else  { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                _@1
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "LD_LIBRARY_PATH"
                          }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.shareDirs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty _@1
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "XDG_DATA_DIRS"
                    }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.preloadLibs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty _@1
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2} ${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "LD_PRELOAD"
                    }
                  , { value =
                        merge
                          { Empty = "", NonEmpty = λ(_ : Text) → _ }
                          ( List/fold
                              Text
                              cfg.linkDirs
                              < Empty | NonEmpty : Text >
                              ( λ(_ : Text) →
                                λ(_ : < Empty | NonEmpty : Text >) →
                                  merge
                                    { Empty =
                                        < Empty | NonEmpty : Text >.NonEmpty
                                          "${_@1}/site_perl/5.30.2/${merge
                                                                       { AArch =
                                                                           "aarch64"
                                                                       , Alpha =
                                                                           "alpha"
                                                                       , Arm =
                                                                           "arm"
                                                                       , HPPA =
                                                                           "hppa"
                                                                       , HPPA64 =
                                                                           "hppa64"
                                                                       , M68k =
                                                                           "m68k"
                                                                       , Mips =
                                                                           "mips"
                                                                       , Mips64 =
                                                                           "mips64"
                                                                       , Mips64El =
                                                                           "mips64el"
                                                                       , MipsEl =
                                                                           "mipsel"
                                                                       , MipsIsa32r6 =
                                                                           "mipsisa32r6"
                                                                       , MipsIsa32r6El =
                                                                           "mipsisa32r6el"
                                                                       , MipsIsa64r6 =
                                                                           "mipsisa64r6"
                                                                       , MipsIsa64r6El =
                                                                           "mipsisa64r6el"
                                                                       , PowerPC =
                                                                           "powerpc"
                                                                       , PowerPC64 =
                                                                           "powerpc64"
                                                                       , PowerPC64le =
                                                                           "powerpc64le"
                                                                       , RISCV64 =
                                                                           "riscv64"
                                                                       , S390x =
                                                                           "s390x"
                                                                       , SH4 =
                                                                           "sh4"
                                                                       , Sparc64 =
                                                                           "sparc64"
                                                                       , X64 =
                                                                           "x86_64"
                                                                       , X86 =
                                                                           "i686"
                                                                       }
                                                                       cfg.buildArch}-${merge
                                                                                          { AIX =
                                                                                              "aix"
                                                                                          , Android =
                                                                                              "android"
                                                                                          , Darwin =
                                                                                              "darwin"
                                                                                          , Dragonfly =
                                                                                              "dragonfly"
                                                                                          , FreeBSD =
                                                                                              "freebsd"
                                                                                          , Haiku =
                                                                                              "haiku"
                                                                                          , Hurd =
                                                                                              "hurd"
                                                                                          , IOS =
                                                                                              "darwin"
                                                                                          , Linux =
                                                                                              "linux"
                                                                                          , NetBSD =
                                                                                              "netbsd"
                                                                                          , NoOs =
                                                                                              "none"
                                                                                          , OpenBSD =
                                                                                              "openbsd"
                                                                                          , Redox =
                                                                                              "redox"
                                                                                          , Solaris =
                                                                                              "solaris"
                                                                                          , Windows =
                                                                                              "w64"
                                                                                          }
                                                                                          cfg.buildOS}/"
                                    , NonEmpty =
                                        λ(_ : Text) →
                                          < Empty | NonEmpty : Text >.NonEmpty
                                            "${_@2}/site_perl/5.30.2/${merge
                                                                         { AArch =
                                                                             "aarch64"
                                                                         , Alpha =
                                                                             "alpha"
                                                                         , Arm =
                                                                             "arm"
                                                                         , HPPA =
                                                                             "hppa"
                                                                         , HPPA64 =
                                                                             "hppa64"
                                                                         , M68k =
                                                                             "m68k"
                                                                         , Mips =
                                                                             "mips"
                                                                         , Mips64 =
                                                                             "mips64"
                                                                         , Mips64El =
                                                                             "mips64el"
                                                                         , MipsEl =
                                                                             "mipsel"
                                                                         , MipsIsa32r6 =
                                                                             "mipsisa32r6"
                                                                         , MipsIsa32r6El =
                                                                             "mipsisa32r6el"
                                                                         , MipsIsa64r6 =
                                                                             "mipsisa64r6"
                                                                         , MipsIsa64r6El =
                                                                             "mipsisa64r6el"
                                                                         , PowerPC =
                                                                             "powerpc"
                                                                         , PowerPC64 =
                                                                             "powerpc64"
                                                                         , PowerPC64le =
                                                                             "powerpc64le"
                                                                         , RISCV64 =
                                                                             "riscv64"
                                                                         , S390x =
                                                                             "s390x"
                                                                         , SH4 =
                                                                             "sh4"
                                                                         , Sparc64 =
                                                                             "sparc64"
                                                                         , X64 =
                                                                             "x86_64"
                                                                         , X86 =
                                                                             "i686"
                                                                         }
                                                                         cfg.buildArch}-${merge
                                                                                            { AIX =
                                                                                                "aix"
                                                                                            , Android =
                                                                                                "android"
                                                                                            , Darwin =
                                                                                                "darwin"
                                                                                            , Dragonfly =
                                                                                                "dragonfly"
                                                                                            , FreeBSD =
                                                                                                "freebsd"
                                                                                            , Haiku =
                                                                                                "haiku"
                                                                                            , Hurd =
                                                                                                "hurd"
                                                                                            , IOS =
                                                                                                "darwin"
                                                                                            , Linux =
                                                                                                "linux"
                                                                                            , NetBSD =
                                                                                                "netbsd"
                                                                                            , NoOs =
                                                                                                "none"
                                                                                            , OpenBSD =
                                                                                                "openbsd"
                                                                                            , Redox =
                                                                                                "redox"
                                                                                            , Solaris =
                                                                                                "solaris"
                                                                                            , Windows =
                                                                                                "w64"
                                                                                            }
                                                                                            cfg.buildOS}/:${_}"
                                    }
                                    _
                              )
                              < Empty | NonEmpty : Text >.Empty
                          )
                    , var = "PERL5LIB"
                    }
                  ]
              )
      , printArch =
          λ ( arch
            : < AArch
              | Alpha
              | Arm
              | HPPA
              | HPPA64
              | M68k
              | Mips
              | Mips64
              | Mips64El
              | MipsEl
              | MipsIsa32r6
              | MipsIsa32r6El
              | MipsIsa64r6
              | MipsIsa64r6El
              | PowerPC
              | PowerPC64
              | PowerPC64le
              | RISCV64
              | S390x
              | SH4
              | Sparc64
              | X64
              | X86
              >
            ) →
            merge
              { AArch = "aarch64"
              , Alpha = "alpha"
              , Arm = "arm"
              , HPPA = "hppa"
              , HPPA64 = "hppa64"
              , M68k = "m68k"
              , Mips = "mips"
              , Mips64 = "mips64"
              , Mips64El = "mips64el"
              , MipsEl = "mipsel"
              , MipsIsa32r6 = "mipsisa32r6"
              , MipsIsa32r6El = "mipsisa32r6el"
              , MipsIsa64r6 = "mipsisa64r6"
              , MipsIsa64r6El = "mipsisa64r6el"
              , PowerPC = "powerpc"
              , PowerPC64 = "powerpc64"
              , PowerPC64le = "powerpc64le"
              , RISCV64 = "riscv64"
              , S390x = "s390x"
              , SH4 = "sh4"
              , Sparc64 = "sparc64"
              , X64 = "x86_64"
              , X86 = "i686"
              }
              arch
      , printEnvVar =
          λ(var : { value : Text, var : Text }) → "${var.var}=${var.value}"
      , printManufacturer =
          λ(x : < Apple | IBM | PC | Unknown >) →
            merge
              { Apple = "apple", IBM = "ibm", PC = "pc", Unknown = "unknown" }
              x
      , printOS =
          λ ( os
            : < AIX
              | Android
              | Darwin
              | Dragonfly
              | FreeBSD
              | Haiku
              | Hurd
              | IOS
              | Linux
              | NetBSD
              | NoOs
              | OpenBSD
              | Redox
              | Solaris
              | Windows
              >
            ) →
            merge
              { AIX = "aix"
              , Android = "android"
              , Darwin = "darwin"
              , Dragonfly = "dragonfly"
              , FreeBSD = "freebsd"
              , Haiku = "haiku"
              , Hurd = "hurd"
              , IOS = "darwin"
              , Linux = "linux"
              , NetBSD = "netbsd"
              , NoOs = "none"
              , OpenBSD = "openbsd"
              , Redox = "redox"
              , Solaris = "solaris"
              , Windows = "w64"
              }
              os
      , printTargetTriple =
          λ ( t
            : { abi :
                  Optional
                    < GNU | GNUabi64 | GNUeabi | GNUeabihf | GNUspe | MinGw >
              , arch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , manufacturer : Optional < Apple | IBM | PC | Unknown >
              , os :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              }
            ) →
            "${merge
                 { AArch = "aarch64"
                 , Alpha = "alpha"
                 , Arm = "arm"
                 , HPPA = "hppa"
                 , HPPA64 = "hppa64"
                 , M68k = "m68k"
                 , Mips = "mips"
                 , Mips64 = "mips64"
                 , Mips64El = "mips64el"
                 , MipsEl = "mipsel"
                 , MipsIsa32r6 = "mipsisa32r6"
                 , MipsIsa32r6El = "mipsisa32r6el"
                 , MipsIsa64r6 = "mipsisa64r6"
                 , MipsIsa64r6El = "mipsisa64r6el"
                 , PowerPC = "powerpc"
                 , PowerPC64 = "powerpc64"
                 , PowerPC64le = "powerpc64le"
                 , RISCV64 = "riscv64"
                 , S390x = "s390x"
                 , SH4 = "sh4"
                 , Sparc64 = "sparc64"
                 , X64 = "x86_64"
                 , X86 = "i686"
                 }
                 t.arch}-${merge
                             { AIX = "aix"
                             , Android = "android"
                             , Darwin = "darwin"
                             , Dragonfly = "dragonfly"
                             , FreeBSD = "freebsd"
                             , Haiku = "haiku"
                             , Hurd = "hurd"
                             , IOS = "darwin"
                             , Linux = "linux"
                             , NetBSD = "netbsd"
                             , NoOs = "none"
                             , OpenBSD = "openbsd"
                             , Redox = "redox"
                             , Solaris = "solaris"
                             , Windows = "w64"
                             }
                             t.os}${merge
                                      { None = ""
                                      , Some =
                                          λ ( abi
                                            : < GNU
                                              | GNUabi64
                                              | GNUeabi
                                              | GNUeabihf
                                              | GNUspe
                                              | MinGw
                                              >
                                            ) →
                                            "-${merge
                                                  { GNU = "gnu"
                                                  , GNUabi64 = "gnuabi64"
                                                  , GNUeabi = "gnueabi"
                                                  , GNUeabihf = "gnueabihf"
                                                  , GNUspe = "gnuspe"
                                                  , MinGw = "mingw32"
                                                  }
                                                  abi}"
                                      }
                                      t.abi}"
      , python2Package =
          λ(x : { name : Text, version : List Natural }) →
            { buildCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.CreateDirectory
                      { dir = "${cfg.installDir}/lib/python2.7/site-packages" }
                  , < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments = [ "setup.py", "build" ]
                      , environment = Some
                          (   [ { value =
                                    "${cfg.installDir}/lib/python2.7/site-packages"
                                , var = "PYTHONPATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              ]
                            # ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                          )
                      , procDir = None Text
                      , program = "python2"
                      }
                  ]
            , configureCommand =
                λ ( _
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
            , installCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.CreateDirectory
                      { dir = "${cfg.installDir}/lib/python2.7/site-packages" }
                  , < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments =
                        [ "setup.py"
                        , "install"
                        , "--prefix=${cfg.installDir}"
                        , "--optimize=1"
                        ]
                      , environment = Some
                          (   [ { value =
                                    "${cfg.installDir}/lib/python2.7/site-packages"
                                , var = "PYTHONPATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              ]
                            # ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                          )
                      , procDir = None Text
                      , program = "python2"
                      }
                  ]
            , pkgBuildDeps =
              [ { bound =
                    < Lower : { lower : List Natural }
                    | LowerUpper :
                        { lower : List Natural, upper : List Natural }
                    | NoBound
                    | Upper : { upper : List Natural }
                    >.NoBound
                , name = "python2"
                }
              ]
            , pkgDeps =
                [] : List
                       { bound :
                           < Lower : { lower : List Natural }
                           | LowerUpper :
                               { lower : List Natural, upper : List Natural }
                           | NoBound
                           | Upper : { upper : List Natural }
                           >
                       , name : Text
                       }
            , pkgName = x.name
            , pkgSubdir =
                "${x.name}-${merge
                               { Empty = "", NonEmpty = λ(_ : Text) → _ }
                               ( List/fold
                                   Natural
                                   x.version
                                   < Empty | NonEmpty : Text >
                                   ( λ(_ : Natural) →
                                     λ(_ : < Empty | NonEmpty : Text >) →
                                       merge
                                         { Empty =
                                             < Empty
                                             | NonEmpty : Text
                                             >.NonEmpty
                                               (Natural/show _@1)
                                         , NonEmpty =
                                             λ(_ : Text) →
                                               < Empty
                                               | NonEmpty : Text
                                               >.NonEmpty
                                                 "${Natural/show _@2}.${_}"
                                         }
                                         _
                                   )
                                   < Empty | NonEmpty : Text >.Empty
                               )}"
            , pkgVersion = x.version
            }
      , python3Build =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "${cfg.installDir}/lib/python3.8/site-packages" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments = [ "setup.py", "build" ]
                , environment = Some
                    (   [ { value =
                              "${cfg.installDir}/lib/python3.8/site-packages"
                          , var = "PYTHONPATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = None Text
                , program = "python3"
                }
            ]
      , python3Install =
          λ ( cfg
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            [ < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.CreateDirectory
                { dir = "${cfg.installDir}/lib/python3.8/site-packages" }
            , < Call :
                  { arguments : List Text
                  , environment : Optional (List { value : Text, var : Text })
                  , procDir : Optional Text
                  , program : Text
                  }
              | CopyFile : { dest : Text, src : Text }
              | CreateDirectory : { dir : Text }
              | MakeExecutable : { file : Text }
              | Patch : { patchContents : Text }
              | Symlink : { linkName : Text, tgt : Text }
              | SymlinkBinary : { file : Text }
              | SymlinkManpage : { file : Text, section : Natural }
              | Write : { contents : Text, file : Text }
              >.Call
                { arguments =
                  [ "setup.py"
                  , "install"
                  , "--prefix=${cfg.installDir}"
                  , "--optimize=1"
                  ]
                , environment = Some
                    (   [ { value =
                              "${cfg.installDir}/lib/python3.8/site-packages"
                          , var = "PYTHONPATH"
                          }
                        , { value =
                              merge
                                { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                ( List/fold
                                    Text
                                    cfg.linkDirs
                                    < Empty | NonEmpty : Text >
                                    ( λ(_ : Text) →
                                      λ(_ : < Empty | NonEmpty : Text >) →
                                        merge
                                          { Empty =
                                              < Empty
                                              | NonEmpty : Text
                                              >.NonEmpty
                                                "${_@1}/pkgconfig"
                                          , NonEmpty =
                                              λ(_ : Text) →
                                                < Empty
                                                | NonEmpty : Text
                                                >.NonEmpty
                                                  "${_@2}/pkgconfig:${_}"
                                          }
                                          _
                                    )
                                    < Empty | NonEmpty : Text >.Empty
                                )
                          , var = "PKG_CONFIG_PATH"
                          }
                        , if    cfg.static
                          then  { value =
                                    "${List/fold
                                         Text
                                         cfg.linkDirs
                                         Text
                                         ( λ(_ : Text) →
                                           λ(_ : Text) →
                                             "${_@1}:${_}"
                                         )
                                         ""}/usr/local/lib:/lib:/usr/lib"
                                , var = "LIBRARY_PATH"
                                }
                          else  { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                        ]
                      # ( if    merge
                                  { AIX = True
                                  , Android = True
                                  , Darwin = True
                                  , Dragonfly = True
                                  , FreeBSD = True
                                  , Haiku = False
                                  , Hurd = True
                                  , IOS = True
                                  , Linux = True
                                  , NetBSD = True
                                  , NoOs = False
                                  , OpenBSD = True
                                  , Redox = False
                                  , Solaris = True
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  [ { value =
                                      "${List/fold
                                           Text
                                           cfg.binDirs
                                           Text
                                           ( λ(_ : Text) →
                                             λ(_ : Text) →
                                               "${_@1}:${_}"
                                           )
                                           ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                  , var = "PATH"
                                  }
                                ]
                          else  [] : List { value : Text, var : Text }
                        )
                    )
                , procDir = None Text
                , program = "python3"
                }
            ]
      , python3Package =
          λ(x : { name : Text, version : List Natural }) →
            { buildCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.CreateDirectory
                      { dir = "${cfg.installDir}/lib/python3.8/site-packages" }
                  , < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments = [ "setup.py", "build" ]
                      , environment = Some
                          (   [ { value =
                                    "${cfg.installDir}/lib/python3.8/site-packages"
                                , var = "PYTHONPATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              ]
                            # ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                          )
                      , procDir = None Text
                      , program = "python3"
                      }
                  ]
            , configureCommand =
                λ ( _
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [] : List
                         < Call :
                             { arguments : List Text
                             , environment :
                                 Optional (List { value : Text, var : Text })
                             , procDir : Optional Text
                             , program : Text
                             }
                         | CopyFile : { dest : Text, src : Text }
                         | CreateDirectory : { dir : Text }
                         | MakeExecutable : { file : Text }
                         | Patch : { patchContents : Text }
                         | Symlink : { linkName : Text, tgt : Text }
                         | SymlinkBinary : { file : Text }
                         | SymlinkManpage : { file : Text, section : Natural }
                         | Write : { contents : Text, file : Text }
                         >
            , installCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.CreateDirectory
                      { dir = "${cfg.installDir}/lib/python3.8/site-packages" }
                  , < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments =
                        [ "setup.py"
                        , "install"
                        , "--prefix=${cfg.installDir}"
                        , "--optimize=1"
                        ]
                      , environment = Some
                          (   [ { value =
                                    "${cfg.installDir}/lib/python3.8/site-packages"
                                , var = "PYTHONPATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              ]
                            # ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                          )
                      , procDir = None Text
                      , program = "python3"
                      }
                  ]
            , pkgBuildDeps =
              [ { bound =
                    < Lower : { lower : List Natural }
                    | LowerUpper :
                        { lower : List Natural, upper : List Natural }
                    | NoBound
                    | Upper : { upper : List Natural }
                    >.NoBound
                , name = "python3"
                }
              ]
            , pkgDeps =
                [] : List
                       { bound :
                           < Lower : { lower : List Natural }
                           | LowerUpper :
                               { lower : List Natural, upper : List Natural }
                           | NoBound
                           | Upper : { upper : List Natural }
                           >
                       , name : Text
                       }
            , pkgName = x.name
            , pkgSubdir =
                "${x.name}-${merge
                               { Empty = "", NonEmpty = λ(_ : Text) → _ }
                               ( List/fold
                                   Natural
                                   x.version
                                   < Empty | NonEmpty : Text >
                                   ( λ(_ : Natural) →
                                     λ(_ : < Empty | NonEmpty : Text >) →
                                       merge
                                         { Empty =
                                             < Empty
                                             | NonEmpty : Text
                                             >.NonEmpty
                                               (Natural/show _@1)
                                         , NonEmpty =
                                             λ(_ : Text) →
                                               < Empty
                                               | NonEmpty : Text
                                               >.NonEmpty
                                                 "${Natural/show _@2}.${_}"
                                         }
                                         _
                                   )
                                   < Empty | NonEmpty : Text >.Empty
                               )}"
            , pkgVersion = x.version
            }
      , showVersion =
          λ(_ : List Natural) →
            merge
              { Empty = "", NonEmpty = λ(_ : Text) → _ }
              ( List/fold
                  Natural
                  _
                  < Empty | NonEmpty : Text >
                  ( λ(_ : Natural) →
                    λ(_ : < Empty | NonEmpty : Text >) →
                      merge
                        { Empty =
                            < Empty | NonEmpty : Text >.NonEmpty
                              (Natural/show _@1)
                        , NonEmpty =
                            λ(_ : Text) →
                              < Empty | NonEmpty : Text >.NonEmpty
                                "${Natural/show _@2}.${_}"
                        }
                        _
                  )
                  < Empty | NonEmpty : Text >.Empty
              )
      , simplePackage =
          λ(pkg : { name : Text, version : List Natural }) →
            { buildCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments = [ "-j${Natural/show cfg.cpus}" ]
                      , environment = Some
                          (   ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                            # [ { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          (cfg.shareDirs # cfg.linkDirs)
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/site_perl/5.30.2/${merge
                                                                                   { AArch =
                                                                                       "aarch64"
                                                                                   , Alpha =
                                                                                       "alpha"
                                                                                   , Arm =
                                                                                       "arm"
                                                                                   , HPPA =
                                                                                       "hppa"
                                                                                   , HPPA64 =
                                                                                       "hppa64"
                                                                                   , M68k =
                                                                                       "m68k"
                                                                                   , Mips =
                                                                                       "mips"
                                                                                   , Mips64 =
                                                                                       "mips64"
                                                                                   , Mips64El =
                                                                                       "mips64el"
                                                                                   , MipsEl =
                                                                                       "mipsel"
                                                                                   , MipsIsa32r6 =
                                                                                       "mipsisa32r6"
                                                                                   , MipsIsa32r6El =
                                                                                       "mipsisa32r6el"
                                                                                   , MipsIsa64r6 =
                                                                                       "mipsisa64r6"
                                                                                   , MipsIsa64r6El =
                                                                                       "mipsisa64r6el"
                                                                                   , PowerPC =
                                                                                       "powerpc"
                                                                                   , PowerPC64 =
                                                                                       "powerpc64"
                                                                                   , PowerPC64le =
                                                                                       "powerpc64le"
                                                                                   , RISCV64 =
                                                                                       "riscv64"
                                                                                   , S390x =
                                                                                       "s390x"
                                                                                   , SH4 =
                                                                                       "sh4"
                                                                                   , Sparc64 =
                                                                                       "sparc64"
                                                                                   , X64 =
                                                                                       "x86_64"
                                                                                   , X86 =
                                                                                       "i686"
                                                                                   }
                                                                                   cfg.buildArch}-${merge
                                                                                                      { AIX =
                                                                                                          "aix"
                                                                                                      , Android =
                                                                                                          "android"
                                                                                                      , Darwin =
                                                                                                          "darwin"
                                                                                                      , Dragonfly =
                                                                                                          "dragonfly"
                                                                                                      , FreeBSD =
                                                                                                          "freebsd"
                                                                                                      , Haiku =
                                                                                                          "haiku"
                                                                                                      , Hurd =
                                                                                                          "hurd"
                                                                                                      , IOS =
                                                                                                          "darwin"
                                                                                                      , Linux =
                                                                                                          "linux"
                                                                                                      , NetBSD =
                                                                                                          "netbsd"
                                                                                                      , NoOs =
                                                                                                          "none"
                                                                                                      , OpenBSD =
                                                                                                          "openbsd"
                                                                                                      , Redox =
                                                                                                          "redox"
                                                                                                      , Solaris =
                                                                                                          "solaris"
                                                                                                      , Windows =
                                                                                                          "w64"
                                                                                                      }
                                                                                                      cfg.buildOS}/"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/site_perl/5.30.2/${merge
                                                                                     { AArch =
                                                                                         "aarch64"
                                                                                     , Alpha =
                                                                                         "alpha"
                                                                                     , Arm =
                                                                                         "arm"
                                                                                     , HPPA =
                                                                                         "hppa"
                                                                                     , HPPA64 =
                                                                                         "hppa64"
                                                                                     , M68k =
                                                                                         "m68k"
                                                                                     , Mips =
                                                                                         "mips"
                                                                                     , Mips64 =
                                                                                         "mips64"
                                                                                     , Mips64El =
                                                                                         "mips64el"
                                                                                     , MipsEl =
                                                                                         "mipsel"
                                                                                     , MipsIsa32r6 =
                                                                                         "mipsisa32r6"
                                                                                     , MipsIsa32r6El =
                                                                                         "mipsisa32r6el"
                                                                                     , MipsIsa64r6 =
                                                                                         "mipsisa64r6"
                                                                                     , MipsIsa64r6El =
                                                                                         "mipsisa64r6el"
                                                                                     , PowerPC =
                                                                                         "powerpc"
                                                                                     , PowerPC64 =
                                                                                         "powerpc64"
                                                                                     , PowerPC64le =
                                                                                         "powerpc64le"
                                                                                     , RISCV64 =
                                                                                         "riscv64"
                                                                                     , S390x =
                                                                                         "s390x"
                                                                                     , SH4 =
                                                                                         "sh4"
                                                                                     , Sparc64 =
                                                                                         "sparc64"
                                                                                     , X64 =
                                                                                         "x86_64"
                                                                                     , X86 =
                                                                                         "i686"
                                                                                     }
                                                                                     cfg.buildArch}-${merge
                                                                                                        { AIX =
                                                                                                            "aix"
                                                                                                        , Android =
                                                                                                            "android"
                                                                                                        , Darwin =
                                                                                                            "darwin"
                                                                                                        , Dragonfly =
                                                                                                            "dragonfly"
                                                                                                        , FreeBSD =
                                                                                                            "freebsd"
                                                                                                        , Haiku =
                                                                                                            "haiku"
                                                                                                        , Hurd =
                                                                                                            "hurd"
                                                                                                        , IOS =
                                                                                                            "darwin"
                                                                                                        , Linux =
                                                                                                            "linux"
                                                                                                        , NetBSD =
                                                                                                            "netbsd"
                                                                                                        , NoOs =
                                                                                                            "none"
                                                                                                        , OpenBSD =
                                                                                                            "openbsd"
                                                                                                        , Redox =
                                                                                                            "redox"
                                                                                                        , Solaris =
                                                                                                            "solaris"
                                                                                                        , Windows =
                                                                                                            "w64"
                                                                                                        }
                                                                                                        cfg.buildOS}/:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PERL5LIB"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              ]
                          )
                      , procDir = None Text
                      , program =
                          merge
                            { AIX = "make"
                            , Android = "make"
                            , Darwin = "make"
                            , Dragonfly = "gmake"
                            , FreeBSD = "gmake"
                            , Haiku = "make"
                            , Hurd = "make"
                            , IOS = "make"
                            , Linux = "make"
                            , NetBSD = "gmake"
                            , NoOs = "make"
                            , OpenBSD = "gmake"
                            , Redox = "make"
                            , Solaris = "gmake"
                            , Windows = "make"
                            }
                            cfg.buildOS
                      }
                  ]
            , configureCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments =
                          ( if    merge
                                    { AIX = False
                                    , Android = False
                                    , Darwin = True
                                    , Dragonfly = False
                                    , FreeBSD = False
                                    , Haiku = False
                                    , Hurd = False
                                    , IOS = False
                                    , Linux = False
                                    , NetBSD = False
                                    , NoOs = False
                                    , OpenBSD = False
                                    , Redox = False
                                    , Solaris = False
                                    , Windows = False
                                    }
                                    cfg.buildOS
                            then  λ(x : List Text) → [ "configure" ] # x
                            else  λ(x : List Text) → x
                          )
                            ( merge
                                { None = [ "--prefix=${cfg.installDir}" ]
                                , Some =
                                    λ(x : Text) →
                                      [ "--prefix=${cfg.installDir}", x ]
                                }
                                ( merge
                                    { None = None Text
                                    , Some =
                                        λ ( _
                                          : { abi :
                                                Optional
                                                  < GNU
                                                  | GNUabi64
                                                  | GNUeabi
                                                  | GNUeabihf
                                                  | GNUspe
                                                  | MinGw
                                                  >
                                            , arch :
                                                < AArch
                                                | Alpha
                                                | Arm
                                                | HPPA
                                                | HPPA64
                                                | M68k
                                                | Mips
                                                | Mips64
                                                | Mips64El
                                                | MipsEl
                                                | MipsIsa32r6
                                                | MipsIsa32r6El
                                                | MipsIsa64r6
                                                | MipsIsa64r6El
                                                | PowerPC
                                                | PowerPC64
                                                | PowerPC64le
                                                | RISCV64
                                                | S390x
                                                | SH4
                                                | Sparc64
                                                | X64
                                                | X86
                                                >
                                            , manufacturer :
                                                Optional
                                                  < Apple | IBM | PC | Unknown >
                                            , os :
                                                < AIX
                                                | Android
                                                | Darwin
                                                | Dragonfly
                                                | FreeBSD
                                                | Haiku
                                                | Hurd
                                                | IOS
                                                | Linux
                                                | NetBSD
                                                | NoOs
                                                | OpenBSD
                                                | Redox
                                                | Solaris
                                                | Windows
                                                >
                                            }
                                          ) →
                                          Some
                                            "--host=${merge
                                                        { AArch = "aarch64"
                                                        , Alpha = "alpha"
                                                        , Arm = "arm"
                                                        , HPPA = "hppa"
                                                        , HPPA64 = "hppa64"
                                                        , M68k = "m68k"
                                                        , Mips = "mips"
                                                        , Mips64 = "mips64"
                                                        , Mips64El = "mips64el"
                                                        , MipsEl = "mipsel"
                                                        , MipsIsa32r6 =
                                                            "mipsisa32r6"
                                                        , MipsIsa32r6El =
                                                            "mipsisa32r6el"
                                                        , MipsIsa64r6 =
                                                            "mipsisa64r6"
                                                        , MipsIsa64r6El =
                                                            "mipsisa64r6el"
                                                        , PowerPC = "powerpc"
                                                        , PowerPC64 =
                                                            "powerpc64"
                                                        , PowerPC64le =
                                                            "powerpc64le"
                                                        , RISCV64 = "riscv64"
                                                        , S390x = "s390x"
                                                        , SH4 = "sh4"
                                                        , Sparc64 = "sparc64"
                                                        , X64 = "x86_64"
                                                        , X86 = "i686"
                                                        }
                                                        _.arch}-${merge
                                                                    { AIX =
                                                                        "aix"
                                                                    , Android =
                                                                        "android"
                                                                    , Darwin =
                                                                        "darwin"
                                                                    , Dragonfly =
                                                                        "dragonfly"
                                                                    , FreeBSD =
                                                                        "freebsd"
                                                                    , Haiku =
                                                                        "haiku"
                                                                    , Hurd =
                                                                        "hurd"
                                                                    , IOS =
                                                                        "darwin"
                                                                    , Linux =
                                                                        "linux"
                                                                    , NetBSD =
                                                                        "netbsd"
                                                                    , NoOs =
                                                                        "none"
                                                                    , OpenBSD =
                                                                        "openbsd"
                                                                    , Redox =
                                                                        "redox"
                                                                    , Solaris =
                                                                        "solaris"
                                                                    , Windows =
                                                                        "w64"
                                                                    }
                                                                    _.os}${merge
                                                                             { None =
                                                                                 ""
                                                                             , Some =
                                                                                 λ ( abi
                                                                                   : < GNU
                                                                                     | GNUabi64
                                                                                     | GNUeabi
                                                                                     | GNUeabihf
                                                                                     | GNUspe
                                                                                     | MinGw
                                                                                     >
                                                                                   ) →
                                                                                   "-${merge
                                                                                         { GNU =
                                                                                             "gnu"
                                                                                         , GNUabi64 =
                                                                                             "gnuabi64"
                                                                                         , GNUeabi =
                                                                                             "gnueabi"
                                                                                         , GNUeabihf =
                                                                                             "gnueabihf"
                                                                                         , GNUspe =
                                                                                             "gnuspe"
                                                                                         , MinGw =
                                                                                             "mingw32"
                                                                                         }
                                                                                         abi}"
                                                                             }
                                                                             _.abi}"
                                    }
                                    cfg.targetTriple
                                )
                            )
                      , environment = Some
                          (   ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                            # [ { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.includeDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-I${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-I${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${if    cfg.static
                                             then  " -static"
                                             else  ""}"
                                , var = "CPPFLAGS"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          (cfg.shareDirs # cfg.linkDirs)
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , if    cfg.static
                                then  { value =
                                          "${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${_@1}:${_}"
                                               )
                                               ""}/usr/local/lib:/lib:/usr/lib"
                                      , var = "LIBRARY_PATH"
                                      }
                                else  { value =
                                          merge
                                            { Empty = ""
                                            , NonEmpty = λ(_ : Text) → _
                                            }
                                            ( List/fold
                                                Text
                                                cfg.linkDirs
                                                < Empty | NonEmpty : Text >
                                                ( λ(_ : Text) →
                                                  λ ( _
                                                    : < Empty
                                                      | NonEmpty : Text
                                                      >
                                                    ) →
                                                    merge
                                                      { Empty =
                                                          < Empty
                                                          | NonEmpty : Text
                                                          >.NonEmpty
                                                            _@1
                                                      , NonEmpty =
                                                          λ(_ : Text) →
                                                            < Empty
                                                            | NonEmpty : Text
                                                            >.NonEmpty
                                                              "${_@2}:${_}"
                                                      }
                                                      _
                                                )
                                                < Empty
                                                | NonEmpty : Text
                                                >.Empty
                                            )
                                      , var = "LD_LIBRARY_PATH"
                                      }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_RUN_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/site_perl/5.30.2/${merge
                                                                                   { AArch =
                                                                                       "aarch64"
                                                                                   , Alpha =
                                                                                       "alpha"
                                                                                   , Arm =
                                                                                       "arm"
                                                                                   , HPPA =
                                                                                       "hppa"
                                                                                   , HPPA64 =
                                                                                       "hppa64"
                                                                                   , M68k =
                                                                                       "m68k"
                                                                                   , Mips =
                                                                                       "mips"
                                                                                   , Mips64 =
                                                                                       "mips64"
                                                                                   , Mips64El =
                                                                                       "mips64el"
                                                                                   , MipsEl =
                                                                                       "mipsel"
                                                                                   , MipsIsa32r6 =
                                                                                       "mipsisa32r6"
                                                                                   , MipsIsa32r6El =
                                                                                       "mipsisa32r6el"
                                                                                   , MipsIsa64r6 =
                                                                                       "mipsisa64r6"
                                                                                   , MipsIsa64r6El =
                                                                                       "mipsisa64r6el"
                                                                                   , PowerPC =
                                                                                       "powerpc"
                                                                                   , PowerPC64 =
                                                                                       "powerpc64"
                                                                                   , PowerPC64le =
                                                                                       "powerpc64le"
                                                                                   , RISCV64 =
                                                                                       "riscv64"
                                                                                   , S390x =
                                                                                       "s390x"
                                                                                   , SH4 =
                                                                                       "sh4"
                                                                                   , Sparc64 =
                                                                                       "sparc64"
                                                                                   , X64 =
                                                                                       "x86_64"
                                                                                   , X86 =
                                                                                       "i686"
                                                                                   }
                                                                                   cfg.buildArch}-${merge
                                                                                                      { AIX =
                                                                                                          "aix"
                                                                                                      , Android =
                                                                                                          "android"
                                                                                                      , Darwin =
                                                                                                          "darwin"
                                                                                                      , Dragonfly =
                                                                                                          "dragonfly"
                                                                                                      , FreeBSD =
                                                                                                          "freebsd"
                                                                                                      , Haiku =
                                                                                                          "haiku"
                                                                                                      , Hurd =
                                                                                                          "hurd"
                                                                                                      , IOS =
                                                                                                          "darwin"
                                                                                                      , Linux =
                                                                                                          "linux"
                                                                                                      , NetBSD =
                                                                                                          "netbsd"
                                                                                                      , NoOs =
                                                                                                          "none"
                                                                                                      , OpenBSD =
                                                                                                          "openbsd"
                                                                                                      , Redox =
                                                                                                          "redox"
                                                                                                      , Solaris =
                                                                                                          "solaris"
                                                                                                      , Windows =
                                                                                                          "w64"
                                                                                                      }
                                                                                                      cfg.buildOS}/"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/site_perl/5.30.2/${merge
                                                                                     { AArch =
                                                                                         "aarch64"
                                                                                     , Alpha =
                                                                                         "alpha"
                                                                                     , Arm =
                                                                                         "arm"
                                                                                     , HPPA =
                                                                                         "hppa"
                                                                                     , HPPA64 =
                                                                                         "hppa64"
                                                                                     , M68k =
                                                                                         "m68k"
                                                                                     , Mips =
                                                                                         "mips"
                                                                                     , Mips64 =
                                                                                         "mips64"
                                                                                     , Mips64El =
                                                                                         "mips64el"
                                                                                     , MipsEl =
                                                                                         "mipsel"
                                                                                     , MipsIsa32r6 =
                                                                                         "mipsisa32r6"
                                                                                     , MipsIsa32r6El =
                                                                                         "mipsisa32r6el"
                                                                                     , MipsIsa64r6 =
                                                                                         "mipsisa64r6"
                                                                                     , MipsIsa64r6El =
                                                                                         "mipsisa64r6el"
                                                                                     , PowerPC =
                                                                                         "powerpc"
                                                                                     , PowerPC64 =
                                                                                         "powerpc64"
                                                                                     , PowerPC64le =
                                                                                         "powerpc64le"
                                                                                     , RISCV64 =
                                                                                         "riscv64"
                                                                                     , S390x =
                                                                                         "s390x"
                                                                                     , SH4 =
                                                                                         "sh4"
                                                                                     , Sparc64 =
                                                                                         "sparc64"
                                                                                     , X64 =
                                                                                         "x86_64"
                                                                                     , X86 =
                                                                                         "i686"
                                                                                     }
                                                                                     cfg.buildArch}-${merge
                                                                                                        { AIX =
                                                                                                            "aix"
                                                                                                        , Android =
                                                                                                            "android"
                                                                                                        , Darwin =
                                                                                                            "darwin"
                                                                                                        , Dragonfly =
                                                                                                            "dragonfly"
                                                                                                        , FreeBSD =
                                                                                                            "freebsd"
                                                                                                        , Haiku =
                                                                                                            "haiku"
                                                                                                        , Hurd =
                                                                                                            "hurd"
                                                                                                        , IOS =
                                                                                                            "darwin"
                                                                                                        , Linux =
                                                                                                            "linux"
                                                                                                        , NetBSD =
                                                                                                            "netbsd"
                                                                                                        , NoOs =
                                                                                                            "none"
                                                                                                        , OpenBSD =
                                                                                                            "openbsd"
                                                                                                        , Redox =
                                                                                                            "redox"
                                                                                                        , Solaris =
                                                                                                            "solaris"
                                                                                                        , Windows =
                                                                                                            "w64"
                                                                                                        }
                                                                                                        cfg.buildOS}/:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PERL5LIB"
                                }
                              ]
                          )
                      , procDir = None Text
                      , program =
                          if    merge
                                  { AIX = False
                                  , Android = False
                                  , Darwin = True
                                  , Dragonfly = False
                                  , FreeBSD = False
                                  , Haiku = False
                                  , Hurd = False
                                  , IOS = False
                                  , Linux = False
                                  , NetBSD = False
                                  , NoOs = False
                                  , OpenBSD = False
                                  , Redox = False
                                  , Solaris = False
                                  , Windows = False
                                  }
                                  cfg.buildOS
                          then  "sh"
                          else  "./configure"
                      }
                  ]
            , installCommand =
                λ ( cfg
                  : { binDirs : List Text
                    , buildArch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , buildOS :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    , cpus : Natural
                    , currentDir : Text
                    , includeDirs : List Text
                    , installDir : Text
                    , isCross : Bool
                    , linkDirs : List Text
                    , preloadLibs : List Text
                    , shareDirs : List Text
                    , static : Bool
                    , targetTriple :
                        Optional
                          { abi :
                              Optional
                                < GNU
                                | GNUabi64
                                | GNUeabi
                                | GNUeabihf
                                | GNUspe
                                | MinGw
                                >
                          , arch :
                              < AArch
                              | Alpha
                              | Arm
                              | HPPA
                              | HPPA64
                              | M68k
                              | Mips
                              | Mips64
                              | Mips64El
                              | MipsEl
                              | MipsIsa32r6
                              | MipsIsa32r6El
                              | MipsIsa64r6
                              | MipsIsa64r6El
                              | PowerPC
                              | PowerPC64
                              | PowerPC64le
                              | RISCV64
                              | S390x
                              | SH4
                              | Sparc64
                              | X64
                              | X86
                              >
                          , manufacturer :
                              Optional < Apple | IBM | PC | Unknown >
                          , os :
                              < AIX
                              | Android
                              | Darwin
                              | Dragonfly
                              | FreeBSD
                              | Haiku
                              | Hurd
                              | IOS
                              | Linux
                              | NetBSD
                              | NoOs
                              | OpenBSD
                              | Redox
                              | Solaris
                              | Windows
                              >
                          }
                    }
                  ) →
                  [ < Call :
                        { arguments : List Text
                        , environment :
                            Optional (List { value : Text, var : Text })
                        , procDir : Optional Text
                        , program : Text
                        }
                    | CopyFile : { dest : Text, src : Text }
                    | CreateDirectory : { dir : Text }
                    | MakeExecutable : { file : Text }
                    | Patch : { patchContents : Text }
                    | Symlink : { linkName : Text, tgt : Text }
                    | SymlinkBinary : { file : Text }
                    | SymlinkManpage : { file : Text, section : Natural }
                    | Write : { contents : Text, file : Text }
                    >.Call
                      { arguments = [ "install" ]
                      , environment = Some
                          (   ( if    merge
                                        { AIX = True
                                        , Android = True
                                        , Darwin = True
                                        , Dragonfly = True
                                        , FreeBSD = True
                                        , Haiku = False
                                        , Hurd = True
                                        , IOS = True
                                        , Linux = True
                                        , NetBSD = True
                                        , NoOs = False
                                        , OpenBSD = True
                                        , Redox = False
                                        , Solaris = True
                                        , Windows = False
                                        }
                                        cfg.buildOS
                                then  [ { value =
                                            "${List/fold
                                                 Text
                                                 cfg.binDirs
                                                 Text
                                                 ( λ(_ : Text) →
                                                   λ(_ : Text) →
                                                     "${_@1}:${_}"
                                                 )
                                                 ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                        , var = "PATH"
                                        }
                                      ]
                                else  [] : List { value : Text, var : Text }
                              )
                            # [ { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          (cfg.shareDirs # cfg.linkDirs)
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/pkgconfig"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/pkgconfig:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PKG_CONFIG_PATH"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      "${_@1}/site_perl/5.30.2/${merge
                                                                                   { AArch =
                                                                                       "aarch64"
                                                                                   , Alpha =
                                                                                       "alpha"
                                                                                   , Arm =
                                                                                       "arm"
                                                                                   , HPPA =
                                                                                       "hppa"
                                                                                   , HPPA64 =
                                                                                       "hppa64"
                                                                                   , M68k =
                                                                                       "m68k"
                                                                                   , Mips =
                                                                                       "mips"
                                                                                   , Mips64 =
                                                                                       "mips64"
                                                                                   , Mips64El =
                                                                                       "mips64el"
                                                                                   , MipsEl =
                                                                                       "mipsel"
                                                                                   , MipsIsa32r6 =
                                                                                       "mipsisa32r6"
                                                                                   , MipsIsa32r6El =
                                                                                       "mipsisa32r6el"
                                                                                   , MipsIsa64r6 =
                                                                                       "mipsisa64r6"
                                                                                   , MipsIsa64r6El =
                                                                                       "mipsisa64r6el"
                                                                                   , PowerPC =
                                                                                       "powerpc"
                                                                                   , PowerPC64 =
                                                                                       "powerpc64"
                                                                                   , PowerPC64le =
                                                                                       "powerpc64le"
                                                                                   , RISCV64 =
                                                                                       "riscv64"
                                                                                   , S390x =
                                                                                       "s390x"
                                                                                   , SH4 =
                                                                                       "sh4"
                                                                                   , Sparc64 =
                                                                                       "sparc64"
                                                                                   , X64 =
                                                                                       "x86_64"
                                                                                   , X86 =
                                                                                       "i686"
                                                                                   }
                                                                                   cfg.buildArch}-${merge
                                                                                                      { AIX =
                                                                                                          "aix"
                                                                                                      , Android =
                                                                                                          "android"
                                                                                                      , Darwin =
                                                                                                          "darwin"
                                                                                                      , Dragonfly =
                                                                                                          "dragonfly"
                                                                                                      , FreeBSD =
                                                                                                          "freebsd"
                                                                                                      , Haiku =
                                                                                                          "haiku"
                                                                                                      , Hurd =
                                                                                                          "hurd"
                                                                                                      , IOS =
                                                                                                          "darwin"
                                                                                                      , Linux =
                                                                                                          "linux"
                                                                                                      , NetBSD =
                                                                                                          "netbsd"
                                                                                                      , NoOs =
                                                                                                          "none"
                                                                                                      , OpenBSD =
                                                                                                          "openbsd"
                                                                                                      , Redox =
                                                                                                          "redox"
                                                                                                      , Solaris =
                                                                                                          "solaris"
                                                                                                      , Windows =
                                                                                                          "w64"
                                                                                                      }
                                                                                                      cfg.buildOS}/"
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}/site_perl/5.30.2/${merge
                                                                                     { AArch =
                                                                                         "aarch64"
                                                                                     , Alpha =
                                                                                         "alpha"
                                                                                     , Arm =
                                                                                         "arm"
                                                                                     , HPPA =
                                                                                         "hppa"
                                                                                     , HPPA64 =
                                                                                         "hppa64"
                                                                                     , M68k =
                                                                                         "m68k"
                                                                                     , Mips =
                                                                                         "mips"
                                                                                     , Mips64 =
                                                                                         "mips64"
                                                                                     , Mips64El =
                                                                                         "mips64el"
                                                                                     , MipsEl =
                                                                                         "mipsel"
                                                                                     , MipsIsa32r6 =
                                                                                         "mipsisa32r6"
                                                                                     , MipsIsa32r6El =
                                                                                         "mipsisa32r6el"
                                                                                     , MipsIsa64r6 =
                                                                                         "mipsisa64r6"
                                                                                     , MipsIsa64r6El =
                                                                                         "mipsisa64r6el"
                                                                                     , PowerPC =
                                                                                         "powerpc"
                                                                                     , PowerPC64 =
                                                                                         "powerpc64"
                                                                                     , PowerPC64le =
                                                                                         "powerpc64le"
                                                                                     , RISCV64 =
                                                                                         "riscv64"
                                                                                     , S390x =
                                                                                         "s390x"
                                                                                     , SH4 =
                                                                                         "sh4"
                                                                                     , Sparc64 =
                                                                                         "sparc64"
                                                                                     , X64 =
                                                                                         "x86_64"
                                                                                     , X86 =
                                                                                         "i686"
                                                                                     }
                                                                                     cfg.buildArch}-${merge
                                                                                                        { AIX =
                                                                                                            "aix"
                                                                                                        , Android =
                                                                                                            "android"
                                                                                                        , Darwin =
                                                                                                            "darwin"
                                                                                                        , Dragonfly =
                                                                                                            "dragonfly"
                                                                                                        , FreeBSD =
                                                                                                            "freebsd"
                                                                                                        , Haiku =
                                                                                                            "haiku"
                                                                                                        , Hurd =
                                                                                                            "hurd"
                                                                                                        , IOS =
                                                                                                            "darwin"
                                                                                                        , Linux =
                                                                                                            "linux"
                                                                                                        , NetBSD =
                                                                                                            "netbsd"
                                                                                                        , NoOs =
                                                                                                            "none"
                                                                                                        , OpenBSD =
                                                                                                            "openbsd"
                                                                                                        , Redox =
                                                                                                            "redox"
                                                                                                        , Solaris =
                                                                                                            "solaris"
                                                                                                        , Windows =
                                                                                                            "w64"
                                                                                                        }
                                                                                                        cfg.buildOS}/:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "PERL5LIB"
                                }
                              , { value =
                                    merge
                                      { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                      ( List/fold
                                          Text
                                          cfg.linkDirs
                                          < Empty | NonEmpty : Text >
                                          ( λ(_ : Text) →
                                            λ(_ : < Empty | NonEmpty : Text >) →
                                              merge
                                                { Empty =
                                                    < Empty
                                                    | NonEmpty : Text
                                                    >.NonEmpty
                                                      _@1
                                                , NonEmpty =
                                                    λ(_ : Text) →
                                                      < Empty
                                                      | NonEmpty : Text
                                                      >.NonEmpty
                                                        "${_@2}:${_}"
                                                }
                                                _
                                          )
                                          < Empty | NonEmpty : Text >.Empty
                                      )
                                , var = "LD_LIBRARY_PATH"
                                }
                              , { value =
                                    "${merge
                                         { Empty = ""
                                         , NonEmpty = λ(_ : Text) → _
                                         }
                                         ( List/fold
                                             Text
                                             cfg.linkDirs
                                             < Empty | NonEmpty : Text >
                                             ( λ(_ : Text) →
                                               λ ( _
                                                 : < Empty | NonEmpty : Text >
                                                 ) →
                                                 merge
                                                   { Empty =
                                                       < Empty
                                                       | NonEmpty : Text
                                                       >.NonEmpty
                                                         "-L${_@1}"
                                                   , NonEmpty =
                                                       λ(_ : Text) →
                                                         < Empty
                                                         | NonEmpty : Text
                                                         >.NonEmpty
                                                           "-L${_@2} ${_}"
                                                   }
                                                   _
                                             )
                                             < Empty | NonEmpty : Text >.Empty
                                         )}${List/fold
                                               Text
                                               cfg.linkDirs
                                               Text
                                               ( λ(_ : Text) →
                                                 λ(_ : Text) →
                                                   "${if    merge
                                                              { AIX = False
                                                              , Android = False
                                                              , Darwin = True
                                                              , Dragonfly =
                                                                  False
                                                              , FreeBSD = False
                                                              , Haiku = False
                                                              , Hurd = False
                                                              , IOS = False
                                                              , Linux = False
                                                              , NetBSD = False
                                                              , NoOs = False
                                                              , OpenBSD = False
                                                              , Redox = False
                                                              , Solaris = False
                                                              , Windows = False
                                                              }
                                                              cfg.buildOS
                                                      then  ""
                                                      else  " -Wl,-rpath-link,${_@1}"}${_}"
                                               )
                                               ""}"
                                , var = "LDFLAGS"
                                }
                              ]
                          )
                      , procDir = None Text
                      , program =
                          merge
                            { AIX = "make"
                            , Android = "make"
                            , Darwin = "make"
                            , Dragonfly = "gmake"
                            , FreeBSD = "gmake"
                            , Haiku = "make"
                            , Hurd = "make"
                            , IOS = "make"
                            , Linux = "make"
                            , NetBSD = "gmake"
                            , NoOs = "make"
                            , OpenBSD = "gmake"
                            , Redox = "make"
                            , Solaris = "gmake"
                            , Windows = "make"
                            }
                            cfg.buildOS
                      }
                  ]
            , pkgBuildDeps =
                [] : List
                       { bound :
                           < Lower : { lower : List Natural }
                           | LowerUpper :
                               { lower : List Natural, upper : List Natural }
                           | NoBound
                           | Upper : { upper : List Natural }
                           >
                       , name : Text
                       }
            , pkgDeps =
                [] : List
                       { bound :
                           < Lower : { lower : List Natural }
                           | LowerUpper :
                               { lower : List Natural, upper : List Natural }
                           | NoBound
                           | Upper : { upper : List Natural }
                           >
                       , name : Text
                       }
            , pkgName = pkg.name
            , pkgSubdir =
                "${pkg.name}-${merge
                                 { Empty = "", NonEmpty = λ(_ : Text) → _ }
                                 ( List/fold
                                     Natural
                                     pkg.version
                                     < Empty | NonEmpty : Text >
                                     ( λ(_ : Natural) →
                                       λ(_ : < Empty | NonEmpty : Text >) →
                                         merge
                                           { Empty =
                                               < Empty
                                               | NonEmpty : Text
                                               >.NonEmpty
                                                 (Natural/show _@1)
                                           , NonEmpty =
                                               λ(_ : Text) →
                                                 < Empty
                                                 | NonEmpty : Text
                                                 >.NonEmpty
                                                   "${Natural/show _@2}.${_}"
                                           }
                                           _
                                     )
                                     < Empty | NonEmpty : Text >.Empty
                                 )}"
            , pkgVersion = pkg.version
            }
      , singleThreaded =
          λ ( _
            : { binDirs : List Text
              , buildArch :
                  < AArch
                  | Alpha
                  | Arm
                  | HPPA
                  | HPPA64
                  | M68k
                  | Mips
                  | Mips64
                  | Mips64El
                  | MipsEl
                  | MipsIsa32r6
                  | MipsIsa32r6El
                  | MipsIsa64r6
                  | MipsIsa64r6El
                  | PowerPC
                  | PowerPC64
                  | PowerPC64le
                  | RISCV64
                  | S390x
                  | SH4
                  | Sparc64
                  | X64
                  | X86
                  >
              , buildOS :
                  < AIX
                  | Android
                  | Darwin
                  | Dragonfly
                  | FreeBSD
                  | Haiku
                  | Hurd
                  | IOS
                  | Linux
                  | NetBSD
                  | NoOs
                  | OpenBSD
                  | Redox
                  | Solaris
                  | Windows
                  >
              , cpus : Natural
              , currentDir : Text
              , includeDirs : List Text
              , installDir : Text
              , isCross : Bool
              , linkDirs : List Text
              , preloadLibs : List Text
              , shareDirs : List Text
              , static : Bool
              , targetTriple :
                  Optional
                    { abi :
                        Optional
                          < GNU
                          | GNUabi64
                          | GNUeabi
                          | GNUeabihf
                          | GNUspe
                          | MinGw
                          >
                    , arch :
                        < AArch
                        | Alpha
                        | Arm
                        | HPPA
                        | HPPA64
                        | M68k
                        | Mips
                        | Mips64
                        | Mips64El
                        | MipsEl
                        | MipsIsa32r6
                        | MipsIsa32r6El
                        | MipsIsa64r6
                        | MipsIsa64r6El
                        | PowerPC
                        | PowerPC64
                        | PowerPC64le
                        | RISCV64
                        | S390x
                        | SH4
                        | Sparc64
                        | X64
                        | X86
                        >
                    , manufacturer : Optional < Apple | IBM | PC | Unknown >
                    , os :
                        < AIX
                        | Android
                        | Darwin
                        | Dragonfly
                        | FreeBSD
                        | Haiku
                        | Hurd
                        | IOS
                        | Linux
                        | NetBSD
                        | NoOs
                        | OpenBSD
                        | Redox
                        | Solaris
                        | Windows
                        >
                    }
              }
            ) →
            1
      , squishVersion =
          λ(_ : List Natural) →
            List/fold
              Natural
              _
              Text
              (λ(_ : Natural) → λ(_ : Text) → "${Natural/show _@1}${_}")
              ""
      , symlink =
          λ(tgt : Text) →
          λ(lnk : Text) →
            < Call :
                { arguments : List Text
                , environment : Optional (List { value : Text, var : Text })
                , procDir : Optional Text
                , program : Text
                }
            | CopyFile : { dest : Text, src : Text }
            | CreateDirectory : { dir : Text }
            | MakeExecutable : { file : Text }
            | Patch : { patchContents : Text }
            | Symlink : { linkName : Text, tgt : Text }
            | SymlinkBinary : { file : Text }
            | SymlinkManpage : { file : Text, section : Natural }
            | Write : { contents : Text, file : Text }
            >.Symlink
              { linkName = lnk, tgt }
      , symlinkBinaries =
          λ(_ : List Text) →
            List/fold
              Text
              _
              ( List
                  < Call :
                      { arguments : List Text
                      , environment :
                          Optional (List { value : Text, var : Text })
                      , procDir : Optional Text
                      , program : Text
                      }
                  | CopyFile : { dest : Text, src : Text }
                  | CreateDirectory : { dir : Text }
                  | MakeExecutable : { file : Text }
                  | Patch : { patchContents : Text }
                  | Symlink : { linkName : Text, tgt : Text }
                  | SymlinkBinary : { file : Text }
                  | SymlinkManpage : { file : Text, section : Natural }
                  | Write : { contents : Text, file : Text }
                  >
              )
              ( λ(_ : Text) →
                λ ( _
                  : List
                      < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >
                  ) →
                    [ < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.SymlinkBinary
                        { file = _@1 }
                    ]
                  # _
              )
              ( [] : List
                       < Call :
                           { arguments : List Text
                           , environment :
                               Optional (List { value : Text, var : Text })
                           , procDir : Optional Text
                           , program : Text
                           }
                       | CopyFile : { dest : Text, src : Text }
                       | CreateDirectory : { dir : Text }
                       | MakeExecutable : { file : Text }
                       | Patch : { patchContents : Text }
                       | Symlink : { linkName : Text, tgt : Text }
                       | SymlinkBinary : { file : Text }
                       | SymlinkManpage : { file : Text, section : Natural }
                       | Write : { contents : Text, file : Text }
                       >
              )
      , symlinkBinary =
          λ(file : Text) →
            < Call :
                { arguments : List Text
                , environment : Optional (List { value : Text, var : Text })
                , procDir : Optional Text
                , program : Text
                }
            | CopyFile : { dest : Text, src : Text }
            | CreateDirectory : { dir : Text }
            | MakeExecutable : { file : Text }
            | Patch : { patchContents : Text }
            | Symlink : { linkName : Text, tgt : Text }
            | SymlinkBinary : { file : Text }
            | SymlinkManpage : { file : Text, section : Natural }
            | Write : { contents : Text, file : Text }
            >.SymlinkBinary
              { file }
      , symlinkManpage =
          < Call :
              { arguments : List Text
              , environment : Optional (List { value : Text, var : Text })
              , procDir : Optional Text
              , program : Text
              }
          | CopyFile : { dest : Text, src : Text }
          | CreateDirectory : { dir : Text }
          | MakeExecutable : { file : Text }
          | Patch : { patchContents : Text }
          | Symlink : { linkName : Text, tgt : Text }
          | SymlinkBinary : { file : Text }
          | SymlinkManpage : { file : Text, section : Natural }
          | Write : { contents : Text, file : Text }
          >.SymlinkManpage
      , symlinkManpages =
          λ(_ : List { file : Text, section : Natural }) →
            List/fold
              { file : Text, section : Natural }
              _
              ( List
                  < Call :
                      { arguments : List Text
                      , environment :
                          Optional (List { value : Text, var : Text })
                      , procDir : Optional Text
                      , program : Text
                      }
                  | CopyFile : { dest : Text, src : Text }
                  | CreateDirectory : { dir : Text }
                  | MakeExecutable : { file : Text }
                  | Patch : { patchContents : Text }
                  | Symlink : { linkName : Text, tgt : Text }
                  | SymlinkBinary : { file : Text }
                  | SymlinkManpage : { file : Text, section : Natural }
                  | Write : { contents : Text, file : Text }
                  >
              )
              ( λ(_ : { file : Text, section : Natural }) →
                λ ( _
                  : List
                      < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >
                  ) →
                    [ < Call :
                          { arguments : List Text
                          , environment :
                              Optional (List { value : Text, var : Text })
                          , procDir : Optional Text
                          , program : Text
                          }
                      | CopyFile : { dest : Text, src : Text }
                      | CreateDirectory : { dir : Text }
                      | MakeExecutable : { file : Text }
                      | Patch : { patchContents : Text }
                      | Symlink : { linkName : Text, tgt : Text }
                      | SymlinkBinary : { file : Text }
                      | SymlinkManpage : { file : Text, section : Natural }
                      | Write : { contents : Text, file : Text }
                      >.SymlinkManpage
                        _@1
                    ]
                  # _
              )
              ( [] : List
                       < Call :
                           { arguments : List Text
                           , environment :
                               Optional (List { value : Text, var : Text })
                           , procDir : Optional Text
                           , program : Text
                           }
                       | CopyFile : { dest : Text, src : Text }
                       | CreateDirectory : { dir : Text }
                       | MakeExecutable : { file : Text }
                       | Patch : { patchContents : Text }
                       | Symlink : { linkName : Text, tgt : Text }
                       | SymlinkBinary : { file : Text }
                       | SymlinkManpage : { file : Text, section : Natural }
                       | Write : { contents : Text, file : Text }
                       >
              )
      , unbounded =
          λ(x : Text) →
            { bound =
                < Lower : { lower : List Natural }
                | LowerUpper : { lower : List Natural, upper : List Natural }
                | NoBound
                | Upper : { upper : List Natural }
                >.NoBound
            , name = x
            }
      , underscoreVersion =
          λ(_ : List Natural) →
            merge
              { Empty = "", NonEmpty = λ(_ : Text) → _ }
              ( List/fold
                  Natural
                  _
                  < Empty | NonEmpty : Text >
                  ( λ(_ : Natural) →
                    λ(_ : < Empty | NonEmpty : Text >) →
                      merge
                        { Empty =
                            < Empty | NonEmpty : Text >.NonEmpty
                              (Natural/show _@1)
                        , NonEmpty =
                            λ(_ : Text) →
                              < Empty | NonEmpty : Text >.NonEmpty
                                "${Natural/show _@2}_${_}"
                        }
                        _
                  )
                  < Empty | NonEmpty : Text >.Empty
              )
      , unixPath =
          λ(binDirs : List Text) →
            { value =
                "${List/fold
                     Text
                     binDirs
                     Text
                     (λ(_ : Text) → λ(_ : Text) → "${_@1}:${_}")
                     ""}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            , var = "PATH"
            }
      , upperBound =
          λ(pkg : { name : Text, upper : List Natural }) →
            { bound =
                < Lower : { lower : List Natural }
                | LowerUpper : { lower : List Natural, upper : List Natural }
                | NoBound
                | Upper : { upper : List Natural }
                >.Upper
                  { upper = pkg.upper }
            , name = pkg.name
            }
      , writeFile =
          < Call :
              { arguments : List Text
              , environment : Optional (List { value : Text, var : Text })
              , procDir : Optional Text
              , program : Text
              }
          | CopyFile : { dest : Text, src : Text }
          | CreateDirectory : { dir : Text }
          | MakeExecutable : { file : Text }
          | Patch : { patchContents : Text }
          | Symlink : { linkName : Text, tgt : Text }
          | SymlinkBinary : { file : Text }
          | SymlinkManpage : { file : Text, section : Natural }
          | Write : { contents : Text, file : Text }
          >.Write
      }

let gpgPackage =
      λ(x : { name : Text, version : List Natural }) →
          prelude.simplePackage x
        ⫽ { pkgUrl =
              "https://gnupg.org/ftp/gcrypt/${x.name}/${x.name}-${prelude.showVersion
                                                                    x.version}.tar.bz2"
          }

let gnupg =
      λ(v : List Natural) →
          gpgPackage { name = "gnupg", version = v }
        ⫽ { pkgDeps =
            [ prelude.lowerBound { name = "npth", lower = [ 1, 2 ] }
            , prelude.lowerBound { name = "libgpg-error", lower = [ 1, 24 ] }
            , prelude.lowerBound { name = "libgcrypt", lower = [ 1, 7, 0 ] }
            , prelude.lowerBound { name = "libassuan", lower = [ 2, 5, 0 ] }
            , prelude.lowerBound { name = "libksba", lower = [ 1, 3, 4 ] }
            ]
          , installCommand = prelude.installWithBinaries [ "bin/gpg" ]
          }

let npth = λ(v : List Natural) → gpgPackage { name = "npth", version = v }

let libgpgError =
      λ(v : List Natural) → gpgPackage { name = "libgpg-error", version = v }

let libgcrypt =
      λ(v : List Natural) →
          gpgPackage { name = "libgcrypt", version = v }
        ⫽ { pkgDeps =
            [ prelude.lowerBound { name = "libgpg-error", lower = [ 1, 25 ] } ]
          }

let libassuan =
      λ(v : List Natural) →
          gpgPackage { name = "libassuan", version = v }
        ⫽ { pkgDeps =
            [ prelude.lowerBound { name = "libgpg-error", lower = [ 1, 24 ] } ]
          }

let libksba =
      λ(v : List Natural) →
          gpgPackage { name = "libksba", version = v }
        ⫽ { pkgDeps =
            [ prelude.lowerBound { name = "libgpg-error", lower = [ 1, 8 ] } ]
          }

let musl =
      λ(v : List Natural) →
          prelude.simplePackage { name = "musl", version = v }
        ⫽ { pkgUrl =
              "https://www.musl-libc.org/releases/musl-${prelude.showVersion
                                                           v}.tar.gz"
          , installCommand = prelude.installWithBinaries [ "bin/musl-gcc" ]
          }

let binutils =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "binutils", version = v }
        ⫽ { pkgUrl =
              "https://ftp.wayne.edu/gnu/binutils/binutils-${prelude.showVersion
                                                               v}.tar.lz"
          , installCommand =
              prelude.installWithBinaries
                [ "bin/ar"
                , "bin/as"
                , "bin/ld"
                , "bin/strip"
                , "bin/strings"
                , "bin/readelf"
                , "bin/objdump"
                , "bin/nm"
                , "bin/ranlib"
                ]
          }

let bison =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "bison", version = v }
        ⫽ { buildCommand =
              λ(cfg : types.BuildVars) →
                prelude.generalBuild
                  prelude.singleThreaded
                  (prelude.buildEnv cfg)
                  cfg
          , installCommand =
              prelude.installWithBinaries [ "bin/bison", "bin/yacc" ]
          , pkgBuildDeps = [ prelude.unbounded "m4" ]
          }

let cmake =
      λ(cfg : { version : List Natural, patch : Natural }) →
        let patchString = Natural/show cfg.patch

        let versionString = prelude.showVersion cfg.version

        let cmakeConfigure =
              λ(cfg : types.BuildVars) →
                prelude.configureMkExesExtraFlags
                  { bins = [ "bootstrap" ]
                  , extraFlags = [ "--parallel=${Natural/show cfg.cpus}" ]
                  }
                  cfg

        in    prelude.defaultPackage
            ⫽ { pkgName = "cmake"
              , pkgVersion = prelude.fullVersion cfg
              , pkgUrl =
                  "https://cmake.org/files/v${versionString}/cmake-${versionString}.${patchString}.tar.gz"
              , pkgSubdir = "cmake-${versionString}.${patchString}"
              , configureCommand = cmakeConfigure
              , installCommand =
                  λ(cfg : types.BuildVars) →
                    let wrapper =
                          "CMAKE_ROOT=${cfg.installDir}/share/cmake-${versionString}/ ${cfg.installDir}/bin/cmake \$@"

                    let wrapped = "wrapper/cmake"

                    in    prelude.defaultInstall cfg
                        # [ prelude.createDir "wrapper"
                          , prelude.writeFile
                              { file = wrapped, contents = wrapper }
                          , prelude.mkExe wrapped
                          , prelude.copyFile wrapped wrapped
                          , prelude.symlinkBinary wrapped
                          ]
              }

let curl =
      λ(v : List Natural) →
          prelude.simplePackage { name = "curl", version = v }
        ⫽ { pkgUrl =
              "https://curl.haxx.se/download/curl-${prelude.showVersion
                                                      v}.tar.xz"
          , installCommand = prelude.installWithBinaries [ "bin/curl" ]
          , pkgDeps = [ prelude.unbounded "zlib" ]
          }

let dbus =
      λ(v : List Natural) →
          prelude.simplePackage { name = "dbus", version = v }
        ⫽ { pkgUrl =
              "https://dbus.freedesktop.org/releases/dbus/dbus-${prelude.showVersion
                                                                   v}.tar.xz"
          , pkgDeps =
            [ prelude.unbounded "expat", prelude.unbounded "libselinux" ]
          , configureCommand = prelude.configureLinkExtraLibs [ "pcre" ]
          , pkgBuildDeps = [ prelude.unbounded "pkg-config" ]
          }

let fltk =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "fltk", version = v }
            ⫽ { pkgUrl =
                  "http://fltk.org/pub/fltk/${versionString}/fltk-${versionString}-source.tar.bz2"
              , pkgSubdir = "fltk-${versionString}"
              , pkgDeps =
                [ prelude.unbounded "libX11"
                , prelude.unbounded "alsa-lib"
                , prelude.unbounded "zlib"
                , prelude.unbounded "libpng"
                , prelude.unbounded "libXft"
                , prelude.unbounded "freetype"
                ]
              }

let gawk =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "gawk", version = v }
        ⫽ { installCommand =
              prelude.installWithBinaries [ "bin/gawk", "bin/awk" ]
          }

let gc =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "gc", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/ivmai/bdwgc/releases/download/v${versionString}/gc-${versionString}.tar.gz"
              , pkgDeps = [ prelude.unbounded "libatomic_ops" ]
              }

let libatomic_ops =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libatomic_ops", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/ivmai/libatomic_ops/releases/download/v${versionString}/libatomic_ops-${versionString}.tar.gz"
              }

let git =
      λ(v : List Natural) →
          prelude.simplePackage { name = "git", version = v }
        ⫽ { pkgUrl =
              "https://mirrors.edge.kernel.org/pub/software/scm/git/git-${prelude.showVersion
                                                                            v}.tar.xz"
          , installCommand = prelude.installWithBinaries [ "bin/git" ]
          , pkgBuildDeps = [ prelude.unbounded "gettext" ]
          }

let glibc =
      let buildDir = Some "build"

      let glibcConfigure =
            λ(cfg : types.BuildVars) →
              let maybeHost = prelude.mkHost cfg.targetTriple

              let modifyArgs = prelude.maybeAppend Text maybeHost

              in  [ prelude.createDir "build"
                  , prelude.call
                      { program = "../configure"
                      , arguments = modifyArgs [ "--prefix=${cfg.installDir}" ]
                      , environment = prelude.configSome ([] : List Text) cfg
                      , procDir = buildDir
                      }
                  ]

      let glibcBuild =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  { program = prelude.makeExe cfg.buildOS
                  , arguments = [ "-j${Natural/show cfg.cpus}" ]
                  , environment = prelude.configSome ([] : List Text) cfg
                  , procDir = buildDir
                  }
              ]

      let glibcInstall =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  { program = prelude.makeExe cfg.buildOS
                  , arguments = [ "install" ]
                  , environment = prelude.configSome ([] : List Text) cfg
                  , procDir = buildDir
                  }
              ]

      in  λ(v : List Natural) →
              prelude.defaultPackage
            ⫽ { pkgName = "glibc"
              , pkgVersion = v
              , pkgUrl =
                  "http://mirror.keystealth.org/gnu/libc/glibc-${prelude.showVersion
                                                                   v}.tar.xz"
              , pkgSubdir = "glibc-${prelude.showVersion v}"
              , configureCommand = glibcConfigure
              , buildCommand = glibcBuild
              , installCommand = glibcInstall
              , pkgBuildDeps =
                [ prelude.unbounded "bison"
                , prelude.unbounded "gawk"
                , prelude.unbounded "python3"
                ]
              }

let gmp =
      λ(v : List Natural) →
          prelude.simplePackage { name = "gmp", version = v }
        ⫽ { pkgUrl =
              "https://gmplib.org/download/gmp/gmp-${prelude.showVersion
                                                       v}.tar.lz"
          , pkgBuildDeps = [ prelude.unbounded "m4" ]
          }

let harfbuzz =
      let symlinkHarfbuzz =
            λ(h : Text) → prelude.symlink "include/harfbuzz/${h}" "include/${h}"

      in  λ(v : List Natural) →
              prelude.simplePackage { name = "harfbuzz", version = v }
            ⫽ { pkgUrl =
                  "https://www.freedesktop.org/software/harfbuzz/release/harfbuzz-${prelude.showVersion
                                                                                      v}.tar.xz"
              , pkgDeps =
                [ prelude.unbounded "freetype-prebuild"
                , prelude.unbounded "glib"
                ]
              , pkgBuildDeps = [ prelude.unbounded "pkg-config" ]
              , configureCommand =
                  prelude.configureLinkExtraLibs [ "pcre", "z" ]
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.defaultInstall cfg
                    # [ symlinkHarfbuzz "hb-aat-layout.h"
                      , symlinkHarfbuzz "hb-aat.h"
                      , symlinkHarfbuzz "hb-blob.h"
                      , symlinkHarfbuzz "hb-buffer.h"
                      , symlinkHarfbuzz "hb-common.h"
                      , symlinkHarfbuzz "hb-deprecated.h"
                      , symlinkHarfbuzz "hb-face.h"
                      , symlinkHarfbuzz "hb-font.h"
                      , symlinkHarfbuzz "hb-ft.h"
                      , symlinkHarfbuzz "hb-glib.h"
                      , symlinkHarfbuzz "hb-icu.h"
                      , symlinkHarfbuzz "hb-map.h"
                      , symlinkHarfbuzz "hb-ot-color.h"
                      , symlinkHarfbuzz "hb-ot-font.h"
                      , symlinkHarfbuzz "hb-ot-layout.h"
                      , symlinkHarfbuzz "hb-ot-math.h"
                      , symlinkHarfbuzz "hb-ot-name.h"
                      , symlinkHarfbuzz "hb-ot-shape.h"
                      , symlinkHarfbuzz "hb-ot-var.h"
                      , symlinkHarfbuzz "hb-ot.h"
                      , symlinkHarfbuzz "hb-set.h"
                      , symlinkHarfbuzz "hb-shape-plan.h"
                      , symlinkHarfbuzz "hb-shape.h"
                      , symlinkHarfbuzz "hb-subset.h"
                      , symlinkHarfbuzz "hb-unicode.h"
                      , symlinkHarfbuzz "hb-version.h"
                      , symlinkHarfbuzz "hb.h"
                      ]
              }

let libjpeg-turbo =
      λ(v : List Natural) →
          prelude.cmakePackage
        ⫽ { pkgName = "libjpeg-turbo"
          , pkgVersion = v
          , pkgUrl =
              "https://ayera.dl.sourceforge.net/project/libjpeg-turbo/${prelude.showVersion
                                                                          v}/libjpeg-turbo-${prelude.showVersion
                                                                                               v}.tar.gz"
          , pkgSubdir = "libjpeg-turbo-${prelude.showVersion v}"
          , pkgBuildDeps =
            [ prelude.unbounded "cmake"
            , prelude.unbounded "nasm"
            , prelude.unbounded "make"
            ]
          }

let libuv =
      λ(v : List Natural) →
          prelude.defaultPackage
        ⫽ { pkgName = "libuv"
          , pkgVersion = v
          , pkgUrl =
              "https://dist.libuv.org/dist/v${prelude.showVersion
                                                v}/libuv-v${prelude.showVersion
                                                              v}.tar.gz"
          , pkgSubdir = "libuv-v${prelude.showVersion v}"
          , configureCommand = prelude.autogenConfigure
          , pkgBuildDeps =
            [ prelude.unbounded "m4"
            , prelude.unbounded "automake"
            , prelude.unbounded "libtool"
            ]
          }

let nasm =
      λ(v : List Natural) →
          prelude.simplePackage { name = "nasm", version = v }
        ⫽ { pkgUrl =
              "http://www.nasm.us/pub/nasm/releasebuilds/${prelude.showVersion
                                                             v}.02/nasm-${prelude.showVersion
                                                                            v}.02.tar.xz"
          , pkgSubdir = "nasm-${prelude.showVersion v}.02"
          , installCommand =
              prelude.installWithBinaries [ "bin/nasm", "bin/ndisasm" ]
          }

let ncurses =
      λ(v : List Natural) →
          prelude.simplePackage { name = "ncurses", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/ncurses/ncurses-${prelude.showVersion
                                                           v}.tar.gz"
          , configureCommand =
              λ(cfg : types.BuildVars) →
                let crossArgs =
                      if    cfg.isCross
                      then  [ "--disable-stripping" ]
                      else  [] : List Text

                in  prelude.configureWithFlags
                      ([ "--with-shared", "--enable-widec" ] # crossArgs)
                      cfg
          , installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.defaultInstall cfg
                # [ prelude.symlink "lib/libncursesw.so" "lib/libncurses.so" ]
          }

let pcre2 =
      λ(v : List Natural) →
          prelude.simplePackage { name = "pcre2", version = v }
        ⫽ { pkgUrl =
              "https://ftp.pcre.org/pub/pcre/pcre2-${prelude.showVersion
                                                       v}.tar.bz2"
          }

let pcre =
      λ(v : List Natural) →
          prelude.simplePackage { name = "pcre", version = v }
        ⫽ { pkgUrl =
              "https://ftp.pcre.org/pub/pcre/pcre-${prelude.showVersion
                                                      v}.tar.bz2"
          , configureCommand =
              prelude.configureWithFlags
                [ "--enable-utf8", "--enable-unicode-properties" ]
          }

let perl5 =
      let perlConfigure =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = "sh"
                      , arguments =
                            [ "./Configure"
                            , "-des"
                            , "-Dprefix=${cfg.installDir}"
                            ]
                          # ( if    cfg.static
                              then  [] : List Text
                              else  [ "-Duseshrplib" ]
                            )
                      }
                  )
              ]

      let linkDir =
            λ(os : types.OS) →
              merge
                { FreeBSD = "CORE"
                , OpenBSD = "CORE"
                , NetBSD = "CORE"
                , Solaris = "CORE"
                , Dragonfly = "CORE"
                , Linux = "CORE"
                , Darwin = "darwin-2level/CORE"
                , Windows = "CORE"
                , Redox = "CORE"
                , Haiku = "CORE"
                , IOS = "darwin-2level/CORE"
                , AIX = "CORE"
                , Hurd = "CORE"
                , Android = "CORE"
                , NoOs = "CORE"
                }
                os

      in  λ(v : List Natural) →
            let major =
                  merge { Some = Natural/show, None = "" } (List/head Natural v)

            in    prelude.simplePackage { name = "perl", version = v }
                ⫽ { pkgUrl =
                      "https://www.cpan.org/src/${major}.0/perl-${prelude.showVersion
                                                                    v}.tar.gz"
                  , configureCommand = perlConfigure
                  , buildCommand =
                      λ(cfg : types.BuildVars) →
                        prelude.generalBuild
                          prelude.singleThreaded
                          (prelude.buildEnv cfg)
                          cfg
                  , installCommand =
                      λ(cfg : types.BuildVars) →
                        let libperlFile =
                              if    cfg.static
                              then  "libperl.a"
                              else  "libperl.${prelude.libSuffix
                                                 (prelude.osCfg cfg)}"

                        in    prelude.installWithBinaries
                                [ "bin/perl", "bin/cpan", "bin/ptar" ]
                                cfg
                            # [ prelude.symlink
                                  "lib/${prelude.showVersion
                                           v}/${prelude.printArch
                                                  cfg.buildArch}-${prelude.printOS
                                                                     cfg.buildOS}/${linkDir
                                                                                      cfg.buildOS}/${libperlFile}"
                                  "lib/${libperlFile}"
                              ]
                  }

let libpng =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libpng", version = v }
        ⫽ { pkgUrl =
              "https://download.sourceforge.net/libpng/libpng-${prelude.showVersion
                                                                  v}.tar.xz"
          , pkgDeps = [ prelude.unbounded "zlib" ]
          }

let sed =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "sed", version = v }
        ⫽ { installCommand =
              prelude.installWithManpages
                [ { file = "share/man/man1/sed.1", section = 1 } ]
          , configureCommand =
              prelude.configureWithFlags [ "--disable-dependency-tracking" ]
          }

let tar = λ(v : List Natural) → prelude.makeGnuExe { name = "tar", version = v }

let unistring =
      λ(v : List Natural) →
        prelude.makeGnuLibrary { name = "unistring", version = v }

let valgrind =
      λ(v : List Natural) →
          prelude.simplePackage { name = "valgrind", version = v }
        ⫽ { pkgUrl =
              "https://sourceware.org/pub/valgrind/valgrind-${prelude.showVersion
                                                                v}.tar.bz2"
          , installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.installWithBinaries [ "bin/valgrind" ] cfg
                # prelude.symlinkManpages
                    [ { file = "share/man/man1/pdfgrep.1", section = 1 } ]
          }

let vim =
      λ(v : List Natural) →
          prelude.defaultPackage
        ⫽ { pkgName = "vim"
          , pkgVersion = v
          , pkgUrl =
              "http://ftp.vim.org/vim/unix/vim-${prelude.showVersion v}.tar.bz2"
          , pkgSubdir = "vim${prelude.squishVersion v}"
          , configureCommand =
              prelude.configureMkExesExtraFlags
                { bins =
                  [ "src/configure", "src/auto/configure", "src/which.sh" ]
                , extraFlags = [ "--enable-gui=no", "--enable-pythoninterp" ]
                }
          , installCommand =
              λ(cfg : types.BuildVars) →
                let mkLibDynload =
                      λ(libs : List Text) →
                        concatMapSep
                          ":"
                          Text
                          ( λ(dir : Text) →
                              "${dir}:${dir}/python2.7/lib-dynload"
                          )
                          libs

                let mkPython =
                      λ(libs : List Text) →
                        concatMapSep
                          ":"
                          Text
                          ( λ(dir : Text) →
                              "${dir}/python2.7/:${dir}/python2.7/lib-dynload"
                          )
                          libs

                let wrapper =
                      "LD_LIBRARY_PATH=${mkLibDynload
                                           cfg.linkDirs} PYTHONPATH=${mkPython
                                                                        cfg.linkDirs} ${cfg.installDir}/bin/vim \$@"

                let wrapped = "wrapper/vim"

                in    prelude.installWithBinaries [ "bin/xxd" ] cfg
                    # [ prelude.createDir "wrapper"
                      , prelude.writeFile { file = wrapped, contents = wrapper }
                      , prelude.mkExe wrapped
                      , prelude.copyFile wrapped wrapped
                      , prelude.symlinkBinary wrapped
                      ]
          , pkgDeps =
            [ prelude.unbounded "ncurses"
            , prelude.unbounded "libXpm"
            , prelude.unbounded "libXt"
            , prelude.unbounded "python2"
            ]
          }

let xz =
      λ(v : List Natural) →
          prelude.simplePackage { name = "xz", version = v }
        ⫽ { pkgUrl = "https://tukaani.org/xz/xz-${prelude.showVersion v}.tar.xz"
          , installCommand = prelude.installWithBinaries [ "bin/xz" ]
          }

let zlib =
      λ(v : List Natural) →
        let zlibConfigure =
              λ(cfg : types.BuildVars) →
                let host = prelude.mkCCVar cfg

                in  [ prelude.call
                        (   prelude.defaultCall
                          ⫽ { program = "sh"
                            , arguments =
                              [ "configure", "--prefix=${cfg.installDir}" ]
                            , environment = Some
                                (   host
                                  # [ { var = "PATH"
                                      , value =
                                          "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                                      }
                                    ]
                                )
                            }
                        )
                    ]

        in    prelude.simplePackage { name = "zlib", version = v }
            ⫽ { pkgUrl =
                  "http://www.zlib.net/zlib-${prelude.showVersion v}.tar.xz"
              , configureCommand = zlibConfigure
              , installCommand =
                  prelude.installWithManpages
                    [ { file = "share/man/man3/zlib.3", section = 3 } ]
              }

let gettext =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "gettext", version = v }
        ⫽ { installCommand =
              prelude.installWithBinaries
                [ "bin/gettext", "bin/msgfmt", "bin/autopoint" ]
          , configureCommand =
              prelude.configureWithFlags [ "--disable-dependency-tracking" ]
          }

let gzip =
      λ(v : List Natural) → prelude.makeGnuExe { name = "gzip", version = v }

let wget =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "wget", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/wget/wget-${prelude.showVersion
                                                     v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "gnutls" ]
          , pkgBuildDeps = [ prelude.unbounded "perl" ]
          , installCommand = prelude.installWithWrappers [ "wget" ]
          }

let gnutls =
      λ(cfg : { version : List Natural, patch : List Natural }) →
        let versionString = prelude.showVersion cfg.version

        in    prelude.simplePackage
                { name = "gnutls", version = cfg.version # cfg.patch }
            ⫽ { pkgUrl =
                  "https://www.gnupg.org/ftp/gcrypt/gnutls/v${versionString}/gnutls-${versionString}.${prelude.showVersion
                                                                                                         cfg.patch}.tar.xz"
              , pkgDeps =
                [ prelude.lowerBound { name = "nettle", lower = [ 3, 1 ] }
                , prelude.unbounded "unistring"
                , prelude.lowerBound { name = "libtasn1", lower = [ 4, 9 ] }
                , prelude.lowerBound { name = "p11-kit", lower = [ 0, 23, 1 ] }
                ]
              , configureCommand =
                  prelude.configureLinkExtraLibs [ "nettle", "hogweed" ]
              }

let lapack =
      λ(v : List Natural) →
          prelude.cmakePackage
        ⫽ { pkgName = "lapack"
          , pkgVersion = v
          , pkgUrl =
              "http://www.netlib.org/lapack/lapack-${prelude.showVersion
                                                       v}.tar.gz"
          , pkgSubdir = "lapack-${prelude.showVersion v}"
          , pkgBuildDeps =
            [ prelude.unbounded "cmake", prelude.unbounded "gcc" ]
          }

let cairo =
      let symlinkCairo =
            λ(h : Text) → prelude.symlink "include/cairo/${h}" "include/${h}"

      in  λ(v : List Natural) →
              prelude.simplePackage { name = "cairo", version = v }
            ⫽ { pkgUrl =
                  "https://www.cairographics.org/releases/cairo-${prelude.showVersion
                                                                    v}.tar.xz"
              , pkgDeps =
                [ prelude.lowerBound { name = "pixman", lower = [ 0, 30, 0 ] }
                , prelude.lowerBound { name = "freetype", lower = [ 9, 7, 3 ] }
                , prelude.lowerBound
                    { name = "fontconfig", lower = [ 2, 2, 95 ] }
                , prelude.unbounded "libXext"
                ]
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.defaultInstall cfg
                    # [ symlinkCairo "cairo-deprecated.h"
                      , symlinkCairo "cairo-features.h"
                      , symlinkCairo "cairo-ft.h"
                      , symlinkCairo "cairo-gobject.h"
                      , symlinkCairo "cairo-pdf.h"
                      , symlinkCairo "cairo-ps.h"
                      , symlinkCairo "cairo-script-interpreter.h"
                      , symlinkCairo "cairo-script.h"
                      , symlinkCairo "cairo-svg.h"
                      , symlinkCairo "cairo-version.h"
                      , symlinkCairo "cairo-xcb.h"
                      , symlinkCairo "cairo-xlib-xrender.h"
                      , symlinkCairo "cairo-xlib.h"
                      , symlinkCairo "cairo.h"
                      ]
              }

let pycairo =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.python2Package { name = "pycairo", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/pygobject/pycairo/releases/download/v${versionString}/pycairo-${versionString}.tar.gz"
              , pkgDeps = [ prelude.unbounded "cairo" ]
              }

let libnettle =
      λ(v : List Natural) →
          prelude.simplePackage { name = "nettle", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/nettle/nettle-${prelude.showVersion
                                                         v}.tar.gz"
          , pkgBuildDeps = [ prelude.unbounded "m4" ]
          }

let diffutils =
      λ(v : List Natural) →
          prelude.simplePackage { name = "diffutils", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/diffutils/diffutils-${prelude.showVersion
                                                               v}.tar.xz"
          , installCommand = prelude.installWithBinaries [ "bin/diff" ]
          }

let patch =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "patch", version = v }
        ⫽ { installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.installWithBinaries [ "bin/patch" ] cfg
                # prelude.symlinkManpages
                    [ { file = "share/man/man1/patch.1", section = 1 } ]
          }

let m4 =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "m4", version = v }
        ⫽ { configureCommand =
              λ(cfg : types.BuildVars) →
                  [ prelude.patch
                      ''
                      diff --color -u lib/fflush.c lib/fflush.c
                      --- lib/fflush.c	2016-12-31 07:54:41.000000000 -0600
                      +++ lib/fflush.c	2019-05-24 15:43:00.800903010 -0500
                      @@ -33,7 +33,7 @@
                       #undef fflush


                      -#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                      +#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */

                       /* Clear the stream's ungetc buffer, preserving the value of ftello (fp).  */
                       static void
                      @@ -72,7 +72,7 @@

                       #endif

                      -#if ! (defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */)
                      +#if ! (defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */)

                       # if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
                       /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Android */
                      @@ -148,7 +148,7 @@
                         if (stream == NULL || ! freading (stream))
                           return fflush (stream);

                      -#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                      +#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */

                         clear_ungetc_buffer_preserving_position (stream);

                      diff --color -u lib/fpending.c lib/fpending.c
                      --- lib/fpending.c	2016-12-31 07:54:41.000000000 -0600
                      +++ lib/fpending.c	2019-05-24 15:43:00.800903010 -0500
                      @@ -32,7 +32,7 @@
                         /* Most systems provide FILE as a struct and the necessary bitmask in
                            <stdio.h>, because they need it for implementing getc() and putc() as
                            fast macros.  */
                      -#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                      +#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                         return fp->_IO_write_ptr - fp->_IO_write_base;
                       #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
                         /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Android */
                      diff --color -u lib/fpurge.c lib/fpurge.c
                      --- lib/fpurge.c	2016-12-31 07:54:41.000000000 -0600
                      +++ lib/fpurge.c	2019-05-24 15:43:00.800903010 -0500
                      @@ -62,7 +62,7 @@
                         /* Most systems provide FILE as a struct and the necessary bitmask in
                            <stdio.h>, because they need it for implementing getc() and putc() as
                            fast macros.  */
                      -# if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                      +# if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                         fp->_IO_read_end = fp->_IO_read_ptr;
                         fp->_IO_write_ptr = fp->_IO_write_base;
                         /* Avoid memory leak when there is an active ungetc buffer.  */
                      diff --color -u lib/freadahead.c lib/freadahead.c
                      --- lib/freadahead.c	2016-12-31 07:54:41.000000000 -0600
                      +++ lib/freadahead.c	2019-05-24 15:43:00.800903010 -0500
                      @@ -25,7 +25,7 @@
                       size_t
                       freadahead (FILE *fp)
                       {
                      -#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                      +#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                         if (fp->_IO_write_ptr > fp->_IO_write_base)
                           return 0;
                         return (fp->_IO_read_end - fp->_IO_read_ptr)
                      diff --color -u lib/freading.c lib/freading.c
                      --- lib/freading.c	2016-12-31 07:54:41.000000000 -0600
                      +++ lib/freading.c	2019-05-24 15:43:00.800903010 -0500
                      @@ -31,7 +31,7 @@
                         /* Most systems provide FILE as a struct and the necessary bitmask in
                            <stdio.h>, because they need it for implementing getc() and putc() as
                            fast macros.  */
                      -# if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                      +# if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                         return ((fp->_flags & _IO_NO_WRITES) != 0
                                 || ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0
                                     && fp->_IO_read_base != NULL));
                      diff --color -u lib/fseeko.c lib/fseeko.c
                      --- lib/fseeko.c	2016-12-31 07:54:41.000000000 -0600
                      +++ lib/fseeko.c	2019-05-24 15:43:00.800903010 -0500
                      @@ -47,7 +47,7 @@
                       #endif

                         /* These tests are based on fpurge.c.  */
                      -#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                      +#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                         if (fp->_IO_read_end == fp->_IO_read_ptr
                             && fp->_IO_write_ptr == fp->_IO_write_base
                             && fp->_IO_save_base == NULL)
                      @@ -123,7 +123,7 @@
                                 return -1;
                               }

                      -#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                      +#if defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
                             fp->_flags &= ~_IO_EOF_SEEN;
                             fp->_offset = pos;
                       #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
                      Common subdirectories: lib/glthread and lib/glthread
                      diff --color -u lib/stdio-impl.h lib/stdio-impl.h
                      --- lib/stdio-impl.h	2016-12-31 07:54:42.000000000 -0600
                      +++ lib/stdio-impl.h	2019-05-24 15:43:10.885006876 -0500
                      @@ -138,3 +138,4 @@
                       # define _IOERR   0x10

                       #endif
                      +#define _IO_IN_BACKUP 0x100
                      ''
                  ]
                # prelude.defaultConfigure cfg
          , installCommand =
              prelude.installWithManpages
                [ { file = "share/man/man1/m4.1", section = 1 } ]
          , pkgBuildDeps = [ prelude.unbounded "patch" ]
          }

let nginx =
      λ(v : List Natural) →
          prelude.simplePackage { name = "nginx", version = v }
        ⫽ { pkgUrl =
              "http://nginx.org/download/nginx-${prelude.showVersion v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "zlib", prelude.unbounded "pcre2" ]
          }

let openssl =
      let opensslCfgVars =
            λ(cfg : types.BuildVars) →
              Some
                (prelude.mkCCVar cfg # prelude.configEnv ([] : List Text) cfg)

      let cfgOS =
            λ(os : types.OS) →
              merge
                { FreeBSD = "BSD-x86_64"
                , OpenBSD = "BSD-x86_64"
                , NetBSD = "BSD-x86_64"
                , Solaris = "solaris64-x86_64-cc"
                , Dragonfly = "BSD-x86_64"
                , Linux = "linux-x86_64"
                , Darwin = "darwin64-x86_64-cc"
                , Windows = "mingw64"
                , Redox = "gcc"
                , Haiku = "haiku-x86_64"
                , IOS = "ios64-cross"
                , AIX = "aix64-cc"
                , Hurd = "hurd-x86"
                , Android = "android64-aarch64"
                , NoOs = "gcc"
                }
                os

      in  λ(v : List Natural) →
              prelude.simplePackage { name = "openssl", version = v }
            ⫽ { pkgUrl =
                  "https://www.openssl.org/source/openssl-${prelude.showVersion
                                                              v}d.tar.gz"
              , configureCommand =
                  λ(cfg : types.BuildVars) →
                    let sharedFlag =
                          if cfg.static then "no-shared" else "shared"

                    let targetMakefile =
                          if cfg.isCross then "gcc" else cfgOS cfg.buildOS

                    in  [ prelude.call
                            (   prelude.defaultCall
                              ⫽ { program = "perl"
                                , arguments =
                                  [ "./Configure"
                                  , "--prefix=${cfg.installDir}"
                                  , targetMakefile
                                  , sharedFlag
                                  ]
                                , environment = opensslCfgVars cfg
                                }
                            )
                        ]
              , pkgSubdir = "openssl-${prelude.showVersion v}d"
              , pkgBuildDeps = [ prelude.unbounded "perl" ]
              }

let libssh2 =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libssh2", version = v }
        ⫽ { pkgUrl =
              "https://www.libssh2.org/download/libssh2-${prelude.showVersion
                                                            v}.tar.gz"
          }

let giflib =
      λ(v : List Natural) →
          prelude.simplePackage { name = "giflib", version = v }
        ⫽ { pkgUrl =
              "https://downloads.sourceforge.net/giflib/giflib-${prelude.showVersion
                                                                   v}.tar.bz2"
          }

let emacs =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "emacs", version = v }
        ⫽ { pkgDeps =
            [ prelude.unbounded "giflib"
            , prelude.unbounded "libXaw"
            , prelude.unbounded "libpng"
            , prelude.unbounded "libjpeg-turbo"
            , prelude.unbounded "ncurses"
            , prelude.unbounded "gtk3"
            , prelude.unbounded "libotf"
            , prelude.unbounded "m17n-lib"
            , prelude.unbounded "gnutls"
            , prelude.unbounded "libXft"
            , prelude.unbounded "dbus"
            , prelude.unbounded "cairo"
            ]
          , configureCommand =
              prelude.configureMkExesExtraFlags
                { bins =
                  [ "build-aux/move-if-change", "build-aux/update-subdirs" ]
                , extraFlags =
                  [ "--with-tiff=no"
                  , "--with-libotf"
                  , "--with-m17n-flt"
                  , "--with-gnutls"
                  , "--with-xft"
                  , "--with-dbus"
                  , "--with-cairo=yes"
                  ]
                }
          , installCommand =
              λ(cfg : types.BuildVars) →
                if    cfg.static
                then  prelude.installWithBinaries [ "bin/emacs" ] cfg
                else  prelude.installWithWrappers [ "emacs" ] cfg
          }

let which =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "which", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/which/which-${prelude.showVersion
                                                       v}.tar.gz"
          }

let automake =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "automake", version = v }
        ⫽ { pkgBuildDeps =
            [ prelude.lowerBound { name = "autoconf", lower = [ 2, 65 ] } ]
          , installCommand =
              prelude.installWithBinaries [ "bin/automake", "bin/aclocal" ]
          }

let autoconf =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "autoconf", version = v }
        ⫽ { pkgBuildDeps =
            [ prelude.lowerBound { name = "m4", lower = [ 1, 4, 16 ] } ]
          , installCommand =
              prelude.installWithBinaries
                [ "bin/autoconf"
                , "bin/autoheader"
                , "bin/autom4te"
                , "bin/autoreconf"
                ]
          }

let python =
      λ(v : List Natural) →
        let major =
              merge { Some = Natural/show, None = "" } (List/head Natural v)

        let versionString = prelude.showVersion v

        let pyEnv =
              λ(_ : List Text) →
              λ(cfg : types.BuildVars) →
                Some
                  (   prelude.configEnv ([] : List Text) cfg
                    # [ { var = "CONFIG_SITE", value = "config.site" } ]
                  )

        in    prelude.simplePackage { name = "python${major}", version = v }
            ⫽ { pkgUrl =
                  "https://www.python.org/ftp/python/${versionString}/Python-${versionString}.tar.xz"
              , pkgSubdir = "Python-${versionString}"
              , configureCommand =
                  λ(cfg : types.BuildVars) →
                    let config =
                          ''
                          ac_cv_file__dev_ptmx=yes
                          ac_cv_file__dev_ptc=no
                          ''

                    let staticFlag =
                          if    cfg.static
                          then  [] : List Text
                          else  [ "--enable-shared" ]

                    let crossArgs =
                          if    cfg.isCross
                          then  [ "--disable-ipv6" ]
                          else  [] : List Text

                    in    [ prelude.writeFile
                              { file = "config.site", contents = config }
                          ]
                        # prelude.generalConfigure
                            pyEnv
                            "configure"
                            ([] : List Text)
                            (   [ "--build=${prelude.printArch cfg.buildArch}" ]
                              # crossArgs
                              # staticFlag
                            )
                            cfg
              , pkgDeps =
                [ prelude.unbounded "libffi", prelude.unbounded "ncurses" ]
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.installWithBinaries [ "bin/python${major}" ] cfg
                    # prelude.symlinkManpages
                        [ { file = "share/man/man1/python${major}.1"
                          , section = 1
                          }
                        ]
              }

let lua =
      λ(v : List Natural) →
        let printLuaOS =
              λ(os : types.OS) →
                merge
                  { FreeBSD = "freebsd"
                  , OpenBSD = "bsd"
                  , NetBSD = "bsd"
                  , Solaris = "solaris"
                  , Dragonfly = "bsd"
                  , Linux = "linux"
                  , Darwin = "macosx"
                  , Windows = "mingw"
                  , Redox = "generic"
                  , Haiku = "generic"
                  , IOS = "generic"
                  , AIX = "generic"
                  , Hurd = "generic"
                  , Android = "generic"
                  , NoOs = "c89"
                  }
                  os

        let luaBuild =
              λ(cfg : types.BuildVars) →
                let cc = prelude.mkCCArg cfg

                let ldflags = (prelude.mkLDFlags cfg.linkDirs cfg).value

                let cflags = (prelude.mkCFlags cfg).value

                let os = prelude.osCfg cfg

                in  [ prelude.call
                        (   prelude.defaultCall
                          ⫽ { program = "make"
                            , arguments =
                                  cc
                                # [ printLuaOS os
                                  , "MYLDFLAGS=${ldflags}"
                                  , "MYCFLAGS=${cflags}"
                                  , "MYLIBS=-lncurses"
                                  , "-j${Natural/show cfg.cpus}"
                                  ]
                            }
                        )
                    ]

        let luaInstall =
              λ(cfg : types.BuildVars) →
                  [ prelude.call
                      (   prelude.defaultCall
                        ⫽ { program = "make"
                          , arguments =
                            [ "install", "INSTALL_TOP=${cfg.installDir}" ]
                          }
                      )
                  ]
                # prelude.symlinkBinaries [ "bin/lua", "bin/luac" ]

        in    prelude.simplePackage { name = "lua", version = v }
            ⫽ { pkgUrl =
                  "http://www.lua.org/ftp/lua-${prelude.showVersion v}.tar.gz"
              , configureCommand = prelude.doNothing
              , buildCommand = luaBuild
              , installCommand = luaInstall
              , pkgDeps =
                [ prelude.unbounded "readline", prelude.unbounded "ncurses" ]
              }

let libtasn1 =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libtasn1", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/libtasn1/libtasn1-${prelude.showVersion
                                                             v}.tar.gz"
          }

let p11kit =
      λ(v : List Natural) →
          prelude.simplePackage { name = "p11-kit", version = v }
        ⫽ { pkgUrl =
              "https://github.com/p11-glue/p11-kit/releases/download/${prelude.showVersion
                                                                         v}/p11-kit-${prelude.showVersion
                                                                                        v}.tar.gz"
          , pkgDeps =
            [ prelude.lowerBound { name = "libffi", lower = [ 3, 0, 0 ] }
            , prelude.unbounded "libtasn1"
            ]
          , pkgBuildDeps = [ prelude.unbounded "pkg-config" ]
          }

let libffi =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libffi", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/libffi/libffi/releases/download/v${versionString}/libffi-${versionString}.tar.gz"
              }

let gdb =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "gdb", version = v }
        ⫽ { pkgBuildDeps = [ prelude.unbounded "texinfo" ] }

let libtool =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "libtool", version = v }
        ⫽ { pkgUrl =
              "https://ftp.wayne.edu/gnu/libtool/libtool-${prelude.showVersion
                                                             v}.tar.xz"
          , pkgBuildDeps =
            [ prelude.lowerBound { name = "m4", lower = [ 1, 4, 16 ] } ]
          }

let pkg-config =
      λ(v : List Natural) →
          prelude.simplePackage { name = "pkg-config", version = v }
        ⫽ { pkgUrl =
              "https://pkg-config.freedesktop.org/releases/pkg-config-${prelude.showVersion
                                                                          v}.tar.gz"
          , configureCommand =
              prelude.configureWithFlags [ "--with-internal-glib" ]
          }

let qrencode =
      λ(v : List Natural) →
          prelude.simplePackage { name = "qrencode", version = v }
        ⫽ { pkgUrl =
              "https://fukuchi.org/works/qrencode/qrencode-${prelude.showVersion
                                                               v}.tar.gz"
          , configureCommand = prelude.configureWithFlags [ "--without-tools" ]
          }

let readline =
      λ(v : List Natural) →
          prelude.simplePackage { name = "readline", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/readline/readline-${prelude.showVersion
                                                             v}.tar.gz"
          }

let pixman =
      λ(v : List Natural) →
          prelude.simplePackage { name = "pixman", version = v }
        ⫽ { pkgUrl =
              "https://www.cairographics.org/releases/pixman-${prelude.showVersion
                                                                 v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "libpng" ]
          }

let freetype-shared =
      λ(x : { name : Text, version : List Natural }) →
        let versionString = prelude.showVersion x.version

        in    prelude.simplePackage x
            ⫽ { pkgUrl =
                  "https://download.savannah.gnu.org/releases/freetype/freetype-${versionString}.tar.gz"
              , pkgSubdir = "freetype-${versionString}"
              , pkgBuildDeps = [ prelude.unbounded "sed" ]
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.defaultInstall cfg
                    # [ prelude.symlink
                          "include/freetype2/ft2build.h"
                          "include/ft2build.h"
                      , prelude.symlink
                          "include/freetype2/freetype"
                          "include/freetype"
                      ]
              }

let freetype-prebuild =
      λ(v : List Natural) →
          freetype-shared { name = "freetype-prebuild", version = v }
        ⫽ { pkgDeps = [ prelude.unbounded "zlib", prelude.unbounded "libpng" ]
          , pkgBuildDeps = [ prelude.unbounded "pkg-config" ]
          }

let freetype =
      λ(v : List Natural) →
          freetype-shared { name = "freetype", version = v }
        ⫽ { pkgDeps =
            [ prelude.unbounded "zlib"
            , prelude.unbounded "harfbuzz"
            , prelude.unbounded "libpng"
            ]
          , configureCommand =
              prelude.configureMkExesExtraFlags
                { bins = [ "builds/unix/configure" ]
                , extraFlags = [ "--enable-freetype-config" ]
                }
          }

let sdl2 =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "sdl2", version = v }
            ⫽ { pkgUrl =
                  "https://www.libsdl.org/release/SDL2-${versionString}.tar.gz"
              , pkgSubdir = "SDL2-${versionString}"
              }

let imageMagick =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        let major =
              merge { Some = Natural/show, None = "" } (List/head Natural v)

        in    prelude.simplePackage { name = "imagemagick", version = v }
            ⫽ { pkgUrl =
                  "https://imagemagick.org/download/ImageMagick-${versionString}-67.tar.xz"
              , pkgSubdir = "ImageMagick-${versionString}-67"
              , pkgDeps =
                [ prelude.unbounded "zlib"
                , prelude.unbounded "libtool"
                , prelude.unbounded "bzip2"
                , prelude.unbounded "glib"
                ]
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.defaultInstall cfg
                    # [ prelude.symlink
                          "include/ImageMagick-${major}/MagickWand"
                          "include/wand"
                      , prelude.symlinkBinary "bin/convert"
                      ]
              }

let gtk2 =
      let gtkEnv =
            λ(cfg : types.BuildVars) →
                prelude.defaultPath cfg
              # [ { var = "LDFLAGS"
                  , value =
                          (prelude.mkLDFlags cfg.linkDirs cfg).value
                      ++  " -lpcre -lfribidi"
                  }
                , prelude.mkCFlags cfg
                , prelude.mkPkgConfigVar cfg.linkDirs
                , prelude.libPath cfg
                , prelude.mkLDRunPath cfg.linkDirs
                , prelude.mkXdgDataDirs cfg.shareDirs
                , prelude.mkLDPreload cfg.preloadLibs
                ]

      let gtkConfig =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = "./configure"
                      , arguments = [ "--prefix=${cfg.installDir}" ]
                      , environment = Some (gtkEnv cfg)
                      }
                  )
              ]

      in  λ(x : { version : List Natural, patch : Natural }) →
            let versionString = prelude.showVersion x.version

            let fullVersion = versionString ++ "." ++ Natural/show x.patch

            in    prelude.simplePackage
                    { name = "gtk2", version = prelude.fullVersion x }
                ⫽ { pkgUrl =
                      "http://ftp.gnome.org/pub/gnome/sources/gtk+/${versionString}/gtk+-${fullVersion}.tar.xz"
                  , pkgSubdir = "gtk+-${fullVersion}"
                  , pkgDeps =
                    [ prelude.lowerBound { name = "cairo", lower = [ 1, 6 ] }
                    , prelude.lowerBound { name = "pango", lower = [ 1, 20 ] }
                    , prelude.lowerBound { name = "atk", lower = [ 1, 29, 2 ] }
                    , prelude.lowerBound { name = "glib", lower = [ 2, 28, 0 ] }
                    , prelude.lowerBound
                        { name = "gdk-pixbuf", lower = [ 2, 38, 0 ] }
                    ]
                  , buildCommand =
                      λ(cfg : types.BuildVars) →
                        prelude.buildWith (gtkEnv cfg) cfg
                  , configureCommand = gtkConfig
                  , installCommand =
                      λ(cfg : types.BuildVars) →
                          prelude.defaultInstall cfg
                        # [ prelude.symlink
                              "include/gdk-pixbuf-2.0/gdk-pixbuf"
                              "include/gdk-pixbuf"
                          ]
                  }

let mkXProto =
      λ(name : Text) →
      λ(v : List Natural) →
          prelude.simplePackage { name, version = v }
        ⫽ { pkgUrl =
              "https://www.x.org/releases/individual/proto/${name}-${prelude.showVersion
                                                                       v}.tar.bz2"
          }

let mkXProtoWithPatch =
      λ(name : Text) →
      λ(patch : Text) →
      λ(v : List Natural) →
          mkXProto name v
        ⫽ { configureCommand = prelude.configureWithPatch patch
          , pkgBuildDeps = [ prelude.unbounded "patch" ]
          }

let xproto =
      mkXProtoWithPatch
        "xproto"
        ''
        --- config.sub	2019-04-27 16:40:36.266089495 -0500
        +++ config.sub	2019-04-27 16:41:44.593275058 -0500
        @@ -240,7 +240,7 @@
         	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
         	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
         	| am33_2.0 \
        -	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
        +	| arc | aarch64 | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
         	| bfin \
         	| c4x | clipper \
         	| d10v | d30v | dlx | dsp16xx \
        ''

let renderproto =
      mkXProtoWithPatch
        "renderproto"
        ''
        --- config.sub	2010-08-10 09:11:53.000000000 -0500
        +++ config.sub.new	2019-04-27 17:18:57.730988579 -0500
        @@ -248,7 +248,7 @@
         	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
         	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
         	| am33_2.0 \
        -	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
        +	| arc | aarch64 | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
         	| bfin \
         	| c4x | clipper \
         	| d10v | d30v | dlx | dsp16xx \
        ''

let randrproto = mkXProto "randrproto"

let scrnsaverproto =
      mkXProtoWithPatch
        "scrnsaverproto"
        ''
        --- config.sub	2012-03-22 22:49:47.000000000 -0500
        +++ config.sub	2019-04-28 04:52:47.247723846 -0500
        @@ -250,7 +250,7 @@
         	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
         	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
         	| am33_2.0 \
        -	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
        +	| arc | aarch64 | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
         	| bfin \
         	| c4x | clipper \
         	| d10v | d30v | dlx | dsp16xx \
        ''

let recordproto = mkXProto "recordproto"

let xf86vidmodeproto = mkXProto "xf86vidmodeproto"

let glproto = mkXProto "glproto"

let dri2proto = mkXProto "dri2proto"

let pango =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        let pangoCfgFile =
              ''
              option('enable_docs',
                    description: 'Build API reference for Pango using GTK-Doc',
                    type: 'boolean',
                    value: false)
              option('gir',
                    description: 'Build the GObject introspection data for Pango',
                    type: 'boolean',
                    value: false)
              ''

        let no_gir =
              λ(cfg : types.BuildVars) →
                if    cfg.isCross
                then  [ prelude.writeFile
                          { file = "meson_options.txt"
                          , contents = pangoCfgFile
                          }
                      ]
                else  [] : List types.Command

        in    prelude.simplePackage
                { name = "pango", version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "http://ftp.gnome.org/pub/GNOME/sources/pango/${versionString}/pango-${fullVersion}.tar.xz"
              , configureCommand =
                  λ(cfg : types.BuildVars) →
                    no_gir cfg # prelude.mesonConfigure cfg
              , buildCommand = prelude.ninjaBuild
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.ninjaInstallWithPkgConfig
                        ( prelude.mesonMoves
                            [ "pango.pc", "pangocairo.pc", "pangoft2.pc" ]
                        )
                        cfg
                    # [ prelude.symlink
                          "include/pango-1.0/pango"
                          "include/pango"
                      ]
              , pkgBuildDeps =
                [ prelude.lowerBound { name = "meson", lower = [ 0, 48, 0 ] }
                , prelude.unbounded "gobject-introspection"
                ]
              , pkgDeps =
                [ prelude.lowerBound
                    { name = "fontconfig", lower = [ 2, 11, 91 ] }
                , prelude.lowerBound { name = "cairo", lower = [ 1, 12, 10 ] }
                , prelude.lowerBound { name = "fribidi", lower = [ 0, 19, 7 ] }
                , prelude.lowerBound { name = "harfbuzz", lower = [ 1, 4, 2 ] }
                , prelude.unbounded "libXrender"
                , prelude.unbounded "libxcb"
                ]
              }

let libxml2 =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libxml2", version = v }
        ⫽ { pkgUrl =
              "http://xmlsoft.org/sources/libxml2-${prelude.showVersion
                                                      v}.tar.gz"
          , pkgDeps =
            [ prelude.unbounded "zlib"
            , prelude.unbounded "xz"
            , prelude.unbounded "python2"
            ]
          }

let shared-mime-info =
      λ(v : List Natural) →
          prelude.simplePackage { name = "shared-mime-info", version = v }
        ⫽ { pkgUrl =
              "http://freedesktop.org/~hadess/shared-mime-info-${prelude.showVersion
                                                                   v}.tar.xz"
          , buildCommand =
              λ(cfg : types.BuildVars) →
                prelude.generalBuild
                  prelude.singleThreaded
                  (prelude.buildEnv cfg)
                  cfg
          , installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.defaultInstall cfg
                # [ prelude.symlink "share/pkgconfig" "lib/pkgconfig" ]
          , pkgDeps = [ prelude.unbounded "glib", prelude.unbounded "libxml2" ]
          , pkgBuildDeps =
            [ prelude.lowerBound { name = "intltool", lower = [ 0, 35, 0 ] }
            , prelude.unbounded "sed"
            , prelude.unbounded "gettext"
            ]
          }

let intltool =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "intltool", version = v }
            ⫽ { pkgUrl =
                  "https://launchpad.net/intltool/trunk/${versionString}/+download/intltool-${versionString}.tar.gz"
              , configureCommand =
                  λ(cfg : types.BuildVars) →
                    [ prelude.patch
                        ''
                        --- intltool-update.in	2015-03-08 20:39:54.000000000 -0500
                        +++ intltool-update.in	2019-06-19 20:58:02.349782444 -0500
                        @@ -1062,13 +1062,13 @@
                         	}
                             }

                        -    if ($str =~ /^(.*)\''${?([A-Z_]+)}?(.*)$/)
                        +    if ($str =~ /^(.*)\$\{?([A-Z_]+)}?(.*)$/)
                             {
                         	my $rest = $3;
                         	my $untouched = $1;
                         	my $sub = "";
                                 # Ignore recursive definitions of variables
                        -        $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\''${?$2}?/;
                        +        $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\$\{?$2}?/;

                         	return SubstituteVariable ("$untouched$sub$rest");
                             }
                        @@ -1190,10 +1190,10 @@
                         	$name    =~ s/\(+$//g;
                         	$version =~ s/\(+$//g;

                        -	$varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\''${?AC_PACKAGE_NAME}?/);
                        -	$varhash{"PACKAGE"} = $name if (not $name =~ /\''${?PACKAGE}?/);
                        -	$varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\''${?AC_PACKAGE_VERSION}?/);
                        -	$varhash{"VERSION"} = $version if (not $name =~ /\''${?VERSION}?/);
                        +	$varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\$\{?AC_PACKAGE_NAME}?/);
                        +	$varhash{"PACKAGE"} = $name if (not $name =~ /\$\{?PACKAGE}?/);
                        +	$varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\$\{?AC_PACKAGE_VERSION}?/);
                        +	$varhash{"VERSION"} = $version if (not $name =~ /\$\{?VERSION}?/);
                             }

                             if ($conf_source =~ /^AC_INIT\(([^,\)]+),([^,\)]+)[,]?([^,\)]+)?/m)
                        @@ -1219,11 +1219,11 @@
                         	$version =~ s/\(+$//g;
                                 $bugurl  =~ s/\(+$//g if (defined $bugurl);

                        -	$varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\''${?AC_PACKAGE_NAME}?/);
                        -	$varhash{"PACKAGE"} = $name if (not $name =~ /\''${?PACKAGE}?/);
                        -	$varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\''${?AC_PACKAGE_VERSION}?/);
                        -	$varhash{"VERSION"} = $version if (not $name =~ /\''${?VERSION}?/);
                        -        $varhash{"PACKAGE_BUGREPORT"} = $bugurl if (defined $bugurl and not $bugurl =~ /\''${?\w+}?/);
                        +	$varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\$\{?AC_PACKAGE_NAME}?/);
                        +	$varhash{"PACKAGE"} = $name if (not $name =~ /\$\{?PACKAGE}?/);
                        +	$varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\$\{?AC_PACKAGE_VERSION}?/);
                        +	$varhash{"VERSION"} = $version if (not $name =~ /\$\{?VERSION}?/);
                        +        $varhash{"PACKAGE_BUGREPORT"} = $bugurl if (defined $bugurl and not $bugurl =~ /\$\{?\w+}?/);
                             }

                             # \s makes this not work, why?
                        ''
                    , prelude.call
                        (   prelude.defaultCall
                          ⫽ { program = "./configure"
                            , arguments = [ "--prefix=${cfg.installDir}" ]
                            , environment = Some
                                (   prelude.defaultPath cfg
                                  # [ prelude.mkPerlLib
                                        { libDirs = cfg.linkDirs
                                        , perlVersion = [ 5, 30, 1 ]
                                        , cfg
                                        }
                                    ]
                                )
                            }
                        )
                    ]
              , pkgDeps = [ prelude.unbounded "XML-Parser" ]
              , pkgBuildDeps =
                [ prelude.lowerBound { name = "perl", lower = [ 5, 8, 1 ] } ]
              }

let gdk-pixbuf =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        let gdkInstall =
              λ(fs : List { src : Text, dest : Text }) →
              λ(cfg : types.BuildVars) →
                  [ prelude.call
                      (   prelude.defaultCall
                        ⫽ { program = "ninja"
                          , environment = Some
                            [ prelude.mkPkgConfigVar cfg.linkDirs
                            , { var = "PATH"
                              , value =
                                      prelude.mkPathVar cfg.binDirs
                                  ++  ":${cfg.currentDir}/gdk-pixbuf-${fullVersion}/build/gdk-pixbuf:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                              }
                            , prelude.mkPy3Path cfg.linkDirs
                            , prelude.libPath cfg
                            , prelude.mkLDRunPath cfg.linkDirs
                            , prelude.mkLDFlags cfg.linkDirs cfg
                            , prelude.mkCFlags cfg
                            ]
                          , arguments = [ "install" ]
                          , procDir = Some "build"
                          }
                      )
                  , prelude.symlink
                      "include/gdk-pixbuf-2.0/gdk-pixbuf"
                      "include/gdk-pixbuf"
                  ]
                # prelude.copyFiles fs

        in    prelude.simplePackage
                { name = "gdk-pixbuf", version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "http://ftp.gnome.org/pub/GNOME/sources/gdk-pixbuf/${versionString}/gdk-pixbuf-${fullVersion}.tar.xz"
              , configureCommand = prelude.mesonConfigure
              , buildCommand = prelude.ninjaBuild
              , installCommand =
                  gdkInstall (prelude.mesonMoves [ "gdk-pixbuf-2.0.pc" ])
              , pkgDeps =
                [ prelude.unbounded "glib"
                , prelude.unbounded "libjpeg-turbo"
                , prelude.unbounded "libpng"
                , prelude.unbounded "gobject-introspection"
                , prelude.unbounded "shared-mime-info"
                , prelude.unbounded "libX11"
                ]
              }

let xmlParser =
      λ(v : List Natural) →
          prelude.simplePackage { name = "XML-Parser", version = v }
        ⫽ { pkgUrl =
              "https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-${prelude.showVersion
                                                                              v}.tar.gz"
          , configureCommand = prelude.perlConfigure
          , pkgBuildDeps = [ prelude.unbounded "perl" ]
          , pkgDeps = [ prelude.unbounded "expat" ]
          }

let meson =
      λ(v : List Natural) →
          prelude.simplePackage { name = "meson", version = v }
        ⫽ { pkgUrl =
              "https://github.com/mesonbuild/meson/archive/${prelude.showVersion
                                                               v}.tar.gz"
          , configureCommand =
              λ(cfg : types.BuildVars) →
                prelude.python3Install cfg # prelude.mkPy3Wrapper "meson" cfg
          , buildCommand = prelude.doNothing
          , installCommand = prelude.doNothing
          , pkgDeps = [ prelude.unbounded "python3" ]
          }

let ninja =
      let ninjaConfigure =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = "./configure.py"
                      , arguments = [ "--bootstrap" ]
                      }
                  )
              ]

      let ninjaInstall =
            λ(cfg : types.BuildVars) →
              [ prelude.copyFile "ninja" "bin/ninja"
              , prelude.symlinkBinary "bin/ninja"
              ]

      in  λ(v : List Natural) →
              prelude.simplePackage { name = "ninja", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/ninja-build/ninja/archive/v${prelude.showVersion
                                                                     v}.tar.gz"
              , configureCommand = ninjaConfigure
              , buildCommand = prelude.doNothing
              , installCommand = ninjaInstall
              , pkgBuildDeps = [ prelude.unbounded "python2" ]
              }

let fontconfig =
      λ(v : List Natural) →
          prelude.simplePackage { name = "fontconfig", version = v }
        ⫽ { pkgUrl =
              "https://www.freedesktop.org/software/fontconfig/release/fontconfig-${prelude.showVersion
                                                                                      v}.tar.bz2"
          , pkgDeps =
            [ prelude.unbounded "freetype"
            , prelude.unbounded "expat"
            , prelude.unbounded "util-linux"
            ]
          , pkgBuildDeps = [ prelude.unbounded "gperf" ]
          }

let util-linux =
      λ(x : { version : List Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString

        in    prelude.simplePackage { name = "util-linux", version = x.version }
            ⫽ { pkgUrl =
                  "https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v${versionString}/util-linux-${fullVersion}.tar.xz"
              , configureCommand =
                  λ(cfg : types.BuildVars) →
                    let crossFlags =
                          if    cfg.isCross
                          then  [ "--disable-pylibmount", "--without-tinfo" ]
                          else  [] : List Text

                    in  prelude.configureWithFlags
                          (   [ "--disable-makeinstall-chown"
                              , "--disable-bash-completion"
                              ]
                            # crossFlags
                          )
                          cfg
              , pkgDeps =
                [ prelude.unbounded "ncurses", prelude.unbounded "pcre2" ]
              }

let fribidi =
      λ(v : List Natural) →
          prelude.simplePackage { name = "fribidi", version = v }
        ⫽ { pkgUrl =
              "https://github.com/fribidi/fribidi/releases/download/v${prelude.showVersion
                                                                         v}/fribidi-${prelude.showVersion
                                                                                        v}.tar.bz2"
          }

let gobject-introspection =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.ninjaPackage
                { name = "gobject-introspection"
                , version = prelude.fullVersion x
                }
            ⫽ { pkgUrl =
                  "https://download.gnome.org/sources/gobject-introspection/${versionString}/gobject-introspection-${fullVersion}.tar.xz"
              , pkgBuildDeps =
                [ prelude.unbounded "meson"
                , prelude.unbounded "m4"
                , prelude.unbounded "bison"
                , prelude.unbounded "flex"
                , prelude.unbounded "pkg-config"
                , prelude.unbounded "glibc"
                ]
              , pkgDeps =
                [ prelude.lowerBound { name = "glib", lower = [ 2, 58, 0 ] } ]
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      [ prelude.mkExe "build/tools/g-ir-scanner"
                      , prelude.copyFile
                          "build/gobject-introspection-1.0.pc"
                          "lib/pkgconfig/gobject-introspection-1.0.pc"
                      ]
                    # prelude.ninjaInstall cfg
              }

let flex =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        let flexEnv =
              λ(_ : List Text) →
              λ(cfg : types.BuildVars) →
                Some
                  (   prelude.configEnv ([] : List Text) cfg
                    # [ { var = "YFLAGS", value = "-Wno-error=yacc" } ]
                  )

        in    prelude.simplePackage { name = "flex", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/westes/flex/releases/download/v${versionString}/flex-${versionString}.tar.gz"
              , pkgBuildDeps =
                [ prelude.unbounded "m4", prelude.unbounded "bison" ]
              , configureCommand = prelude.configWithEnv flexEnv
              , installCommand = prelude.installWithBinaries [ "bin/flex" ]
              }

let glib =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        let glibConfigure =
              λ(cfg : types.BuildVars) →
                let crossArgs =
                      if    cfg.isCross
                      then  [ "--cross-file", "cross.txt" ]
                      else  [] : List Text

                in  [ prelude.createDir "build"
                    , prelude.writeFile
                        { file = "build/cross.txt"
                        , contents = prelude.mesonCfgFile cfg
                        }
                    , prelude.call
                        { program = "meson"
                        , arguments =
                              [ "--prefix=${cfg.installDir}"
                              , ".."
                              , "-Dselinux=disabled"
                              ]
                            # crossArgs
                        , environment = Some
                            (   [ prelude.mkPkgConfigVar cfg.linkDirs
                                , { var = "LDFLAGS"
                                  , value =
                                      (prelude.mkLDFlags cfg.linkDirs cfg).value
                                  }
                                , prelude.mkPy3Path cfg.linkDirs
                                , prelude.libPath cfg
                                , prelude.mkCFlags cfg
                                , prelude.mkPkgConfigVar cfg.linkDirs
                                ]
                              # prelude.defaultPath cfg
                            )
                        , procDir = Some "build"
                        }
                    ]

        let symlinkGio =
              λ(h : Text) →
                prelude.symlink "include/glib-2.0/gio/${h}" "include/gio/${h}"

        let symlinkGunix =
              λ(h : Text) →
                prelude.symlink
                  "include/gio-unix-2.0/gio/${h}"
                  "include/gio/${h}"

        in    prelude.simplePackage
                { name = "glib", version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "http://ftp.gnome.org/pub/gnome/sources/glib/${versionString}/glib-${fullVersion}.tar.xz"
              , configureCommand = glibConfigure
              , buildCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.ninjaBuild cfg
                    # prelude.mkExes
                        [ "build/gobject/glib-mkenums"
                        , "build/gobject/glib-genmarshal"
                        , "build/gio/gdbus-2.0/codegen/gdbus-codegen"
                        ]
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.ninjaInstallWithPkgConfig
                        ( prelude.mesonMoves
                            [ "glib-2.0.pc"
                            , "gobject-2.0.pc"
                            , "gio-2.0.pc"
                            , "gio-unix-2.0.pc"
                            , "gmodule-no-export-2.0.pc"
                            , "gmodule-export-2.0.pc"
                            , "gmodule-2.0.pc"
                            , "gthread-2.0.pc"
                            ]
                        )
                        cfg
                    # [ prelude.symlink "include/glib-2.0/glib" "include/glib"
                      , prelude.symlink
                          "include/glib-2.0/gobject"
                          "include/gobject"
                      , prelude.symlink
                          "include/glib-2.0/glib.h"
                          "include/glib.h"
                      , prelude.symlink
                          "include/glib-2.0/glib-object.h"
                          "include/glib-object.h"
                      , prelude.symlink
                          "include/glib-2.0/glib-unix.h"
                          "include/glib-unix.h"
                      , prelude.symlink
                          "include/glib-2.0/gmodule.h"
                          "include/gmodule.h"
                      , symlinkGio "gaction.h"
                      , symlinkGio "gactiongroup.h"
                      , symlinkGio "gactiongroupexporter.h"
                      , symlinkGio "gactionmap.h"
                      , symlinkGio "gappinfo.h"
                      , symlinkGio "gapplication.h"
                      , symlinkGio "gapplicationcommandline.h"
                      , symlinkGio "gasyncinitable.h"
                      , symlinkGio "gasyncresult.h"
                      , symlinkGio "gbufferedinputstream.h"
                      , symlinkGio "gbufferedoutputstream.h"
                      , symlinkGio "gbytesicon.h"
                      , symlinkGio "gcancellable.h"
                      , symlinkGio "gcharsetconverter.h"
                      , symlinkGio "gcontenttype.h"
                      , symlinkGio "gconverter.h"
                      , symlinkGio "gconverterinputstream.h"
                      , symlinkGio "gconverteroutputstream.h"
                      , symlinkGio "gcredentials.h"
                      , symlinkGio "gdatagrambased.h"
                      , symlinkGio "gdatainputstream.h"
                      , symlinkGio "gdataoutputstream.h"
                      , symlinkGio "gdbusactiongroup.h"
                      , symlinkGio "gdbusaddress.h"
                      , symlinkGio "gdbusauthobserver.h"
                      , symlinkGio "gdbusconnection.h"
                      , symlinkGio "gdbuserror.h"
                      , symlinkGio "gdbusinterface.h"
                      , symlinkGio "gdbusinterfaceskeleton.h"
                      , symlinkGio "gdbusintrospection.h"
                      , symlinkGio "gdbusmenumodel.h"
                      , symlinkGio "gdbusmessage.h"
                      , symlinkGio "gdbusmethodinvocation.h"
                      , symlinkGio "gdbusnameowning.h"
                      , symlinkGio "gdbusnamewatching.h"
                      , symlinkGio "gdbusobject.h"
                      , symlinkGio "gdbusobjectmanager.h"
                      , symlinkGio "gdbusobjectmanagerclient.h"
                      , symlinkGio "gdbusobjectmanagerserver.h"
                      , symlinkGio "gdbusobjectproxy.h"
                      , symlinkGio "gdbusobjectskeleton.h"
                      , symlinkGio "gdbusproxy.h"
                      , symlinkGio "gdbusserver.h"
                      , symlinkGio "gdbusutils.h"
                      , symlinkGio "gdrive.h"
                      , symlinkGio "gdtlsclientconnection.h"
                      , symlinkGio "gdtlsconnection.h"
                      , symlinkGio "gdtlsserverconnection.h"
                      , symlinkGio "gemblem.h"
                      , symlinkGio "gemblemedicon.h"
                      , symlinkGio "gfile.h"
                      , symlinkGio "gfileattribute.h"
                      , symlinkGio "gfileenumerator.h"
                      , symlinkGio "gfileicon.h"
                      , symlinkGio "gfileinfo.h"
                      , symlinkGio "gfileinputstream.h"
                      , symlinkGio "gfileiostream.h"
                      , symlinkGio "gfilemonitor.h"
                      , symlinkGio "gfilenamecompleter.h"
                      , symlinkGio "gfileoutputstream.h"
                      , symlinkGio "gfilterinputstream.h"
                      , symlinkGio "gfilteroutputstream.h"
                      , symlinkGio "gicon.h"
                      , symlinkGio "ginetaddress.h"
                      , symlinkGio "ginetaddressmask.h"
                      , symlinkGio "ginetsocketaddress.h"
                      , symlinkGio "ginitable.h"
                      , symlinkGio "ginputstream.h"
                      , symlinkGio "gio-autocleanups.h"
                      , symlinkGio "gio.h"
                      , symlinkGio "gioenums.h"
                      , symlinkGio "gioenumtypes.h"
                      , symlinkGio "gioerror.h"
                      , symlinkGio "giomodule.h"
                      , symlinkGio "gioscheduler.h"
                      , symlinkGio "giostream.h"
                      , symlinkGio "giotypes.h"
                      , symlinkGio "glistmodel.h"
                      , symlinkGio "gliststore.h"
                      , symlinkGio "gloadableicon.h"
                      , symlinkGio "gmemoryinputstream.h"
                      , symlinkGio "gmemoryoutputstream.h"
                      , symlinkGio "gmenu.h"
                      , symlinkGio "gmenuexporter.h"
                      , symlinkGio "gmenumodel.h"
                      , symlinkGio "gmount.h"
                      , symlinkGio "gmountoperation.h"
                      , symlinkGio "gnativevolumemonitor.h"
                      , symlinkGio "gnetworkaddress.h"
                      , symlinkGio "gnetworking.h"
                      , symlinkGio "gnetworkmonitor.h"
                      , symlinkGio "gnetworkservice.h"
                      , symlinkGio "gnotification.h"
                      , symlinkGio "goutputstream.h"
                      , symlinkGio "gpermission.h"
                      , symlinkGio "gpollableinputstream.h"
                      , symlinkGio "gpollableoutputstream.h"
                      , symlinkGio "gpollableutils.h"
                      , symlinkGio "gpropertyaction.h"
                      , symlinkGio "gproxy.h"
                      , symlinkGio "gproxyaddress.h"
                      , symlinkGio "gproxyaddressenumerator.h"
                      , symlinkGio "gproxyresolver.h"
                      , symlinkGio "gremoteactiongroup.h"
                      , symlinkGio "gresolver.h"
                      , symlinkGio "gresource.h"
                      , symlinkGio "gseekable.h"
                      , symlinkGio "gsettings.h"
                      , symlinkGio "gsettingsbackend.h"
                      , symlinkGio "gsettingsschema.h"
                      , symlinkGio "gsimpleaction.h"
                      , symlinkGio "gsimpleactiongroup.h"
                      , symlinkGio "gsimpleasyncresult.h"
                      , symlinkGio "gsimpleiostream.h"
                      , symlinkGio "gsimplepermission.h"
                      , symlinkGio "gsimpleproxyresolver.h"
                      , symlinkGio "gsocket.h"
                      , symlinkGio "gsocketaddress.h"
                      , symlinkGio "gsocketaddressenumerator.h"
                      , symlinkGio "gsocketclient.h"
                      , symlinkGio "gsocketconnectable.h"
                      , symlinkGio "gsocketconnection.h"
                      , symlinkGio "gsocketcontrolmessage.h"
                      , symlinkGio "gsocketlistener.h"
                      , symlinkGio "gsocketservice.h"
                      , symlinkGio "gsrvtarget.h"
                      , symlinkGio "gsubprocess.h"
                      , symlinkGio "gsubprocesslauncher.h"
                      , symlinkGio "gtask.h"
                      , symlinkGio "gtcpconnection.h"
                      , symlinkGio "gtcpwrapperconnection.h"
                      , symlinkGio "gtestdbus.h"
                      , symlinkGio "gthemedicon.h"
                      , symlinkGio "gthreadedsocketservice.h"
                      , symlinkGio "gtlsbackend.h"
                      , symlinkGio "gtlscertificate.h"
                      , symlinkGio "gtlsclientconnection.h"
                      , symlinkGio "gtlsconnection.h"
                      , symlinkGio "gtlsdatabase.h"
                      , symlinkGio "gtlsfiledatabase.h"
                      , symlinkGio "gtlsinteraction.h"
                      , symlinkGio "gtlspassword.h"
                      , symlinkGio "gtlsserverconnection.h"
                      , symlinkGio "gvfs.h"
                      , symlinkGio "gvolume.h"
                      , symlinkGio "gvolumemonitor.h"
                      , symlinkGio "gzlibcompressor.h"
                      , symlinkGio "gzlibdecompressor.h"
                      , symlinkGunix "gdesktopappinfo.h"
                      , symlinkGunix "gfiledescriptorbased.h"
                      , symlinkGunix "gunixconnection.h"
                      , symlinkGunix "gunixcredentialsmessage.h"
                      , symlinkGunix "gunixfdlist.h"
                      , symlinkGunix "gunixfdmessage.h"
                      , symlinkGunix "gunixinputstream.h"
                      , symlinkGunix "gunixmounts.h"
                      , symlinkGunix "gunixoutputstream.h"
                      , symlinkGunix "gunixsocketaddress.h"
                      ]
              , pkgBuildDeps =
                [ prelude.unbounded "meson", prelude.unbounded "ninja" ]
              , pkgDeps =
                [ prelude.unbounded "util-linux"
                , prelude.unbounded "pcre"
                , prelude.unbounded "libffi"
                , prelude.unbounded "zlib"
                , prelude.unbounded "dbus"
                ]
              }

let atk =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.ninjaPackage
                { name = "atk", version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "https://ftp.gnome.org/pub/gnome/sources/atk/${versionString}/atk-${fullVersion}.tar.xz"
              , pkgBuildDeps =
                [ prelude.unbounded "gobject-introspection"
                , prelude.unbounded "gettext"
                ]
              , pkgDeps = [ prelude.unbounded "glib" ]
              , installCommand =
                  prelude.ninjaInstallWithPkgConfig
                    [ { src = "build/meson-private/atk.pc"
                      , dest = "lib/pkgconfig/atk.pc"
                      }
                    ]
              }

let re2c =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "re2c", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/skvadrik/re2c/releases/download/${versionString}/re2c-${versionString}.tar.gz"
              }

let chickenScheme =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        let printChickenOS =
              λ(os : types.OS) →
                merge
                  { FreeBSD = "bsd"
                  , OpenBSD = "bsd"
                  , NetBSD = "bsd"
                  , Solaris = "solaris"
                  , Dragonfly = "bsd"
                  , Linux = "linux"
                  , Darwin = "macosx"
                  , Windows = "mingw"
                  , Haiku = "haiku"
                  , IOS = "ios"
                  , AIX = "aix"
                  , Hurd = "hurd"
                  , Android = "android"
                  , Redox = "error: no port for Redox OS"
                  , NoOs = "error: no port for no OS"
                  }
                  os

        let chickenBuild =
              λ(cfg : types.BuildVars) →
                let cc =
                      merge
                        { Some =
                            λ(tgt : types.TargetTriple) →
                              [ "C_COMPILER=${prelude.printTargetTriple
                                                tgt}-gcc"
                              ]
                        , None = [] : List Text
                        }
                        cfg.targetTriple

                let os = prelude.osCfg cfg

                in    [ prelude.call
                          (   prelude.defaultCall
                            ⫽ { program = prelude.makeExe cfg.buildOS
                              , arguments =
                                    cc
                                  # [ "PLATFORM=${printChickenOS os}"
                                    , "PREFIX=${cfg.installDir}"
                                    ]
                              }
                          )
                      , prelude.call
                          (   prelude.defaultCall
                            ⫽ { program = prelude.makeExe cfg.buildOS
                              , arguments =
                                    cc
                                  # [ "PLATFORM=${printChickenOS os}"
                                    , "PREFIX=${cfg.installDir}"
                                    , "install"
                                    ]
                              }
                          )
                      ]
                    # prelude.symlinkBinaries
                        [ "bin/csc", "bin/chicken-install", "bin/csi" ]

        in    prelude.simplePackage { name = "chicken-scheme", version = v }
            ⫽ { pkgUrl =
                  "https://code.call-cc.org/releases/${versionString}/chicken-${versionString}.tar.gz"
              , configureCommand = prelude.doNothing
              , buildCommand = chickenBuild
              , installCommand = prelude.doNothing
              , pkgSubdir = "chicken-${versionString}"
              }

let xcb-proto =
      λ(v : List Natural) →
          prelude.simplePackage { name = "xcb-proto", version = v }
        ⫽ { pkgUrl =
              "https://xorg.freedesktop.org/archive/individual/xcb/xcb-proto-${prelude.showVersion
                                                                                 v}.tar.bz2"
          }

let libxcb =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libxcb", version = v }
        ⫽ { pkgUrl =
              "https://xorg.freedesktop.org/archive/individual/xcb/libxcb-${prelude.showVersion
                                                                              v}.tar.bz2"
          , pkgDeps =
            [ prelude.lowerBound { name = "xcb-proto", lower = [ 1, 13 ] }
            , prelude.unbounded "libXau"
            , prelude.unbounded "libpthread-stubs"
            , prelude.unbounded "libXdmcp"
            ]
          }

let libpthread-stubs =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libpthread-stubs", version = v }
        ⫽ { pkgUrl =
              "https://www.x.org/archive/individual/xcb/libpthread-stubs-${prelude.showVersion
                                                                             v}.tar.bz2"
          }

let xorgConfigure =
      prelude.configureWithFlags [ "--disable-malloc0returnsnull" ]

let mkXLib =
      λ(name : Text) →
      λ(v : List Natural) →
          prelude.simplePackage { name, version = v }
        ⫽ { pkgUrl =
              "https://www.x.org/releases/individual/lib/${name}-${prelude.showVersion
                                                                     v}.tar.bz2"
          , configureCommand = xorgConfigure
          , pkgBuildDeps = [ prelude.unbounded "pkg-config" ]
          }

let mkXLibDeps =
      λ(x : { name : Text, deps : List types.Dep }) →
      λ(v : List Natural) →
        mkXLib x.name v ⫽ { pkgDeps = x.deps }

let libXdmcp =
      mkXLibDeps { name = "libXdmcp", deps = [ prelude.unbounded "xproto" ] }

let libXau =
      mkXLibDeps { name = "libXau", deps = [ prelude.unbounded "xproto" ] }

let mkXUtil =
      λ(name : Text) →
      λ(v : List Natural) →
          prelude.simplePackage { name, version = v }
        ⫽ { pkgUrl =
              "https://www.x.org/releases/individual/util/${name}-${prelude.showVersion
                                                                      v}.tar.bz2"
          }

let libXrender =
      mkXLibDeps
        { name = "libXrender"
        , deps =
          [ prelude.unbounded "xproto"
          , prelude.unbounded "renderproto"
          , prelude.unbounded "libX11"
          ]
        }

let util-macros = mkXUtil "util-macros"

let libXft =
      mkXLibDeps
        { name = "libXft"
        , deps =
          [ prelude.unbounded "freetype"
          , prelude.unbounded "fontconfig"
          , prelude.unbounded "libXrender"
          , prelude.unbounded "libX11"
          ]
        }

let kbproto = mkXProto "kbproto"

let libX11 =
      mkXLibDeps
        { name = "libX11"
        , deps =
          [ prelude.unbounded "libxcb"
          , prelude.unbounded "kbproto"
          , prelude.unbounded "xextproto"
          , prelude.unbounded "inputproto"
          , prelude.unbounded "xtrans"
          ]
        }

let inputproto = mkXProto "inputproto"

let xineramaproto =
      mkXProtoWithPatch
        "xineramaproto"
        ''
        --- config.sub	2009-10-01 05:35:23.000000000 -0500
        +++ config.sub	2019-04-28 04:57:15.837809557 -0500
        @@ -242,7 +242,7 @@
         	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
         	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
         	| am33_2.0 \
        -	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
        +	| arc | aarch64 | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
         	| bfin \
         	| c4x | clipper \
         	| d10v | d30v | dlx | dsp16xx \
        ''

let xtrans = mkXLib "xtrans"

let libXrandr =
      mkXLibDeps
        { name = "libXrandr"
        , deps =
          [ prelude.unbounded "util-macros"
          , prelude.unbounded "libXext"
          , prelude.unbounded "libXrender"
          , prelude.unbounded "libX11"
          , prelude.unbounded "randrproto"
          ]
        }

let libXinerama =
      mkXLibDeps
        { name = "libXinerama"
        , deps =
          [ prelude.unbounded "util-macros"
          , prelude.unbounded "libX11"
          , prelude.unbounded "libXext"
          , prelude.unbounded "xineramaproto"
          ]
        }

let libXext =
      mkXLibDeps
        { name = "libXext"
        , deps =
          [ prelude.lowerBound { name = "xextproto", lower = [ 7, 1, 99 ] }
          , prelude.lowerBound { name = "xproto", lower = [ 7, 0, 13 ] }
          , prelude.lowerBound { name = "libX11", lower = [ 1, 6 ] }
          ]
        }

let xextproto =
      mkXProtoWithPatch
        "xextproto"
        ''
        --- config.sub	2019-04-27 17:01:47.137694014 -0500
        +++ config.sub	2019-04-27 17:02:05.329622757 -0500
        @@ -249,7 +249,7 @@
         	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
         	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
         	| am33_2.0 \
        -	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
        +	| arc | aarch64 | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
         	| bfin \
         	| c4x | clipper \
         	| d10v | d30v | dlx | dsp16xx \
        ''

let fixesproto = mkXProto "fixesproto"

let damageproto = mkXProto "damageproto"

let libXScrnSaver =
      λ(v : List Natural) →
          mkXLib "libXScrnSaver" v
        ⫽ { pkgDeps =
            [ prelude.unbounded "util-macros"
            , prelude.unbounded "libXext"
            , prelude.unbounded "scrnsaverproto"
            ]
          }

let bzip2 =
      let cc = prelude.mkCCArg

      in  λ(v : List Natural) →
            let versionString = prelude.showVersion v

            let bzipInstall =
                  λ(cfg : types.BuildVars) →
                    [ prelude.call
                        (   prelude.defaultCall
                          ⫽ { program = prelude.makeExe cfg.buildOS
                            , arguments =
                                  cc cfg
                                # [ "PREFIX=${cfg.installDir}"
                                  , "install"
                                  , "-j${Natural/show cfg.cpus}"
                                  ]
                            }
                        )
                    , prelude.copyFile
                        "libbz2.so.${versionString}"
                        "lib/libbz2.so.${versionString}"
                    , prelude.symlink
                        "lib/libbz2.so.${versionString}"
                        "lib/libbz2.so.1.0"
                    , prelude.symlink
                        "lib/libbz2.so.${versionString}"
                        "lib/libbz2.so"
                    , prelude.symlinkBinary "bin/bzip2"
                    , prelude.symlinkBinary "bin/bzip2recover"
                    ]

            let bzipShared =
                  λ(cfg : types.BuildVars) →
                    [ prelude.call
                        (   prelude.defaultCall
                          ⫽ { program = prelude.makeExe cfg.buildOS
                            , arguments =
                                cc cfg # [ "-f", "Makefile-libbz2_so" ]
                            }
                        )
                    ]

            in    prelude.simplePackage { name = "bzip2", version = v }
                ⫽ { pkgUrl =
                      "https://www.sourceware.org/pub/bzip2/bzip2-${versionString}.tar.gz"
                  , configureCommand = prelude.doNothing
                  , buildCommand = bzipShared
                  , installCommand = bzipInstall
                  }

let expat =
      λ(v : List Natural) →
          prelude.simplePackage { name = "expat", version = v }
        ⫽ { pkgUrl =
              "https://github.com/libexpat/libexpat/releases/download/R_${prelude.underscoreVersion
                                                                            v}/expat-${prelude.showVersion
                                                                                         v}.tar.bz2"
          }

let gperf =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "gperf", version = v }
        ⫽ { pkgUrl =
              "http://ftp.gnu.org/pub/gnu/gperf/gperf-${prelude.showVersion
                                                          v}.tar.gz"
          }

let coreutils =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "coreutils", version = v }
        ⫽ { installCommand =
              prelude.installWithBinaries
                [ "bin/install"
                , "bin/chmod"
                , "bin/rm"
                , "bin/cp"
                , "bin/ln"
                , "bin/mkdir"
                , "bin/test"
                , "bin/od"
                , "bin/readlink"
                ]
          }

let libsepol =
      let cc = prelude.mkCCArg

      let sepolInstall =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = prelude.makeExe cfg.buildOS
                      , arguments =
                            cc cfg
                          # [ "PREFIX=${cfg.installDir}"
                            , "SHLIBDIR=${cfg.installDir}/lib"
                            , "CFLAGS=-Wno-error -O2"
                            , "install"
                            , "-j${Natural/show cfg.cpus}"
                            ]
                      , environment = Some
                          (   prelude.defaultPath cfg
                            # [ prelude.mkLDFlags cfg.linkDirs cfg
                              , prelude.mkCFlags cfg
                              , prelude.mkPkgConfigVar cfg.linkDirs
                              ]
                          )
                      }
                  )
              ]

      in  λ(v : List Natural) →
              prelude.simplePackage { name = "libsepol", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/SELinuxProject/selinux/releases/download/20191204/libsepol-${prelude.showVersion
                                                                                                     v}.tar.gz"
              , configureCommand = prelude.doNothing
              , buildCommand = prelude.doNothing
              , installCommand = sepolInstall
              , pkgBuildDeps = [ prelude.unbounded "flex" ]
              }

let libselinux =
      let cc = prelude.mkCCArg

      let selinuxInstall =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = prelude.makeExe cfg.buildOS
                      , arguments =
                            cc cfg
                          # [ "PREFIX=${cfg.installDir}"
                            , "SHLIBDIR=${cfg.installDir}/lib"
                            ,     "EXTRA_CFLAGS=-Wno-error -lpcre "
                              ++  (prelude.mkCFlags cfg).value
                            , "install"
                            , "-j${Natural/show cfg.cpus}"
                            ]
                      , environment = Some
                          (   prelude.defaultPath cfg
                            # [ prelude.mkLDFlags cfg.linkDirs cfg
                              , prelude.mkCFlags cfg
                              , prelude.mkPkgConfigVar cfg.linkDirs
                              , prelude.libPath cfg
                              ]
                          )
                      }
                  )
              ]

      in  λ(v : List Natural) →
              prelude.simplePackage { name = "libselinux", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/SELinuxProject/selinux/releases/download/20191204/libselinux-${prelude.showVersion
                                                                                                       v}.tar.gz"
              , configureCommand = prelude.doNothing
              , buildCommand = prelude.doNothing
              , installCommand = selinuxInstall
              , pkgDeps =
                [ prelude.unbounded "pcre", prelude.unbounded "libsepol" ]
              , pkgBuildDeps = [ prelude.unbounded "pkg-config" ]
              }

let libXtst =
      mkXLibDeps
        { name = "libXtst"
        , deps = [ prelude.unbounded "libXi", prelude.unbounded "recordproto" ]
        }

let libXi =
      mkXLibDeps
        { name = "libXi"
        , deps = [ prelude.unbounded "libXext", prelude.unbounded "libXfixes" ]
        }

let mkGnomeNinja =
      λ(name : Text) →
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.ninjaPackage { name, version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "http://ftp.gnome.org/pub/gnome/sources/${name}/${versionString}/${name}-${fullVersion}.tar.xz"
              }

let at-spi-core =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGnomeNinja "at-spi2-core" x
        ⫽ { pkgDeps = [ prelude.unbounded "libXtst", prelude.unbounded "glib" ]
          , installCommand =
              prelude.ninjaInstallWithPkgConfig
                [ { src = "build/meson-private/atspi-2.pc"
                  , dest = "lib/pkgconfig/atspi-2.pc"
                  }
                ]
          }

let at-spi-atk =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGnomeNinja "at-spi2-atk" x
        ⫽ { pkgDeps =
            [ prelude.lowerBound { name = "at-spi2-core", lower = [ 2, 32, 2 ] }
            , prelude.lowerBound { name = "atk", lower = [ 2, 29, 2 ] }
            , prelude.unbounded "libxml2"
            ]
          , installCommand =
              prelude.ninjaInstallWithPkgConfig
                (prelude.mesonMoves [ "atk-bridge-2.0.pc" ])
          }

let libdrm =
      λ(v : List Natural) →
          prelude.ninjaPackage { name = "libdrm", version = v }
        ⫽ { pkgUrl =
              "https://dri.freedesktop.org/libdrm/libdrm-${prelude.showVersion
                                                             v}.tar.bz2"
          , pkgDeps =
            [ prelude.unbounded "libpciaccess", prelude.unbounded "cairo" ]
          , installCommand =
              prelude.ninjaInstallWithPkgConfig
                ( prelude.mesonMoves
                    [ "libdrm.pc"
                    , "libdrm_amdgpu.pc"
                    , "libdrm_intel.pc"
                    , "libdrm_nouveau.pc"
                    , "libdrm_radeon.pc"
                    , "libkms.pc"
                    ]
                )
          }

let libpciaccess = mkXLib "libpciaccess"

let markupSafe =
      λ(v : List Natural) →
          prelude.python3Package { name = "MarkupSafe", version = v }
        ⫽ { pkgUrl =
              "https://files.pythonhosted.org/packages/source/M/MarkupSafe/MarkupSafe-${prelude.showVersion
                                                                                          v}.tar.gz"
          }

let mako =
      λ(v : List Natural) →
          prelude.python3Package { name = "Mako", version = v }
        ⫽ { pkgUrl =
              "https://files.pythonhosted.org/packages/source/M/Mako/Mako-${prelude.showVersion
                                                                              v}.tar.gz"
          }

let elfutils =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "elfutils", version = v }
            ⫽ { pkgUrl =
                  "https://sourceware.org/ftp/elfutils/${versionString}/elfutils-${versionString}.tar.bz2"
              }

let mkGnomeSimple =
      λ(name : Text) →
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.simplePackage { name, version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "http://ftp.gnome.org/pub/gnome/sources/${name}/${versionString}/${name}-${fullVersion}.tar.xz"
              }

let gtk3 =
      let mkLDFlagsGtk =
            λ(linkDirs : List Text) →
              concatMapSep " " Text (λ(dir : Text) → "-L${dir}") linkDirs

      let gtkEnv =
            λ(cfg : types.BuildVars) →
                prelude.defaultPath cfg
              # [ { var = "LDFLAGS"
                  , value = mkLDFlagsGtk cfg.linkDirs ++ " -lpcre -lfribidi"
                  }
                , prelude.mkPkgConfigVar cfg.linkDirs
                , prelude.mkLDPreload cfg.preloadLibs
                , prelude.mkXdgDataDirs cfg.shareDirs
                , prelude.mkCFlags cfg
                ]

      let gtkConfig =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = "./configure"
                      , arguments = [ "--prefix=${cfg.installDir}" ]
                      , environment = Some (gtkEnv cfg)
                      }
                  )
              ]

      in  λ(x : { version : List Natural, patch : Natural }) →
              mkGnomeSimple "gtk+" x
            ⫽ { pkgName = "gtk3"
              , configureCommand = gtkConfig
              , buildCommand =
                  λ(cfg : types.BuildVars) → prelude.buildWith (gtkEnv cfg) cfg
              , pkgDeps =
                [ prelude.lowerBound { name = "pango", lower = [ 1, 41, 0 ] }
                , prelude.unbounded "at-spi2-atk"
                , prelude.lowerBound { name = "atk", lower = [ 2, 15, 1 ] }
                , prelude.lowerBound
                    { name = "gdk-pixbuf", lower = [ 2, 30, 0 ] }
                , prelude.unbounded "libXft"
                , prelude.lowerBound { name = "libepoxy", lower = [ 1, 4 ] }
                , prelude.unbounded "libXi"
                ]
              , pkgBuildDeps = [ prelude.unbounded "binutils" ]
              }

let graphviz =
      λ(v : List Natural) →
          prelude.simplePackage { name = "graphviz", version = v }
        ⫽ { pkgUrl =
              "https://graphviz.gitlab.io/pub/graphviz/stable/SOURCES/graphviz.tar.gz"
          , pkgDeps = [ prelude.unbounded "perl" ]
          , installCommand = prelude.installWithBinaries [ "bin/dot" ]
          }

let wayland =
      λ(v : List Natural) →
          prelude.simplePackage { name = "wayland", version = v }
        ⫽ { pkgUrl =
              "https://wayland.freedesktop.org/releases/wayland-${prelude.showVersion
                                                                    v}.tar.xz"
          , pkgDeps = [ prelude.unbounded "libxml2" ]
          , configureCommand =
              prelude.configureWithFlags [ "--disable-documentation" ]
          }

let swig =
      λ(v : List Natural) →
          prelude.simplePackage { name = "swig", version = v }
        ⫽ { pkgUrl =
              "https://downloads.sourceforge.net/swig/swig-${prelude.showVersion
                                                               v}.tar.gz"
          , installCommand = prelude.installWithBinaries [ "bin/swig" ]
          }

let lmdb =
      let cc = prelude.mkCCArg

      let ar =
            λ(cfg : types.BuildVars) →
              merge
                { Some =
                    λ(tgt : types.TargetTriple) →
                      [ "AR=${prelude.printTargetTriple tgt}-ar" ]
                , None = [] : List Text
                }
                cfg.targetTriple

      let lmdbInstall =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = "make"
                      , arguments =
                            cc cfg
                          # ar cfg
                          # [ "prefix=${cfg.installDir}"
                            , "install"
                            , "-j${Natural/show cfg.cpus}"
                            ]
                      , procDir = Some "libraries/liblmdb"
                      }
                  )
              ]

      in  λ(v : List Natural) →
            let versionString = prelude.showVersion v

            in    prelude.simplePackage { name = "lmdb", version = v }
                ⫽ { pkgUrl =
                      "https://github.com/LMDB/lmdb/archive/LMDB_${versionString}.tar.gz"
                  , pkgSubdir = "lmdb-LMDB_${versionString}"
                  , configureCommand = prelude.doNothing
                  , buildCommand = prelude.doNothing
                  , installCommand = lmdbInstall
                  }

let gsl =
      λ(v : List Natural) →
          prelude.simplePackage { name = "gsl", version = v }
        ⫽ { pkgUrl =
              "http://mirror.keystealth.org/gnu/gsl/gsl-${prelude.showVersion
                                                            v}.tar.gz"
          }

let postgresql =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "postgresql", version = v }
            ⫽ { pkgUrl =
                  "https://ftp.postgresql.org/pub/source/v${versionString}/postgresql-${versionString}.tar.bz2"
              , configureCommand =
                  prelude.configureWithFlags [ "--without-readline" ]
              , installCommand = prelude.installWithBinaries [ "bin/pg_config" ]
              , pkgDeps = [ prelude.unbounded "zlib" ]
              }

let sqlite =
      λ(x : { version : List Natural }) →
          prelude.simplePackage { name = "sqlite", version = x.version }
        ⫽ { pkgUrl =
              "https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz"
          , pkgSubdir = "sqlite-autoconf-3300100"
          }

let ragel =
      λ(v : List Natural) →
          prelude.simplePackage { name = "ragel", version = v }
        ⫽ { pkgUrl =
              "http://www.colm.net/files/ragel/ragel-${prelude.showVersion
                                                         v}.tar.gz"
          , installCommand = prelude.installWithBinaries [ "bin/ragel" ]
          }

let nano =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "nano", version = v }
        ⫽ { pkgDeps = [ prelude.unbounded "ncurses" ] }

let libarchive =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libarchive", version = v }
        ⫽ { pkgUrl =
              "https://www.libarchive.org/downloads/libarchive-${prelude.showVersion
                                                                   v}.tar.gz"
          , pkgDeps =
            [ prelude.unbounded "xz"
            , prelude.unbounded "bzip2"
            , prelude.unbounded "zlib"
            ]
          , installCommand =
              prelude.installWithBinaries [ "bin/bsdtar", "bin/bsdcpio" ]
          }

let pygobject =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGnomeSimple "pygobject" x
        ⫽ { pkgDeps = [ prelude.unbounded "glib" ]
          , configureCommand = prelude.preloadCfg
          }

let pygtk =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    mkGnomeSimple "pygtk" x
            ⫽ { pkgUrl =
                  "http://ftp.gnome.org/pub/gnome/sources/pygtk/${versionString}/pygtk-${fullVersion}.tar.bz2"
              , configureCommand = prelude.preloadCfg
              , pkgDeps =
                [ prelude.lowerBound { name = "glib", lower = [ 2, 8, 0 ] }
                , prelude.lowerBound
                    { name = "pygobject", lower = [ 2, 21, 3 ] }
                , prelude.unbounded "python2"
                ]
              }

let libglade =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.simplePackage
                { name = "libglade", version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "http://ftp.gnome.org/pub/gnome/sources/libglade/${versionString}/libglade-${fullVersion}.tar.bz2"
              , pkgDeps =
                [ prelude.lowerBound { name = "libxml2", lower = [ 2, 4, 10 ] }
                , prelude.lowerBound { name = "gtk2", lower = [ 2, 5, 0 ] }
                ]
              , configureCommand = prelude.configureLinkExtraLibs [ "fribidi" ]
              }

let scour =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.python3Package { name = "scour", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/scour-project/scour/archive/v${versionString}/scour-${versionString}.tar.gz"
              , installCommand = prelude.installWithPy3Wrappers [ "scour" ]
              }

let libXpm =
      λ(v : List Natural) →
          mkXLib "libXpm" v
        ⫽ { pkgDeps = [ prelude.unbounded "libXext", prelude.unbounded "libXt" ]
          , pkgBuildDeps = [ prelude.unbounded "gettext" ]
          }

let libXt =
      mkXLibDeps
        { name = "libXt"
        , deps =
          [ prelude.unbounded "libICE"
          , prelude.unbounded "libSM"
          , prelude.unbounded "libX11"
          , prelude.unbounded "kbproto"
          ]
        }

let libICE =
      mkXLibDeps
        { name = "libICE"
        , deps = [ prelude.unbounded "xproto", prelude.unbounded "xtrans" ]
        }

let libSM =
      mkXLibDeps
        { name = "libSM"
        , deps = [ prelude.unbounded "libICE", prelude.unbounded "util-linux" ]
        }

let libXaw =
      mkXLibDeps
        { name = "libXaw"
        , deps = [ prelude.unbounded "libXmu", prelude.unbounded "libXpm" ]
        }

let libXaw3d =
      mkXLibDeps
        { name = "libXaw3d"
        , deps =
          [ prelude.unbounded "libX11"
          , prelude.unbounded "libXt"
          , prelude.unbounded "libXmu"
          , prelude.unbounded "libXext"
          ]
        }

let libXmu =
      mkXLibDeps
        { name = "libXmu"
        , deps =
          [ prelude.unbounded "util-macros"
          , prelude.unbounded "libXt"
          , prelude.unbounded "libXext"
          ]
        }

let libotf =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libotf", version = v }
        ⫽ { pkgUrl =
              "http://download.savannah.gnu.org/releases/m17n/libotf-${prelude.showVersion
                                                                         v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "freetype" ]
          }

let m17n =
      λ(v : List Natural) →
          prelude.simplePackage { name = "m17n-lib", version = v }
        ⫽ { pkgUrl =
              "http://download.savannah.gnu.org/releases/m17n/m17n-lib-${prelude.showVersion
                                                                           v}.tar.gz"
          , buildCommand =
              λ(cfg : types.BuildVars) →
                prelude.generalBuild
                  prelude.singleThreaded
                  (prelude.buildEnv cfg)
                  cfg
          , pkgDeps = [ prelude.unbounded "libXt" ]
          , pkgBuildDeps = [ prelude.unbounded "binutils" ]
          }

let mkGimpPackage =
      λ(name : Text) →
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.simplePackage { name, version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "https://download.gimp.org/pub/${name}/${versionString}/${name}-${fullVersion}.tar.bz2"
              }

let babl =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.simplePackage
                { name = "babl", version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "https://download.gimp.org/pub/babl/${versionString}/babl-${fullVersion}.tar.xz"
              , pkgBuildDeps =
                [ prelude.unbounded "autoconf"
                , prelude.unbounded "automake"
                , prelude.unbounded "libtool"
                , prelude.unbounded "pkg-config"
                ]
              , pkgDeps = [ prelude.unbounded "lcms2" ]
              , configureCommand = prelude.autogenConfigure
              }

let gegl =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGimpPackage "gegl" x
        ⫽ { pkgDeps =
            [ prelude.lowerBound { name = "babl", lower = [ 0, 1, 58 ] }
            , prelude.lowerBound { name = "glib", lower = [ 2, 44, 0 ] }
            , prelude.unbounded "json-glib"
            ]
          , configureCommand = prelude.preloadCfg
          }

let libexif =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libexif", version = v }
            ⫽ { pkgUrl =
                  "https://nchc.dl.sourceforge.net/project/libexif/libexif/${versionString}/libexif-${versionString}.tar.bz2"
              }

let json-glib =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGnomeNinja "json-glib" x
        ⫽ { pkgDeps =
            [ prelude.unbounded "glib"
            , prelude.unbounded "libjpeg-turbo"
            , prelude.unbounded "libpng"
            ]
          , pkgBuildDeps = [ prelude.unbounded "gettext" ]
          , installCommand =
              prelude.ninjaInstallWithPkgConfig
                (prelude.mesonMoves [ "json-glib-1.0.pc" ])
          }

let lcms2 =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "lcms2", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/mm2/Little-CMS/archive/lcms${versionString}.tar.gz"
              , pkgSubdir = "Little-CMS-lcms${versionString}"
              }

let libmypaint =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libmypaint", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/mypaint/libmypaint/releases/download/v${versionString}/libmypaint-${versionString}.tar.xz"
              , pkgDeps = [ prelude.unbounded "json-c" ]
              , pkgBuildDeps =
                [ prelude.unbounded "intltool", prelude.unbounded "gettext" ]
              }

let json-c =
      λ(x : { version : List Natural, dateStr : Text }) →
        let versionString = "${prelude.showVersion x.version}-${x.dateStr}"

        in    prelude.simplePackage { name = "json-c", version = x.version }
            ⫽ { pkgUrl =
                  "https://github.com/json-c/json-c/archive/json-c-${versionString}.tar.gz"
              , pkgSubdir = "json-c-json-c-${versionString}"
              }

let libopenjpeg =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libopenjpeg", version = v }
            ⫽ prelude.cmakePackage
            ⫽ { pkgUrl =
                  "https://github.com/uclouvain/openjpeg/archive/v${versionString}.tar.gz"
              , pkgSubdir = "openjpeg-${versionString}"
              , pkgDeps = [ prelude.unbounded "zlib" ]
              , pkgBuildDeps =
                [ prelude.unbounded "make", prelude.unbounded "cmake" ]
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.cmakeInstall cfg
                    # [ prelude.symlink
                          "lib/openjpeg-2.3/OpenJPEGConfig.cmake"
                          "lib/OpenJPEGConfig.cmake"
                      ]
              }

let libevent =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libevent", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/libevent/libevent/releases/download/release-${versionString}-stable/libevent-${versionString}-stable.tar.gz"
              , pkgSubdir = "libevent-${versionString}-stable"
              , pkgDeps = [ prelude.unbounded "openssl" ]
              }

let memcached =
      λ(v : List Natural) →
          prelude.simplePackage { name = "memcached", version = v }
        ⫽ { pkgUrl =
              "https://memcached.org/files/memcached-${prelude.showVersion
                                                         v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "libevent" ]
          }

let motif =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "motif", version = v }
            ⫽ { pkgUrl =
                  "https://iweb.dl.sourceforge.net/project/motif/Motif%20${versionString}%20Source%20Code/motif-${versionString}.tar.gz"
              , pkgDeps =
                [ prelude.unbounded "libXft"
                , prelude.unbounded "libpng"
                , prelude.unbounded "freetype"
                ]
              }

let libjpeg =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libjpeg", version = v }
            ⫽ { pkgUrl =
                  "http://www.ijg.org/files/jpegsrc.v${versionString}c.tar.gz"
              , pkgSubdir = "jpeg-${versionString}c"
              }

let feh =
      let cc = prelude.mkCCArg

      let fehMake =
            λ(cfg : types.BuildVars) → { program = prelude.makeExe cfg.buildOS }

      let fehBuild =
            λ(v : List Natural) →
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ fehMake cfg
                    ⫽ { arguments = [ "feh.1" ], procDir = Some "man" }
                  )
              , prelude.call
                  (   prelude.defaultCall
                    ⫽ fehMake cfg
                    ⫽ { arguments =
                            cc cfg
                          # [ "CFLAGS=${( prelude.mkCFlags cfg
                                        ).value} -DPACKAGE=\\\"feh\\\" -DPREFIX=\\\"${cfg.installDir}\\\" -DVERSION=\\\"${prelude.showVersion
                                                                                                                            v}\\\" ${( prelude.mkLDFlags
                                                                                                                                         cfg.linkDirs
                                                                                                                                         cfg
                                                                                                                                     ).value}"
                            , "feh"
                            ]
                      , procDir = Some "src"
                      }
                  )
              , prelude.call
                  (   prelude.defaultCall
                    ⫽ fehMake cfg
                    ⫽ { arguments = [ "feh.desktop" ]
                      , procDir = Some "share/applications"
                      }
                  )
              ]

      let fehInstall =
            λ(cfg : types.BuildVars) →
                [ prelude.call
                    (   prelude.defaultCall
                      ⫽ { program = prelude.makeExe cfg.buildOS
                        , arguments =
                          [ "CFLAGS=${(prelude.mkCFlags cfg).value}"
                          , "-j${Natural/show cfg.cpus}"
                          , "PREFIX=${cfg.installDir}"
                          , "install"
                          ]
                        }
                    )
                ]
              # prelude.mkLDPathWrapper cfg "feh"

      in  λ(v : List Natural) →
              prelude.simplePackage { name = "feh", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/derf/feh/archive/${prelude.showVersion
                                                           v}.tar.gz"
              , configureCommand = prelude.doNothing
              , buildCommand = fehBuild v
              , installCommand = fehInstall
              , pkgBuildDeps = [ prelude.unbounded "sed" ]
              , pkgDeps =
                [ prelude.unbounded "imlib2"
                , prelude.unbounded "libXt"
                , prelude.unbounded "libXinerama"
                , prelude.unbounded "curl"
                ]
              }

let imlib2 =
      λ(v : List Natural) →
          prelude.simplePackage { name = "imlib2", version = v }
        ⫽ { pkgUrl =
              "https://downloads.sourceforge.net/enlightenment/imlib2-${prelude.showVersion
                                                                          v}.tar.bz2"
          , pkgDeps =
            [ prelude.unbounded "libXext"
            , prelude.unbounded "freetype"
            , prelude.unbounded "libjpeg"
            , prelude.unbounded "libpng"
            , prelude.unbounded "giflib"
            ]
          }

let jemalloc =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "jemalloc", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/jemalloc/jemalloc/releases/download/${versionString}/jemalloc-${versionString}.tar.bz2"
              }

let gperftools =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "gperftools", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/gperftools/gperftools/releases/download/gperftools-${versionString}/gperftools-${versionString}.tar.gz"
              }

let openssh =
      let opensshInstall =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = prelude.makeExe cfg.buildOS
                      , arguments =
                        [ "PRIVSEP_PATH=${cfg.installDir}/var"
                        , "install"
                        , "-j${Natural/show cfg.cpus}"
                        ]
                      , environment = Some
                          (   prelude.defaultPath cfg
                            # [ prelude.mkPkgConfigVar cfg.linkDirs
                              , prelude.libPath cfg
                              ]
                          )
                      }
                  )
              ]

      in  λ(v : List Natural) →
              prelude.simplePackage { name = "openssh", version = v }
            ⫽ { pkgUrl =
                  "https://mirrors.gigenet.com/pub/OpenBSD/OpenSSH/portable/openssh-${prelude.showVersion
                                                                                        v}p1.tar.gz"
              , pkgSubdir = "openssh-${prelude.showVersion v}p1"
              , installCommand = opensshInstall
              , pkgDeps = [ prelude.unbounded "openssl" ]
              }

let libxslt =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libxslt", version = v }
        ⫽ { pkgUrl =
              "http://xmlsoft.org/sources/libxslt-${prelude.showVersion
                                                      v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "libxml2" ]
          }

let libepoxy =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.ninjaPackage { name = "libepoxy", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/anholt/libepoxy/releases/download/${versionString}/libepoxy-${versionString}.tar.xz"
              , pkgDeps = [ prelude.unbounded "mesa" ]
              , installCommand =
                  prelude.ninjaInstallWithPkgConfig
                    (prelude.mesonMoves [ "epoxy.pc" ])
              }

let mesa =
      λ(v : List Natural) →
          prelude.simplePackage { name = "mesa", version = v }
        ⫽ { pkgUrl =
              "https://mesa.freedesktop.org/archive/mesa-${prelude.showVersion
                                                             v}.tar.xz"
          , pkgDeps =
            [ prelude.lowerBound { name = "libdrm", lower = [ 2, 4, 75 ] }
            , prelude.unbounded "libXdamage"
            , prelude.unbounded "libXfixes"
            , prelude.unbounded "libXxf86vm"
            , prelude.lowerBound { name = "libxshmfence", lower = [ 1, 1 ] }
            , prelude.lowerBound { name = "glproto", lower = [ 1, 4, 14 ] }
            , prelude.lowerBound { name = "dri2proto", lower = [ 2, 8 ] }
            , prelude.unbounded "libXrandr"
            ]
          , configureCommand =
              prelude.configureWithFlags
                [ "--enable-autotools"
                , "--with-gallium-drivers=nouveau,swrast"
                ]
          }

let libXdamage =
      mkXLibDeps
        { name = "libXdamage"
        , deps =
          [ prelude.unbounded "libXfixes", prelude.unbounded "damageproto" ]
        }

let libXfixes =
      mkXLibDeps
        { name = "libXfixes"
        , deps =
          [ prelude.unbounded "xproto"
          , prelude.unbounded "fixesproto"
          , prelude.unbounded "xextproto"
          , prelude.unbounded "libX11"
          ]
        }

let libXxf86vm =
      mkXLibDeps
        { name = "libXxf86vm"
        , deps =
          [ prelude.unbounded "xproto"
          , prelude.unbounded "libX11"
          , prelude.unbounded "xextproto"
          , prelude.unbounded "libXext"
          , prelude.unbounded "xf86vidmodeproto"
          ]
        }

let libxshmfence =
      mkXLibDeps
        { name = "libxshmfence", deps = [ prelude.unbounded "xproto" ] }

let gnome-doc-utils =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGnomeSimple "gnome-doc-utils" x
        ⫽ { pkgDeps =
            [ prelude.lowerBound { name = "libxslt", lower = [ 1, 1, 8 ] }
            , prelude.lowerBound { name = "libxml2", lower = [ 2, 6, 12 ] }
            ]
          , pkgBuildDeps =
            [ prelude.lowerBound { name = "intltool", lower = [ 0, 35, 0 ] }
            , prelude.unbounded "gettext"
            , prelude.unbounded "python2"
            ]
          }

let itstool =
      λ(v : List Natural) →
          prelude.simplePackage { name = "itstool", version = v }
        ⫽ { pkgUrl =
              "http://files.itstool.org/itstool/itstool-${prelude.showVersion
                                                            v}.tar.bz2"
          , pkgDeps = [ prelude.unbounded "libxml2" ]
          }

let gexiv2 =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGnomeNinja "gexiv2" x
        ⫽ { pkgDeps = [ prelude.unbounded "exiv2", prelude.unbounded "glib" ]
          , installCommand =
              prelude.ninjaInstallWithPkgConfig
                (prelude.mesonMoves [ "gexiv2.pc" ])
          }

let exiv2 =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "exiv2", version = v }
            ⫽ prelude.cmakePackage
            ⫽ { pkgUrl =
                  "http://www.exiv2.org/builds/exiv2-${versionString}-Source.tar.gz"
              , pkgSubdir = "exiv2-${versionString}-Source"
              }

let libtiff =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.ninjaPackage { name = "libtiff", version = v }
            ⫽ { pkgUrl =
                  "https://download.osgeo.org/libtiff/tiff-${versionString}.tar.gz"
              , pkgSubdir = "tiff-${versionString}"
              , configureCommand = prelude.cmakeConfigureNinja
              , pkgBuildDeps =
                [ prelude.unbounded "cmake", prelude.unbounded "ninja" ]
              }

let nspr =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        let bitFlag =
              λ(cfg : types.BuildVars) →
                if    prelude.isX64 (prelude.archCfg cfg)
                then  [ "--enable-64bit" ]
                else  [] : List Text

        in    prelude.simplePackage { name = "nspr", version = v }
            ⫽ { pkgUrl =
                  "https://archive.mozilla.org/pub/nspr/releases/v${versionString}/src/nspr-${versionString}.tar.gz"
              , pkgSubdir = "nspr-${versionString}/nspr"
              , configureCommand =
                  λ(cfg : types.BuildVars) →
                    prelude.configureWithFlags (bitFlag cfg) cfg
              }

let libthai =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libthai", version = v }
        ⫽ { pkgUrl =
              "https://linux.thai.net/pub/thailinux/software/libthai/libthai-${prelude.showVersion
                                                                                 v}.tar.xz"
          , pkgDeps = [ prelude.unbounded "libdatrie" ]
          }

let libdatrie =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libdatrie", version = v }
        ⫽ { pkgUrl =
              "https://linux.thai.net/pub/thailinux/software/libthai/libdatrie-${prelude.showVersion
                                                                                   v}.tar.xz"
          }

let joe =
      λ(v : List Natural) →
          prelude.simplePackage { name = "joe", version = v }
        ⫽ { pkgUrl =
              "https://downloads.sourceforge.net/joe-editor/joe-${prelude.showVersion
                                                                    v}.tar.gz"
          , installCommand = prelude.installWithBinaries [ "bin/joe" ]
          }

let fossil =
      λ(v : List Natural) →
          prelude.simplePackage { name = "fossil", version = v }
        ⫽ { pkgUrl =
              "https://fossil-scm.org/fossil/uv/fossil-src-${prelude.showVersion
                                                               v}.tar.gz"
          , installCommand = prelude.installWithBinaries [ "bin/fossil" ]
          , pkgDeps = [ prelude.unbounded "zlib", prelude.unbounded "openssl" ]
          }

let libcroco =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGnomeSimple "libcroco" x
        ⫽ { pkgDeps =
            [ prelude.lowerBound { name = "glib", lower = [ 2, 0 ] }
            , prelude.lowerBound { name = "libxml2", lower = [ 2, 4, 23 ] }
            ]
          }

let libsoup =
      λ(x : { version : List Natural, patch : Natural }) →
        let libsoupCfgFile =
              ''
              option('gssapi',
                type : 'boolean',
                value : true,
                description : 'Build with GSSAPI support'
              )

              option('krb5_config',
                type : 'string',
                description : 'Where to look for krb5-config, path points to krb5-config installation (defaultly looking in PATH)'
              )

              option('ntlm',
                type : 'boolean',
                value : false,
                description : 'Build with NTLM support'
              )

              option('tls_check',
                type : 'boolean',
                value : true,
                description : 'Enable TLS support through glib-networking. If you are building a package, you can disable this to allow building libsoup anyway (since glib-networking is not actually required at compile time), but you should be sure to add a runtime dependency on it.'
              )

              option('gnome',
                type : 'boolean',
                value : true,
                description : 'Build libsoup with GNOME support'
              )

              option('introspection',
                type : 'boolean',
                value : true,
                description : 'Build GObject Introspection data'
              )

              option('vapi',
                type : 'boolean',
                value : false,
                description : 'Build Vala bindings'
              )

              option('doc',
                type: 'boolean',
                value: false,
                description: 'Enable generating the API reference'
              )

              option('tests',
                type: 'boolean',
                value: true,
                description: 'Enable unit tests compilation'
              )
              ''

        in    mkGnomeNinja "libsoup" x
            ⫽ { pkgDeps =
                [ prelude.unbounded "glib"
                , prelude.unbounded "sqlite"
                , prelude.unbounded "libxml2"
                , prelude.unbounded "libpsl"
                , prelude.unbounded "krb5"
                , prelude.unbounded "gobject-introspection"
                ]
              , pkgBuildDeps = [ prelude.unbounded "vala" ]
              , configureCommand =
                  λ(cfg : types.BuildVars) →
                      [ prelude.writeFile
                          { file = "meson_options.txt"
                          , contents = libsoupCfgFile
                          }
                      ]
                    # prelude.mesonConfigure cfg
              , installCommand =
                  prelude.ninjaInstallWithPkgConfig
                    (prelude.mesonMoves [ "libsoup-2.4.pc" ])
              }

let libpsl =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libpsl", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/rockdaboot/libpsl/releases/download/libpsl-${versionString}/libpsl-${versionString}.tar.gz"
              }

let krb5 =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "krb5", version = v }
            ⫽ { pkgUrl =
                  "https://kerberos.org/dist/krb5/${versionString}/krb5-${versionString}.tar.gz"
              , pkgSubdir = "krb5-${versionString}/src"
              , pkgBuildDeps = [ prelude.unbounded "bison" ]
              }

let vala =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGnomeSimple "vala" x
        ⫽ { pkgBuildDeps = [ prelude.unbounded "flex" ]
          , pkgDeps =
            [ prelude.lowerBound { name = "glib", lower = [ 2, 40, 0 ] }
            , prelude.lowerBound { name = "graphviz", lower = [ 2, 15 ] }
            ]
          }

let htop =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "htop", version = v }
            ⫽ { pkgUrl =
                  "https://hisham.hm/htop/releases/${versionString}/htop-${versionString}.tar.gz"
              , pkgDeps = [ prelude.unbounded "ncurses" ]
              , pkgBuildDeps = [ prelude.unbounded "python3" ]
              , installCommand = prelude.installWithBinaries [ "bin/htop" ]
              }

let mpfr =
      λ(v : List Natural) →
          prelude.simplePackage { name = "mpfr", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/mpfr/mpfr-${prelude.showVersion
                                                     v}.tar.xz"
          }

let libsodium =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libsodium", version = v }
        ⫽ { pkgUrl =
              "https://download.libsodium.org/libsodium/releases/libsodium-${prelude.showVersion
                                                                               v}.tar.gz"
          }

let libev =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libev", version = v }
        ⫽ { pkgUrl =
              "http://dist.schmorp.de/libev/Attic/libev-${prelude.showVersion
                                                            v}.tar.gz"
          }

let ctags =
      λ(v : List Natural) →
          prelude.simplePackage { name = "ctags", version = v }
        ⫽ { pkgUrl =
              "http://prdownloads.sourceforge.net/ctags/ctags-${prelude.showVersion
                                                                  v}.tar.gz"
          , installCommand = prelude.installWithBinaries [ "bin/ctags" ]
          }

let tcc =
      λ(v : List Natural) →
          prelude.simplePackage { name = "tcc", version = v }
        ⫽ { pkgUrl =
              "http://download.savannah.gnu.org/releases/tinycc/tcc-${prelude.showVersion
                                                                        v}.tar.bz2"
          , pkgBuildDeps =
            [ prelude.unbounded "perl", prelude.unbounded "texinfo" ]
          , installCommand = prelude.installWithBinaries [ "bin/tcc" ]
          }

let texinfo =
      λ(v : List Natural) →
          prelude.simplePackage { name = "texinfo", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/texinfo/texinfo-${prelude.showVersion
                                                           v}.tar.xz"
          , configureCommand =
              prelude.configureWithFlags [ "--disable-dependency-tracking" ]
          }

let node =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "node", version = v }
            ⫽ { pkgUrl =
                  "https://nodejs.org/dist/v${versionString}/node-v${versionString}.tar.gz"
              , pkgSubdir = "node-v${versionString}"
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.installWithBinaries [ "bin/node", "bin/npm" ] cfg
                    # [ prelude.mkExe
                          "${cfg.installDir}/lib/node_modules/npm/bin/npm-cli.js"
                      ]
              }

let glu =
      λ(v : List Natural) →
          prelude.simplePackage { name = "glu", version = v }
        ⫽ { pkgUrl =
              "https://mesa.freedesktop.org/archive/glu/glu-${prelude.showVersion
                                                                v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "mesa" ]
          }

let compositeproto = mkXProto "compositeproto"

let libXcomposite =
      mkXLibDeps
        { name = "libXcomposite"
        , deps =
          [ prelude.unbounded "libX11"
          , prelude.lowerBound { name = "compositeproto", lower = [ 0, 4 ] }
          , prelude.unbounded "libXfixes"
          ]
        }

let mosh =
      λ(v : List Natural) →
          prelude.simplePackage { name = "mosh", version = v }
        ⫽ { pkgUrl = "https://mosh.org/mosh-${prelude.showVersion v}.tar.gz"
          , pkgBuildDeps = [ prelude.unbounded "protobuf" ]
          , pkgDeps =
            [ prelude.unbounded "zlib"
            , prelude.unbounded "protobuf"
            , prelude.unbounded "openssl"
            ]
          , installCommand = prelude.installWithBinaries [ "bin/mosh" ]
          }

let protobuf =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "protobuf", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/protocolbuffers/protobuf/releases/download/v${versionString}/protobuf-cpp-${versionString}.tar.gz"
              , pkgSubdir = "protobuf-${versionString}"
              }

let libcds =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libcds", version = v }
            ⫽ prelude.cmakePackage
            ⫽ { pkgUrl =
                  "https://downloads.sourceforge.net/libcds/cds-${prelude.showVersion
                                                                    v}.tar.gz"
              , pkgSubdir = "cds-${versionString}"
              , pkgDeps = [ prelude.unbounded "libboost" ]
              }

let libboost =
    -- TODO: use bootstrap.bat on windows
      let boostConfigure =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (prelude.defaultCall ⫽ { program = "./bootstrap.sh" })
              ]

      let boostInstall =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = "./b2"
                      , arguments =
                        [ "install"
                        , "--prefix=${cfg.installDir}"
                        , "--without-python"
                        ]
                      }
                  )
              ]

      in  λ(v : List Natural) →
            let versionString = prelude.underscoreVersion v

            in    prelude.simplePackage { name = "libboost", version = v }
                ⫽ { pkgUrl =
                      "https://dl.bintray.com/boostorg/release/${prelude.showVersion
                                                                   v}/source/boost_${versionString}.tar.bz2"
                  , pkgSubdir = "boost_${versionString}"
                  , configureCommand = boostConfigure
                  , buildCommand = prelude.doNothing
                  , installCommand = boostInstall
                  }

let slowBuild =
      λ(cfg : types.BuildVars) →
        [ prelude.call
            { program = "cmake"
            , arguments =
              [ "--build", ".", "--config", "Release", "--", "-j", "2" ]
            , environment = prelude.defaultEnv
            , procDir = Some "build"
            }
        ]

let clang =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "clang", version = v }
            ⫽ prelude.cmakePackage
            ⫽ { pkgUrl =
                  "http://releases.llvm.org/${versionString}/cfe-${versionString}.src.tar.xz"
              , pkgSubdir = "cfe-${versionString}.src"
              , buildCommand = slowBuild
              , pkgDeps = [ prelude.unbounded "llvm" ]
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      prelude.cmakeInstall cfg
                    # [ prelude.symlinkBinary "bin/clang"
                      , prelude.symlinkBinary "bin/clang-format"
                      ]
              }

let llvm =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "llvm", version = v }
            ⫽ prelude.cmakePackage
            ⫽ { pkgUrl =
                  "http://releases.llvm.org/${versionString}/llvm-${versionString}.src.tar.xz"
              , pkgSubdir = "llvm-${versionString}.src"
              , buildCommand = slowBuild
              }

let pari =
      λ(v : List Natural) →
          prelude.simplePackage { name = "pari", version = v }
        ⫽ { pkgUrl =
              "http://pari.math.u-bordeaux.fr/pub/pari/unix/pari-${prelude.showVersion
                                                                     v}.tar.gz"
          , configureCommand =
              prelude.generalConfigure
                prelude.configSome
                "Configure"
                ([] : List Text)
                ([] : List Text)
          }

let pdfgrep =
      λ(v : List Natural) →
          prelude.simplePackage { name = "pdfgrep", version = v }
        ⫽ { pkgUrl =
              "https://pdfgrep.org/download/pdfgrep-${prelude.showVersion
                                                        v}.tar.gz"
          , pkgDeps =
            [ prelude.unbounded "poppler", prelude.unbounded "libgcrypt" ]
          , installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.installWithWrappers [ "pdfgrep" ] cfg
                # prelude.symlinkManpages
                    [ { file = "share/man/man1/pdfgrep.1", section = 1 } ]
          }

let mpc =
      λ(v : List Natural) →
          prelude.simplePackage { name = "mpc", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/mpc/mpc-${prelude.showVersion v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "mpfr" ]
          }

let gcc =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "gcc", version = v }
            ⫽ { pkgUrl =
                  "https://ftp.gnu.org/gnu/gcc/gcc-${versionString}/gcc-${versionString}.tar.xz"
              , configureCommand =
                  λ(cfg : types.BuildVars) →
                      [ prelude.call
                          { program = "contrib/download_prerequisites"
                          , arguments = [] : List Text
                          , environment = None (List types.EnvVar)
                          , procDir = None Text
                          }
                      ]
                    # prelude.configureWithFlags [ "--disable-multilib" ] cfg
              , installCommand =
                  prelude.installWithBinaries
                    [ "bin/gcc"
                    , "bin/g++"
                    , "bin/gcc-ar"
                    , "bin/gcc-nm"
                    , "bin/gfortran"
                    , "bin/gcc-ranlib"
                    ]
              , pkgBuildDeps =
                [ prelude.unbounded "curl"
                , prelude.unbounded "sed"
                , prelude.unbounded "libtool"
                ]
              }

let ruby =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.simplePackage
                { name = "ruby", version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "https://cache.ruby-lang.org/pub/ruby/${versionString}/ruby-${fullVersion}.tar.gz"
              , installCommand =
                  prelude.installWithBinaries [ "bin/ruby", "bin/gem" ]
              , pkgDeps =
                [ prelude.unbounded "readline", prelude.unbounded "openssl" ]
              }

let poppler =
      λ(v : List Natural) →
          prelude.simplePackage { name = "poppler", version = v }
        ⫽ prelude.cmakePackage
        ⫽ { pkgUrl =
              "https://poppler.freedesktop.org/poppler-${prelude.showVersion
                                                           v}.tar.xz"
          , pkgDeps =
            [ prelude.unbounded "fontconfig"
            , prelude.unbounded "libopenjpeg"
            , prelude.unbounded "libjpeg-turbo"
            , prelude.unbounded "libjpeg"
            , prelude.unbounded "freetype"
            , prelude.unbounded "zlib"
            , prelude.unbounded "libpng"
            , prelude.unbounded "libiconv"
            , prelude.unbounded "harfbuzz"
            , prelude.unbounded "glib"
            ]
          , installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.cmakeInstall cfg
                # prelude.mkLDPathWrappers
                    cfg
                    [ "pdfdetach"
                    , "pdffonts"
                    , "pdfimages"
                    , "pdfinfo"
                    , "pdfseparate"
                    , "pdfsig"
                    , "pdftocairo"
                    , "pdftohtml"
                    , "pdftoppm"
                    , "pdftops"
                    , "pdftotext"
                    , "pdfunite"
                    ]
          }

let tesseract =
      λ(v : List Natural) →
          prelude.simplePackage { name = "tesseract", version = v }
        ⫽ { pkgUrl =
              "https://github.com/tesseract-ocr/tesseract/archive/${prelude.showVersion
                                                                      v}.tar.gz"
          , pkgDeps =
            [ prelude.lowerBound { name = "leptonica", lower = [ 1, 74 ] } ]
          , pkgBuildDeps =
            [ prelude.unbounded "libtool"
            , prelude.unbounded "automake"
            , prelude.unbounded "pkg-config"
            ]
          , configureCommand = prelude.autogenConfigure
          , installCommand = prelude.installWithBinaries [ "bin/tesseract" ]
          }

let leptonica =
      λ(v : List Natural) →
          prelude.simplePackage { name = "leptonica", version = v }
        ⫽ { pkgUrl =
              "http://leptonica.org/source/leptonica-${prelude.showVersion
                                                         v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "zlib" ]
          }

let grep =
      λ(v : List Natural) → prelude.makeGnuExe { name = "grep", version = v }

let phash =
      λ(v : List Natural) →
          prelude.simplePackage { name = "pHash", version = v }
        ⫽ { pkgUrl =
              "http://phash.org/releases/pHash-${prelude.showVersion v}.tar.gz"
          , pkgDeps =
            [ prelude.lowerBound { name = "CImg", lower = [ 1, 3 ] }
            , prelude.unbounded "ffmpeg"
            , prelude.unbounded "libsndfile"
            , prelude.unbounded "libsamplerate"
            , prelude.unbounded "mpg123"
            , prelude.unbounded "libjpeg-turbo"
            , prelude.unbounded "libpng"
            , prelude.unbounded "fftw"
            ]
          , pkgBuildDeps =
            [ prelude.unbounded "autoconf"
            , prelude.unbounded "automake"
            , prelude.unbounded "grep"
            , prelude.unbounded "coreutils"
            , prelude.unbounded "sed"
            , prelude.unbounded "libtool"
            ]
          , configureCommand =
              λ(cfg : types.BuildVars) →
                  [ prelude.patch
                      ''
                      --- src/cimgffmpeg.cpp	2019-06-22 20:18:05.632517868 -0500
                      +++ src/cimgffmpeg.cpp	2019-06-22 20:18:45.569003435 -0500
                      @@ -100,12 +100,12 @@
                               AVFrame *pFrame;

                       	// Allocate video frame
                      -	pFrame=avcodec_alloc_frame();
                      +	pFrame=av_frame_alloc();
                       	if (pFrame==NULL)
                       	    return -1;

                       	// Allocate an AVFrame structure
                      -	AVFrame *pConvertedFrame = avcodec_alloc_frame();
                      +	AVFrame *pConvertedFrame = av_frame_alloc();
                       	if(pConvertedFrame==NULL)
                       	  return -1;
                       		
                      @@ -254,10 +254,10 @@
                       	AVFrame *pFrame;

                       	// Allocate video frame
                      -	pFrame=avcodec_alloc_frame();
                      +	pFrame=av_frame_alloc();
                       		
                       	// Allocate an AVFrame structure
                      -	AVFrame *pConvertedFrame = avcodec_alloc_frame();
                      +	AVFrame *pConvertedFrame = av_frame_alloc();
                       	if(pConvertedFrame==NULL){
                       	  return -1;
                       	}
                      --- configure.ac	2019-06-22 21:22:10.582842002 -0500
                      +++ configure.ac	2019-06-22 21:21:48.962982961 -0500
                      @@ -122,7 +122,7 @@
                       AC_DEFUN([AC_CHECK_FFMPEG],
                       [
                       AC_MSG_CHECKING([whether FFmpeg is present])
                      -AC_CHECK_LIB([avcodec], [avcodec_alloc_frame], [], [AC_MSG_ERROR([
                      +AC_CHECK_LIB([avutil], [av_frame_alloc], [], [AC_MSG_ERROR([

                       *** libavcodec not found.
                       You need FFmpeg. Get it at <http://ffmpeg.org/>])])
                      --- src/pHash.h	2019-06-23 11:31:15.678771295 -0500
                      +++ src/pHash.h	2019-06-23 11:31:31.754816275 -0500
                      @@ -47,6 +47,8 @@
                       #if defined(HAVE_IMAGE_HASH) || defined(HAVE_VIDEO_HASH)
                       #define cimg_debug 0
                       #define cimg_display 0
                      +#define cimg_use_png
                      +#define cimg_use_jpeg
                       #include "CImg.h"
                       using namespace cimg_library;
                       #endif
                      --- src/cimgffmpeg.cpp	2019-06-22 21:50:15.060403190 -0500
                      +++ src/cimgffmpeg.cpp	2019-06-22 21:56:50.839827371 -0500
                      @@ -39,11 +39,11 @@
                       int ReadFrames(VFInfo *st_info, CImgList<uint8_t> *pFrameList, unsigned int low_index, unsigned int hi_index)
                       {
                               //target pixel format
                      -	PixelFormat ffmpeg_pixfmt;
                      +	AVPixelFormat ffmpeg_pixfmt;
                       	if (st_info->pixelformat == 0)
                      -	    ffmpeg_pixfmt = PIX_FMT_GRAY8;
                      +	    ffmpeg_pixfmt = AV_PIX_FMT_GRAY8;
                       	else
                      -	    ffmpeg_pixfmt = PIX_FMT_RGB24;
                      +	    ffmpeg_pixfmt = AV_PIX_FMT_RGB24;

                       	st_info->next_index = low_index;

                      @@ -123,7 +123,7 @@
                       	int size = 0;
                       	

                      -        int channels = ffmpeg_pixfmt == PIX_FMT_GRAY8 ? 1 : 3;
                      +        int channels = ffmpeg_pixfmt == AV_PIX_FMT_GRAY8 ? 1 : 3;

                       	AVPacket packet;
                       	int result = 1;
                      @@ -189,11 +189,11 @@

                       int NextFrames(VFInfo *st_info, CImgList<uint8_t> *pFrameList)
                       {
                      -        PixelFormat ffmpeg_pixfmt;
                      +        AVPixelFormat ffmpeg_pixfmt;
                       	if (st_info->pixelformat == 0)
                      -	    ffmpeg_pixfmt = PIX_FMT_GRAY8;
                      +	    ffmpeg_pixfmt = AV_PIX_FMT_GRAY8;
                               else
                      -	    ffmpeg_pixfmt = PIX_FMT_RGB24;
                      +	    ffmpeg_pixfmt = AV_PIX_FMT_RGB24;

                       	if (st_info->pFormatCtx == NULL)
                       	{
                      @@ -287,7 +287,7 @@
                       			break;
                       		if(packet.stream_index == st_info->videoStream) {
                       			
                      -		int channels = ffmpeg_pixfmt == PIX_FMT_GRAY8 ? 1 : 3;
                      +		int channels = ffmpeg_pixfmt == AV_PIX_FMT_GRAY8 ? 1 : 3;
                        		AVPacket avpkt;
                                       av_init_packet(&avpkt);
                                       avpkt.data = packet.data;
                      --- src/cimgffmpeg.h	2019-06-23 11:47:59.046307628 -0500
                      +++ src/cimgffmpeg.h	2019-06-23 11:32:14.754956444 -0500
                      @@ -30,6 +30,8 @@
                       #define cimg_display 0${"\r"}
                       #define cimg_debug 0${"\r"}
                       ${"\r"}
                      +#define cimg_use_png${"\r"}
                      +#define cimg_use_jpeg${"\r"}
                       #include "CImg.h"${"\r"}
                       ${"\r"}
                       #define __STDC_CONSTANT_MACROS${"\r"}
                      ''
                  , prelude.call
                      { program = "autoreconf"
                      , arguments = [ "-i" ]
                      , environment = Some
                        [ { var = "PATH"
                          , value = prelude.mkPathVar cfg.binDirs
                          }
                        , prelude.mkAclocalPath cfg.shareDirs
                        ]
                      , procDir = None Text
                      }
                  ]
                # prelude.defaultConfigure cfg
          }

let cimg =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "CImg", version = v }
            ⫽ { pkgUrl = "http://cimg.eu/files/CImg_${versionString}.zip"
              , pkgBuildDeps = [] : List types.Dep
              , configureCommand = prelude.doNothing
              , buildCommand = prelude.doNothing
              , installCommand =
                  λ(_ : types.BuildVars) →
                    [ prelude.copyFile "CImg.h" "include/CImg.h" ]
              }

let ffmpeg =
      λ(v : List Natural) →
          prelude.simplePackage { name = "ffmpeg", version = v }
        ⫽ { pkgUrl =
              "https://ffmpeg.org/releases/ffmpeg-${prelude.showVersion
                                                      v}.tar.bz2"
          , pkgBuildDeps = [ prelude.unbounded "nasm" ]
          , configureCommand =
              prelude.configureWithFlags
                [ "--enable-shared"
                , "--enable-libmp3lame"
                , "--enable-gpl"
                , "--enable-version3"
                , "--enable-nonfree"
                , "--disable-debug"
                , "--enable-libass"
                , "--enable-libfreetype"
                , "--enable-libvorbis"
                , "--enable-avresample"
                , "--enable-gnutls"
                , "--enable-libvpx"
                , "--enable-libfdk-aac"
                ]
          , installCommand = prelude.installWithWrappers [ "ffmpeg" ]
          , pkgDeps =
            [ prelude.unbounded "bzip2"
            , prelude.unbounded "libmp3lame"
            , prelude.unbounded "libass"
            , prelude.unbounded "freetype"
            , prelude.unbounded "libvorbis"
            , prelude.unbounded "gnutls"
            , prelude.unbounded "libvpx"
            , prelude.unbounded "fdk-aac"
            ]
          }

let libsndfile =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libsndfile", version = v }
        ⫽ { pkgUrl =
              "http://www.mega-nerd.com/libsndfile/files/libsndfile-${prelude.showVersion
                                                                        v}.tar.gz"
          }

let libsamplerate =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libsamplerate", version = v }
        ⫽ { pkgUrl =
              "http://www.mega-nerd.com/SRC/libsamplerate-${prelude.showVersion
                                                              v}.tar.gz"
          }

let mpg123 =
      λ(v : List Natural) →
          prelude.simplePackage { name = "mpg123", version = v }
        ⫽ { pkgUrl =
              "http://www.mpg123.de/download/mpg123-${prelude.showVersion
                                                        v}.tar.bz2"
          }

let time =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "time", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/time/time-${prelude.showVersion
                                                     v}.tar.gz"
          }

let make =
      λ(v : List Natural) →
          prelude.makeGnuExe { name = "make", version = v }
        ⫽ { pkgUrl =
              "https://ftp.wayne.edu/gnu/make/make-${prelude.showVersion
                                                       v}.tar.bz2"
          , configureCommand =
              prelude.configureWithPatch
                ''
                --- glob/glob.c	2013-10-20 17:14:38.000000000 +0000
                +++ glob/glob.c	2018-09-18 10:16:03.860886356 +0000
                @@ -208,7 +208,7 @@
                 #endif /* __GNU_LIBRARY__ || __DJGPP__ */


                -#if !defined __alloca && !defined __GNU_LIBRARY__
                +#if !defined __alloca && defined __GNU_LIBRARY__

                 # ifdef	__GNUC__
                 #  undef alloca
                ''
          , buildCommand =
              λ(cfg : types.BuildVars) →
                [ prelude.call
                    (   prelude.defaultCall
                      ⫽ { program = "sh"
                        , arguments = [ "build.sh" ]
                        , environment = Some (prelude.buildEnv cfg)
                        }
                    )
                ]
          , installCommand =
              λ(_ : types.BuildVars) →
                [ prelude.copyFile "make" "bin/make"
                , prelude.symlinkBinary "bin/make"
                ]
          , pkgBuildDeps = [ prelude.unbounded "patch" ]
          }

let mercury =
      let mercuryBuild =
            λ(cfg : types.BuildVars) →
              [ prelude.call
                  (   prelude.defaultCall
                    ⫽ { program = "make"
                      , arguments = [ "PARALLEL=-j${Natural/show cfg.cpus}" ]
                      , environment = Some (prelude.buildEnv cfg)
                      }
                  )
              ]

      let mercuryCommon =
            { pkgUrl =
                "http://dl.mercurylang.org/release/mercury-srcdist-14.01.1.tar.gz"
            , pkgSubdir = "mercury-srcdist-14.01.1"
            , buildCommand = mercuryBuild
            }

      in    prelude.simplePackage { name = "mercury", version = [ 14, 1, 1 ] }
          ⫽ mercuryCommon
          ⫽ { pkgBuildDeps = [ prelude.unbounded "flex" ] }

let qt =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.simplePackage
                { name = "qt", version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "https://download.qt.io/archive/qt/${versionString}/${fullVersion}/single/qt-everywhere-src-${fullVersion}.tar.xz"
              , pkgSubdir = "qt-everywhere-src-${fullVersion}"
              , pkgBuildDeps =
                [ prelude.unbounded "flex"
                , prelude.unbounded "bison"
                , prelude.unbounded "pkg-config"
                , prelude.unbounded "gperf"
                , prelude.unbounded "perl"
                , prelude.unbounded "python2"
                , prelude.unbounded "git"
                ]
              , pkgDeps =
                [ prelude.unbounded "fontconfig"
                , prelude.unbounded "mesa"
                , prelude.unbounded "dbus"
                , prelude.unbounded "freetype"
                , prelude.unbounded "harfbuzz"
                , prelude.unbounded "libjpeg-turbo"
                , prelude.unbounded "libpng"
                , prelude.unbounded "giflib"
                , prelude.unbounded "glib"
                ]
              }

let lz4 =
      λ(v : List Natural) →
          prelude.simplePackage { name = "lz4", version = v }
        ⫽ { pkgUrl =
              "https://github.com/lz4/lz4/archive/v${prelude.showVersion
                                                       v}.tar.gz"
          , configureCommand = prelude.doNothing
          , installCommand =
              λ(cfg : types.BuildVars) →
                  [ prelude.call
                      (   prelude.defaultCall
                        ⫽ { program = "make"
                          , arguments =
                            [ "PREFIX=${cfg.installDir}", "install" ]
                          , environment = Some (prelude.buildEnv cfg)
                          }
                      )
                  , prelude.symlinkBinary "bin/lz4"
                  ]
                # prelude.symlinkManpages
                    [ { file = "share/man/man1/lz4.1", section = 1 } ]
          }

let fftw =
      λ(v : List Natural) →
          prelude.simplePackage { name = "fftw", version = v }
        ⫽ { pkgUrl = "http://www.fftw.org/fftw-${prelude.showVersion v}.tar.gz"
          , configureCommand =
              prelude.configureWithFlags
                [ "--enable-shared"
                , "--enable-threads"
                , "--with-combined-threads"
                ]
          }

let icu-le-hb =
      λ(v : List Natural) →
          prelude.simplePackage { name = "icu-le-hb", version = v }
        ⫽ { pkgUrl =
              "https://github.com/harfbuzz/icu-le-hb/archive/${prelude.showVersion
                                                                 v}.tar.gz"
          , configureCommand = prelude.autogenConfigure
          , pkgDeps = [ prelude.unbounded "harfbuzz", prelude.unbounded "icu" ]
          , pkgBuildDeps = [ prelude.unbounded "pkg-config" ]
          }

let icu =
      λ(v : List Natural) →
          prelude.simplePackage { name = "icu", version = v }
        ⫽ { pkgUrl =
              "http://download.icu-project.org/files/icu4c/${prelude.showVersion
                                                               v}/icu4c-${prelude.underscoreVersion
                                                                            v}-src.tgz"
          , pkgSubdir = "icu/source"
          , pkgBuildDeps =
            [ prelude.lowerBound { name = "make", lower = [ 3, 80 ] }
            , prelude.unbounded "python3"
            ]
          }

let opencv =
      λ(v : List Natural) →
          prelude.simplePackage { name = "opencv", version = v }
        ⫽ prelude.cmakePackage
        ⫽ { pkgUrl =
              "https://github.com/opencv/opencv/archive/${prelude.showVersion
                                                            v}.zip"
          , pkgBuildDeps =
            [ prelude.lowerBound { name = "cmake", lower = [ 2, 8, 7 ] }
            , prelude.unbounded "pkg-config"
            , prelude.unbounded "python2"
            ]
          , pkgDeps =
            [ prelude.unbounded "zlib"
            , prelude.unbounded "libjpeg-turbo"
            , prelude.unbounded "libpng"
            , prelude.unbounded "gtk3"
            , prelude.unbounded "ffmpeg"
            ]
          }

let libraw =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libraw", version = v }
        ⫽ { pkgUrl =
              "https://www.libraw.org/data/LibRaw-${prelude.showVersion
                                                      v}.tar.gz"
          , pkgSubdir = "LibRaw-${prelude.showVersion v}"
          }

let quazip =
      λ(v : List Natural) →
          prelude.simplePackage { name = "quazip", version = v }
        ⫽ prelude.cmakePackage
        ⫽ { pkgUrl =
              "https://github.com/stachenov/quazip/archive/v${prelude.showVersion
                                                                v}.tar.gz"
          , pkgDeps = [ prelude.unbounded "zlib", prelude.unbounded "qt" ]
          }

let eigen =
      λ(v : List Natural) →
          prelude.simplePackage { name = "eigen", version = v }
        ⫽ prelude.cmakePackage
        ⫽ { pkgUrl =
              "http://bitbucket.org/eigen/eigen/get/${prelude.showVersion
                                                        v}.tar.bz2"
          , pkgSubdir = "eigen-eigen-323c052e1731"
          }

let blas =
      λ(v : List Natural) →
          prelude.simplePackage { name = "blas", version = v }
        ⫽ { pkgUrl =
              "http://www.netlib.org/blas/blas-${prelude.showVersion v}.tgz"
          , pkgSubdir = "BLAS-${prelude.showVersion v}"
          , pkgBuildDeps = [ prelude.unbounded "gcc" ]
          , configureCommand = prelude.doNothing
          , installCommand =
              λ(_ : types.BuildVars) →
                [ prelude.copyFile "blas_LINUX.a" "lib/blas.a" ]
          }

let openblas =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "openblas", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/xianyi/OpenBLAS/archive/v${versionString}.tar.gz"
              , pkgSubdir = "OpenBLAS-${versionString}"
              , pkgBuildDeps = [ prelude.unbounded "gcc" ]
              , pkgDeps = [ prelude.unbounded "gcc" ]
              , configureCommand = prelude.doNothing
              , installCommand = prelude.installPrefix
              }

let r =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "r", version = v }
            ⫽ { pkgUrl =
                  "https://cran.r-project.org/src/base/R-4/R-${versionString}.tar.gz"
              , pkgSubdir = "R-${versionString}"
              , pkgDeps =
                [ prelude.unbounded "readline"
                , prelude.unbounded "libXt"
                , prelude.unbounded "pcre"
                ]
              , pkgBuildDeps = [ prelude.unbounded "gcc" ]
              , installCommand =
                  prelude.installWithBinaries [ "bin/R", "bin/Rscript" ]
              }

let libspng =
      λ(v : List Natural) →
          prelude.ninjaPackage { name = "libspng", version = v }
        ⫽ { pkgUrl =
              "https://github.com/randy408/libspng/archive/v${prelude.showVersion
                                                                v}.tar.gz"
          , pkgBuildDeps =
            [ prelude.unbounded "pkg-config"
            , prelude.unbounded "meson"
            , prelude.lowerBound { name = "ninja", lower = [ 1, 5, 0 ] }
            ]
          , pkgDeps = [ prelude.unbounded "zlib" ]
          }

let glib-networking =
      λ(x : { version : List Natural, patch : Natural }) →
        let versionString = prelude.showVersion x.version

        let fullVersion = versionString ++ "." ++ Natural/show x.patch

        in    prelude.ninjaPackage
                { name = "glib-networking", version = prelude.fullVersion x }
            ⫽ { pkgUrl =
                  "http://ftp.gnome.org/pub/gnome/sources/glib-networking/${versionString}/glib-networking-${fullVersion}.tar.xz"
              , pkgBuildDeps =
                [ prelude.unbounded "pkg-config", prelude.unbounded "gettext" ]
              , pkgDeps =
                [ prelude.unbounded "glib", prelude.unbounded "gnutls" ]
              }

let libwebp =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libwebp", version = v }
        ⫽ { pkgUrl =
              "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${prelude.showVersion
                                                                                                  v}.tar.gz"
          }

let rustc =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "rustc", version = v }
            ⫽ { pkgUrl =
                  "https://static.rust-lang.org/dist/rust-${versionString}-x86_64-unknown-linux-gnu.tar.gz"
              , pkgSubdir = "rust-${versionString}-x86_64-unknown-linux-gnu"
              , configureCommand = prelude.doNothing
              , buildCommand = prelude.doNothing
              , installCommand =
                  λ(cfg : types.BuildVars) →
                    [ prelude.call
                        (   prelude.defaultCall
                          ⫽ { program = "./install.sh"
                            , arguments =
                              [ "--prefix=${cfg.installDir}"
                              , "--disable-ldconfig"
                              ]
                            }
                        )
                    ]
              }

let librsvg =
      λ(x : { version : List Natural, patch : Natural }) →
          mkGnomeSimple "librsvg" x
        ⫽ { pkgBuildDeps =
            [ prelude.lowerBound { name = "rustc", lower = [ 1, 16, 0 ] }
            , prelude.unbounded "pkg-config"
            ]
          , pkgDeps =
            [ prelude.lowerBound { name = "cairo", lower = [ 1, 16, 0 ] }
            , prelude.lowerBound { name = "libxml2", lower = [ 2, 9, 0 ] }
            , prelude.lowerBound { name = "libcroco", lower = [ 0, 6, 1 ] }
            , prelude.unbounded "pango"
            , prelude.lowerBound { name = "gdk-pixbuf", lower = [ 2, 20 ] }
            , prelude.unbounded "gobject-introspection"
            , prelude.lowerBound { name = "glib", lower = [ 2, 10, 0 ] }
            ]
          }

let ats =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        let atsBuild =
              λ(cfg : types.BuildVars) →
                let buildDir =
                      cfg.currentDir ++ "/ATS2-Postiats-gmp-${versionString}"

                in  [ prelude.call
                        (   prelude.defaultCall
                          ⫽ { program = prelude.makeExe cfg.buildOS
                            , arguments =
                              [ "CFLAGS=${( prelude.mkCFlags cfg
                                          ).value} -I${buildDir}/src/CBOOT/ccomp/runtime -I${buildDir}/src/CBOOT"
                              , "LDFLAGS='${( prelude.mkLDFlags cfg.linkDirs cfg
                                            ).value}'"
                              ]
                            , environment = Some (prelude.buildEnv cfg)
                            }
                        )
                    ]

        in    prelude.simplePackage { name = "ats", version = v }
            ⫽ { pkgUrl =
                  "http://ats-lang.sourceforge.net/IMPLEMENT/Postiats/ATS2-Postiats-gmp-${versionString}.tgz"
              , pkgSubdir = "ATS2-Postiats-gmp-${versionString}"
              , pkgDeps = [ prelude.unbounded "gmp" ]
              , buildCommand = atsBuild
              , installCommand =
                  prelude.installWithBinaries [ "bin/patsopt", "bin/patscc" ]
              }

let libiconv =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libiconv", version = v }
        ⫽ { pkgUrl =
              "https://ftp.wayne.edu/gnu/libiconv/libiconv-${prelude.showVersion
                                                               v}.tar.gz"
          }

let libav =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libav", version = v }
        ⫽ { pkgUrl =
              "https://libav.org/releases/libav-${prelude.showVersion v}.tar.xz"
          , pkgBuildDeps =
            [ prelude.unbounded "nasm", prelude.unbounded "perl" ]
          , installCommand =
              prelude.installWithBinaries [ "bin/avconv", "bin/avprobe" ]
          }

let alsa-lib =
      λ(v : List Natural) →
          prelude.simplePackage { name = "alsa-lib", version = v }
        ⫽ { pkgUrl =
              "https://www.alsa-project.org/files/pub/lib/alsa-lib-${prelude.showVersion
                                                                       v}.tar.bz2"
          }

let bash-completion =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "bash-completion", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/scop/bash-completion/releases/download/${versionString}/bash-completion-${versionString}.tar.xz"
              }

let hugs =
      let hugsEnv =
            λ(_ : List Text) →
            λ(cfg : types.BuildVars) →
              Some
                [ { var = "CFLAGS", value = "-std=gnu89" }
                , { var = "PATH", value = prelude.mkPathVar cfg.binDirs }
                ]

      in    prelude.simplePackage { name = "hugs", version = [ 2006, 9 ] }
          ⫽ { pkgUrl =
                "https://www.haskell.org/hugs/downloads/2006-09/hugs98-plus-Sep2006.tar.gz"
            , pkgSubdir = "hugs98-plus-Sep2006"
            , configureCommand =
                prelude.generalConfigure
                  hugsEnv
                  "configure"
                  ([] : List Text)
                  ([] : List Text)
            , pkgBuildDeps =
              [ prelude.unbounded "coreutils"
              , prelude.unbounded "sed"
              , prelude.unbounded "gcc"
              , prelude.unbounded "binutils"
              , prelude.unbounded "grep"
              , prelude.unbounded "findutils"
              ]
            }

let bash =
      λ(v : List Natural) →
          prelude.simplePackage { name = "bash", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/gnu/bash/bash-${prelude.showVersion
                                                     v}.tar.gz"
          }

let findutils =
      λ(v : List Natural) →
          prelude.simplePackage { name = "findutils", version = v }
        ⫽ { pkgUrl =
              "https://ftp.gnu.org/pub/gnu/findutils/findutils-${prelude.showVersion
                                                                   v}.tar.xz"
          }

let ghc =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "ghc", version = v }
            ⫽ { pkgUrl =
                  "https://downloads.haskell.org/~ghc/${versionString}/ghc-${versionString}-x86_64-deb9-linux.tar.xz"
              , buildCommand = prelude.doNothing
              }

let cmark =
      λ(v : List Natural) →
          prelude.simplePackage { name = "cmark", version = v }
        ⫽ prelude.cmakePackage
        ⫽ { pkgUrl =
              "https://github.com/commonmark/cmark/archive/${prelude.showVersion
                                                               v}.tar.gz"
          }

let lzip =
      λ(v : List Natural) →
          prelude.simplePackage { name = "lzip", version = v }
        ⫽ { pkgUrl =
              "http://download.savannah.gnu.org/releases/lzip/lzip-${prelude.showVersion
                                                                       v}.tar.lz"
          , installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.installWithBinaries [ "bin/lzip" ] cfg
                # prelude.symlinkManpages
                    [ { file = "share/man/man1/lzip.1", section = 1 } ]
          }

let clzip =
      λ(v : List Natural) →
          prelude.simplePackage { name = "clzip", version = v }
        ⫽ { pkgUrl =
              "http://download.savannah.gnu.org/releases/lzip/clzip/clzip-${prelude.showVersion
                                                                              v}.tar.lz"
          , installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.installWithBinaries [ "bin/clzip" ] cfg
                # prelude.symlinkManpages
                    [ { file = "share/man/man1/clzip.1", section = 1 } ]
          }

let lunzip =
      λ(v : List Natural) →
          prelude.simplePackage { name = "lunzip", version = v }
        ⫽ { pkgUrl =
              "http://download.savannah.gnu.org/releases/lzip/lunzip/lunzip-${prelude.showVersion
                                                                                v}.tar.lz"
          , installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.installWithBinaries [ "bin/lunzip" ] cfg
                # prelude.symlinkManpages
                    [ { file = "share/man/man1/lunzip.1", section = 1 } ]
          }

let lzlib =
      λ(v : List Natural) →
          prelude.simplePackage { name = "lzlib", version = v }
        ⫽ { pkgUrl =
              "http://download.savannah.gnu.org/releases/lzip/lzlib/lzlib-${prelude.showVersion
                                                                              v}.tar.lz"
          , configureCommand = prelude.configureWithFlags [ "--enable-shared" ]
          }

let lziprecover =
      λ(v : List Natural) →
          prelude.simplePackage { name = "lziprecover", version = v }
        ⫽ { pkgUrl =
              "http://download.savannah.gnu.org/releases/lzip/lziprecover/lziprecover-${prelude.showVersion
                                                                                          v}.tar.lz"
          , installCommand = prelude.installWithBinaries [ "bin/lziprecover" ]
          }

let libmp3lame =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libmp3lame", version = v }
            ⫽ { pkgUrl =
                  "https://downloads.sourceforge.net/lame/lame-${versionString}.tar.gz"
              , pkgSubdir = "lame-${versionString}"
              }

let libass =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libass", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/libass/libass/releases/download/${versionString}/libass-${versionString}.tar.xz"
              , pkgBuildDeps = [ prelude.unbounded "nasm" ]
              , pkgDeps =
                [ prelude.lowerBound { name = "freetype", lower = [ 9, 10, 3 ] }
                , prelude.lowerBound { name = "fribidi", lower = [ 0, 19, 0 ] }
                , prelude.lowerBound { name = "harfbuzz", lower = [ 0, 9, 5 ] }
                , prelude.lowerBound
                    { name = "fontconfig", lower = [ 2, 10, 92 ] }
                ]
              }

let libogg =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libogg", version = v }
        ⫽ { pkgUrl =
              "https://downloads.xiph.org/releases/ogg/libogg-${prelude.showVersion
                                                                  v}.tar.xz"
          }

let libvorbis =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libvorbis", version = v }
        ⫽ { pkgUrl =
              "https://downloads.xiph.org/releases/vorbis/libvorbis-${prelude.showVersion
                                                                        v}.tar.xz"
          , pkgDeps = [ prelude.unbounded "libogg" ]
          }

let libvpx =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "libvpx", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/webmproject/libvpx/archive/v${versionString}/libvpx-${versionString}.tar.gz"
              , pkgBuildDeps =
                [ prelude.unbounded "nasm", prelude.unbounded "perl" ]
              }

let fdk-aac =
      λ(v : List Natural) →
          prelude.simplePackage { name = "fdk-aac", version = v }
        ⫽ { pkgUrl =
              "https://downloads.sourceforge.net/opencore-amr/fdk-aac-${prelude.showVersion
                                                                          v}.tar.gz"
          }

let swi-prolog =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.ninjaPackage { name = "swi-prolog", version = v }
            ⫽ { pkgUrl =
                  "https://www.swi-prolog.org/download/stable/src/swipl-${versionString}.tar.gz"
              , configureCommand = prelude.cmakeConfigureNinja
              , pkgBuildDeps =
                [ prelude.unbounded "cmake"
                , prelude.unbounded "ninja"
                , prelude.unbounded "coreutils"
                ]
              , pkgSubdir = "swipl-${versionString}"
              }

let exiftool =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "exiftool", version = v }
            ⫽ { pkgUrl =
                  "https://sno.phy.queensu.ca/~phil/exiftool/Image-ExifTool-${versionString}.tar.gz"
              , pkgSubdir = "Image-ExifTool-${versionString}"
              , configureCommand = prelude.perlConfigure
              , installCommand =
                  λ(cfg : types.BuildVars) →
                    let perlWrapper =
                          "PERL5LIB=${cfg.installDir}/lib/site_perl/5.30.0/ ${cfg.installDir}/bin/exiftool \$@"

                    let wrapped = "wrapper/exiftool"

                    in    prelude.defaultInstall cfg
                        # [ prelude.createDir "wrapper"
                          , prelude.writeFile
                              { file = wrapped, contents = perlWrapper }
                          , prelude.mkExe wrapped
                          , prelude.copyFile wrapped wrapped
                          , prelude.symlinkBinary wrapped
                          ]
              , pkgBuildDeps = [ prelude.unbounded "perl" ]
              }

let subversion =
      λ(v : List Natural) →
          prelude.simplePackage { name = "subversion", version = v }
        ⫽ { pkgUrl =
              "https://www-eu.apache.org/dist/subversion/subversion-${prelude.showVersion
                                                                        v}.tar.bz2"
          , pkgDeps =
            [ prelude.unbounded "apr"
            , prelude.unbounded "apr-util"
            , prelude.unbounded "sqlite"
            , prelude.unbounded "lz4"
            , prelude.unbounded "zlib"
            , prelude.unbounded "utf8proc"
            ]
          , pkgBuildDeps = [ prelude.unbounded "pkg-config" ]
          , installCommand = prelude.installWithBinaries [ "bin/svn" ]
          }

let utf8proc =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "utf8proc", version = v }
            ⫽ prelude.cmakePackage
            ⫽ { pkgUrl =
                  "https://github.com/JuliaStrings/utf8proc/archive/v${versionString}.tar.gz"
              }

let apr =
      λ(v : List Natural) →
          prelude.simplePackage { name = "apr", version = v }
        ⫽ { pkgUrl =
              "https://www-eu.apache.org/dist/apr/apr-${prelude.showVersion
                                                          v}.tar.bz2"
          }

let apr-util =
      λ(v : List Natural) →
          prelude.simplePackage { name = "apr-util", version = v }
        ⫽ { pkgUrl =
              "https://www-eu.apache.org/dist/apr/apr-util-${prelude.showVersion
                                                               v}.tar.bz2"
          , pkgDeps = [ prelude.unbounded "apr" ]
          , configureCommand =
              λ(cfg : types.BuildVars) →
                prelude.configureWithFlags
                  [ "--with-apr=${concat cfg.linkDirs}/../" ]
                  cfg
          }

let libsass =
      λ(v : List Natural) →
          prelude.simplePackage { name = "libsass", version = v }
        ⫽ { pkgUrl =
              "https://github.com/sass/libsass/archive/${prelude.showVersion
                                                           v}.tar.gz"
          , pkgBuildDeps =
            [ prelude.unbounded "autoconf"
            , prelude.unbounded "automake"
            , prelude.unbounded "m4"
            , prelude.unbounded "grep"
            , prelude.unbounded "sed"
            , prelude.unbounded "coreutils"
            , prelude.unbounded "libtool"
            ]
          , configureCommand =
              λ(cfg : types.BuildVars) →
                  [ prelude.call
                      { program = "autoreconf"
                      , arguments = [ "-i" ]
                      , environment = Some
                        [ { var = "PATH"
                          , value = prelude.mkPathVar cfg.binDirs
                          }
                        , prelude.mkAclocalPath cfg.shareDirs
                        ]
                      , procDir = None Text
                      }
                  ]
                # prelude.defaultConfigure cfg
          }

let zstd =
      λ(v : List Natural) →
        let versionString = prelude.showVersion v

        in    prelude.simplePackage { name = "zstd", version = v }
            ⫽ { pkgUrl =
                  "https://github.com/facebook/zstd/releases/download/v${versionString}/zstd-${versionString}.tar.zst"
              , configureCommand = prelude.doNothing
              , installCommand =
                  λ(cfg : types.BuildVars) →
                      [ prelude.call
                          { program = "make"
                          , arguments =
                            [ "PREFIX=${cfg.installDir}", "install" ]
                          , environment = Some (prelude.buildEnv cfg)
                          , procDir = None Text
                          }
                      , prelude.symlinkBinary "bin/zstd"
                      ]
                    # prelude.symlinkManpages
                        [ { file = "share/man/man1/zstd.1", section = 1 } ]
              }

let luarocks =
      λ(v : List Natural) →
          prelude.simplePackage { name = "luarocks", version = v }
        ⫽ { pkgUrl =
              "http://luarocks.org/releases/luarocks-${prelude.showVersion
                                                         v}.tar.gz"
          , pkgBuildDeps = [ prelude.unbounded "lua" ]
          , installCommand = prelude.installWithWrappers [ "luarocks" ]
          }

let star =
      λ(v : List Natural) →
          prelude.simplePackage { name = "star", version = v }
        ⫽ { pkgUrl =
              "https://downloads.sourceforge.net/s-tar/star-${prelude.showVersion
                                                                v}.tar.bz2"
          , configureCommand = prelude.doNothing
          , installCommand =
              λ(cfg : types.BuildVars) →
                  [ prelude.call
                      (   prelude.defaultCall
                        ⫽ { program = "make"
                          , arguments =
                            [ "DESTDIR=${cfg.installDir}", "install" ]
                          , environment = Some (prelude.buildEnv cfg)
                          }
                      )
                  , prelude.symlinkBinary "opt/schily/bin/star"
                  ]
                # prelude.symlinkManpages
                    [ { file = "opt/schily/share/man/man1/star.1", section = 1 }
                    , { file = "opt/schily/share/man/man1/scpio.1"
                      , section = 1
                      }
                    , { file = "opt/schily/share/man/man1/spax.1", section = 1 }
                    ]
          }

let smake =
      λ(v : List Natural) →
          prelude.simplePackage { name = "smake", version = v }
        ⫽ { pkgUrl =
              "https://downloads.sourceforge.net/s-make/smake-${prelude.showVersion
                                                                  v}.tar.bz2"
          , configureCommand = prelude.doNothing
          , installCommand =
              λ(cfg : types.BuildVars) →
                  [ prelude.call
                      (   prelude.defaultCall
                        ⫽ { program = "make"
                          , arguments =
                            [ "DESTDIR=${cfg.installDir}", "install" ]
                          , environment = Some (prelude.buildEnv cfg)
                          }
                      )
                  , prelude.symlinkBinary "opt/schily/bin/smake"
                  ]
                # prelude.symlinkManpages
                    [ { file = "opt/schily/share/man/man1/smake.1"
                      , section = 1
                      }
                    , { file = "opt/schily/share/man/man5/makefiles.5"
                      , section = 5
                      }
                    , { file = "opt/schily/share/man/man5/makerules.5"
                      , section = 5
                      }
                    ]
          }

let busybox =
      λ(v : List Natural) →
          prelude.simplePackage { name = "busybox", version = v }
        ⫽ { pkgUrl =
              "https://www.busybox.net/downloads/busybox-${prelude.showVersion
                                                             v}.tar.bz2"
          , configureCommand =
              λ(cfg : types.BuildVars) →
                [ prelude.call
                    (   prelude.defaultCall
                      ⫽ { program = "make"
                        , arguments = [ "defconfig" ]
                        , environment = Some (prelude.buildEnv cfg)
                        }
                    )
                ]
          , installCommand =
              λ(cfg : types.BuildVars) →
                [ prelude.call
                    (   prelude.defaultCall
                      ⫽ { program = "make"
                        , arguments =
                          [ "CONFIG_PREFIX=${cfg.installDir}", "install" ]
                        , environment = Some (prelude.buildEnv cfg)
                        }
                    )
                , prelude.symlinkBinary "bin/busybox"
                ]
          }

let tarlz =
      λ(v : List Natural) →
          prelude.simplePackage { name = "tarlz", version = v }
        ⫽ { pkgUrl =
              "http://download.savannah.gnu.org/releases/lzip/tarlz/tarlz-${prelude.showVersion
                                                                              v}.tar.lz"
          , installCommand =
              λ(cfg : types.BuildVars) →
                  prelude.installWithBinaries [ "bin/tarlz" ] cfg
                # prelude.symlinkManpages
                    [ { file = "share/man/man1/tarlz.1", section = 1 } ]
          }

in  [ alsa-lib [ 1, 1, 9 ]
    , apr [ 1, 7, 0 ]
    , apr-util [ 1, 6, 1 ]
    , at-spi-atk { version = [ 2, 33 ], patch = 2 }
    , at-spi-core { version = [ 2, 33 ], patch = 2 }
    , atk { version = [ 2, 36 ], patch = 0 }
    , ats [ 0, 4, 0 ]
    , autoconf [ 2, 69 ]
    , automake [ 1, 16, 2 ]
    , babl { version = [ 0, 1 ], patch = 68 }
    , bash [ 5, 0, 17 ]
    , bash-completion [ 2, 9 ]
    , binutils [ 2, 33, 1 ]
    , bison [ 3, 5 ]
    , blas [ 3, 8, 0 ]
    , busybox [ 1, 31, 1 ]
    , bzip2 [ 1, 0, 8 ]
    , cairo [ 1, 16, 0 ]
    , chickenScheme [ 5, 0, 0 ]
    , cimg [ 2, 7, 0 ]
    , clang [ 9, 0, 0 ]
    , clzip [ 1, 11 ]
    , cmake { version = [ 3, 17 ], patch = 2 }
    , cmark [ 0, 29, 0 ]
    , compositeproto [ 0, 4 ]
    , coreutils [ 8, 31 ]
    , ctags [ 5, 8 ]
    , curl [ 7, 66, 0 ]
    , damageproto [ 1, 2, 1 ]
    , dbus [ 1, 13, 12 ]
    , diffutils [ 3, 7 ]
    , dri2proto [ 2, 8 ]
    , eigen [ 3, 3, 7 ]
    , elfutils [ 0, 177 ]
    , emacs [ 26, 3 ]
    , exiftool [ 11, 65 ]
    , exiv2 [ 0, 27, 1 ]
    , expat [ 2, 2, 9 ]
    , fdk-aac [ 2, 0, 1 ]
    , feh [ 3, 2, 1 ]
    , ffmpeg [ 4, 2, 2 ]
    , fftw [ 3, 3, 8 ]
    , findutils [ 4, 7, 0 ]
    , fixesproto [ 5, 0 ]
    , fontconfig [ 2, 13, 1 ]
    , fossil [ 2, 10 ]
    , flex [ 2, 6, 3 ]
    , fltk [ 1, 3, 5 ]
    , freetype-prebuild [ 2, 10, 1 ]
    , freetype [ 2, 10, 1 ]
    , fribidi [ 1, 0, 9 ]
    , gawk [ 5, 0, 1 ]
    , gc [ 8, 0, 4 ]
    , gcc [ 10, 1, 0 ]
    , gdb [ 8, 3, 1 ]
    , gdk-pixbuf { version = [ 2, 38 ], patch = 1 }
    , gegl { version = [ 0, 4 ], patch = 16 }
    , gettext [ 0, 20, 2 ]
    , gexiv2 { version = [ 0, 12 ], patch = 0 }
    , ghc [ 8, 8, 3 ]
    , gperf [ 3, 1 ]
    , gperftools [ 2, 7 ]
    , giflib [ 5, 1, 4 ]
    , git [ 2, 26, 2 ]
    , glib { version = [ 2, 64 ], patch = 2 }
    , glib-networking { version = [ 2, 61 ], patch = 2 }
    , glproto [ 1, 4, 17 ]
    , glu [ 9, 0, 0 ]
    , json-glib { version = [ 1, 4 ], patch = 4 }
    , glibc [ 2, 30 ]
    , gmp [ 6, 2, 0 ]
    , gobject-introspection { version = [ 1, 62 ], patch = 0 }
    , gnome-doc-utils { version = [ 0, 20 ], patch = 10 }
    , gnupg [ 2, 2, 20 ]
    , gnutls { version = [ 3, 6 ], patch = [ 13 ] }
    , graphviz [ 2, 40, 1 ]
    , grep [ 3, 3 ]
    , gsl [ 2, 6 ]
    , gtk2 { version = [ 2, 24 ], patch = 32 }
    , gtk3 { version = [ 3, 24 ], patch = 18 }
    , gzip [ 1, 10 ]
    , harfbuzz [ 2, 6, 4 ]
    , htop [ 2, 2, 0 ]
    , hugs
    , icu [ 64, 2 ]
    , icu-le-hb [ 1, 0, 3 ]
    , imageMagick [ 7, 0, 8 ]
    , imlib2 [ 1, 5, 1 ]
    , inputproto [ 2, 3, 2 ]
    , intltool [ 0, 51, 0 ]
    , itstool [ 2, 0, 6 ]
    , jemalloc [ 5, 2, 1 ]
    , joe [ 4, 6 ]
    , json-c { version = [ 0, 13, 1 ], dateStr = "20180305" }
    , kbproto [ 1, 0, 7 ]
    , krb5 [ 1, 18 ]
    , lapack [ 3, 8, 0 ]
    , lcms2 [ 2, 9 ]
    , leptonica [ 1, 78, 0 ]
    , libarchive [ 3, 4, 3 ]
    , libass [ 0, 14, 0 ]
    , libassuan [ 2, 5, 3 ]
    , libatomic_ops [ 7, 6, 10 ]
    , libav [ 12, 3 ]
    , libboost [ 1, 72, 0 ]
    , libcds [ 2, 3, 2 ]
    , libcroco { version = [ 0, 6 ], patch = 12 }
    , libdatrie [ 0, 2, 12 ]
    , libdrm [ 2, 4, 96 ]
    , libepoxy [ 1, 5, 3 ]
    , libev [ 4, 25 ]
    , libevent [ 2, 1, 10 ]
    , libexif [ 0, 6, 21 ]
    , libffi [ 3, 3 ]
    , libgcrypt [ 1, 8, 5 ]
    , libglade { version = [ 2, 6 ], patch = 4 }
    , libgpgError [ 1, 37 ]
    , libICE [ 1, 0, 9 ]
    , libiconv [ 1, 16 ]
    , libjpeg [ 9 ]
    , libjpeg-turbo [ 2, 0, 4 ]
    , libksba [ 1, 3, 5 ]
    , libmp3lame [ 3, 100 ]
    , libmypaint [ 1, 3, 0 ]
    , libnettle [ 3, 5, 1 ]
    , libogg [ 1, 3, 4 ]
    , libopenjpeg [ 2, 3, 1 ]
    , libotf [ 0, 9, 16 ]
    , libpciaccess [ 0, 14 ]
    , libpng [ 1, 6, 37 ]
    , libpsl [ 0, 21, 0 ]
    , libpthread-stubs [ 0, 4 ]
    , libraw [ 0, 19, 2 ]
    , librsvg { version = [ 2, 48 ], patch = 4 }
    , libsamplerate [ 0, 1, 9 ]
    , libsass [ 3, 6, 2 ]
    , libselinux [ 3, 0 ]
    , libsndfile [ 1, 0, 28 ]
    , libsepol [ 3, 0 ]
    , libsodium [ 1, 0, 17 ]
    , libsoup { version = [ 2, 67 ], patch = 3 }
    , libspng [ 0, 5, 0 ]
    , libssh2 [ 1, 8, 0 ]
    , libtasn1 [ 4, 15, 0 ]
    , libtiff [ 4, 0, 10 ]
    , libtool [ 2, 4, 6 ]
    , libuv [ 1, 24, 0 ]
    , libwebp [ 1, 0, 3 ]
    , libSM [ 1, 2, 3 ]
    , libthai [ 0, 1, 28 ]
    , libvorbis [ 1, 3, 6 ]
    , libvpx [ 1, 8, 2 ]
    , libX11 [ 1, 6, 8 ]
    , libXau [ 1, 0, 9 ]
    , libXaw [ 1, 0, 13 ]
    , libXaw3d [ 1, 6, 3 ]
    , libxcb [ 1, 13 ]
    , libXcomposite [ 0, 4, 5 ]
    , libXdamage [ 1, 1, 5 ]
    , libXdmcp [ 1, 1, 3 ]
    , libXext [ 1, 3, 4 ]
    , libXfixes [ 5, 0, 3 ]
    , libXft [ 2, 3, 3 ]
    , libXi [ 1, 7, 10 ]
    , libXinerama [ 1, 1, 4 ]
    , libxml2 [ 2, 9, 9 ]
    , libXmu [ 1, 1, 3 ]
    , libXpm [ 3, 5, 12 ]
    , libXScrnSaver [ 1, 2, 3 ]
    , libxshmfence [ 1, 3 ]
    , libxslt [ 1, 1, 33 ]
    , libXrandr [ 1, 5, 2 ]
    , libXrender [ 0, 9, 10 ]
    , libXt [ 1, 2, 0 ]
    , libXtst [ 1, 2, 3 ]
    , libXxf86vm [ 1, 1, 4 ]
    , llvm [ 9, 0, 0 ]
    , lmdb [ 0, 9, 23 ]
    , lua [ 5, 3, 5 ]
    , luarocks [ 3, 2, 1 ]
    , lunzip [ 1, 11 ]
    , lz4 [ 1, 9, 2 ]
    , lzip [ 1, 21 ]
    , lziprecover [ 1, 21 ]
    , lzlib [ 1, 11 ]
    , m17n [ 1, 8, 0 ]
    , m4 [ 1, 4, 18 ]
    , make [ 4, 2, 1 ]
    , mako [ 1, 0, 7 ]
    , markupSafe [ 1, 0 ]
    , memcached [ 1, 5, 18 ]
    , mercury
    , mesa [ 19, 0, 5 ]
    , meson [ 0, 51, 2 ]
    , mosh [ 1, 3, 2 ]
    , motif [ 2, 3, 8 ]
    , mpc [ 1, 1, 0 ]
    , mpfr [ 4, 0, 2 ]
    , mpg123 [ 1, 25, 12 ]
    , musl [ 1, 1, 20 ]
    , nano [ 4, 3 ]
    , nasm [ 2, 14 ]
    , ncurses [ 6, 2 ]
    , nginx [ 1, 15, 7 ]
    , ninja [ 1, 9, 0 ]
    , node [ 12, 17, 0 ]
    , npth [ 1, 6 ]
    , nspr [ 4, 20 ]
    , openblas [ 0, 3, 2 ]
    , opencv [ 4, 2, 0 ]
    , openssh [ 7, 9 ]
    , openssl [ 1, 1, 1 ]
    , p11kit [ 0, 23, 16, 1 ]
    , pango { version = [ 1, 43 ], patch = 0 }
    , pari [ 2, 11, 1 ]
    , patch [ 2, 7 ]
    , pcre [ 8, 44 ]
    , pcre2 [ 10, 33 ]
    , pdfgrep [ 2, 1, 2 ]
    , perl5 [ 5, 30, 2 ]
    , phash [ 0, 9, 6 ]
    , pixman [ 0, 38, 4 ]
    , pkg-config [ 0, 29, 2 ]
    , poppler [ 0, 84, 0 ]
    , postgresql [ 12, 2 ]
    , protobuf [ 3, 8, 0 ]
    , pycairo [ 1, 18, 1 ]
    , pygobject { version = [ 2, 28 ], patch = 7 }
    , pygtk { version = [ 2, 24 ], patch = 0 }
    , python [ 2, 7, 17 ]
    , python [ 3, 8, 2 ]
    , qrencode [ 4, 0, 2 ]
    , qt { version = [ 5, 13 ], patch = 0 }
    , quazip [ 0, 8, 1 ]
    , r [ 4, 0, 0 ]
    , ragel [ 6, 10 ]
    , randrproto [ 1, 5, 0 ]
    , re2c [ 1, 1, 1 ]
    , readline [ 8, 0 ]
    , recordproto [ 1, 14, 2 ]
    , renderproto [ 0, 11, 1 ]
    , ruby { version = [ 2, 7 ], patch = 1 }
    , rustc [ 1, 42, 0 ]
    , scour [ 0, 37 ]
    , scrnsaverproto [ 1, 2, 2 ]
    , sdl2 [ 2, 0, 10 ]
    , sed [ 4, 7 ]
    , shared-mime-info [ 1, 10 ]
    , smake [ 1, 2, 5 ]
    , sqlite { version = [ 3, 30, 1 ] }
    , star [ 1, 6 ]
    , subversion [ 1, 12, 2 ]
    , swig [ 3, 0, 12 ]
    , swi-prolog [ 8, 0, 3 ]
    , tar [ 1, 32 ]
    , tarlz [ 0, 16 ]
    , tcc [ 0, 9, 27 ]
    , texinfo [ 6, 6 ]
    , tesseract [ 4, 0, 0 ]
    , time [ 1, 9 ]
    , unistring [ 0, 9, 10 ]
    , utf8proc [ 2, 4, 0 ]
    , util-linux { version = [ 2, 34 ] }
    , util-macros [ 1, 19, 2 ]
    , vala { version = [ 0, 45 ], patch = 3 }
    , valgrind [ 3, 15, 0 ]
    , vim [ 8, 2 ]
    , wayland [ 1, 17, 0 ]
    , wget [ 1, 20, 3 ]
    , which [ 2, 21 ]
    , xcb-proto [ 1, 13 ]
    , xextproto [ 7, 3, 0 ]
    , xf86vidmodeproto [ 2, 3, 1 ]
    , xineramaproto [ 1, 2 ]
    , xmlParser [ 2, 44 ]
    , xproto [ 7, 0, 31 ]
    , xtrans [ 1, 4, 0 ]
    , xz [ 5, 2, 5 ]
    , zlib [ 1, 2, 11 ]
    , zstd [ 1, 4, 5 ]
    ]