diff --git a/src/embedding_wrapper.c b/src/embedding_wrapper.c index e74dbe2f..2394d49d 100644 --- a/src/embedding_wrapper.c +++ b/src/embedding_wrapper.c @@ -37,22 +37,45 @@ jl_value_t *checked_eval_string(const char *code) { void set_depot_load_path(const char *root_dir) { #ifdef _WIN32 + char *path_sep = ";"; char *julia_share_subdir = "\\share\\julia"; #else + char *path_sep = ":"; char *julia_share_subdir = "/share/julia"; #endif - char *share_dir = - calloc(sizeof(char), strlen(root_dir) + strlen(julia_share_subdir) + 1); - strcat(share_dir, root_dir); - strcat(share_dir, julia_share_subdir); + int share_path_len = strlen(root_dir) + strlen(julia_share_subdir) + 1; + + char *curr_depot_path = getenv("JULIA_DEPOT_PATH"); + int curr_depot_path_len = curr_depot_path == NULL ? 0 : strlen(curr_depot_path); + int new_depot_path_len = curr_depot_path_len + 1 + share_path_len; + char *new_depot_path = calloc(sizeof (char), new_depot_path_len); + if (curr_depot_path_len > 0) { + strcat(new_depot_path, curr_depot_path); + strcat(new_depot_path, path_sep); + } + strcat(new_depot_path, root_dir); + strcat(new_depot_path, julia_share_subdir); + + char *curr_load_path = getenv("JULIA_LOAD_PATH"); + int curr_load_path_len = curr_load_path == NULL ? 0 : strlen(curr_load_path); + int new_load_path_len = curr_load_path_len + 1 + share_path_len; + char *new_load_path = calloc(sizeof (char), new_load_path_len); + if (curr_load_path_len > 0) { + strcat(new_load_path, curr_load_path); + strcat(new_load_path, path_sep); + } + strcat(new_load_path, root_dir); + strcat(new_load_path, julia_share_subdir); #ifdef _WIN32 - _putenv_s("JULIA_DEPOT_PATH", share_dir); - _putenv_s("JULIA_LOAD_PATH", share_dir); + _putenv_s("JULIA_DEPOT_PATH", new_depot_path); + _putenv_s("JULIA_LOAD_PATH", new_load_path); #else - setenv("JULIA_DEPOT_PATH", share_dir, 1); - setenv("JULIA_LOAD_PATH", share_dir, 1); + setenv("JULIA_DEPOT_PATH", new_depot_path, 1); + setenv("JULIA_LOAD_PATH", new_load_path, 1); #endif + free(new_load_path); + free(new_depot_path); } // main function (windows UTF16 -> UTF8 argument conversion code copied from diff --git a/src/julia_init.c b/src/julia_init.c index d598f90b..9bbb865a 100644 --- a/src/julia_init.c +++ b/src/julia_init.c @@ -42,23 +42,45 @@ const char *get_sysimage_path(const char *libname) { void set_depot_load_path(const char *root_dir) { #ifdef _WIN32 + char *path_sep = ";"; char *julia_share_subdir = "\\share\\julia"; #else + char *path_sep = ":"; char *julia_share_subdir = "/share/julia"; #endif - char *share_dir = - calloc(sizeof(char), strlen(root_dir) + strlen(julia_share_subdir) + 1); - strcat(share_dir, root_dir); - strcat(share_dir, julia_share_subdir); + int share_path_len = strlen(root_dir) + strlen(julia_share_subdir) + 1; + + char *curr_depot_path = getenv("JULIA_DEPOT_PATH"); + int curr_depot_path_len = curr_depot_path == NULL ? 0 : strlen(curr_depot_path); + int new_depot_path_len = curr_depot_path_len + 1 + share_path_len; + char *new_depot_path = calloc(sizeof (char), new_depot_path_len); + if (curr_depot_path_len > 0) { + strcat(new_depot_path, curr_depot_path); + strcat(new_depot_path, path_sep); + } + strcat(new_depot_path, root_dir); + strcat(new_depot_path, julia_share_subdir); + + char *curr_load_path = getenv("JULIA_LOAD_PATH"); + int curr_load_path_len = curr_load_path == NULL ? 0 : strlen(curr_load_path); + int new_load_path_len = curr_load_path_len + 1 + share_path_len; + char *new_load_path = calloc(sizeof (char), new_load_path_len); + if (curr_load_path_len > 0) { + strcat(new_load_path, curr_load_path); + strcat(new_load_path, path_sep); + } + strcat(new_load_path, root_dir); + strcat(new_load_path, julia_share_subdir); #ifdef _WIN32 - _putenv_s("JULIA_DEPOT_PATH", share_dir); - _putenv_s("JULIA_LOAD_PATH", share_dir); + _putenv_s("JULIA_DEPOT_PATH", new_depot_path); + _putenv_s("JULIA_LOAD_PATH", new_load_path); #else - setenv("JULIA_DEPOT_PATH", share_dir, 1); - setenv("JULIA_LOAD_PATH", share_dir, 1); + setenv("JULIA_DEPOT_PATH", new_depot_path, 1); + setenv("JULIA_LOAD_PATH", new_load_path, 1); #endif - free(share_dir); + free(new_load_path); + free(new_depot_path); } void init_julia(int argc, char **argv) { diff --git a/test/runtests.jl b/test/runtests.jl index 8db26274..8473c2e7 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -110,8 +110,12 @@ end rm(joinpath(new_depot, "compiled"); recursive=true, force=true) rm(joinpath(new_depot, "artifacts"); recursive=true, force=true) end # try + test_load_path = mktempdir() + test_depot_path = mktempdir() app_path(app_name) = abspath(app_compiled_dir, "bin", app_name * (Sys.iswindows() ? ".exe" : "")) - app_output = read(`$(app_path("MyApp")) I get --args áéíóú --julia-args --threads=3 --check-bounds=yes -O1`, String) + app_output = withenv("JULIA_DEPOT_PATH" => test_depot_path, "JULIA_LOAD_PATH" => test_load_path) do + read(`$(app_path("MyApp")) I get --args áéíóú --julia-args --threads=3 --check-bounds=yes -O1`, String) + end # Check stdlib filtering if filter == true @@ -140,6 +144,9 @@ end # Check app is precompiled in a normal process @test occursin("outputo: ok", app_output) @test occursin("myrand: ok", app_output) + # Check env-provided depot and load paths are accepted + @test occursin("DEPOT_PATH = [\"$(escape_string(test_depot_path))", app_output) + @test occursin("LOAD_PATH = [\"$(escape_string(test_load_path))", app_output) # Check distributed @test occursin("n = 20000000", app_output) @test occursin("From worker 2:\t8", app_output)