@@ -1230,36 +1230,169 @@ func getBMPPorts() (gdbPort, uartPort string, err error) {
1230
1230
}
1231
1231
}
1232
1232
1233
- func usage (command string ) {
1234
- switch command {
1235
- default :
1236
- fmt .Fprintln (os .Stderr , "TinyGo is a Go compiler for small places." )
1237
- fmt .Fprintln (os .Stderr , "version:" , goenv .Version ())
1238
- fmt .Fprintf (os .Stderr , "usage: %s <command> [arguments]\n " , os .Args [0 ])
1239
- fmt .Fprintln (os .Stderr , "\n commands:" )
1240
- fmt .Fprintln (os .Stderr , " build: compile packages and dependencies" )
1241
- fmt .Fprintln (os .Stderr , " run: compile and run immediately" )
1242
- fmt .Fprintln (os .Stderr , " test: test packages" )
1243
- fmt .Fprintln (os .Stderr , " flash: compile and flash to the device" )
1244
- fmt .Fprintln (os .Stderr , " gdb: run/flash and immediately enter GDB" )
1245
- fmt .Fprintln (os .Stderr , " lldb: run/flash and immediately enter LLDB" )
1246
- fmt .Fprintln (os .Stderr , " monitor: open communication port" )
1247
- fmt .Fprintln (os .Stderr , " ports: list available serial ports" )
1248
- fmt .Fprintln (os .Stderr , " env: list environment variables used during build" )
1249
- fmt .Fprintln (os .Stderr , " list: run go list using the TinyGo root" )
1250
- fmt .Fprintln (os .Stderr , " clean: empty cache directory (" + goenv .Get ("GOCACHE" )+ ")" )
1251
- fmt .Fprintln (os .Stderr , " targets: list targets" )
1252
- fmt .Fprintln (os .Stderr , " info: show info for specified target" )
1253
- fmt .Fprintln (os .Stderr , " version: show version" )
1254
- fmt .Fprintln (os .Stderr , " help: print this help text" )
1233
+ const (
1234
+ usageBuild = `Build compiles the packages named by the import paths, along with their
1235
+ dependencies, but it does not install the results. The output binary is
1236
+ specified using the -o parameter. The generated file type depends on the
1237
+ extension:
1238
+
1239
+ .o:
1240
+ Create a relocatable object file. You can use this option if you
1241
+ don't want to use the TinyGo build system or want to do other custom
1242
+ things.
1243
+
1244
+ .ll:
1245
+ Create textual LLVM IR, after optimization. This is mainly useful
1246
+ for debugging.
1247
+
1248
+ .bc:
1249
+ Create LLVM bitcode, after optimization. This may be useful for
1250
+ debugging or for linking into other programs using LTO.
1251
+
1252
+ .hex:
1253
+ Create an Intel HEX file to flash it to a microcontroller.
1254
+
1255
+ .bin:
1256
+ Similar, but create a binary file.
1257
+
1258
+ .wasm:
1259
+ Compile and link a WebAssembly file.
1260
+
1261
+ (all other) Compile and link the program into a regular executable. For
1262
+ microcontrollers, it is common to use the .elf file extension to indicate a
1263
+ linked ELF file is generated. For Linux, it is common to build binaries with no
1264
+ extension at all.`
1265
+
1266
+ usageRun = `Run the program, either directly on the host or in an emulated environment
1267
+ (depending on -target).`
1268
+
1269
+ usageFlash = `Flash the program to a microcontroller. Some common flags are described below.
1270
+
1271
+ -target={name}:
1272
+ Specifies the type of microcontroller that is used. The name of the
1273
+ microcontroller is given on the individual pages for each board type
1274
+ listed under Microcontrollers
1275
+ (https://tinygo.org/docs/reference/microcontrollers/).
1276
+ Examples: "arduino-nano", "d1mini", "xiao".
1277
+
1278
+ -monitor:
1279
+ Start the serial monitor (see below) immediately after
1280
+ flashing. However, some microcontrollers need a split second
1281
+ or two to configure the serial port after flashing, and
1282
+ using the "-monitor" flag can fail because the serial
1283
+ monitor starts too quickly. In that case, use the "tinygo
1284
+ monitor" command explicitly.`
1285
+
1286
+ usageMonitor = `Start the serial monitor on the serial port that is connected to the
1287
+ microcontroller. If there is only a single board attached to the host computer,
1288
+ the default values for various options should be sufficient. In other
1289
+ situations, particularly if you have multiple microcontrollers attached, some
1290
+ parameters may need to be overridden using the following flags:
1291
+
1292
+ -port={port}:
1293
+ If there are multiple microcontroller attached, an error
1294
+ message will display a list of potential serial ports. The
1295
+ appropriate port can be specified by this flag. On Linux,
1296
+ the port will be something like /dev/ttyUSB0 or /dev/ttyACM1.
1297
+ On MacOS, the port will look like /dev/cu.usbserial-1420. On
1298
+ Windows, the port will be something like COM1 or COM31.
1299
+
1300
+ -baudrate={rate}:
1301
+ The default baud rate is 115200. Boards using the AVR
1302
+ processor (e.g. Arduino Nano, Arduino Mega 2560) use 9600
1303
+ instead.
1304
+
1305
+ -target={name}:
1306
+ If you have more than one microcontrollers attached, you can
1307
+ sometimes just specify the target name and let tinygo
1308
+ monitor figure out the port. Sometimes, this does not work
1309
+ and you have to explicitly use the -port flag.
1310
+
1311
+ The serial monitor intercepts several control characters for its own use instead of sending them
1312
+ to the microcontroller:
1313
+
1314
+ Control-C: terminates the tinygo monitor
1315
+ Control-Z: suspends the tinygo monitor and drops back into shell
1316
+ Control-\: terminates the tinygo monitor with a stack trace
1317
+ Control-S: flow control, suspends output to the console
1318
+ Control-Q: flow control, resumes output to the console
1319
+ Control-@: thrown away by tinygo monitor
1320
+
1321
+ Note: If you are using os.Stdin on the microcontroller, you may find that a CR
1322
+ character on the host computer (also known as Enter, ^M, or \r) is transmitted
1323
+ to the microcontroller without conversion, so os.Stdin returns a \r character
1324
+ instead of the expected \n (also known as ^J, NL, or LF) to indicate
1325
+ end-of-line. You may be able to get around this problem by hitting Control-J in
1326
+ tinygo monitor to transmit the \n end-of-line character.`
1327
+
1328
+ usageGdb = `Build the program, optionally flash it to a microcontroller if it is a remote
1329
+ target, and drop into a GDB shell. From there you can set breakpoints, start the
1330
+ program with "run" or "continue" ("run" for a local program, continue for
1331
+ on-chip debugging), single-step, show a backtrace, break and resume the program
1332
+ with Ctrl-C/"continue", etc. You may need to install extra tools (like openocd
1333
+ and arm-none-eabi-gdb) to be able to do this. Also, you may need a dedicated
1334
+ debugger to be able to debug certain boards if no debugger is integrated. Some
1335
+ boards (like the BBC micro:bit and most professional evaluation boards) have an
1336
+ integrated debugger.`
1337
+
1338
+ usageClean = `Clean the cache directory, normally stored in $HOME/.cache/tinygo. This is not
1339
+ normally needed.`
1340
+
1341
+ usageHelp = `Print a short summary of the available commands, plus a list of command flags.`
1342
+ usageVersion = `Print the version of the command and the version of the used $GOROOT.`
1343
+ usageEnv = `Print a list of environment variables that affect TinyGo (as a shell script).
1344
+ If one or more variable names are given as arguments, env prints the value of
1345
+ each on a new line.`
1346
+
1347
+ usageDefault = `TinyGo is a Go compiler for small places.
1348
+ version: %s
1349
+ usage: %s <command> [arguments]
1350
+ commands:
1351
+ build: compile packages and dependencies
1352
+ run: compile and run immediately
1353
+ test: test packages
1354
+ flash: compile and flash to the device
1355
+ gdb: run/flash and immediately enter GDB
1356
+ lldb: run/flash and immediately enter LLDB
1357
+ monitor: open communication port
1358
+ ports: list available serial ports
1359
+ env: list environment variables used during build
1360
+ list: run go list using the TinyGo root
1361
+ clean: empty cache directory (%s)
1362
+ targets: list targets
1363
+ info: show info for specified target
1364
+ version: show version
1365
+ help: print this help text`
1366
+ )
1367
+
1368
+ var (
1369
+ commandHelp = map [string ]string {
1370
+ "build" : usageBuild ,
1371
+ "run" : usageRun ,
1372
+ "flash" : usageFlash ,
1373
+ "monitor" : usageMonitor ,
1374
+ "gdb" : usageGdb ,
1375
+ "clean" : usageClean ,
1376
+ "help" : usageHelp ,
1377
+ "version" : usageVersion ,
1378
+ "env" : usageEnv ,
1379
+ }
1380
+ )
1255
1381
1382
+ func usage (command string ) {
1383
+ val , ok := commandHelp [command ]
1384
+ if ! ok {
1385
+ fmt .Fprintf (os .Stderr , usageDefault , goenv .Version (), os .Args [0 ], goenv .Get ("GOCACHE" ))
1256
1386
if flag .Parsed () {
1257
1387
fmt .Fprintln (os .Stderr , "\n flags:" )
1258
1388
flag .PrintDefaults ()
1259
1389
}
1260
1390
1261
1391
fmt .Fprintln (os .Stderr , "\n for more details, see https://tinygo.org/docs/reference/usage/" )
1392
+ } else {
1393
+ fmt .Fprintln (os .Stderr , val )
1262
1394
}
1395
+
1263
1396
}
1264
1397
1265
1398
func handleCompilerError (err error ) {
0 commit comments