From b4f7ea4598fcd9f55493680ec6f9a1fd782c4d4a Mon Sep 17 00:00:00 2001 From: Riccardo Rizzo Date: Mon, 25 Mar 2019 15:14:10 +0100 Subject: [PATCH 1/3] Minor fix added return value to the compile function in command/compile --- commands/compile/compile.go | 63 ++++++++++++++++++++++++------------- daemon/daemon.go | 1 + 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/commands/compile/compile.go b/commands/compile/compile.go index c597332cd2f..0a4bc6309c3 100644 --- a/commands/compile/compile.go +++ b/commands/compile/compile.go @@ -3,7 +3,6 @@ package compile import ( "context" "fmt" - "os" "path/filepath" "sort" "strings" @@ -29,8 +28,9 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) } sketch, err := cli.InitSketch(sketchPath) if err != nil { - formatter.PrintError(err, "Error opening sketch.") - os.Exit(cli.ErrGeneric) + return &rpc.CompileResp{ + Result: rpc.Error("Error opening sketch", rpc.ErrGeneric), + }, nil } fqbnIn := req.GetFqbn() @@ -39,12 +39,16 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) } if fqbnIn == "" { formatter.PrintErrorMessage("No Fully Qualified Board Name provided.") - os.Exit(cli.ErrGeneric) + return &rpc.CompileResp{ + Result: rpc.Error("No Fully Qualified Board Name provided.", rpc.ErrGeneric), + }, nil } fqbn, err := cores.ParseFQBN(fqbnIn) if err != nil { formatter.PrintErrorMessage("Fully Qualified Board Name has incorrect format.") - os.Exit(cli.ErrBadArgument) + return &rpc.CompileResp{ + Result: rpc.Error("Fully Qualified Board Name has incorrect format.", rpc.ErrGeneric), + }, nil } pm, _ := cli.InitPackageAndLibraryManager() @@ -58,13 +62,16 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) core.InstallToolRelease(pm, ctags) if err := pm.LoadHardware(cli.Config); err != nil { - formatter.PrintError(err, "Could not load hardware packages.") - os.Exit(cli.ErrCoreConfig) + return &rpc.CompileResp{ + Result: rpc.Error("Could not load hardware packages.", rpc.ErrGeneric), + }, nil } ctags, _ = getBuiltinCtagsTool(pm) if !ctags.IsInstalled() { formatter.PrintErrorMessage("Missing ctags tool.") - os.Exit(cli.ErrCoreConfig) + return &rpc.CompileResp{ + Result: rpc.Error("Missing ctags tool.", rpc.ErrGeneric), + }, nil } } @@ -77,7 +84,9 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) "\"%[1]s:%[2]s\" platform is not installed, please install it by running \""+ cli.AppName+" core install %[1]s:%[2]s\".", fqbn.Package, fqbn.PlatformArch) formatter.PrintErrorMessage(errorMessage) - os.Exit(cli.ErrCoreConfig) + return &rpc.CompileResp{ + Result: rpc.Error(errorMessage, rpc.ErrGeneric), + }, nil } builderCtx := &types.Context{} @@ -89,15 +98,17 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) if packagesDir, err := cli.Config.HardwareDirectories(); err == nil { builderCtx.HardwareDirs = packagesDir } else { - formatter.PrintError(err, "Cannot get hardware directories.") - os.Exit(cli.ErrCoreConfig) + return &rpc.CompileResp{ + Result: rpc.Error("Cannot get hardware directories.", rpc.ErrGeneric), + }, nil } if toolsDir, err := cli.Config.BundleToolsDirectories(); err == nil { builderCtx.ToolsDirs = toolsDir } else { - formatter.PrintError(err, "Cannot get bundled tools directories.") - os.Exit(cli.ErrCoreConfig) + return &rpc.CompileResp{ + Result: rpc.Error("Cannot get bundled tools directories.", rpc.ErrGeneric), + }, nil } builderCtx.OtherLibrariesDirs = paths.NewPathList() @@ -107,8 +118,9 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) builderCtx.BuildPath = paths.New(req.GetBuildPath()) err = builderCtx.BuildPath.MkdirAll() if err != nil { - formatter.PrintError(err, "Cannot create the build directory.") - os.Exit(cli.ErrBadCall) + return &rpc.CompileResp{ + Result: rpc.Error("Cannot create the build directory.", rpc.ErrGeneric), + }, nil } } @@ -131,8 +143,9 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) builderCtx.BuildCachePath = paths.New(req.GetBuildCachePath()) err = builderCtx.BuildCachePath.MkdirAll() if err != nil { - formatter.PrintError(err, "Cannot create the build cache directory.") - os.Exit(cli.ErrBadCall) + return &rpc.CompileResp{ + Result: rpc.Error("Cannot create the build cache directory.", rpc.ErrGeneric), + }, nil } } @@ -166,8 +179,9 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) } if err != nil { - formatter.PrintError(err, "Compilation failed.") - os.Exit(cli.ErrGeneric) + return &rpc.CompileResp{ + Result: rpc.Error("Compilation failed.", rpc.ErrGeneric), + }, nil } // FIXME: Make a function to obtain these info... @@ -197,8 +211,9 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) dstHex := exportPath.Join(exportFile + ext) logrus.WithField("from", srcHex).WithField("to", dstHex).Print("copying sketch build output") if err = srcHex.CopyTo(dstHex); err != nil { - formatter.PrintError(err, "Error copying output file.") - os.Exit(cli.ErrGeneric) + return &rpc.CompileResp{ + Result: rpc.Error("Error copying output file.", rpc.ErrGeneric), + }, nil } // Copy .elf file to sketch directory @@ -207,6 +222,10 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) logrus.WithField("from", srcElf).WithField("to", dstElf).Print("copying sketch build output") if err = srcElf.CopyTo(dstElf); err != nil { formatter.PrintError(err, "Error copying elf file.") - os.Exit(cli.ErrGeneric) + return &rpc.CompileResp{ + Result: rpc.Error("Error copying elf file.", rpc.ErrGeneric), + }, nil } + + return &rpc.CompileResp{}, nil } diff --git a/daemon/daemon.go b/daemon/daemon.go index ed10d63e444..023a69bc295 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -12,6 +12,7 @@ import ( "github.com/arduino/arduino-cli/commands" "github.com/arduino/arduino-cli/commands/board" + "github.com/arduino/arduino-cli/commands/compile" "github.com/arduino/arduino-cli/rpc" "github.com/spf13/cobra" "google.golang.org/grpc" From 9dcf5312b4a6fcab4f7697911b10a706ce5744f4 Mon Sep 17 00:00:00 2001 From: Riccardo Rizzo Date: Mon, 25 Mar 2019 17:20:07 +0100 Subject: [PATCH 2/3] Implemented run function in cli/compile --- cli/compile/compile.go | 37 +++++++++++++++++++++++++++++++++++-- commands/compile/compile.go | 26 +++++++++++++------------- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/cli/compile/compile.go b/cli/compile/compile.go index fdd625a7069..76ad07c2ced 100644 --- a/cli/compile/compile.go +++ b/cli/compile/compile.go @@ -19,8 +19,11 @@ package compile import ( "context" + "os" "github.com/arduino/arduino-cli/commands/compile" + "github.com/arduino/arduino-cli/common/formatter" + "github.com/arduino/arduino-cli/rpc" "github.com/arduino/arduino-cli/cli" "github.com/spf13/cobra" @@ -87,6 +90,36 @@ var flags struct { } func run(cmd *cobra.Command, args []string) { - // TODO: fill request, parse response - compile.Compile(context.Background(), nil) + instance := cli.CreateInstance() + path := "" + + if len(args) > 0 { + path = args[0] + } + + compRes, err := compile.Compile(context.Background(), &rpc.CompileReq{ + Instance: instance, + Fqbn: flags.fqbn, + SketchPath: path, + ShowProperties: flags.showProperties, + Preprocess: flags.preprocess, + BuildCachePath: flags.buildCachePath, + BuildPath: flags.buildPath, + BuildProperties: flags.buildProperties, + Warnings: flags.warnings, + Verbose: flags.verbose, + Quiet: flags.quiet, + VidPid: flags.vidPid, + ExportFile: flags.exportFile, + }) + if err == nil { + outputCompileResp(compRes) + } else { + formatter.PrintError(err, compRes.GetResult().Message) + os.Exit(cli.ErrGeneric) + } +} + +func outputCompileResp(details *rpc.CompileResp) { + } diff --git a/commands/compile/compile.go b/commands/compile/compile.go index 0a4bc6309c3..b39f26e6bea 100644 --- a/commands/compile/compile.go +++ b/commands/compile/compile.go @@ -30,7 +30,7 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) if err != nil { return &rpc.CompileResp{ Result: rpc.Error("Error opening sketch", rpc.ErrGeneric), - }, nil + }, err } fqbnIn := req.GetFqbn() @@ -41,14 +41,14 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) formatter.PrintErrorMessage("No Fully Qualified Board Name provided.") return &rpc.CompileResp{ Result: rpc.Error("No Fully Qualified Board Name provided.", rpc.ErrGeneric), - }, nil + }, rpc.Error("No Fully Qualified Board Name provided.", rpc.ErrGeneric) } fqbn, err := cores.ParseFQBN(fqbnIn) if err != nil { formatter.PrintErrorMessage("Fully Qualified Board Name has incorrect format.") return &rpc.CompileResp{ Result: rpc.Error("Fully Qualified Board Name has incorrect format.", rpc.ErrGeneric), - }, nil + }, err } pm, _ := cli.InitPackageAndLibraryManager() @@ -64,14 +64,14 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) if err := pm.LoadHardware(cli.Config); err != nil { return &rpc.CompileResp{ Result: rpc.Error("Could not load hardware packages.", rpc.ErrGeneric), - }, nil + }, err } ctags, _ = getBuiltinCtagsTool(pm) if !ctags.IsInstalled() { formatter.PrintErrorMessage("Missing ctags tool.") return &rpc.CompileResp{ Result: rpc.Error("Missing ctags tool.", rpc.ErrGeneric), - }, nil + }, rpc.Error("Missing ctags tool.", rpc.ErrGeneric) } } @@ -86,7 +86,7 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) formatter.PrintErrorMessage(errorMessage) return &rpc.CompileResp{ Result: rpc.Error(errorMessage, rpc.ErrGeneric), - }, nil + }, rpc.Error(errorMessage, rpc.ErrGeneric) } builderCtx := &types.Context{} @@ -100,7 +100,7 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) } else { return &rpc.CompileResp{ Result: rpc.Error("Cannot get hardware directories.", rpc.ErrGeneric), - }, nil + }, err } if toolsDir, err := cli.Config.BundleToolsDirectories(); err == nil { @@ -108,7 +108,7 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) } else { return &rpc.CompileResp{ Result: rpc.Error("Cannot get bundled tools directories.", rpc.ErrGeneric), - }, nil + }, err } builderCtx.OtherLibrariesDirs = paths.NewPathList() @@ -120,7 +120,7 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) if err != nil { return &rpc.CompileResp{ Result: rpc.Error("Cannot create the build directory.", rpc.ErrGeneric), - }, nil + }, err } } @@ -145,7 +145,7 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) if err != nil { return &rpc.CompileResp{ Result: rpc.Error("Cannot create the build cache directory.", rpc.ErrGeneric), - }, nil + }, err } } @@ -181,7 +181,7 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) if err != nil { return &rpc.CompileResp{ Result: rpc.Error("Compilation failed.", rpc.ErrGeneric), - }, nil + }, err } // FIXME: Make a function to obtain these info... @@ -213,7 +213,7 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) if err = srcHex.CopyTo(dstHex); err != nil { return &rpc.CompileResp{ Result: rpc.Error("Error copying output file.", rpc.ErrGeneric), - }, nil + }, err } // Copy .elf file to sketch directory @@ -224,7 +224,7 @@ func Compile(ctx context.Context, req *rpc.CompileReq) (*rpc.CompileResp, error) formatter.PrintError(err, "Error copying elf file.") return &rpc.CompileResp{ Result: rpc.Error("Error copying elf file.", rpc.ErrGeneric), - }, nil + }, err } return &rpc.CompileResp{}, nil From 6555b1095bfb0861d18a51d0097a2d50be39de60 Mon Sep 17 00:00:00 2001 From: Riccardo Rizzo Date: Wed, 27 Mar 2019 14:47:46 +0100 Subject: [PATCH 3/3] Implemented Client "Compile" call on Daemon/Client --- daemon/client/client.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/daemon/client/client.go b/daemon/client/client.go index cb882852546..0d9e6386bd2 100644 --- a/daemon/client/client.go +++ b/daemon/client/client.go @@ -11,7 +11,7 @@ import ( ) func main() { - if len(os.Args) != 2 { + if len(os.Args) != 3 { fmt.Println("Please specify Arduino DATA_DIR as first argument") os.Exit(1) } @@ -50,6 +50,17 @@ func main() { fmt.Println("Board name: ", details.GetName()) } + compResp, err := client.Compile(context.Background(), &rpc.CompileReq{ + Instance: instance, + Fqbn: "arduino:samd:mkr1000", + SketchPath: os.Args[2], + }) + + if err != nil { + fmt.Println(compResp.GetResult().Message, err) + os.Exit(1) + } + destroyResp, err := client.Destroy(context.Background(), &rpc.DestroyReq{ Instance: instance, })