Skip to content

Commit ebb585f

Browse files
author
jld3103
authored
Merge pull request #170 from go-flutter-desktop/fix/debug-mode-segfault
Fix segfault in debug mode
2 parents fb103e4 + 088ef59 commit ebb585f

File tree

3 files changed

+103
-31
lines changed

3 files changed

+103
-31
lines changed

cmd/build.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ func buildGoBinary(targetOS string, vmArguments []string) {
582582
log.Warnf("The '--opengl=none' flag makes go-flutter incompatible with texture plugins!")
583583
}
584584

585-
if targetOS == "darwin" {
585+
if targetOS == "darwin" && buildOrRunMode != build.DebugMode {
586586
darwinDyldHack(filepath.Join(build.OutputDirectoryPath(targetOS, buildOrRunMode), build.EngineFiles(targetOS, buildOrRunMode)[0]))
587587
}
588588

@@ -603,7 +603,7 @@ func buildGoBinary(targetOS string, vmArguments []string) {
603603
os.Exit(1)
604604
}
605605
log.Infof("Successfully compiled executable binary for %s", targetOS)
606-
if targetOS == "darwin" {
606+
if targetOS == "darwin" && buildOrRunMode != build.DebugMode {
607607
darwinDyldHack(build.OutputBinaryPath(config.GetConfig().GetExecutableName(pubspec.GetPubSpec().Name), targetOS, buildOrRunMode))
608608
}
609609
}
@@ -638,8 +638,13 @@ func buildEnv(targetOS string, engineCachePath string) []string {
638638

639639
switch targetOS {
640640
case "darwin":
641-
cgoLdflags += fmt.Sprintf(" -L%s -L%s", engineCachePath, outputDirPath)
642-
cgoLdflags += fmt.Sprintf(" -lflutter_engine -Wl,-rpath,.")
641+
if buildOrRunMode == build.DebugMode {
642+
cgoLdflags += fmt.Sprintf(" -F%s -Wl,-rpath,@executable_path", engineCachePath)
643+
cgoLdflags += fmt.Sprintf(" -F%s -L%s -framework FlutterEmbedder", outputDirPath, outputDirPath)
644+
} else {
645+
cgoLdflags += fmt.Sprintf(" -L%s -L%s", engineCachePath, outputDirPath)
646+
cgoLdflags += " -lflutter_engine -Wl,-rpath,."
647+
}
643648
cgoLdflags += " -mmacosx-version-min=10.10"
644649
cgoCflags += " -mmacosx-version-min=10.10"
645650
case "linux":

internal/build/build.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,11 @@ func ExecutableExtension(targetOS string) string {
9595
func EngineFiles(targetOS string, mode Mode) []string {
9696
switch targetOS {
9797
case "darwin":
98-
return []string{"libflutter_engine.dylib"}
98+
if mode.IsAot {
99+
return []string{"libflutter_engine.dylib"}
100+
} else {
101+
return []string{"FlutterEmbedder.framework"}
102+
}
99103
case "linux":
100104
return []string{"libflutter_engine.so"}
101105
case "windows":

internal/enginecache/cache.go

Lines changed: 89 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -241,29 +241,87 @@ func ValidateOrUpdateEngine(targetOS, cachePath, requiredEngineVersion string, m
241241

242242
log.Printf("Downloading engine for platform %s at version %s...", EngineConfig(targetOS, mode), requiredEngineVersion)
243243

244-
file := ""
245-
switch targetOS {
246-
case "linux":
247-
file += "linux"
248-
case "darwin":
249-
file += "macosx"
250-
case "windows":
251-
file += "windows"
252-
}
253-
file += fmt.Sprintf("_x64-host_%s.zip", mode.Name)
254-
engineDownloadURL := fmt.Sprintf("https://github.com/flutter-rs/engine-builds/releases/download/f-%s/%s", requiredEngineVersion, file)
244+
if mode == build.DebugMode {
245+
targetedDomain := "https://storage.googleapis.com"
246+
envURLFlutter := os.Getenv("FLUTTER_STORAGE_BASE_URL")
247+
if envURLFlutter != "" {
248+
targetedDomain = envURLFlutter
249+
}
250+
var engineDownloadURL = fmt.Sprintf(targetedDomain+"/flutter_infra/flutter/%s/%s-x64/", requiredEngineVersion, targetOS)
251+
switch targetOS {
252+
case "darwin":
253+
engineDownloadURL += "FlutterEmbedder.framework.zip"
254+
case "linux":
255+
engineDownloadURL += targetOS + "-x64-embedder"
256+
case "windows":
257+
engineDownloadURL += targetOS + "-x64-embedder.zip"
258+
default:
259+
log.Errorf("Cannot run on %s, download engine not implemented.", targetOS)
260+
os.Exit(1)
261+
}
262+
263+
artifactsZipPath := filepath.Join(dir, "artifacts.zip")
264+
artifactsDownloadURL := fmt.Sprintf(targetedDomain+"/flutter_infra/flutter/%s/%s-x64/artifacts.zip", requiredEngineVersion, targetOS)
265+
266+
err = downloadFile(engineZipPath, engineDownloadURL)
267+
if err != nil {
268+
log.Errorf("Failed to download engine: %v", err)
269+
os.Exit(1)
270+
}
271+
_, err = unzip(engineZipPath, engineExtractPath)
272+
if err != nil {
273+
log.Warnf("%v", err)
274+
}
275+
276+
err = downloadFile(artifactsZipPath, artifactsDownloadURL)
277+
if err != nil {
278+
log.Errorf("Failed to download artifacts: %v", err)
279+
os.Exit(1)
280+
}
281+
_, err = unzip(artifactsZipPath, engineExtractPath)
282+
if err != nil {
283+
log.Warnf("%v", err)
284+
}
285+
if targetOS == "darwin" {
286+
frameworkZipPath := filepath.Join(engineExtractPath, "FlutterEmbedder.framework.zip")
287+
frameworkDestPath := filepath.Join(engineExtractPath, "FlutterEmbedder.framework")
288+
_, err = unzip(frameworkZipPath, frameworkDestPath)
289+
if err != nil {
290+
log.Errorf("Failed to unzip engine framework: %v", err)
291+
os.Exit(1)
292+
}
293+
createSymLink("A", frameworkDestPath+"/Versions/Current")
294+
createSymLink("Versions/Current/FlutterEmbedder", frameworkDestPath+"/FlutterEmbedder")
295+
createSymLink("Versions/Current/Headers", frameworkDestPath+"/Headers")
296+
createSymLink("Versions/Current/Modules", frameworkDestPath+"/Modules")
297+
createSymLink("Versions/Current/Resources", frameworkDestPath+"/Resources")
298+
}
299+
} else {
300+
file := ""
301+
switch targetOS {
302+
case "linux":
303+
file += "linux"
304+
case "darwin":
305+
file += "macosx"
306+
case "windows":
307+
file += "windows"
308+
}
309+
file += fmt.Sprintf("_x64-host_%s.zip", mode.Name)
310+
engineDownloadURL := fmt.Sprintf("https://github.com/flutter-rs/engine-builds/releases/download/f-%s/%s", requiredEngineVersion, file)
311+
312+
err = downloadFile(engineZipPath, engineDownloadURL)
313+
if err != nil {
314+
log.Errorf("Failed to download engine: %v", err)
315+
log.Errorf("Engine builds are a bit delayed after they are published in flutter.")
316+
log.Errorf("You can either try again later or switch the flutter channel to beta, because these engines are more likely to be already built.")
317+
log.Errorf("To dig into the already built engines look at https://github.com/flutter-rs/engine-builds/releases and https://github.com/flutter-rs/engine-builds/actions")
318+
os.Exit(1)
319+
}
320+
_, err = unzip(engineZipPath, engineExtractPath)
321+
if err != nil {
322+
log.Warnf("%v", err)
323+
}
255324

256-
err = downloadFile(engineZipPath, engineDownloadURL)
257-
if err != nil {
258-
log.Errorf("Failed to download engine: %v", err)
259-
log.Errorf("Engine builds are a bit delayed after they are published in flutter.")
260-
log.Errorf("You can either try again later or switch the flutter channel to beta, because these engines are more likely to be already built.")
261-
log.Errorf("To dig into the already built engines look at https://github.com/flutter-rs/engine-builds/releases and https://github.com/flutter-rs/engine-builds/actions")
262-
os.Exit(1)
263-
}
264-
_, err = unzip(engineZipPath, engineExtractPath)
265-
if err != nil {
266-
log.Warnf("%v", err)
267325
}
268326

269327
for _, engineFile := range build.EngineFiles(targetOS, mode) {
@@ -288,11 +346,16 @@ func ValidateOrUpdateEngine(targetOS, cachePath, requiredEngineVersion string, m
288346
}
289347

290348
files := []string{
291-
"dart" + build.ExecutableExtension(targetOS),
292-
"gen_snapshot" + build.ExecutableExtension(targetOS),
293349
"icudtl.dat",
294-
"gen",
295-
"flutter_patched_sdk",
350+
}
351+
if mode != build.DebugMode {
352+
files = append(
353+
files,
354+
"dart"+build.ExecutableExtension(targetOS),
355+
"gen_snapshot"+build.ExecutableExtension(targetOS),
356+
"gen",
357+
"flutter_patched_sdk",
358+
)
296359
}
297360
for _, file := range files {
298361
err = copy.Copy(

0 commit comments

Comments
 (0)