From 1ed180887d5d40232ddda3666904362a5d4fd740 Mon Sep 17 00:00:00 2001 From: Aofei Sheng Date: Wed, 10 Jul 2024 15:33:53 +0800 Subject: [PATCH] cmd: add "llgo version" command --- cmd/internal/version/version.go | 39 +++++++++++++++++++++++++++++++++ cmd/llgo/llgo.go | 2 ++ xtool/env/build.go | 38 ++++++++++++++++++++++++++++++++ xtool/env/version.go | 35 +++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 cmd/internal/version/version.go create mode 100644 xtool/env/build.go create mode 100644 xtool/env/version.go diff --git a/cmd/internal/version/version.go b/cmd/internal/version/version.go new file mode 100644 index 00000000..f6fc6eb4 --- /dev/null +++ b/cmd/internal/version/version.go @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +// Package version implements the "llgo version" command. +package version + +import ( + "fmt" + "runtime" + + "github.com/goplus/llgo/cmd/internal/base" + "github.com/goplus/llgo/xtool/env" +) + +// llgo version +var Cmd = &base.Command{ + UsageLine: "llgo version", + Short: "Print LLGo version", +} + +func init() { + Cmd.Run = runCmd +} + +func runCmd(cmd *base.Command, args []string) { + fmt.Printf("llgo %s %s/%s\n", env.Version(), runtime.GOOS, runtime.GOARCH) +} diff --git a/cmd/llgo/llgo.go b/cmd/llgo/llgo.go index 69c4444d..0d4fa707 100644 --- a/cmd/llgo/llgo.go +++ b/cmd/llgo/llgo.go @@ -30,6 +30,7 @@ import ( "github.com/goplus/llgo/cmd/internal/help" "github.com/goplus/llgo/cmd/internal/install" "github.com/goplus/llgo/cmd/internal/run" + "github.com/goplus/llgo/cmd/internal/version" ) func mainUsage() { @@ -45,6 +46,7 @@ func init() { run.Cmd, run.CmpTestCmd, clean.Cmd, + version.Cmd, } } diff --git a/xtool/env/build.go b/xtool/env/build.go new file mode 100644 index 00000000..9cb25d2c --- /dev/null +++ b/xtool/env/build.go @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package env + +import "runtime/debug" + +// buildTime is the LLGo binary's build time. It should be set by the linker. +var buildTime string + +// BuildTime returns the build time of the running LLGo binary. +func BuildTime() string { + if buildTime != "" { + return buildTime + } + info, ok := debug.ReadBuildInfo() + if ok { + for _, setting := range info.Settings { + if setting.Key == "vcs.time" { + return setting.Value + } + } + } + return "" +} diff --git a/xtool/env/version.go b/xtool/env/version.go new file mode 100644 index 00000000..975d4fef --- /dev/null +++ b/xtool/env/version.go @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package env + +import "runtime/debug" + +// buildVersion is the LLGo tree's version string at build time. It should be +// set by the linker. +var buildVersion string + +// Version returns the version of the running LLGo binary. +func Version() string { + if buildVersion != "" { + return buildVersion + } + info, ok := debug.ReadBuildInfo() + if ok { + return info.Main.Version + } + return "(devel)" +}