diff --git a/internal/crosscompile/crosscompile.go b/internal/crosscompile/crosscompile.go index 17bd05aa..6f9b64a9 100644 --- a/internal/crosscompile/crosscompile.go +++ b/internal/crosscompile/crosscompile.go @@ -85,14 +85,21 @@ func Use(goos, goarch string, wasiThreads bool) (export Export, err error) { // Configure based on GOOS switch goos { case "wasip1": - sdkDir := filepath.Join(cacheDir(), llvm.GetTargetTriple(goos, goarch)) - if _, err = os.Stat(sdkDir); err != nil { - if !errors.Is(err, fs.ErrNotExist) { - return - } + // Set wasiSdkRoot path + llgoRoot := env.LLGoROOT() + wasiSdkRoot := filepath.Join(llgoRoot, "crosscompile", "wasi-libc") - if err = downloadAndExtract(wasiSdkUrl, sdkDir); err != nil { - return + // If not exists in LLGoROOT, download and use cached wasiSdkRoot + if _, err = os.Stat(wasiSdkRoot); err != nil { + sdkDir := filepath.Join(cacheDir(), llvm.GetTargetTriple(goos, goarch)) + if _, err = os.Stat(sdkDir); err != nil { + if !errors.Is(err, fs.ErrNotExist) { + return + } + + if wasiSdkRoot, err = downloadAndExtract(wasiSdkUrl, sdkDir); err != nil { + return + } } } // WASI-SDK configuration @@ -101,8 +108,7 @@ func Use(goos, goarch string, wasiThreads bool) (export Export, err error) { triple = "wasm32-wasip1-threads" } - // Set up flags for the WASI-SDK - wasiSdkRoot := filepath.Join(sdkDir, "wasi-sdk-25.0-x86_64-macos") + // Set up flags for the WASI-SDK or wasi-libc sysrootDir := filepath.Join(wasiSdkRoot, "share", "wasi-sysroot") libclangDir := filepath.Join(wasiSdkRoot, "lib", "clang", "19") includeDir := filepath.Join(sysrootDir, "include", triple) diff --git a/internal/crosscompile/fetch.go b/internal/crosscompile/fetch.go index edd556a7..045ac9a6 100644 --- a/internal/crosscompile/fetch.go +++ b/internal/crosscompile/fetch.go @@ -11,36 +11,37 @@ import ( "strings" ) -func downloadAndExtract(url, dir string) (err error) { +func downloadAndExtract(url, dir string) (wasiSdkRoot string, err error) { if _, err = os.Stat(dir); err == nil { os.RemoveAll(dir) } tempDir := dir + ".temp" os.RemoveAll(tempDir) - if err = os.MkdirAll(tempDir, 0755); err != nil { - return fmt.Errorf("failed to create temporary directory: %w", err) + if err := os.MkdirAll(tempDir, 0755); err != nil { + return "", fmt.Errorf("failed to create temporary directory: %w", err) } urlPath := strings.Split(url, "/") filename := urlPath[len(urlPath)-1] localFile := filepath.Join(tempDir, filename) if err = downloadFile(url, localFile); err != nil { - return fmt.Errorf("failed to download file: %w", err) + return "", fmt.Errorf("failed to download file: %w", err) } defer os.Remove(localFile) if strings.HasSuffix(filename, ".tar.gz") || strings.HasSuffix(filename, ".tgz") { err = extractTarGz(localFile, tempDir) } else { - return fmt.Errorf("unsupported archive format: %s", filename) + return "", fmt.Errorf("unsupported archive format: %s", filename) } if err != nil { - return fmt.Errorf("failed to extract archive: %w", err) + return "", fmt.Errorf("failed to extract archive: %w", err) } if err = os.Rename(tempDir, dir); err != nil { - return fmt.Errorf("failed to rename directory: %w", err) + return "", fmt.Errorf("failed to rename directory: %w", err) } - return nil + wasiSdkRoot = filepath.Join(dir, "wasi-sdk-25.0-x86_64-macos") + return } func downloadFile(url, filepath string) error {