From 7ecaead1400296b01384e59e447e61edbc69c914 Mon Sep 17 00:00:00 2001 From: Alde Rojas Date: Fri, 14 Jun 2024 18:26:05 -0500 Subject: [PATCH 1/5] Add Write() to Config type --- pkg/ini/config.go | 46 +++++++++++++++++++++++++++++++++- pkg/ini/write_test.go | 57 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 pkg/ini/write_test.go diff --git a/pkg/ini/config.go b/pkg/ini/config.go index b4703ca..b8e07f2 100644 --- a/pkg/ini/config.go +++ b/pkg/ini/config.go @@ -1,11 +1,27 @@ package ini -import "strings" +import ( + "fmt" + "io" + "strings" +) type Config struct { Sections []*Section } +func (c *Config) Write(w io.Writer) error { + var err error + for _, s := range c.Sections { + err = s.Write(w) + if err != nil { + return err + } + } + + return nil +} + func (c *Config) Values(section string, key string) ([]string, bool) { sec, found := c.Section(section) if !found { @@ -35,6 +51,23 @@ type Section struct { Items []*Item } +func (s *Section) Write(w io.Writer) error { + _, err := fmt.Fprintf(w, "[%s]\n", s.Name) + if err != nil { + return err + } + + for _, item := range s.Items { + err = item.Write(w) + if err != nil { + return err + } + } + + fmt.Fprint(w, "\n") + return nil +} + func (s *Section) Values(key string) ([]string, bool) { for _, i := range s.Items { if strings.EqualFold(i.Key, key) { @@ -49,3 +82,14 @@ type Item struct { Key string Values []string } + +func (i *Item) Write(w io.Writer) error { + var err error + for _, val := range i.Values { + _, err = fmt.Fprintf(w, "%s=%s\n", i.Key, val) + if err != nil { + return err + } + } + return nil +} diff --git a/pkg/ini/write_test.go b/pkg/ini/write_test.go new file mode 100644 index 0000000..b9f3daa --- /dev/null +++ b/pkg/ini/write_test.go @@ -0,0 +1,57 @@ +package ini + +import ( + "strings" + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestWrite(t *testing.T) { + cfg := &Config{ + Sections: []*Section{ + { + Name: "Engine.Engine", + Items: []*Item{ + {"RenderDevice", []string{"D3DDrv.D3DRenderDevice"}}, + }, + }, + { + Name: "Core.System", + Items: []*Item{ + { + Key: "Paths", + Values: []string{ + "../System/*.u", + "../Maps/*.ut2", + "../Textures/*.utx", + "../Sounds/*.uax", + }, + }, + }, + }, + }, + } + + var buf strings.Builder + + err := cfg.Write(&buf) + if err != nil { + t.Error(err) + } + + if diff := cmp.Diff(expectedWriteResult, buf.String()); diff != "" { + t.Errorf("TestWrite() Mismatch (-want, +got):\n%s", diff) + } +} + +var expectedWriteResult = `[Engine.Engine] +RenderDevice=D3DDrv.D3DRenderDevice + +[Core.System] +Paths=../System/*.u +Paths=../Maps/*.ut2 +Paths=../Textures/*.utx +Paths=../Sounds/*.uax + +` From b3e54190a68b882d89e4b4373baca14bd004660f Mon Sep 17 00:00:00 2001 From: Alde Rojas Date: Fri, 14 Jun 2024 19:59:53 -0500 Subject: [PATCH 2/5] Implement build command --- .github/workflows/go-package.yml | 2 +- README.md | 47 +++ cmd/build/cmd.go | 93 ++++++ cmd/root.go | 2 + pkg/build/build.go | 301 ++++++++++++++++++ pkg/build/build_test.go | 25 ++ pkg/build/testdata/UT2004/Build/build.ini | 57 ++++ .../testdata/UT2004/ExamplePackage/.keep | 0 pkg/build/testdata/UT2004/System/.gitignore | 4 + pkg/build/testdata/UT2004/System/Example.ini | 53 +++ pkg/build/testdata/UT2004/System/main.go | 130 ++++++++ 11 files changed, 713 insertions(+), 1 deletion(-) create mode 100644 cmd/build/cmd.go create mode 100644 pkg/build/build.go create mode 100644 pkg/build/build_test.go create mode 100644 pkg/build/testdata/UT2004/Build/build.ini create mode 100644 pkg/build/testdata/UT2004/ExamplePackage/.keep create mode 100644 pkg/build/testdata/UT2004/System/.gitignore create mode 100644 pkg/build/testdata/UT2004/System/Example.ini create mode 100644 pkg/build/testdata/UT2004/System/main.go diff --git a/.github/workflows/go-package.yml b/.github/workflows/go-package.yml index 8bb97ae..efeb2e6 100644 --- a/.github/workflows/go-package.yml +++ b/.github/workflows/go-package.yml @@ -16,7 +16,7 @@ jobs: go-version: '1.20' - name: Test - run: go test -v ./... + run: go generate ./... && go test -v ./... - name: Build for Linux run: CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o ut2u-linux-amd64 . diff --git a/README.md b/README.md index 0cbd118..9fc7f9a 100644 --- a/README.md +++ b/README.md @@ -205,3 +205,50 @@ Configure your AWS credentials similarily to the `upload` command. ``` ut2u redirect sync -b my.bucket -p ut2-redirect/ System/UT2004.ini ``` + + +## Build + +The build command simplifies the build process by isolating the package +definitions into its own ini. + +``` +$ ut2u build -h +Build a UT2004 Mutator/Mod + +Usage: + ut2u build [pkg-path...] + +Flags: + -d, --dep strings Dependency + -h, --help help for build +``` + +If no package path is defined, then it assumes the package is the current +working directory. + +``` +$ ut2u build +``` + +If your package requires another package, then you may pass in `-d pkg` to +include that package in the build. This does not build the dependencies, it +only includes them so they must have a compiled `*.u` file in the `System` +directory. + +``` +$ ut2u build -d UTComp +``` + +To build multiple packages when developing them in parallel, then pass each one +as separate arguments. + +``` +$ ut2u build ../WSUTComp . + +# If at the root directory: +$ ut2u build WSUTComp WS3SPN +``` + +Note that dependencies must be listed in order. For example, `WS3SPN` dependes +on `WSUTComp`, therefore `WSUTComp` must come first. diff --git a/cmd/build/cmd.go b/cmd/build/cmd.go new file mode 100644 index 0000000..a2d2b1d --- /dev/null +++ b/cmd/build/cmd.go @@ -0,0 +1,93 @@ +package build + +import ( + "context" + "fmt" + "os" + "os/signal" + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/aldehir/ut2u/pkg/build" +) + +var deps []string + +var buildCommand = &cobra.Command{ + Use: "build [pkg-path...]", + Short: "Build a UT2004 Mutator/Mod", + RunE: doBuild, + DisableFlagsInUseLine: true, +} + +func EnrichCommand(cmd *cobra.Command) { + cmd.AddCommand(buildCommand) +} + +func init() { + buildCommand.Flags().StringSliceVarP(&deps, "dep", "d", []string{}, "Dependency") +} + +func doBuild(cmd *cobra.Command, args []string) error { + var err error + var packages []string + + cwd, err := os.Getwd() + if err != nil { + return err + } + + if len(args) == 0 { + // If no arguments, assume cwd is the package path + path, err := filepath.Abs(cwd) + if err != nil { + return fmt.Errorf("error resolving path %s: %w", cwd, err) + } + + packages = append(packages, path) + } else { + for _, arg := range args { + path, err := filepath.Abs(arg) + if err != nil { + return fmt.Errorf("error resolving path %s: %w", arg, err) + } + packages = append(packages, path) + } + } + + if len(packages) == 0 { + return fmt.Errorf("no packages defined") + } + + // Assume the root path is the parent of the package path + root := filepath.Dir(packages[0]) + fmt.Printf("Root: %s\n", root) + + builder, err := build.NewBuilder(root) + if err != nil { + return err + } + + // Add any explicit dependencies + for _, dep := range deps { + err := builder.AddDependency(dep) + if err != nil { + return err + } + } + + // Add package to build + for _, pkg := range packages { + name := filepath.Base(pkg) + err := builder.AddPackage(name) + if err != nil { + return err + } + } + + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) + defer stop() + + return builder.Build(ctx) +} diff --git a/cmd/root.go b/cmd/root.go index 3ebbf0e..a7e4b36 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "github.com/spf13/cobra" + "github.com/aldehir/ut2u/cmd/build" "github.com/aldehir/ut2u/cmd/query" "github.com/aldehir/ut2u/cmd/redirect" "github.com/aldehir/ut2u/cmd/upackage" @@ -20,6 +21,7 @@ func init() { redirect.EnrichCommand(rootCmd) upackage.EnrichCommand(rootCmd) query.EnrichCommand(rootCmd) + build.EnrichCommand(rootCmd) } func Execute() error { diff --git a/pkg/build/build.go b/pkg/build/build.go new file mode 100644 index 0000000..d475e0a --- /dev/null +++ b/pkg/build/build.go @@ -0,0 +1,301 @@ +package build + +import ( + "context" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + + "github.com/aldehir/ut2u/pkg/ini" +) + +type Builder struct { + // UT2004 root path + RootPath string + + // UT2004 system path + SystemDir string + + // Path to UT2004 UCC executable + UCCPath string + + // Packages to build + Packages []Package + + // Dependencies to include in EditPackages + Dependencies []string +} + +type Package struct { + Name string + Path string +} + +var ErrInvalidRoot = errors.New("invalid root") +var ErrInvalidPackage = errors.New("invalid package") + +func NewBuilder(root string) (*Builder, error) { + absRoot, err := filepath.Abs(root) + if err != nil { + return nil, fmt.Errorf("error resolving path %s: %w", root, err) + } + + // Check if root path is correct by checking for System/UCC.exe + ucc := filepath.Join(absRoot, "System/UCC.exe") + _, err = os.Stat(ucc) + if err != nil { + return nil, fmt.Errorf("%w: %s", ErrInvalidRoot, root) + } + + return &Builder{ + RootPath: absRoot, + SystemDir: filepath.Join(absRoot, "System"), + UCCPath: ucc, + }, nil +} + +func (b *Builder) AddPackage(name string) error { + path := filepath.Join(b.RootPath, name) + + info, err := os.Stat(path) + if err != nil { + return fmt.Errorf("error reading path %s: %w", path, err) + } + + if !info.IsDir() { + return fmt.Errorf("%w: %s", ErrInvalidPackage, path) + } + + b.Packages = append(b.Packages, Package{ + Name: name, + Path: path, + }) + + return nil +} + +func (b *Builder) AddDependency(name string) error { + path := filepath.Join(b.SystemDir, name+".u") + info, err := os.Stat(path) + if err != nil || !info.Mode().IsRegular() { + return fmt.Errorf("dependency %s not found", err) + } + + b.Dependencies = append(b.Dependencies, name) + return nil +} + +func (b *Builder) buildDir() (string, error) { + dir := filepath.Join(b.RootPath, "Build") + err := os.MkdirAll(dir, 0755) + if err != nil { + return "", err + } + return dir, nil +} + +func (b *Builder) generateBuildIni(path string) error { + editPkgs := make([]string, len(defaultEditPackages)) + copy(editPkgs, defaultEditPackages) + + for _, pkg := range b.Dependencies { + editPkgs = append(editPkgs, pkg) + } + + for _, pkg := range b.Packages { + editPkgs = append(editPkgs, pkg.Name) + } + + cfg := generateConfig(editPkgs) + + f, err := os.Create(path) + if err != nil { + return fmt.Errorf("error generating config: %w", err) + } + defer f.Close() + + err = cfg.Write(f) + if err != nil { + return fmt.Errorf("error writing conifg: %w", err) + } + + return nil +} + +func (b *Builder) Build(ctx context.Context) error { + buildDir, err := b.buildDir() + if err != nil { + return err + } + + ini := filepath.Join(buildDir, "build.ini") + err = b.generateBuildIni(ini) + if err != nil { + return err + } + + build := &build{ + builder: b, + buildDir: buildDir, + iniFile: ini, + } + + err = build.build(ctx) + if err != nil { + return err + } + + return nil +} + +type build struct { + builder *Builder + + buildDir string + iniFile string +} + +func (b *build) clean() error { + var removeFiles []string + for _, pkg := range b.builder.Packages { + removeFiles = append( + removeFiles, + filepath.Join(b.builder.SystemDir, pkg.Name+".u"), + filepath.Join(b.builder.SystemDir, pkg.Name+".ucl"), + filepath.Join(b.builder.SystemDir, pkg.Name+".int"), + ) + } + + for _, fp := range removeFiles { + err := os.Remove(fp) + if err != nil { + if !errors.Is(err, os.ErrNotExist) { + return err + } + } + } + + return nil +} + +func (b *build) build(ctx context.Context) error { + if err := b.clean(); err != nil { + return err + } + + cmd := exec.CommandContext(ctx, b.builder.UCCPath, "make", fmt.Sprintf("-ini=%s", b.iniFile)) + cmd.Dir = b.builder.SystemDir // UCC requires cwd to be the system path + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} + +func generateConfig(editPkgs []string) *ini.Config { + return &ini.Config{ + Sections: []*ini.Section{ + { + Name: "Engine.Engine", + Items: []*ini.Item{ + { + Key: "EditorEngine", + Values: []string{"Editor.EditorEngine"}, + }, + }, + }, + { + Name: "Core.System", + Items: []*ini.Item{ + { + Key: "SavePath", + Values: []string{"../Save"}, + }, + { + Key: "CachePath", + Values: []string{"../Cache"}, + }, + { + Key: "CacheExt", + Values: []string{".uxx"}, + }, + { + Key: "CacheRecordPath", + Values: []string{"../System/*.ucl"}, + }, + { + Key: "MusicPath", + Values: []string{"../Music"}, + }, + { + Key: "SpeechPath", + Values: []string{"../Speech"}, + }, + { + Key: "Paths", + Values: []string{ + "../System/*.u", + "../Maps/*.ut2", + "../Textures/*.utx", + "../Sounds/*.uax", + "../Music/*.umx", + "../StaticMeshes/*.usx", + "../Animations/*.ukx", + "../Saves/*.uvx", + }, + }, + }, + }, + { + Name: "Editor.EditorEngine", + Items: []*ini.Item{ + { + Key: "CacheSizeMegs", + Values: []string{"32"}, + }, + { + Key: "EditPackages", + Values: editPkgs, + }, + }, + }, + }, + } +} + +var defaultEditPackages = []string{ + "Core", + "Engine", + "Fire", + "Editor", + "UnrealEd", + "IpDrv", + "UWeb", + "GamePlay", + "UnrealGame", + "XGame_rc", + "XEffects", + "XWeapons_rc", + "XPickups_rc", + "XPickups", + "XGame", + "XWeapons", + "XInterface", + "XAdmin", + "XWebAdmin", + "Vehicles", + "BonusPack", + "SkaarjPack_rc", + "SkaarjPack", + "UTClassic", + "UT2k4Assault", + "Onslaught", + "GUI2K4", + "UT2k4AssaultFull", + "OnslaughtFull", + "xVoting", + "StreamlineFX", + "UTV2004c", + "UTV2004s", + "OnslaughtBP", +} diff --git a/pkg/build/build_test.go b/pkg/build/build_test.go new file mode 100644 index 0000000..a27d60d --- /dev/null +++ b/pkg/build/build_test.go @@ -0,0 +1,25 @@ +package build + +import ( + "context" + "testing" +) + +//go:generate go build -o testdata/UT2004/System/UCC.exe testdata/UT2004/System/main.go + +func TestBuild(t *testing.T) { + builder, err := NewBuilder("testdata/UT2004") + if err != nil { + t.Error(err) + } + + err = builder.AddPackage("ExamplePackage") + if err != nil { + t.Error(err) + } + + err = builder.Build(context.Background()) + if err != nil { + t.Errorf("Build failed: %s", err) + } +} diff --git a/pkg/build/testdata/UT2004/Build/build.ini b/pkg/build/testdata/UT2004/Build/build.ini new file mode 100644 index 0000000..675056f --- /dev/null +++ b/pkg/build/testdata/UT2004/Build/build.ini @@ -0,0 +1,57 @@ +[Engine.Engine] +EditorEngine=Editor.EditorEngine + +[Core.System] +SavePath=../Save +CachePath=../Cache +CacheExt=.uxx +CacheRecordPath=../System/*.ucl +MusicPath=../Music +SpeechPath=../Speech +Paths=../System/*.u +Paths=../Maps/*.ut2 +Paths=../Textures/*.utx +Paths=../Sounds/*.uax +Paths=../Music/*.umx +Paths=../StaticMeshes/*.usx +Paths=../Animations/*.ukx +Paths=../Saves/*.uvx + +[Editor.EditorEngine] +CacheSizeMegs=32 +EditPackages=Core +EditPackages=Engine +EditPackages=Fire +EditPackages=Editor +EditPackages=UnrealEd +EditPackages=IpDrv +EditPackages=UWeb +EditPackages=GamePlay +EditPackages=UnrealGame +EditPackages=XGame_rc +EditPackages=XEffects +EditPackages=XWeapons_rc +EditPackages=XPickups_rc +EditPackages=XPickups +EditPackages=XGame +EditPackages=XWeapons +EditPackages=XInterface +EditPackages=XAdmin +EditPackages=XWebAdmin +EditPackages=Vehicles +EditPackages=BonusPack +EditPackages=SkaarjPack_rc +EditPackages=SkaarjPack +EditPackages=UTClassic +EditPackages=UT2k4Assault +EditPackages=Onslaught +EditPackages=GUI2K4 +EditPackages=UT2k4AssaultFull +EditPackages=OnslaughtFull +EditPackages=xVoting +EditPackages=StreamlineFX +EditPackages=UTV2004c +EditPackages=UTV2004s +EditPackages=OnslaughtBP +EditPackages=ExamplePackage + diff --git a/pkg/build/testdata/UT2004/ExamplePackage/.keep b/pkg/build/testdata/UT2004/ExamplePackage/.keep new file mode 100644 index 0000000..e69de29 diff --git a/pkg/build/testdata/UT2004/System/.gitignore b/pkg/build/testdata/UT2004/System/.gitignore new file mode 100644 index 0000000..e28b1c7 --- /dev/null +++ b/pkg/build/testdata/UT2004/System/.gitignore @@ -0,0 +1,4 @@ +UCC* +*.u +*.ucl +*.int diff --git a/pkg/build/testdata/UT2004/System/Example.ini b/pkg/build/testdata/UT2004/System/Example.ini new file mode 100644 index 0000000..b793f83 --- /dev/null +++ b/pkg/build/testdata/UT2004/System/Example.ini @@ -0,0 +1,53 @@ +[Core.System] +PurgeCacheDays=30 +SavePath=../Save +CachePath=../Cache +CacheExt=.uxx +CacheRecordPath=../System/*.ucl +MusicPath=../Music +SpeechPath=../Speech +Paths=../System/*.u +Paths=../Maps/*.ut2 +Paths=../Textures/*.utx +Paths=../Sounds/*.uax +Paths=../Music/*.umx +Paths=../StaticMeshes/*.usx +Paths=../Animations/*.ukx +Paths=../Saves/*.uvx + +[Editor.EditorEngine] +EditPackages=Core +EditPackages=Engine +EditPackages=Fire +EditPackages=Editor +EditPackages=UnrealEd +EditPackages=IpDrv +EditPackages=UWeb +EditPackages=GamePlay +EditPackages=UnrealGame +EditPackages=XGame_rc +EditPackages=XEffects +EditPackages=XWeapons_rc +EditPackages=XPickups_rc +EditPackages=XPickups +EditPackages=XGame +EditPackages=XWeapons +EditPackages=XInterface +EditPackages=XAdmin +EditPackages=XWebAdmin +EditPackages=Vehicles +EditPackages=BonusPack +EditPackages=SkaarjPack_rc +EditPackages=SkaarjPack +EditPackages=UTClassic +EditPackages=UT2k4Assault +EditPackages=Onslaught +EditPackages=GUI2K4 +EditPackages=UT2k4AssaultFull +EditPackages=OnslaughtFull +EditPackages=xVoting +EditPackages=StreamlineFX +EditPackages=UTV2004c +EditPackages=UTV2004s +EditPackages=OnslaughtBP +EditPackages=WSUTComp diff --git a/pkg/build/testdata/UT2004/System/main.go b/pkg/build/testdata/UT2004/System/main.go new file mode 100644 index 0000000..59d8a90 --- /dev/null +++ b/pkg/build/testdata/UT2004/System/main.go @@ -0,0 +1,130 @@ +package main + +import ( + "fmt" + "os" + "slices" + "strings" + + "github.com/aldehir/ut2u/pkg/ini" +) + +var command string +var iniFile string + +func main() { + if len(os.Args) >= 2 { + command = os.Args[1] + } + + if command == "" { + fmt.Println("Unknown command") + os.Exit(1) + } + + for _, arg := range os.Args[2:] { + switch { + case strings.HasPrefix(arg, "-ini="): + _, iniFile, _ = strings.Cut(arg, "=") + } + } + + if !strings.EqualFold(command, "make") { + fmt.Printf("Unknown command: %s\n", command) + os.Exit(1) + } + + fmt.Printf("Processing %s\n", iniFile) + cfg, err := ParseConfig(iniFile) + if err != nil { + fmt.Printf("Failed to parse %s: %s\n", iniFile, err) + os.Exit(2) + } + + packages, found := cfg.Values("Editor.EditorEngine", "EditPackages") + if !found { + fmt.Println("No EditPacakges found") + os.Exit(3) + } + + var buildPackages []string + for _, pkg := range packages { + if !slices.Contains(defaultPackages, pkg) { + buildPackages = append(buildPackages, pkg) + } + } + + if len(buildPackages) == 0 { + fmt.Println("No custom build packages defined") + os.Exit(4) + } + + for _, pkg := range buildPackages { + err = BuildPackage(pkg) + if err != nil { + fmt.Printf("Failed to build %s: %s\n", pkg, err) + } + } +} + +func ParseConfig(path string) (*ini.Config, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + return ini.Parse(f) +} + +func BuildPackage(name string) error { + for _, ext := range makeExtensions { + fn := name + ext + f, err := os.Create(fn) + if err != nil { + return err + } + defer f.Close() + f.WriteString("Dummy file") + fmt.Printf("=> %s\n", fn) + } + return nil +} + +var makeExtensions = []string{".u", ".ucl"} + +var defaultPackages = []string{ + "Core", + "Engine", + "Fire", + "Editor", + "UnrealEd", + "IpDrv", + "UWeb", + "GamePlay", + "UnrealGame", + "XGame_rc", + "XEffects", + "XWeapons_rc", + "XPickups_rc", + "XPickups", + "XGame", + "XWeapons", + "XInterface", + "XAdmin", + "XWebAdmin", + "Vehicles", + "BonusPack", + "SkaarjPack_rc", + "SkaarjPack", + "UTClassic", + "UT2k4Assault", + "Onslaught", + "GUI2K4", + "UT2k4AssaultFull", + "OnslaughtFull", + "xVoting", + "StreamlineFX", + "UTV2004c", + "UTV2004s", + "OnslaughtBP", +} From 3fb788319a4c3331d8dbba1d8ca55d7c5168dd10 Mon Sep 17 00:00:00 2001 From: Alde Rojas Date: Fri, 14 Jun 2024 20:02:44 -0500 Subject: [PATCH 3/5] Bump go version --- .github/workflows/go-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go-package.yml b/.github/workflows/go-package.yml index efeb2e6..d24942c 100644 --- a/.github/workflows/go-package.yml +++ b/.github/workflows/go-package.yml @@ -13,7 +13,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.22' - name: Test run: go generate ./... && go test -v ./... From 32aa6c544f08afe1ba801e2d36722f27ab2bdd39 Mon Sep 17 00:00:00 2001 From: Alde Rojas Date: Fri, 14 Jun 2024 20:03:11 -0500 Subject: [PATCH 4/5] Bump to min 1.21 --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 28bfafa..7282a84 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/aldehir/ut2u -go 1.20 +go 1.21 require ( github.com/aws/aws-sdk-go-v2 v1.21.0 // indirect From d58dfa2f981d13a4739af84edecf7e9ca609ff34 Mon Sep 17 00:00:00 2001 From: Alde Rojas Date: Fri, 14 Jun 2024 21:43:08 -0500 Subject: [PATCH 5/5] Update README --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9fc7f9a..d3d50dd 100644 --- a/README.md +++ b/README.md @@ -210,7 +210,9 @@ ut2u redirect sync -b my.bucket -p ut2-redirect/ System/UT2004.ini ## Build The build command simplifies the build process by isolating the package -definitions into its own ini. +definitions into a separate ini. + +**The UCC compiler only works on Windows.** ``` $ ut2u build -h @@ -232,16 +234,16 @@ $ ut2u build ``` If your package requires another package, then you may pass in `-d pkg` to -include that package in the build. This does not build the dependencies, it -only includes them so they must have a compiled `*.u` file in the `System` +include that package as a dependency. This does not build the dependency, it +only includes them so there must be a compiled `*.u` file in the `System` directory. ``` $ ut2u build -d UTComp ``` -To build multiple packages when developing them in parallel, then pass each one -as separate arguments. +To build multiple packages when developing in parallel, pass each one as +separate arguments. ``` $ ut2u build ../WSUTComp .