X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Frelocate.cc;h=a7ee0f01aa9f871bc46cef2db6b05f62eb2e7005;hb=ab685a4504e0aef61caf91085e900e05b6aa0194;hp=0fae879b518249ed4cd0656c9ca27b91faba0b1a;hpb=b3916dc1307dbaad8e50a97aadff8181000344ae;p=lilypond.git diff --git a/lily/relocate.cc b/lily/relocate.cc index 0fae879b51..a7ee0f01aa 100644 --- a/lily/relocate.cc +++ b/lily/relocate.cc @@ -41,12 +41,22 @@ sane_putenv (char const *key, String value, bool overwrite) } static int -set_env_file (char const *key, String value) +set_env_file (char const *key, String value, bool overwrite = false) { if (is_file (value)) + return sane_putenv (key, value, overwrite); + else if (be_verbose_global) + warning (_f ("no such file: %s for %s", value, key)); + return -1; +} + +static int +set_env_dir (char const *key, String value) +{ + if (is_dir (value)) return sane_putenv (key, value, false); else if (be_verbose_global) - warning (_f ("no such file: %s", value)); + warning (_f ("no such directory: %s for %s", value, key)); return -1; } @@ -73,6 +83,9 @@ dir_name (String const file_name) { String s = file_name; s.substitute ('\\', '/'); + int n = s.length (); + if (n && s[n - 1] == '/') + s[n - 1] = 0; s = s.left_string (s.index_last ('/')); return s; } @@ -82,17 +95,16 @@ dir_name (String const file_name) #endif void -set_relocation (String bindir, String prefix) +prefix_relocation (String prefix) { if (be_verbose_global) warning (_f ("Relocation: compile prefix=%s, new prefix=%s", prefix_directory, prefix.to_str0 ())); + String bindir = prefix + "/bin"; String datadir = prefix + "/share"; - String libdir = prefix + "/lib"; String localedir = datadir + "/locale"; - String sysconfdir = prefix + "/etc"; String lilypond_datadir = datadir + "/lilypond/" TOPLEVEL_VERSION; if (is_dir (lilypond_datadir)) @@ -103,7 +115,26 @@ set_relocation (String bindir, String prefix) bindtextdomain ("lilypond", localedir.to_str0 ()); #endif - set_env_file ("FONTCONFIG_FILE", sysconfdir + "/fonts/fonts.conf"); + prepend_env_path ("PATH", bindir); +} + +void +framework_relocation (String prefix) +{ + if (be_verbose_global) + warning (_f ("Relocation: framework_prefix=%s", prefix)); + + String bindir = prefix + "/bin"; + String datadir = prefix + "/share"; + String libdir = prefix + "/lib"; + String sysconfdir = prefix + "/etc"; + + /* need otherwise dynamic .so's aren't found. */ + prepend_env_path ("DYLD_LIBRARY_PATH", libdir); + + set_env_file ("FONTCONFIG_FILE", sysconfdir + "/fonts/fonts.conf", true); + set_env_dir ("FONTCONFIG_PATH", sysconfdir + "/fonts"); + #ifdef __MINGW32__ char font_dir[PATH_MAX]; ExpandEnvironmentStrings ("%windir%/fonts", font_dir, sizeof (font_dir)); @@ -119,13 +150,13 @@ set_relocation (String bindir, String prefix) prepend_env_path ("GS_LIB", datadir + "/gs/Resource"); prepend_env_path ("GS_LIB", datadir + "/gs/lib"); - /* need otherwise dynamic .so's aren't found. */ - prepend_env_path ("DYLD_LIBRARY_PATH", libdir); - prepend_env_path ("GUILE_LOAD_PATH", datadir + to_string ("/guile/%d.%d", SCM_MAJOR_VERSION, SCM_MINOR_VERSION)); + set_env_file ("PANGO_RC_FILE", sysconfdir + "/pango/pangorc"); + set_env_dir ("PANGO_PREFIX", prefix); + prepend_env_path ("PATH", bindir); } @@ -148,25 +179,40 @@ setup_paths (char const *argv0_ptr) && getenv ("LILYPOND_RELOCATE_PREFIX")) { String prefix = getenv ("LILYPOND_RELOCATE_PREFIX"); - /* - fixme: need different sep for mingw? - */ - set_relocation (prefix + "/" + "bin", prefix); +#ifdef __MINGW32__ + /* Normalize file name. */ + prefix = File_name (prefix).to_string ().get_copy_str0 (); +#endif /* __MINGW32__ */ + prefix_relocation (prefix); + String bindir = prefix + "/bin"; + framework_relocation (bindir + "/" FRAMEWORKDIR); } else if (relocate_binary) { String argv0_abs; if (argv0_filename.is_absolute ()) - argv0_abs = argv0_abs; + { + argv0_abs = argv0_filename.to_string (); + if (be_verbose_global) + warning (_f ("Relocation: is absolute: argv0=%s", argv0_ptr)); + } else if (argv0_filename.dir_.length ()) - argv0_abs = get_working_directory () + "/" + String (argv0_filename.to_string ()); + { + argv0_abs = get_working_directory () + + "/" + String (argv0_filename.to_string ()); + if (be_verbose_global) + warning (_f ("Relocation: from cwd: argv0=%s", argv0_ptr)); + } else { /* Find absolute ARGV0 name, using PATH. */ File_path path; path.parse_path (getenv ("PATH")); - + if (be_verbose_global) + warning (_f ("Relocation: from PATH=%s\nargv0=%s", + path.to_string ().get_str0 (), argv0_ptr)); + #ifndef __MINGW32__ String argv0_abs = path.find (argv0_filename.to_string ()); #else /* __MINGW32__ */ @@ -178,11 +224,13 @@ setup_paths (char const *argv0_ptr) programming_error ("can't find absolute argv0."); } - String bindir = dir_name (argv0_abs); String argv0_prefix = dir_name (bindir); - if (argv0_prefix != dir_name (dir_name (dir_name (prefix_directory)))) - set_relocation (bindir, argv0_prefix); + String compile_prefix = dir_name (dir_name (dir_name (prefix_directory))); + if (argv0_prefix != compile_prefix) + prefix_relocation (argv0_prefix); + if (argv0_prefix != compile_prefix || String (FRAMEWORKDIR) != "..") + framework_relocation (bindir + "/" FRAMEWORKDIR); } /* FIXME: use LILYPOND_DATADIR. */