diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-04-25 11:33:29 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-04-25 11:37:36 +0300 |
commit | f1bc0aeddedacf68182164dde5d4674d11aba6c9 (patch) | |
tree | c1cda109993544429ed279b3c4fab84b69705456 /source | |
parent | 5285de16f3e8f6b29a85eda5d7632a98cd0cddfe (diff) |
Fix (unreported) broken 'get system path' in some cases.
There were two issues here actually:
* The hack to allow running Blender directly from the source directory
would just check for a 'release' directory, without actually ensuring it
is release dir from blender source tree, and not some other random
folder.
* GHOST_getSystemDir returns nothing for portable installations, now
we'll then check directly in the blender binary dir in that case.
This fix is more critical in 2.8 branch, where that system path is used
to retrieve new '3D' icons...
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/appdir.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/appdir.c b/source/blender/blenkernel/intern/appdir.c index 8d4776dca0e..142449b8aeb 100644 --- a/source/blender/blenkernel/intern/appdir.c +++ b/source/blender/blenkernel/intern/appdir.c @@ -298,22 +298,36 @@ static bool get_path_system_dev_build_exception( char *targetpath, size_t targetpath_len, const char *relfolder) { char cwd[FILE_MAX]; + char tmp_path[FILE_MAX]; + bool ret = false; /* Try EXECUTABLE_DIR/release/folder_name. Allows symlinking release folder from source dir. */ if (test_path(targetpath, targetpath_len, bprogdir, "release", relfolder)) { - return true; + ret = true; } /* Try CWD/release/folder_name. Allows executing Blender from any directory * (usually source dir), even without a release dir in bprogdir. */ if (BLI_current_working_dir(cwd, sizeof(cwd))) { if (test_path(targetpath, targetpath_len, cwd, "release", relfolder)) { - return true; + ret = true; } } + + /* Ensure we are in source dir, not in another one that happens to have a release folder. */ + if (ret) { + BLI_join_dirfile(tmp_path, sizeof(tmp_path), bprogdir, + "source" SEP_STR "blender" SEP_STR "blenkernel" SEP_STR "BKE_blender_version.h"); + if (!BLI_is_file(tmp_path)) { + ret = false; + } + } + /* never use if not existing. */ - targetpath[0] = '\0'; + if (!ret) { + targetpath[0] = '\0'; + } - return false; + return ret; } /** @@ -362,10 +376,19 @@ static bool get_path_system( } } - system_base_path = (const char *)GHOST_getSystemDir(ver, blender_version_decimal(ver)); + const char *blender_version_str = blender_version_decimal(ver); + system_base_path = (const char *)GHOST_getSystemDir(ver, blender_version_str); if (system_base_path) BLI_strncpy(system_path, system_base_path, FILE_MAX); - + + /* GHOST_getSystemDir returns nothing in case of portable install, so we try binary directory itself. */ + if (!system_path[0]) { + const char *prog_dir = BKE_appdir_program_dir(); + if (prog_dir != NULL) { + BLI_join_dirfile(system_path, sizeof(system_path), prog_dir, blender_version_str); + } + } + if (!system_path[0]) return false; |