Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <campbell@blender.org>2022-09-08 13:27:03 +0300
committerCampbell Barton <campbell@blender.org>2022-09-08 13:32:57 +0300
commit5e2d139ee30d88b474d3e7d65d5ff37d0be086b6 (patch)
tree160ffc1f82463a185d8011d35feb517bc170873b /source/blender/blenkernel
parent82fc52ffc88142e0fa29335e07595c87c173a3a6 (diff)
Fix Blender as a Python module for WIN32
BKE_appdir_program_path_init would override the module path extracted from the Python module, replacing it with the Python executable. This caused the data files not to be found and the module not to load.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_appdir.h5
-rw-r--r--source/blender/blenkernel/intern/appdir.c22
2 files changed, 18 insertions, 9 deletions
diff --git a/source/blender/blenkernel/BKE_appdir.h b/source/blender/blenkernel/BKE_appdir.h
index dcacc2ca7b3..16488bdbf09 100644
--- a/source/blender/blenkernel/BKE_appdir.h
+++ b/source/blender/blenkernel/BKE_appdir.h
@@ -105,8 +105,11 @@ void BKE_appdir_app_templates(struct ListBase *templates);
/**
* Initialize path to program executable.
+ *
+ * \param strict: When true, use `argv0` unmodified (besides making absolute & normalizing).
+ * Otherwise other methods may be used to find the program path, including searching `$PATH`.
*/
-void BKE_appdir_program_path_init(const char *argv0);
+void BKE_appdir_program_path_init(const char *argv0, bool strict);
/**
* Path to executable
diff --git a/source/blender/blenkernel/intern/appdir.c b/source/blender/blenkernel/intern/appdir.c
index 031d3647878..c19afdb4fb8 100644
--- a/source/blender/blenkernel/intern/appdir.c
+++ b/source/blender/blenkernel/intern/appdir.c
@@ -794,11 +794,11 @@ const char *BKE_appdir_folder_id_version(const int folder_id,
* (must be #FILE_MAX minimum)
* \param name: The name of the executable (usually `argv[0]`) to be checked
*/
-static void where_am_i(char *fullname, const size_t maxlen, const char *name)
+static void where_am_i(char *fullname, const size_t maxlen, const char *name, const bool strict)
{
#ifdef WITH_BINRELOC
/* Linux uses `binreloc` since `argv[0]` is not reliable, call `br_init(NULL)` first. */
- {
+ if (!strict) {
const char *path = NULL;
path = br_find_exe(NULL);
if (path) {
@@ -810,7 +810,7 @@ static void where_am_i(char *fullname, const size_t maxlen, const char *name)
#endif
#ifdef _WIN32
- {
+ if (!strict) {
wchar_t *fullname_16 = MEM_mallocN(maxlen * sizeof(wchar_t), "ProgramPath");
if (GetModuleFileNameW(0, fullname_16, maxlen)) {
conv_utf_16_to_8(fullname_16, fullname, maxlen);
@@ -834,18 +834,24 @@ static void where_am_i(char *fullname, const size_t maxlen, const char *name)
if (name[0] == '.') {
BLI_path_abs_from_cwd(fullname, maxlen);
#ifdef _WIN32
- BLI_path_program_extensions_add_win32(fullname, maxlen);
+ if (!strict) {
+ BLI_path_program_extensions_add_win32(fullname, maxlen);
+ }
#endif
}
else if (BLI_path_slash_rfind(name)) {
/* Full path. */
BLI_strncpy(fullname, name, maxlen);
#ifdef _WIN32
- BLI_path_program_extensions_add_win32(fullname, maxlen);
+ if (!strict) {
+ BLI_path_program_extensions_add_win32(fullname, maxlen);
+ }
#endif
}
else {
- BLI_path_program_search(fullname, maxlen, name);
+ if (!strict) {
+ BLI_path_program_search(fullname, maxlen, name);
+ }
}
/* Remove "/./" and "/../" so string comparisons can be used on the path. */
BLI_path_normalize(NULL, fullname);
@@ -858,9 +864,9 @@ static void where_am_i(char *fullname, const size_t maxlen, const char *name)
}
}
-void BKE_appdir_program_path_init(const char *argv0)
+void BKE_appdir_program_path_init(const char *argv0, const bool strict)
{
- where_am_i(g_app.program_filepath, sizeof(g_app.program_filepath), argv0);
+ where_am_i(g_app.program_filepath, sizeof(g_app.program_filepath), argv0, strict);
BLI_split_dir_part(g_app.program_filepath, g_app.program_dirname, sizeof(g_app.program_dirname));
}