80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package main
|
|
|
|
import "os"
|
|
import "io"
|
|
import "path/filepath"
|
|
import "git.tebibyte.media/fspl/fspl/cli"
|
|
import "git.tebibyte.media/fspl/fspl/entity"
|
|
import "git.tebibyte.media/fspl/fspl/compiler"
|
|
import ferrors "git.tebibyte.media/fspl/fspl/errors"
|
|
|
|
func main () {
|
|
// instantiate the compiler
|
|
// FIXME: perhaps we want different paths on Windows?
|
|
comp := new(compiler.Compiler)
|
|
comp.Writer = os.Stderr
|
|
comp.Resolver = compiler.NewResolver (
|
|
"/usr/local/src/fspl",
|
|
"/usr/src/fspl",
|
|
"/usr/local/incude/fspl",
|
|
"/usr/include/fspl")
|
|
homeDir, err := os.UserHomeDir()
|
|
if err != nil {
|
|
comp.Errorln(err)
|
|
os.Exit(2)
|
|
}
|
|
comp.Resolver.AddPathFront (
|
|
filepath.Join(homeDir, ".local/src/fspl"),
|
|
filepath.Join(homeDir, ".local/include/fspl"))
|
|
|
|
// take in CLI flags
|
|
debug := cli.NewFlag (
|
|
0, "debug",
|
|
"Print extra debug information while compiling")
|
|
quiet := cli.NewFlag (
|
|
'q', "quiet",
|
|
"Don't print warnings, errors, etc.")
|
|
format := cli.NewInputFlag (
|
|
'm', "format",
|
|
"Output format (.s, .o, .ll)", "",
|
|
cli.NewValSet(".s", ".o", ".ll"))
|
|
output := cli.NewInputFlag (
|
|
'o', "output",
|
|
"Output filename", "",
|
|
cli.ValString)
|
|
optimization := cli.NewInputFlag (
|
|
'O', "optimization",
|
|
"Optimization level (0-3)", "0",
|
|
cli.NewValSet("0", "1", "2", "3"))
|
|
|
|
application := cli.New (
|
|
"Compile FSPL source files",
|
|
cli.NewHelp(),
|
|
debug,
|
|
quiet,
|
|
format,
|
|
output,
|
|
optimization)
|
|
|
|
application.Syntax = "[OPTION]... ADDRESS"
|
|
application.ParseOrExit(os.Args)
|
|
if len(application.Args) != 1 {
|
|
comp.Errorln("please specify one unit address")
|
|
application.Usage()
|
|
os.Exit(2)
|
|
}
|
|
|
|
// configure the compiler based on user input
|
|
comp.Output = output.Value
|
|
comp.Optimization = optimization.Value
|
|
comp.Format = format.Value
|
|
comp.Debug = debug.Value != ""
|
|
if quiet.Value != "" { comp.Writer = io.Discard }
|
|
|
|
err = comp.CompileUnit(entity.Address(application.Args[0]))
|
|
if err != nil {
|
|
comp.Errorln(ferrors.Format(err))
|
|
os.Exit(1)
|
|
}
|
|
}
|