From 8ba96873bb4ad19483fa1929bd1ad82c6f4d7e12 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 Jul 2026 11:46:58 +0800 Subject: [PATCH 1/2] change prototype of onBuild, onTest --- cmd/llar/internal/make_test.go | 8 ++-- formula/classfile.go | 44 +++---------------- formula/classfile_test.go | 4 +- formula/demo/zlib/zlib_llar.gox | 29 +++--------- formula/project.go | 26 ++++++++--- formula/project_test.go | 44 +++++++++---------- internal/build/build.go | 21 ++++----- internal/build/build_test.go | 17 ++++--- internal/formula/formula.go | 20 ++++----- internal/formula/formula_test.go | 12 ++--- .../github.com/goplus/llar/formula/export.go | 3 +- 11 files changed, 94 insertions(+), 134 deletions(-) diff --git a/cmd/llar/internal/make_test.go b/cmd/llar/internal/make_test.go index 9826926..823ba54 100644 --- a/cmd/llar/internal/make_test.go +++ b/cmd/llar/internal/make_test.go @@ -716,12 +716,12 @@ func TestMakeLocal_VerboseWritesBuildOutputToStderr(t *testing.T) { t.Cleanup(func() { makeVerbose = savedVerbose }) stdout, stderr, restore := captureProcessStreams(t) - var out formula.BuildResult + buildCtx := formula.NewContext(nil, "", "", "", nil) err = execbroker.Do(execbroker.Scope{ Stdout: os.Stderr, Stderr: os.Stderr, }, func() error { - mods[0].OnBuild(nil, nil, &out) + mods[0].OnBuild(buildCtx) return nil }) restore() @@ -729,8 +729,8 @@ func TestMakeLocal_VerboseWritesBuildOutputToStderr(t *testing.T) { t.Fatal(err) } - if out.Metadata() != "-lA" { - t.Fatalf("metadata = %q, want %q", out.Metadata(), "-lA") + if buildCtx.Out.Metadata() != "-lA" { + t.Fatalf("metadata = %q, want %q", buildCtx.Out.Metadata(), "-lA") } if got := strings.TrimSpace(stdout.String()); got != "" { t.Fatalf("stdout = %q, want no build output", got) diff --git a/formula/classfile.go b/formula/classfile.go index a353223..8c97a26 100644 --- a/formula/classfile.go +++ b/formula/classfile.go @@ -24,8 +24,8 @@ type ModuleF struct { gsh.App fOnRequire func(proj *Project, deps *ModuleDeps) - fOnBuild func(ctx *Context, proj *Project, out *BuildResult) - fOnTest func(ctx *Context, proj *Project, out *TestResult) + fOnBuild func(ctx *Context) + fOnTest func(ctx *Context) fFilter func() bool modPath string @@ -214,58 +214,28 @@ func (p *ModuleF) OnRequire(f func(proj *Project, deps *ModuleDeps)) { // BuildResult represents the result of building a project. type BuildResult struct { - errs []error - metadata string // build output metadata, for C/C++ it's the result of pkg-config. -} - -// AddErr records a build error. -func (b *BuildResult) AddErr(err error) { - b.errs = append(b.errs, err) -} - -// Errs returns all errors collected during build. -func (b *BuildResult) Errs() []error { - return b.errs + meta string // build output metadata, for C/C++ it's the result of pkg-config. } // Metadata returns the build output metadata. func (b *BuildResult) Metadata() string { - return b.metadata + return b.meta } // SetMetadata sets the build output metadata. func (b *BuildResult) SetMetadata(metadata string) { - b.metadata = metadata + b.meta = metadata } // OnBuild event is used to instruct the Formula to compile a project. -func (p *ModuleF) OnBuild(f func(ctx *Context, proj *Project, out *BuildResult)) { +func (p *ModuleF) OnBuild(f func(ctx *Context)) { p.fOnBuild = f } -// TestResult represents the outcome of a formula's onTest hook. -// Unlike BuildResult it has no metadata field: a test's job is to verify -// the build, not to emit additional pkg-config-style flags. Future -// extensions (pass/fail counts, skip markers, captured logs) should be -// added here without polluting BuildResult. -type TestResult struct { - errs []error -} - -// AddErr records a test failure. -func (t *TestResult) AddErr(err error) { - t.errs = append(t.errs, err) -} - -// Errs returns all errors collected during the test hook. -func (t *TestResult) Errs() []error { - return t.errs -} - // OnTest event is used to run post-build verification for a project. // It fires after OnBuild has completed successfully, reusing the same build // context so tests can locate built artifacts via ctx.OutputDir. -func (p *ModuleF) OnTest(f func(ctx *Context, proj *Project, out *TestResult)) { +func (p *ModuleF) OnTest(f func(ctx *Context)) { p.fOnTest = f } diff --git a/formula/classfile_test.go b/formula/classfile_test.go index cb8e2cc..c24e4af 100644 --- a/formula/classfile_test.go +++ b/formula/classfile_test.go @@ -24,8 +24,8 @@ func (f *testFormula) MainEntry() { f.Defaults(map[string]string{"debug": "OFF"}) f.Filter(func() bool { return true }) f.OnRequire(func(*Project, *ModuleDeps) {}) - f.OnBuild(func(*Context, *Project, *BuildResult) {}) - f.OnTest(func(*Context, *Project, *TestResult) {}) + f.OnBuild(func(*Context) {}) + f.OnTest(func(*Context) {}) } // TestGopt_ModuleF_Main exercises the classfile entry point together with diff --git a/formula/demo/zlib/zlib_llar.gox b/formula/demo/zlib/zlib_llar.gox index 22003d5..e4f66df 100644 --- a/formula/demo/zlib/zlib_llar.gox +++ b/formula/demo/zlib/zlib_llar.gox @@ -2,30 +2,13 @@ id "madler/zlib" fromVer "1.0.0" -onBuild (ctx, proj, out) => { - installDir, err := ctx.outputDir() - if err != nil { - out.addErr err - return - } +onBuild ctx => { + installDir := ctx.outputDir a := autotools.new(ctx.SourceDir, ctx.SourceDir+"/_build", installDir) + a.configure "--static" + a.build + a.install - err = a.configure("--static") - if err != nil { - out.addErr err - return - } - err = a.build() - if err != nil { - out.addErr err - return - } - err = a.install() - if err != nil { - out.addErr err - return - } - - out.setMetadata "-lz" + ctx.setMetadata "-lz" } diff --git a/formula/project.go b/formula/project.go index 0d389ff..356d1d2 100644 --- a/formula/project.go +++ b/formula/project.go @@ -8,6 +8,7 @@ import ( "io/fs" "github.com/goplus/llar/mod/module" + "github.com/qiniu/x/errors" ) // ----------------------------------------------------------------------------- @@ -25,7 +26,10 @@ func (p *Project) ReadFile(path string) ([]byte, error) { // Context represents the build context. type Context struct { + Proj *Project SourceDir string + Out BuildResult + Errs errors.List buildResults map[module.Version]BuildResult @@ -35,9 +39,9 @@ type Context struct { getOutputDir func(matrixStr string, mod module.Version) (string, error) } -// NewContext creates a Context with build-internal fields. -func NewContext(sourceDir, installDir, matrixStr string, getOutputDir func(string, module.Version) (string, error)) *Context { +func NewContext(proj *Project, sourceDir, installDir, matrixStr string, getOutputDir func(string, module.Version) (string, error)) *Context { return &Context{ + Proj: proj, SourceDir: sourceDir, installDir: installDir, matrixStr: matrixStr, @@ -45,16 +49,26 @@ func NewContext(sourceDir, installDir, matrixStr string, getOutputDir func(strin } } +// SetMetadata sets the build output metadata. +func (c *Context) SetMetadata(metadata string) { + c.Out.SetMetadata(metadata) +} + // OutputDir__0 returns the current module's output (install) directory. // In DSL: ctx.outputDir() -func (c *Context) OutputDir__0() (string, error) { - return c.installDir, nil +func (c *Context) OutputDir__0() string { + return c.installDir } // OutputDir__1 returns the output (install) directory for the given dependency. // In DSL: ctx.outputDir(dep) -func (c *Context) OutputDir__1(mod module.Version) (string, error) { - return c.getOutputDir(c.matrixStr, mod) +func (c *Context) OutputDir__1(mod module.Version) string { + dir, err := c.getOutputDir(c.matrixStr, mod) + if err != nil { + c.Errs.Add(err) + panic(err) + } + return dir } // BuildResult returns the stored build result for the module, if any. diff --git a/formula/project_test.go b/formula/project_test.go index 68305d4..661e12f 100644 --- a/formula/project_test.go +++ b/formula/project_test.go @@ -28,18 +28,8 @@ func TestModuleDeps_Require(t *testing.T) { } } -func TestBuildResult_ErrsAndMetadata(t *testing.T) { +func TestBuildResult_Metadata(t *testing.T) { result := &BuildResult{} - errA := errors.New("first") - errB := errors.New("second") - - result.AddErr(errA) - result.AddErr(errB) - - if got := result.Errs(); len(got) != 2 || got[0] != errA || got[1] != errB { - t.Fatalf("BuildResult.Errs() = %#v, want [%v %v]", got, errA, errB) - } - if result.Metadata() != "" { t.Fatalf("BuildResult.Metadata() = %q, want empty string", result.Metadata()) } @@ -84,7 +74,7 @@ func TestContext_DoesNotExposeCurrentMatrix(t *testing.T) { func TestNewContext(t *testing.T) { getOutputDir := func(_ string, _ module.Version) (string, error) { return "", nil } - ctx := NewContext("/src", "/install", "amd64-linux", getOutputDir) + ctx := NewContext(nil, "/src", "/install", "amd64-linux", getOutputDir) if ctx.SourceDir != "/src" { t.Errorf("SourceDir = %q, want %q", ctx.SourceDir, "/src") @@ -114,25 +104,19 @@ func TestContext_OutputDir(t *testing.T) { return "/out/" + m.Path, nil } - ctx := NewContext("/src", "/install", "amd64-linux", getOutputDir) + ctx := NewContext(nil, "/src", "/install", "amd64-linux", getOutputDir) t.Run("OutputDir__0 returns own installDir", func(t *testing.T) { - got, err := ctx.OutputDir__0() - if err != nil { - t.Fatalf("OutputDir__0() error = %v", err) - } + got := ctx.OutputDir__0() if got != "/install" { - t.Errorf("OutputDir__0() = %q, want %q", got, "/install") + t.Errorf("OutputDir() = %q, want %q", got, "/install") } }) t.Run("OutputDir__1 dispatches through getOutputDir", func(t *testing.T) { - got, err := ctx.OutputDir__1(dep) - if err != nil { - t.Fatalf("OutputDir__1() error = %v", err) - } + got := ctx.OutputDir__1(dep) if got != "/out/owner/dep" { - t.Errorf("OutputDir__1() = %q, want %q", got, "/out/owner/dep") + t.Errorf("OutputDir() = %q, want %q", got, "/out/owner/dep") } if gotMatrix != "amd64-linux" { t.Errorf("getOutputDir matrix = %q, want %q", gotMatrix, "amd64-linux") @@ -143,6 +127,20 @@ func TestContext_OutputDir(t *testing.T) { }) } +func TestContext_ErrOutputDir(t *testing.T) { + getOutputDir := func(matrixStr string, m module.Version) (string, error) { + return "", errors.New("failed to get output dir") + } + + ctx := NewContext(nil, "/src", "/install", "amd64-linux", getOutputDir) + defer func() { + if r := recover(); r == nil { + t.Errorf("OutputDir did not panic on error") + } + }() + ctx.OutputDir__1(module.Version{Path: "owner/dep", Version: "1.0.0"}) +} + func TestContext_BuildResult(t *testing.T) { ctx := &Context{} mod := module.Version{Path: "owner/repo", Version: "1.0.0"} diff --git a/internal/build/build.go b/internal/build/build.go index ee6d272..fb4f976 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -282,15 +282,14 @@ func (b *Builder) Build(ctx context.Context, targets []*modules.Module) ([]Resul getOutputDir := func(_ string, m module.Version) (string, error) { return b.installDir(m.Path, m.Version) } - buildContext := classfile.NewContext(tmpSourceDir, installDir, b.matrix, getOutputDir) + project := &classfile.Project{Deps: deps, SourceFS: mod.FS.(fs.ReadFileFS)} + buildContext := classfile.NewContext(project, tmpSourceDir, installDir, b.matrix, getOutputDir) // Inject results of already-built dependencies for modVer, result := range builtResults { buildContext.AddBuildResult(modVer, result) } - project := &classfile.Project{Deps: deps, SourceFS: mod.FS.(fs.ReadFileFS)} - var metadata string if err := execbroker.Do(execbroker.Scope{ Dir: tmpSourceDir, @@ -302,22 +301,20 @@ func (b *Builder) Build(ctx context.Context, targets []*modules.Module) ([]Resul if cacheHit { metadata = entry.Metadata } else { - var out classfile.BuildResult - mod.OnBuild(buildContext, project, &out) - if len(out.Errs()) > 0 { - return errors.Join(out.Errs()...) + mod.OnBuild(buildContext) + if len(buildContext.Errs) > 0 { + return errors.Join(buildContext.Errs...) } - metadata = out.Metadata() + metadata = buildContext.Out.Metadata() } // Run OnTest (root only) against the just-built or cached // artifacts, reusing the same build context so tests see a // consistent environment either way. if testThisMod { - var testOut classfile.TestResult - mod.OnTest(buildContext, project, &testOut) - if len(testOut.Errs()) > 0 { - return fmt.Errorf("onTest failed for %s@%s: %w", mod.Path, mod.Version, errors.Join(testOut.Errs()...)) + mod.OnTest(buildContext) + if len(buildContext.Errs) > 0 { + return fmt.Errorf("onTest failed for %s@%s: %w", mod.Path, mod.Version, buildContext.Errs) } } return nil diff --git a/internal/build/build_test.go b/internal/build/build_test.go index aeca925..a71b149 100644 --- a/internal/build/build_test.go +++ b/internal/build/build_test.go @@ -910,9 +910,9 @@ func TestBuild_RunTest_DisabledSkipsOnTest(t *testing.T) { // Inject an OnTest callback that would fail the build if invoked. var called bool for _, m := range mods { - m.OnTest = func(ctx *classfile.Context, proj *classfile.Project, out *classfile.TestResult) { + m.OnTest = func(ctx *classfile.Context) { called = true - out.AddErr(errors.New("onTest should not have been invoked")) + ctx.Errs.Add(errors.New("onTest should not have been invoked")) } } @@ -941,8 +941,8 @@ func TestBuild_RunTest_EnabledSurfacesOnTestError(t *testing.T) { wantErr := errors.New("boom from onTest") for _, m := range mods { - m.OnTest = func(ctx *classfile.Context, proj *classfile.Project, out *classfile.TestResult) { - out.AddErr(wantErr) + m.OnTest = func(ctx *classfile.Context) { + ctx.Errs.Add(wantErr) } } @@ -988,7 +988,7 @@ func TestBuild_RunTest_ReusesCacheWhenHit(t *testing.T) { var testCalled bool for _, m := range mods { - m.OnTest = func(ctx *classfile.Context, proj *classfile.Project, out *classfile.TestResult) { + m.OnTest = func(ctx *classfile.Context) { testCalled = true } } @@ -1041,7 +1041,7 @@ func TestBuild_RunTest_SavesCacheOnMiss(t *testing.T) { var testCalled bool for _, m := range mods { - m.OnTest = func(ctx *classfile.Context, proj *classfile.Project, out *classfile.TestResult) { + m.OnTest = func(ctx *classfile.Context) { testCalled = true } } @@ -1097,13 +1097,12 @@ func TestBuild_RunTest_DepOnTestNotInvoked(t *testing.T) { m := m switch m.Path { case "test/depresult": - m.OnTest = func(_ *classfile.Context, _ *classfile.Project, _ *classfile.TestResult) { + m.OnTest = func(_ *classfile.Context) { rootCalled = true } case "test/liba": - m.OnTest = func(_ *classfile.Context, _ *classfile.Project, out *classfile.TestResult) { + m.OnTest = func(_ *classfile.Context) { depCalled = true - out.AddErr(errors.New("dep OnTest should not have been invoked")) } } } diff --git a/internal/formula/formula.go b/internal/formula/formula.go index 3f32cfc..258729a 100644 --- a/internal/formula/formula.go +++ b/internal/formula/formula.go @@ -36,8 +36,8 @@ type Formula struct { ModPath string FromVer string OnRequire func(proj *formula.Project, deps *formula.ModuleDeps) - OnBuild func(ctx *formula.Context, proj *formula.Project, out *formula.BuildResult) - OnTest func(ctx *formula.Context, proj *formula.Project, out *formula.TestResult) + OnBuild func(ctx *formula.Context) + OnTest func(ctx *formula.Context) Filter func() bool } @@ -154,8 +154,8 @@ func loadFS(fs fs.ReadFileFS, path string) (*Formula, error) { program: program, ModPath: valueOf(class, "modPath").(string), FromVer: valueOf(class, "modFromVer").(string), - OnBuild: valueOf(class, "fOnBuild").(func(*formula.Context, *formula.Project, *formula.BuildResult)), - OnTest: valueOf(class, "fOnTest").(func(*formula.Context, *formula.Project, *formula.TestResult)), + OnBuild: valueOf(class, "fOnBuild").(func(*formula.Context)), + OnTest: valueOf(class, "fOnTest").(func(*formula.Context)), OnRequire: valueOf(class, "fOnRequire").(func(*formula.Project, *formula.ModuleDeps)), Filter: valueOf(class, "fFilter").(func() bool), } @@ -178,8 +178,8 @@ func Clone(f *Formula) *Formula { program: f.program, ModPath: valueOf(class, "modPath").(string), FromVer: valueOf(class, "modFromVer").(string), - OnBuild: valueOf(class, "fOnBuild").(func(*formula.Context, *formula.Project, *formula.BuildResult)), - OnTest: valueOf(class, "fOnTest").(func(*formula.Context, *formula.Project, *formula.TestResult)), + OnBuild: valueOf(class, "fOnBuild").(func(*formula.Context)), + OnTest: valueOf(class, "fOnTest").(func(*formula.Context)), OnRequire: valueOf(class, "fOnRequire").(func(*formula.Project, *formula.ModuleDeps)), Filter: valueOf(class, "fFilter").(func() bool), } @@ -201,14 +201,14 @@ func Clone(f *Formula) *Formula { func (f *Formula) keepProgramAlive() { program := f.program if fn := f.OnBuild; fn != nil { - f.OnBuild = func(ctx *formula.Context, proj *formula.Project, out *formula.BuildResult) { - fn(ctx, proj, out) + f.OnBuild = func(ctx *formula.Context) { + fn(ctx) runtime.KeepAlive(program) } } if fn := f.OnTest; fn != nil { - f.OnTest = func(ctx *formula.Context, proj *formula.Project, out *formula.TestResult) { - fn(ctx, proj, out) + f.OnTest = func(ctx *formula.Context) { + fn(ctx) runtime.KeepAlive(program) } } diff --git a/internal/formula/formula_test.go b/internal/formula/formula_test.go index 8460d93..a734b35 100644 --- a/internal/formula/formula_test.go +++ b/internal/formula/formula_test.go @@ -44,8 +44,8 @@ func TestLoadFS(t *testing.T) { // Functional test: verify callbacks can be invoked without panic f.OnRequire(&formulapkg.Project{}, &formulapkg.ModuleDeps{}) - f.OnBuild(&formulapkg.Context{}, &formulapkg.Project{}, &formulapkg.BuildResult{}) - f.OnTest(&formulapkg.Context{}, &formulapkg.Project{}, &formulapkg.TestResult{}) + f.OnBuild(&formulapkg.Context{}) + f.OnTest(&formulapkg.Context{}) }) t.Run("NonExistentFile", func(t *testing.T) { @@ -92,7 +92,7 @@ func TestLoadFS_TargetSurface(t *testing.T) { if len(gotDeps) != 1 || gotDeps[0].Path != "madler/zlib" || gotDeps[0].Version != "v1.3.1" { t.Fatalf("deps = %+v, want [madler/zlib@v1.3.1]", gotDeps) } - f.OnBuild(&formulapkg.Context{}, &formulapkg.Project{}, &formulapkg.BuildResult{}) + f.OnBuild(&formulapkg.Context{}) } func TestClone(t *testing.T) { @@ -142,7 +142,7 @@ func TestFormulaProgramCleanup(t *testing.T) { llarixgo.UnlockInterp() var loaded int - var onBuild func(*formulapkg.Context, *formulapkg.Project, *formulapkg.BuildResult) + var onBuild func(*formulapkg.Context) func() { fsys := os.DirFS("testdata/formula").(fs.ReadFileFS) f, err := LoadFS(fsys, "targetsurface_llar.gox") @@ -169,7 +169,7 @@ func TestFormulaProgramCleanup(t *testing.T) { if withHook <= before { t.Fatal("formula program was released while OnBuild remained reachable") } - onBuild(&formulapkg.Context{}, &formulapkg.Project{}, &formulapkg.BuildResult{}) + onBuild(&formulapkg.Context{}) onBuild = nil deadline := time.Now().Add(5 * time.Second) @@ -195,7 +195,7 @@ func TestFormulaPrintUsesBrokerScope(t *testing.T) { var stdout bytes.Buffer err = execbroker.Do(execbroker.Scope{Stdout: &stdout}, func() error { - f.OnBuild(&formulapkg.Context{}, &formulapkg.Project{}, &formulapkg.BuildResult{}) + f.OnBuild(&formulapkg.Context{}) return nil }) if err != nil { diff --git a/internal/ixgo/pkg/github.com/goplus/llar/formula/export.go b/internal/ixgo/pkg/github.com/goplus/llar/formula/export.go index 5ad52b5..0d02bb8 100755 --- a/internal/ixgo/pkg/github.com/goplus/llar/formula/export.go +++ b/internal/ixgo/pkg/github.com/goplus/llar/formula/export.go @@ -31,13 +31,12 @@ func init() { "ModuleDeps": reflect.TypeOf((*q.ModuleDeps)(nil)).Elem(), "ModuleF": reflect.TypeOf((*q.ModuleF)(nil)).Elem(), "Project": reflect.TypeOf((*q.Project)(nil)).Elem(), - "TestResult": reflect.TypeOf((*q.TestResult)(nil)).Elem(), }, AliasTypes: map[string]reflect.Type{}, Vars: map[string]reflect.Value{}, Funcs: map[string]reflect.Value{ - "XGot_ModuleF_Main": reflect.ValueOf(q.XGot_ModuleF_Main), "NewContext": reflect.ValueOf(q.NewContext), + "XGot_ModuleF_Main": reflect.ValueOf(q.XGot_ModuleF_Main), }, TypedConsts: map[string]ixgo.TypedConst{}, UntypedConsts: map[string]ixgo.UntypedConst{ From 17ac0a7110e96b7912990d9f1f1ee9e328dc1ff8 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 Jul 2026 12:04:09 +0800 Subject: [PATCH 2/2] autotools: use panic instead of return err --- x/autotools/autotools.go | 21 ++++++++++++--------- x/autotools/autotools_test.go | 17 ++++------------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/x/autotools/autotools.go b/x/autotools/autotools.go index 0e52157..040e34c 100644 --- a/x/autotools/autotools.go +++ b/x/autotools/autotools.go @@ -67,10 +67,10 @@ func (a *AutoTools) Use(root string) { // Configure runs the configure script from sourceDir in the build directory. // --prefix is prepended automatically when installDir is set. // Extra flags are appended after --prefix. -func (a *AutoTools) Configure(args ...string) error { +func (a *AutoTools) Configure(args ...string) { dir := a.workDir() if err := os.MkdirAll(dir, 0o755); err != nil { - return err + panic(err) } exe := filepath.Join(a.sourceDir, "configure") if dir == "." { @@ -80,17 +80,17 @@ func (a *AutoTools) Configure(args ...string) error { if a.installDir != "" { flags = append(flags, "--prefix="+a.installDir) } - return a.run(exe, append(flags, args...)) + a.run(exe, append(flags, args...)) } // Build runs "make" with optional extra arguments. -func (a *AutoTools) Build(args ...string) error { - return a.run("make", args) +func (a *AutoTools) Build(args ...string) { + a.run("make", args) } // Install runs "make install" with optional extra arguments appended. -func (a *AutoTools) Install(args ...string) error { - return a.run("make", append([]string{"install"}, args...)) +func (a *AutoTools) Install(args ...string) { + a.run("make", append([]string{"install"}, args...)) } // OutputDir returns installDir if set, otherwise buildDir. @@ -108,7 +108,7 @@ func (a *AutoTools) workDir() string { return a.buildDir } -func (a *AutoTools) run(name string, args []string) error { +func (a *AutoTools) run(name string, args []string) { cmd := execbroker.Command(name, args...) cmd.Dir = a.workDir() if cmd.Stdout == nil { @@ -117,7 +117,10 @@ func (a *AutoTools) run(name string, args []string) error { if cmd.Stderr == nil { cmd.Stderr = os.Stderr } - return cmd.Run() + err := cmd.Run() + if err != nil { + panic(err) + } } // prependPath prepends value to a PATH-style env var. diff --git a/x/autotools/autotools_test.go b/x/autotools/autotools_test.go index c780fd0..2f24a47 100644 --- a/x/autotools/autotools_test.go +++ b/x/autotools/autotools_test.go @@ -183,15 +183,9 @@ func TestConfigureBuildInstallE2E(t *testing.T) { a := New(absSource, buildDir, installDir) - if err := a.Configure("--enable-foo"); err != nil { - t.Fatalf("Configure: %v", err) - } - if err := a.Build(); err != nil { - t.Fatalf("Build: %v", err) - } - if err := a.Install(); err != nil { - t.Fatalf("Install: %v", err) - } + a.Configure("--enable-foo") + a.Build() + a.Install() data, err := os.ReadFile(filepath.Join(buildDir, "config.log")) if err != nil { @@ -228,10 +222,7 @@ func TestConfigureNoPrefix(t *testing.T) { // No installDir → no --prefix a := New(absSource, buildDir, "") - - if err := a.Configure(); err != nil { - t.Fatalf("Configure: %v", err) - } + a.Configure() data, err := os.ReadFile(filepath.Join(buildDir, "config.log")) if err != nil {