 96e863f0f3
			
		
	
	
		96e863f0f3
		
	
	
	
	
		
			
			This can be very useful for some purposes:
  * It makes it possible to disable the UART in cases where it is not
    needed or needs to be disabled to conserve power.
  * It makes it possible to disable the serial output to reduce code
    size, which may be important for some chips. Sometimes, a few kB can
    be saved this way.
  * It makes it possible to override the default, for example you might
    want to use an actual UART to debug the USB-CDC implementation.
It also lowers the dependency on having machine.Serial defined, which is
often not defined when targeting a chip. Eventually, we might want to
make it possible to write `-target=nrf52` or `-target=atmega328p` for
example to target the chip itself with no board specific assumptions.
The defaults don't change. I checked this by running `make smoketest`
before and after and comparing the results.
		
	
			
		
			
				
	
	
		
			107 строки
		
	
	
	
		
			2,8 КиБ
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			107 строки
		
	
	
	
		
			2,8 КиБ
		
	
	
	
		
			Go
		
	
	
	
	
	
| package compileopts
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"regexp"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	validGCOptions            = []string{"none", "leaking", "extalloc", "conservative"}
 | |
| 	validSchedulerOptions     = []string{"none", "tasks", "coroutines"}
 | |
| 	validSerialOptions        = []string{"none", "uart", "usb"}
 | |
| 	validPrintSizeOptions     = []string{"none", "short", "full"}
 | |
| 	validPanicStrategyOptions = []string{"print", "trap"}
 | |
| 	validOptOptions           = []string{"none", "0", "1", "2", "s", "z"}
 | |
| )
 | |
| 
 | |
| // Options contains extra options to give to the compiler. These options are
 | |
| // usually passed from the command line.
 | |
| type Options struct {
 | |
| 	Target          string
 | |
| 	Opt             string
 | |
| 	GC              string
 | |
| 	PanicStrategy   string
 | |
| 	Scheduler       string
 | |
| 	Serial          string
 | |
| 	PrintIR         bool
 | |
| 	DumpSSA         bool
 | |
| 	VerifyIR        bool
 | |
| 	PrintCommands   func(cmd string, args ...string)
 | |
| 	Debug           bool
 | |
| 	PrintSizes      string
 | |
| 	PrintAllocs     *regexp.Regexp // regexp string
 | |
| 	PrintStacks     bool
 | |
| 	Tags            string
 | |
| 	WasmAbi         string
 | |
| 	GlobalValues    map[string]map[string]string // map[pkgpath]map[varname]value
 | |
| 	TestConfig      TestConfig
 | |
| 	Programmer      string
 | |
| 	OpenOCDCommands []string
 | |
| 	LLVMFeatures    string
 | |
| }
 | |
| 
 | |
| // Verify performs a validation on the given options, raising an error if options are not valid.
 | |
| func (o *Options) Verify() error {
 | |
| 	if o.GC != "" {
 | |
| 		valid := isInArray(validGCOptions, o.GC)
 | |
| 		if !valid {
 | |
| 			return fmt.Errorf(`invalid gc option '%s': valid values are %s`,
 | |
| 				o.GC,
 | |
| 				strings.Join(validGCOptions, ", "))
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if o.Scheduler != "" {
 | |
| 		valid := isInArray(validSchedulerOptions, o.Scheduler)
 | |
| 		if !valid {
 | |
| 			return fmt.Errorf(`invalid scheduler option '%s': valid values are %s`,
 | |
| 				o.Scheduler,
 | |
| 				strings.Join(validSchedulerOptions, ", "))
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if o.Serial != "" {
 | |
| 		valid := isInArray(validSerialOptions, o.Serial)
 | |
| 		if !valid {
 | |
| 			return fmt.Errorf(`invalid serial option '%s': valid values are %s`,
 | |
| 				o.Serial,
 | |
| 				strings.Join(validSerialOptions, ", "))
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if o.PrintSizes != "" {
 | |
| 		valid := isInArray(validPrintSizeOptions, o.PrintSizes)
 | |
| 		if !valid {
 | |
| 			return fmt.Errorf(`invalid size option '%s': valid values are %s`,
 | |
| 				o.PrintSizes,
 | |
| 				strings.Join(validPrintSizeOptions, ", "))
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if o.PanicStrategy != "" {
 | |
| 		valid := isInArray(validPanicStrategyOptions, o.PanicStrategy)
 | |
| 		if !valid {
 | |
| 			return fmt.Errorf(`invalid panic option '%s': valid values are %s`,
 | |
| 				o.PanicStrategy,
 | |
| 				strings.Join(validPanicStrategyOptions, ", "))
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if o.Opt != "" {
 | |
| 		if !isInArray(validOptOptions, o.Opt) {
 | |
| 			return fmt.Errorf("invalid -opt=%s: valid values are %s", o.Opt, strings.Join(validOptOptions, ", "))
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func isInArray(arr []string, item string) bool {
 | |
| 	for _, i := range arr {
 | |
| 		if i == item {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 	return false
 | |
| }
 |