mirror of
				https://github.com/yeslayla/godot-build-tools.git
				synced 2025-11-04 09:03:05 +01:00 
			
		
		
		
	Build config, flags, etc
This commit is contained in:
		
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							@ -3,6 +3,7 @@ module github.com/yeslayla/godot-build-tools
 | 
				
			|||||||
go 1.20
 | 
					go 1.20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
 | 
						github.com/BurntSushi/toml v1.3.2
 | 
				
			||||||
	github.com/sethvargo/go-envconfig v0.9.0 // indirect
 | 
						github.com/sethvargo/go-envconfig v0.9.0 // indirect
 | 
				
			||||||
	github.com/sethvargo/go-githubactions v1.1.0 // indirect
 | 
						github.com/sethvargo/go-githubactions v1.1.0 // indirect
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
 | 
				
			||||||
 | 
					github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 | 
				
			||||||
github.com/sethvargo/go-envconfig v0.9.0 h1:Q6FQ6hVEeTECULvkJZakq3dZMeBQ3JUpcKMfPQbKMDE=
 | 
					github.com/sethvargo/go-envconfig v0.9.0 h1:Q6FQ6hVEeTECULvkJZakq3dZMeBQ3JUpcKMfPQbKMDE=
 | 
				
			||||||
github.com/sethvargo/go-envconfig v0.9.0/go.mod h1:Iz1Gy1Sf3T64TQlJSvee81qDhf7YIlt8GMUX6yyNFs0=
 | 
					github.com/sethvargo/go-envconfig v0.9.0/go.mod h1:Iz1Gy1Sf3T64TQlJSvee81qDhf7YIlt8GMUX6yyNFs0=
 | 
				
			||||||
github.com/sethvargo/go-githubactions v1.1.0 h1:mg03w+b+/s5SMS298/2G6tHv8P0w0VhUFaqL1THIqzY=
 | 
					github.com/sethvargo/go-githubactions v1.1.0 h1:mg03w+b+/s5SMS298/2G6tHv8P0w0VhUFaqL1THIqzY=
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										54
									
								
								internal/build_config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								internal/build_config.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					package internal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/BurntSushi/toml"
 | 
				
			||||||
 | 
						"github.com/yeslayla/godot-build-tools/logging"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const defaultGodotVersion = "4.1.3"
 | 
				
			||||||
 | 
					const defaultGodotRelease = "stable"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BuildConfig struct {
 | 
				
			||||||
 | 
						Godot BuildConfigGodot `toml:"godot"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BuildConfigGodot struct {
 | 
				
			||||||
 | 
						Version string `toml:"version"`
 | 
				
			||||||
 | 
						Release string `toml:"release"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func LoadBuildConfig(logger logging.Logger) BuildConfig {
 | 
				
			||||||
 | 
						config := BuildConfig{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						content, err := ioutil.ReadFile(".godot-build.toml")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							if os.IsNotExist(err) {
 | 
				
			||||||
 | 
								logger.Errorf("Build config not found, please run `gbt init`")
 | 
				
			||||||
 | 
								os.Exit(1)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								logger.Errorf("Failed to read build config: %s", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return config
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err = toml.Decode(string(content), &config)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							logger.Errorf("Failed to parse build config: %s", err)
 | 
				
			||||||
 | 
							return config
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.Godot.Release == "" {
 | 
				
			||||||
 | 
							logger.Warnf("Godot release not specified, defaulting to %s", defaultGodotRelease)
 | 
				
			||||||
 | 
							config.Godot.Release = defaultGodotRelease
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.Godot.Version == "" {
 | 
				
			||||||
 | 
							logger.Warnf("Godot version not specified, defaulting to %s", defaultGodotVersion)
 | 
				
			||||||
 | 
							config.Godot.Version = defaultGodotVersion
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return config
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -26,6 +26,20 @@ type Downloader struct {
 | 
				
			|||||||
	logger logging.Logger
 | 
						logger logging.Logger
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DefaultBinDir returns the default bin directory to install Godot to for the given target OS.
 | 
				
			||||||
 | 
					func DefaultBinDir(targetOS TargetOS) string {
 | 
				
			||||||
 | 
						switch targetOS {
 | 
				
			||||||
 | 
						case TargetOSLinux:
 | 
				
			||||||
 | 
							home, _ := os.UserHomeDir()
 | 
				
			||||||
 | 
							return filepath.Join(home, "/.local/bin")
 | 
				
			||||||
 | 
						case TargetOSWindows:
 | 
				
			||||||
 | 
							return "C:\\Program Files (x86)\\Godot"
 | 
				
			||||||
 | 
						case TargetOSMacOS:
 | 
				
			||||||
 | 
							return "/Applications/Godot"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewDownloader(targetOS TargetOS, logger logging.Logger, options *DownloaderOptions) *Downloader {
 | 
					func NewDownloader(targetOS TargetOS, logger logging.Logger, options *DownloaderOptions) *Downloader {
 | 
				
			||||||
	var url string = options.DownloadRepositoryURL
 | 
						var url string = options.DownloadRepositoryURL
 | 
				
			||||||
	if url == "" {
 | 
						if url == "" {
 | 
				
			||||||
@ -33,15 +47,7 @@ func NewDownloader(targetOS TargetOS, logger logging.Logger, options *Downloader
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	var binDir string = options.BinDir
 | 
						var binDir string = options.BinDir
 | 
				
			||||||
	if binDir == "" {
 | 
						if binDir == "" {
 | 
				
			||||||
		switch targetOS {
 | 
							DefaultBinDir(targetOS)
 | 
				
			||||||
		case TargetOSLinux:
 | 
					 | 
				
			||||||
			home, _ := os.UserHomeDir()
 | 
					 | 
				
			||||||
			binDir = filepath.Join(home, "/.local/bin")
 | 
					 | 
				
			||||||
		case TargetOSWindows:
 | 
					 | 
				
			||||||
			binDir = "C:\\Program Files (x86)\\Godot"
 | 
					 | 
				
			||||||
		case TargetOSMacOS:
 | 
					 | 
				
			||||||
			binDir = "/Applications/Godot"
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &Downloader{
 | 
						return &Downloader{
 | 
				
			||||||
@ -51,26 +57,29 @@ func NewDownloader(targetOS TargetOS, logger logging.Logger, options *Downloader
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getRemoteFileFormat(targetOS TargetOS, version string) string {
 | 
					// getRemoteFileName returns the name of the Godot package file for the given target OS, version and release.
 | 
				
			||||||
 | 
					func getRemoteFileName(targetOS TargetOS, version string, release string) string {
 | 
				
			||||||
	switch targetOS {
 | 
						switch targetOS {
 | 
				
			||||||
	case TargetOSLinux:
 | 
						case TargetOSLinux:
 | 
				
			||||||
		if version[0] == '3' {
 | 
							if version[0] == '3' {
 | 
				
			||||||
			return "Godot_v%s-%s_x11.64.zip"
 | 
								return fmt.Sprintf("Godot_v%s-%s_x11.64.zip", version, release)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return "Godot_v%s-%s_linux.x86_64.zip"
 | 
							return fmt.Sprintf("Godot_v%s-%s_linux.x86_64.zip", version, release)
 | 
				
			||||||
	case TargetOSWindows:
 | 
						case TargetOSWindows:
 | 
				
			||||||
		return "Godot_v%s-%s_win64.exe.zip"
 | 
							return fmt.Sprintf("Godot_v%s-%s_win64.exe.zip", version, release)
 | 
				
			||||||
	case TargetOSMacOS:
 | 
						case TargetOSMacOS:
 | 
				
			||||||
		return "Godot_v%s-%s_macos.universal.zip"
 | 
							return fmt.Sprintf("Godot_v%s-%s_macos.universal.zip", version, release)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DownloadGodot downloads the Godot package for the given target OS, version, and release.
 | 
				
			||||||
func (d *Downloader) DownloadGodot(targetOS TargetOS, version string, release string) (string, error) {
 | 
					func (d *Downloader) DownloadGodot(targetOS TargetOS, version string, release string) (string, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var fileName string = fmt.Sprintf(getRemoteFileFormat(targetOS, version), version, release)
 | 
						var fileName string = getRemoteFileName(targetOS, version, release)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Create output file
 | 
				
			||||||
	tempDir, _ := os.MkdirTemp("", "godot-build-tools")
 | 
						tempDir, _ := os.MkdirTemp("", "godot-build-tools")
 | 
				
			||||||
	outFile := filepath.Join(tempDir, fileName)
 | 
						outFile := filepath.Join(tempDir, fileName)
 | 
				
			||||||
	out, err := os.Create(outFile)
 | 
						out, err := os.Create(outFile)
 | 
				
			||||||
@ -79,6 +88,7 @@ func (d *Downloader) DownloadGodot(targetOS TargetOS, version string, release st
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer out.Close()
 | 
						defer out.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Calculate download URL
 | 
				
			||||||
	downloadURL, err := url.Parse(d.downloadRepositoryURL)
 | 
						downloadURL, err := url.Parse(d.downloadRepositoryURL)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", fmt.Errorf("failed to parse download repository URL: %s", err)
 | 
							return "", fmt.Errorf("failed to parse download repository URL: %s", err)
 | 
				
			||||||
@ -92,12 +102,14 @@ func (d *Downloader) DownloadGodot(targetOS TargetOS, version string, release st
 | 
				
			|||||||
	downloadURL.Path = path.Join(downloadURL.Path, fileName)
 | 
						downloadURL.Path = path.Join(downloadURL.Path, fileName)
 | 
				
			||||||
	d.logger.Debugf("Download URL: %s", downloadURL.String())
 | 
						d.logger.Debugf("Download URL: %s", downloadURL.String())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Download Godot package
 | 
				
			||||||
	resp, err := http.Get(downloadURL.String())
 | 
						resp, err := http.Get(downloadURL.String())
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", fmt.Errorf("failed to download Godot: %s", err)
 | 
							return "", fmt.Errorf("failed to download Godot: %s", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defer resp.Body.Close()
 | 
						defer resp.Body.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Write Godot package to output file
 | 
				
			||||||
	_, err = io.Copy(out, resp.Body)
 | 
						_, err = io.Copy(out, resp.Body)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", fmt.Errorf("failed to write Godot package to output file: %s", err)
 | 
							return "", fmt.Errorf("failed to write Godot package to output file: %s", err)
 | 
				
			||||||
@ -106,6 +118,26 @@ func (d *Downloader) DownloadGodot(targetOS TargetOS, version string, release st
 | 
				
			|||||||
	return outFile, nil
 | 
						return outFile, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// isTargetOSBin returns true if the given file name is a binary for the given target OS.
 | 
				
			||||||
 | 
					func isTargetOSBin(targetOS TargetOS, fileName string) bool {
 | 
				
			||||||
 | 
						switch targetOS {
 | 
				
			||||||
 | 
						case TargetOSLinux:
 | 
				
			||||||
 | 
							if path.Ext(fileName) == ".x86_64" || path.Ext(fileName) == ".64" {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case TargetOSWindows:
 | 
				
			||||||
 | 
							if path.Ext(fileName) == ".exe" {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case TargetOSMacOS:
 | 
				
			||||||
 | 
							if path.Ext(fileName) == ".universal" {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *Downloader) UnzipGodot(targetOS TargetOS, godotPackage string) (string, error) {
 | 
					func (d *Downloader) UnzipGodot(targetOS TargetOS, godotPackage string) (string, error) {
 | 
				
			||||||
	files, err := utils.Unzip(godotPackage)
 | 
						files, err := utils.Unzip(godotPackage)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@ -114,20 +146,9 @@ func (d *Downloader) UnzipGodot(targetOS TargetOS, godotPackage string) (string,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Look for godot binary
 | 
						// Look for godot binary
 | 
				
			||||||
	for _, file := range files {
 | 
						for _, file := range files {
 | 
				
			||||||
		switch targetOS {
 | 
							if isTargetOSBin(targetOS, file) {
 | 
				
			||||||
		case TargetOSLinux:
 | 
					 | 
				
			||||||
			if path.Ext(file) == ".x86_64" || path.Ext(file) == ".64" {
 | 
					 | 
				
			||||||
			return file, nil
 | 
								return file, nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		case TargetOSWindows:
 | 
					 | 
				
			||||||
			if path.Ext(file) == ".exe" {
 | 
					 | 
				
			||||||
				return file, nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		case TargetOSMacOS:
 | 
					 | 
				
			||||||
			if path.Ext(file) == ".universal" {
 | 
					 | 
				
			||||||
				return file, nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return "", fmt.Errorf("failed to find godot binary in Godot package")
 | 
						return "", fmt.Errorf("failed to find godot binary in Godot package")
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										44
									
								
								internal/flags.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								internal/flags.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					package internal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"flag"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/yeslayla/godot-build-tools/logging"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BuildFlags struct {
 | 
				
			||||||
 | 
						stepsRaw string
 | 
				
			||||||
 | 
						DebugLog bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Steps returns the steps to run as a slice of strings
 | 
				
			||||||
 | 
					func (f *BuildFlags) Steps() []string {
 | 
				
			||||||
 | 
						return strings.Split(f.stepsRaw, ",")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasStep returns true if the given step is in the list of steps to run
 | 
				
			||||||
 | 
					func (f *BuildFlags) HasStep(step string) bool {
 | 
				
			||||||
 | 
						steps := f.Steps()
 | 
				
			||||||
 | 
						for _, s := range steps {
 | 
				
			||||||
 | 
							if s == step {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Parse parses the flags
 | 
				
			||||||
 | 
					func (f *BuildFlags) Parse() {
 | 
				
			||||||
 | 
						flag.Parse()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewBuildFlags creates a new BuildFlags instance
 | 
				
			||||||
 | 
					func NewBuildFlags(logger logging.Logger) *BuildFlags {
 | 
				
			||||||
 | 
						flags := &BuildFlags{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						flag.StringVar(&flags.stepsRaw, "steps", "godot-setup", "Comma-separated list of build steps to run")
 | 
				
			||||||
 | 
						flag.BoolVar(&flags.DebugLog, "verbose", false, "Enable debug logging")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return flags
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -2,45 +2,45 @@ package internal
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import "strings"
 | 
					import "strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Godot4ArgBuilder struct {
 | 
					type DefaultGodotArgBuilder struct {
 | 
				
			||||||
	args []string
 | 
						args []string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewGodot4ArgBuilder(projectDir string) GodotArgBuilder {
 | 
					func NewGodotArgBuilder(projectDir string) GodotArgBuilder {
 | 
				
			||||||
	return &Godot4ArgBuilder{
 | 
						return &DefaultGodotArgBuilder{
 | 
				
			||||||
		args: []string{"--path", projectDir},
 | 
							args: []string{"--path", projectDir},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Godot4ArgBuilder) AddHeadlessFlag() {
 | 
					func (b *DefaultGodotArgBuilder) AddHeadlessFlag() {
 | 
				
			||||||
	b.args = append(b.args, "--headless")
 | 
						b.args = append(b.args, "--headless")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Godot4ArgBuilder) AddDebugFlag() {
 | 
					func (b *DefaultGodotArgBuilder) AddDebugFlag() {
 | 
				
			||||||
	b.args = append(b.args, "--debug")
 | 
						b.args = append(b.args, "--debug")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Godot4ArgBuilder) AddVerboseFlag() {
 | 
					func (b *DefaultGodotArgBuilder) AddVerboseFlag() {
 | 
				
			||||||
	b.args = append(b.args, "--verbose")
 | 
						b.args = append(b.args, "--verbose")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Godot4ArgBuilder) AddQuietFlag() {
 | 
					func (b *DefaultGodotArgBuilder) AddQuietFlag() {
 | 
				
			||||||
	b.args = append(b.args, "--quiet")
 | 
						b.args = append(b.args, "--quiet")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Godot4ArgBuilder) AddDumpGDExtensionInterfaceFlag() {
 | 
					func (b *DefaultGodotArgBuilder) AddDumpGDExtensionInterfaceFlag() {
 | 
				
			||||||
	b.args = append(b.args, "--dump-gdextension-interface")
 | 
						b.args = append(b.args, "--dump-gdextension-interface")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Godot4ArgBuilder) AddDumpExtensionApiFlag() {
 | 
					func (b *DefaultGodotArgBuilder) AddDumpExtensionApiFlag() {
 | 
				
			||||||
	b.args = append(b.args, "--dump-extension-api")
 | 
						b.args = append(b.args, "--dump-extension-api")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Godot4ArgBuilder) AddCheckOnlyFlag() {
 | 
					func (b *DefaultGodotArgBuilder) AddCheckOnlyFlag() {
 | 
				
			||||||
	b.args = append(b.args, "--check-only")
 | 
						b.args = append(b.args, "--check-only")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Godot4ArgBuilder) AddExportFlag(exportType ExportType) {
 | 
					func (b *DefaultGodotArgBuilder) AddExportFlag(exportType ExportType) {
 | 
				
			||||||
	switch exportType {
 | 
						switch exportType {
 | 
				
			||||||
	case ExportTypeRelease:
 | 
						case ExportTypeRelease:
 | 
				
			||||||
		b.args = append(b.args, "--export")
 | 
							b.args = append(b.args, "--export")
 | 
				
			||||||
@ -51,6 +51,6 @@ func (b *Godot4ArgBuilder) AddExportFlag(exportType ExportType) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (b *Godot4ArgBuilder) GenerateArgs() string {
 | 
					func (b *DefaultGodotArgBuilder) GenerateArgs() string {
 | 
				
			||||||
	return strings.Join(b.args, " ")
 | 
						return strings.Join(b.args, " ")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,5 +1,7 @@
 | 
				
			|||||||
package internal
 | 
					package internal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "runtime"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type TargetOS uint8
 | 
					type TargetOS uint8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@ -7,3 +9,31 @@ const (
 | 
				
			|||||||
	TargetOSWindows
 | 
						TargetOSWindows
 | 
				
			||||||
	TargetOSMacOS
 | 
						TargetOSMacOS
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (t TargetOS) String() string {
 | 
				
			||||||
 | 
						switch t {
 | 
				
			||||||
 | 
						case TargetOSLinux:
 | 
				
			||||||
 | 
							return "linux"
 | 
				
			||||||
 | 
						case TargetOSWindows:
 | 
				
			||||||
 | 
							return "windows"
 | 
				
			||||||
 | 
						case TargetOSMacOS:
 | 
				
			||||||
 | 
							return "macos"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewTargetOSFromRuntime(GOOSRuntime string) TargetOS {
 | 
				
			||||||
 | 
						switch GOOSRuntime {
 | 
				
			||||||
 | 
						case "linux":
 | 
				
			||||||
 | 
							return TargetOSLinux
 | 
				
			||||||
 | 
						case "windows":
 | 
				
			||||||
 | 
							return TargetOSWindows
 | 
				
			||||||
 | 
						case "darwin":
 | 
				
			||||||
 | 
							return TargetOSMacOS
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return TargetOSLinux
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func CurrentTargetOS() TargetOS {
 | 
				
			||||||
 | 
						return NewTargetOSFromRuntime(runtime.GOOS)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										50
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								main.go
									
									
									
									
									
								
							@ -1,51 +1,31 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"runtime"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/yeslayla/godot-build-tools/internal"
 | 
						"github.com/yeslayla/godot-build-tools/internal"
 | 
				
			||||||
	"github.com/yeslayla/godot-build-tools/logging"
 | 
						"github.com/yeslayla/godot-build-tools/logging"
 | 
				
			||||||
 | 
						"github.com/yeslayla/godot-build-tools/steps"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	logger := logging.NewLogger(&logging.LoggerOptions{})
 | 
						logger := logging.NewLogger(&logging.LoggerOptions{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var targetOS internal.TargetOS
 | 
						flags := internal.NewBuildFlags(logger)
 | 
				
			||||||
	switch runtime.GOOS {
 | 
						flags.Parse()
 | 
				
			||||||
	case "linux":
 | 
					
 | 
				
			||||||
		targetOS = internal.TargetOSLinux
 | 
						if flags.DebugLog {
 | 
				
			||||||
	case "windows":
 | 
							logger = logging.NewLogger(&logging.LoggerOptions{
 | 
				
			||||||
		targetOS = internal.TargetOSWindows
 | 
								Debug: true,
 | 
				
			||||||
	case "darwin":
 | 
							})
 | 
				
			||||||
		targetOS = internal.TargetOSMacOS
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GodotSetup(logger, targetOS, "3.3.2", "stable")
 | 
						buildConfig := internal.LoadBuildConfig(logger)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var targetOS internal.TargetOS = internal.CurrentTargetOS()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if flags.HasStep("godot-setup") {
 | 
				
			||||||
 | 
							steps.GodotSetup(logger, targetOS, buildConfig.Godot.Version, buildConfig.Godot.Release)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							logger.Debugf("Skipping godot-setup step")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GodotSetup(logger logging.Logger, targetOS internal.TargetOS, version string, release string) (string, bool) {
 | 
					 | 
				
			||||||
	logger.StartGroup("Godot Setup")
 | 
					 | 
				
			||||||
	defer logger.EndGroup()
 | 
					 | 
				
			||||||
	downloader := internal.NewDownloader(internal.TargetOSLinux, logger, &internal.DownloaderOptions{})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	logger.Infof("Downloading Godot")
 | 
					 | 
				
			||||||
	godotPackage, err := downloader.DownloadGodot(internal.TargetOSLinux, version, release)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		logger.Errorf("Failed to download Godot: %s", err)
 | 
					 | 
				
			||||||
		return "", false
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer os.Remove(godotPackage)
 | 
					 | 
				
			||||||
	logger.Infof("Godot package: %s", godotPackage)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	logger.Infof("Installing Godot")
 | 
					 | 
				
			||||||
	godotBin, err := downloader.InstallGodot(godotPackage, internal.TargetOSLinux, version, release)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		logger.Errorf("Failed to install Godot: %s", err)
 | 
					 | 
				
			||||||
		return "", false
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	logger.Infof("Godot binary: %s", godotBin)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return godotBin, true
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										33
									
								
								steps/godot_setup.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								steps/godot_setup.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					package steps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/yeslayla/godot-build-tools/internal"
 | 
				
			||||||
 | 
						"github.com/yeslayla/godot-build-tools/logging"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GodotSetup(logger logging.Logger, targetOS internal.TargetOS, version string, release string) (string, bool) {
 | 
				
			||||||
 | 
						logger.StartGroup("Godot Setup")
 | 
				
			||||||
 | 
						defer logger.EndGroup()
 | 
				
			||||||
 | 
						downloader := internal.NewDownloader(internal.TargetOSLinux, logger, &internal.DownloaderOptions{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						logger.Infof("Downloading Godot")
 | 
				
			||||||
 | 
						godotPackage, err := downloader.DownloadGodot(internal.TargetOSLinux, version, release)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							logger.Errorf("Failed to download Godot: %s", err)
 | 
				
			||||||
 | 
							return "", false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer os.Remove(godotPackage)
 | 
				
			||||||
 | 
						logger.Infof("Godot package: %s", godotPackage)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						logger.Infof("Installing Godot")
 | 
				
			||||||
 | 
						godotBin, err := downloader.InstallGodot(godotPackage, internal.TargetOSLinux, version, release)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							logger.Errorf("Failed to install Godot: %s", err)
 | 
				
			||||||
 | 
							return "", false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						logger.Infof("Godot binary: %s", godotBin)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return godotBin, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user