(CommandList
  children: [
    (FuncDef
      name: do_build
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:descr)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [16]
                )
              ]
              spids: [16]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:board)
                  op: Equal
                  rhs: {($ VSub_Number '$2')}
                  spids: [20]
                )
              ]
              spids: [20]
            )
            (C {(shift)})
            (C {(shift)})
            (C {(echo)} {(DQ ('building ') ($ VSub_Name '$descr') (' ') ($ VSub_Name '$board'))})
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:build_dir)
                  op: Equal
                  rhs: {(/tmp/stm-build-) ($ VSub_Name '$board')}
                  spids: [40]
                )
              ]
              spids: [40]
            )
            (AndOr
              children: [
                (C {(make)} {(-B)} {($ VSub_At '$@')} {(Lit_VarLike 'BOARD=') ($ VSub_Name '$board')} 
                  {(Lit_VarLike 'BUILD=') ($ VSub_Name '$build_dir')}
                )
                (C {(exit)} {(1)})
              ]
              op_id: Op_DPipe
            )
            (C {(mv)} {($ VSub_Name '$build_dir') (/firmware.dfu)} 
              {($ VSub_Name '$dest_dir') (/) ($ VSub_Name '$descr') (-) ($ VSub_Name '$date') (-) 
                ($ VSub_Name '$git_tag') (.dfu)
              }
            )
            (C {(rm)} {(-rf)} {($ VSub_Name '$build_dir')})
          ]
          spids: [13]
        )
      spids: [7 12]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (C {(Lit_Other '[')} {($ VSub_Pound '$#')} {(KW_Bang '!') (Lit_Other '=')} {(1)} 
                  {(Lit_Other ']')}
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (C {(echo)} {(DQ ('usage: ') ($ VSub_Number '$0') (' <dest-dir>'))})
            (C {(exit)} {(1)})
          ]
          spids: [16777215 105]
        )
      ]
      spids: [16777215 121]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:dest_dir)
          op: Equal
          rhs: {($ VSub_Number '$1')}
          spids: [124]
        )
      ]
      spids: [124]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: (C {(Lit_Other '[')} {(KW_Bang '!')} {(-r)} {(modpyb.c)} {(Lit_Other ']')})
              terminator: <Op_Semi ';'>
            )
          ]
          action: [(C {(echo)} {(DQ ('must be in stm directory'))}) (C {(exit)} {(1)})]
          spids: [16777215 144]
        )
      ]
      spids: [16777215 158]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:date)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(date)} {(SQ <'+%Y-%m-%d'>)})])
                left_token: <Left_CommandSub '$('>
                spids: [165 171]
              )
            }
          spids: [164]
        )
      ]
      spids: [164]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:git_tag)
          op: Equal
          rhs: 
            {
              (DQ 
                (CommandSubPart
                  command_list: 
                    (CommandList
                      children: [
                        (AndOr
                          children: [(C {(git)} {(describe)} {(--dirty)}) (C {(echo)} {(unknown)})]
                          op_id: Op_DPipe
                        )
                      ]
                    )
                  left_token: <Left_CommandSub '$('>
                  spids: [179 191]
                )
              )
            }
          spids: [177]
        )
      ]
      spids: [177]
    )
    (C {(do_build)} {(pybv3)} {(PYBV3)})
    (C {(do_build)} {(pybv3-network)} {(PYBV3)} {(Lit_VarLike 'MICROPY_PY_WIZNET5K=') (1)} 
      {(Lit_VarLike 'MICROPY_PY_CC3K=') (1)}
    )
    (C {(do_build)} {(pybv10)} {(PYBV10)})
    (C {(do_build)} {(pybv10-network)} {(PYBV10)} {(Lit_VarLike 'MICROPY_PY_WIZNET5K=') (1)} 
      {(Lit_VarLike 'MICROPY_PY_CC3K=') (1)}
    )
    (C {(do_build)} {(stm32f4disc)} {(STM32F4DISC)})
    (C {(do_build)} {(espruino-pico)} {(ESPRUINO_PICO)})
  ]
)