Hi, Diff to fix the previously rather painful handling and discussion with upstream, see [1]. Following mostly the linux example. I'm not sure how critical the whole append_utf8 stuff is, but kept it in line with Linux. I tested it with running commercial games (Road to Vostok, How to Kill a Fly), and with the editor. For the curious, I tested it first with a printf in there, and launching the editor and then a project leads to 9 calls to get_executable_path FYI; running the games only one or 2.
Made a new PR with upstream at [2]. Planning to commit this in the next days if I don't hear objections, but sharing here to see if there is feedback or ok's. [1] https://github.com/godotengine/godot/pull/61540 [2] https://github.com/godotengine/godot/pull/123566 Index: Makefile =================================================================== RCS file: /cvs/ports/games/godot/pack3/Makefile,v diff -u -p -r1.7 Makefile --- Makefile 22 Aug 2026 22:42:44 -0000 1.7 +++ Makefile 16 Sep 2026 21:40:26 -0000 @@ -9,6 +9,7 @@ COMMENT-editor= 2D and 3D game engine (w VERSION = 4.7.2 PKGNAME = godot-${VERSION} DIST_TUPLE += codeberg godotsteam godotsteam v4.5.4 godotsteam +REVISION = 0 MULTI_PACKAGES = -main -editor PKGSPEC-main = godot->=4.5 Index: patches/patch-drivers_unix_os_unix_cpp =================================================================== RCS file: /cvs/ports/games/godot/pack3/patches/patch-drivers_unix_os_unix_cpp,v diff -u -p -r1.2 patch-drivers_unix_os_unix_cpp --- patches/patch-drivers_unix_os_unix_cpp 8 Jul 2026 04:05:53 -0000 1.2 +++ patches/patch-drivers_unix_os_unix_cpp 16 Sep 2026 21:40:26 -0000 @@ -1,65 +1,26 @@ -fix get_executable_path(); backport of -<https://github.com/godotengine/godot/pull/61540>. +get_executable_path(): use getexecpath(3) +https://github.com/godotengine/godot/pull/123566 Index: drivers/unix/os_unix.cpp --- drivers/unix/os_unix.cpp.orig +++ drivers/unix/os_unix.cpp -@@ -1158,12 +1158,6 @@ String OS_Unix::get_executable_path() const { - return OS::get_executable_path(); +@@ -1159,11 +1159,16 @@ String OS_Unix::get_executable_path() const { } return b; --#elif defined(__OpenBSD__) + #elif defined(__OpenBSD__) - char resolved_path[MAXPATHLEN]; -- ++ char buf[PATH_MAX]; ++ String b; + - realpath(OS::get_executable_path().utf8().get_data(), resolved_path); -- ++ if (getexecpath(buf, sizeof(buf)) != 0) { ++ ERR_FAIL_V(vformat("getexecpath error: %d - %s", errno, strerror(errno))); ++ } + - return String(resolved_path); ++ b.append_utf8(buf, strnlen(buf, sizeof(buf))); ++ ++ return b; #elif defined(__NetBSD__) int mib[4] = { CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME }; char buf[MAXPATHLEN]; -@@ -1205,8 +1199,43 @@ String OS_Unix::get_executable_path() const { - - return path; - #else -- ERR_PRINT("Warning, don't know how to obtain executable path on this OS! Please override this function properly."); -- return OS::get_executable_path(); -+ char path[PATH_MAX]; -+ String prog; -+ const char *argv0; -+ char *e, *dup, *t, *entry; -+ -+ prog = OS::get_executable_path(); -+ argv0 = prog.utf8().get_data(); // XXX what if it's not utf8? -+ -+ if (*argv0 == '/' || strncmp(argv0, "./", 2) == 0) { -+ if (realpath(argv0, path) != NULL) -+ return String(path); -+ } -+ -+ if ((e = getenv("PATH")) == NULL) { -+ WARN_PRINT("PATH not defined and argv[0] doesn't seem" -+ " a path"); -+ return prog; -+ } -+ -+ if ((dup = strdup(e)) == NULL) -+ return prog; -+ -+ t = dup; -+ while ((entry = strsep(&t, ":")) != NULL) { -+ int r = snprintf(path, sizeof(path), "%s/%s", -+ entry, argv0); -+ if (r < 0 || (size_t)r >= sizeof(path)) -+ continue; -+ if (access(path, X_OK) == 0) { -+ free(dup); -+ return String(path); -+ } -+ } -+ free(dup); -+ -+ WARN_PRINT("executable path not found!"); -+ return prog; - #endif - } -
