diff --git a/action/recipes/linux.go b/action/recipes/linux.go index 6d98b00f..c2afa71e 100644 --- a/action/recipes/linux.go +++ b/action/recipes/linux.go @@ -44,8 +44,8 @@ type LinuxOpts struct { // Specifies target architecture, such as 'x86' or 'arm64'. // Supported options: - // - 'x86' - // - 'x86_64' + // - 'i386' + // - 'amd64' // - 'arm' // - 'arm64' Arch string `json:"arch"` @@ -134,26 +134,29 @@ func (opts LinuxOpts) buildFirmware(ctx context.Context, client *dagger.Client, // Setup environment variables in the container // Handle cross-compilation: Map architecture to cross-compiler crossCompile := map[string]string{ - "x86": "i686-linux-gnu-", - "x86_64": "", - "arm": "arm-linux-gnueabi-", - "arm64": "aarch64-linux-gnu-", + "i386": "i686-linux-gnu-", + "amd64": "x86-64-linux-gnu-", + "arm": "arm-linux-gnueabi-", + "arm64": "aarch64-linux-gnu-", } envVars := map[string]string{ - "ARCH": opts.Arch, + "ARCH": NormalizeArchitectureForLinux(opts.Arch), } - val, ok := crossCompile[opts.Arch] - if !ok { - err = errUnknownArchCrossCompile - slog.Error( - "Selected unknown cross compilation target architecture", - slog.Any("error", err), - ) - return nil, err - } - if val != "" { - envVars["CROSS_COMPILE"] = val + // Check if cross-compilation is needed + if NormalizeArchitecture(runtime.GOARCH) != NormalizeArchitecture(opts.Arch) { + val, ok := crossCompile[opts.Arch] + if !ok { + err = errUnknownArchCrossCompile + slog.Error( + "Selected unknown cross compilation target architecture", + slog.Any("error", err), + ) + return nil, err + } + if val != "" { + envVars["CROSS_COMPILE"] = val + } } for key, value := range envVars { diff --git a/action/recipes/linux_test.go b/action/recipes/linux_test.go index d6a8a44c..e0b8480e 100644 --- a/action/recipes/linux_test.go +++ b/action/recipes/linux_test.go @@ -56,13 +56,13 @@ func TestLinux(t *testing.T) { { name: "normal build for x86 64bit", linuxVersion: "6.1.45", - arch: "x86_64", + arch: "amd64", wantErr: nil, }, { name: "normal build for x86 32bit", linuxVersion: "6.1.45", - arch: "x86", + arch: "i386", wantErr: nil, }, { diff --git a/action/recipes/recipes.go b/action/recipes/recipes.go index c62df379..f5948a5c 100644 --- a/action/recipes/recipes.go +++ b/action/recipes/recipes.go @@ -192,3 +192,45 @@ func Execute(ctx context.Context, target string, config *Config, interactive boo } return ErrTargetMissing } + +// NormalizeArchitecture will translate various architecture strings into expected format +func NormalizeArchitecture(arch string) string { + archMap := map[string]string{ + // x86 32-bit + "IA-32": "i386", // Intel + "IA32": "i386", // Intel + "i686": "i386", // common on Linux + "386": "i386", // GOARCH + "x86": "i386", // common on Windows + "x86-32": "i386", // rare + "x86_32": "i386", // rare + // x86 64-bit + "AMD64": "amd64", + "x64": "amd64", // common on Windows + "x86-64": "amd64", + "x86_64": "amd64", + } + result, ok := archMap[arch] + if result != "" && ok { + return result + } + // fallback + return arch +} + +// NormalizeArchitectureForLinux will translate various architecture strings into format expected by Linux +func NormalizeArchitectureForLinux(arch string) string { + normalArch := NormalizeArchitecture(arch) + archMap := map[string]string{ + // x86 32-bit + "i386": "x86", + // x86 64-bit + "amd64": "x86_64", + } + result, ok := archMap[normalArch] + if result != "" && ok { + return result + } + // fallback + return arch +}