Browse Source

[macOS] Fix self-contained mode, by looking for `._sc_` and writing data to the bundle directory instead of executable directory.

bruvzg 3 years ago
parent
commit
fff3c38af9
2 changed files with 12 additions and 0 deletions
  1. 5 0
      editor/editor_paths.cpp
  2. 7 0
      modules/mono/godotsharp_dirs.cpp

+ 5 - 0
editor/editor_paths.cpp

@@ -91,6 +91,11 @@ EditorPaths::EditorPaths() {
 
 	// Self-contained mode if a `._sc_` or `_sc_` file is present in executable dir.
 	String exe_path = OS::get_singleton()->get_executable_path().get_base_dir();
+
+	// On macOS, look outside .app bundle, since .app bundle is read-only.
+	if (OS::get_singleton()->has_feature("macos") && exe_path.ends_with("MacOS") && exe_path.plus_file("..").simplify_path().ends_with("Contents")) {
+		exe_path = exe_path.plus_file("../../..").simplify_path();
+	}
 	{
 		DirAccessRef d = DirAccess::create_for_path(exe_path);
 

+ 7 - 0
modules/mono/godotsharp_dirs.cpp

@@ -68,7 +68,14 @@ String _get_mono_user_dir() {
 	} else {
 		String settings_path;
 
+		// Self-contained mode if a `._sc_` or `_sc_` file is present in executable dir.
 		String exe_dir = OS::get_singleton()->get_executable_path().get_base_dir();
+
+		// On macOS, look outside .app bundle, since .app bundle is read-only.
+		if (OS::get_singleton()->has_feature("macos") && exe_dir.ends_with("MacOS") && exe_dir.plus_file("..").simplify_path().ends_with("Contents")) {
+			exe_dir = exe_dir.plus_file("../../..").simplify_path();
+		}
+
 		DirAccessRef d = DirAccess::create_for_path(exe_dir);
 
 		if (d->file_exists("._sc_") || d->file_exists("_sc_")) {