]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/relocate.cc
Run `make grand-replace'.
[lilypond.git] / lily / relocate.cc
index 0f01eff06ca554e19bd957180d63df022d6747df..fd6cf85c458f2fbac7dd76ae8c3bae1f8c8b3714 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
@@ -32,7 +32,6 @@
 
 #define FRAMEWORKDIR ".."
 
-
 int
 sane_putenv (char const *key, string value, bool overwrite)
 {
@@ -42,9 +41,15 @@ sane_putenv (char const *key, string value, bool overwrite)
       char *s = strdup (combine.c_str ());
 
       if (be_verbose_global)
-       progress_indication (_f ("Setting %s to %s\n" , key, value.c_str ())); 
+       progress_indication (_f ("Setting %s to %s" , key, value.c_str ())
+                            + "\n");
                             
-      return putenv (s);
+      int retval =  putenv (s);
+      /*
+       unfortunately, we can't portably free S here,
+       due to various bugs in glibc prior to 2.1.1
+      */ 
+      return retval;
     }
   
   return -1;
@@ -92,33 +97,41 @@ prepend_env_path (char const *key, string value)
 #include <winbase.h>
 #endif
 
-void
+static void
 prefix_relocation (string prefix)
 {
-  if (be_verbose_global)
-    warning (_f ("Relocation: compile prefix=%s, new prefix=%s",
-                prefix_directory,
-                prefix.c_str ()));
-  
   string bindir = prefix + "/bin";
   string datadir = prefix + "/share";
   string localedir = datadir + "/locale";
-  string lilypond_datadir = datadir + "/lilypond/";
-
-  if (is_dir (lilypond_datadir + "/" + TOPLEVEL_VERSION))
-    prefix_directory = lilypond_datadir + "/" + TOPLEVEL_VERSION;
-  else if (is_dir (lilypond_datadir + "/current"))
-    prefix_directory = lilypond_datadir + "/current";
-
+  string package_datadir = datadir + "/lilypond/";
+  string old_lilypond_datadir = lilypond_datadir;
+
+  if (is_dir (package_datadir + "/" + TOPLEVEL_VERSION))
+    lilypond_datadir = package_datadir + "/" + TOPLEVEL_VERSION;
+  else if (is_dir (package_datadir + "/current"))
+    lilypond_datadir = package_datadir + "/current";
+  else
+    warning (_f ("not relocating, no %s/ or current/ found under %s",
+                TOPLEVEL_VERSION, package_datadir.c_str ()));
+  
 #if HAVE_GETTEXT
   if (is_dir (localedir))
     bindtextdomain ("lilypond", localedir.c_str ());
 #endif
 
   prepend_env_path ("PATH", bindir);
+
+  if (be_verbose_global)
+    warning (_f ("Relocation: compile datadir=%s, new datadir=%s",
+                old_lilypond_datadir.c_str (),
+                lilypond_datadir.c_str ()));
 }
 
-void
+/*
+  UGH : this is a complete mess.
+*/
+
+static void
 framework_relocation (string prefix)
 {
   if (be_verbose_global)
@@ -129,152 +142,111 @@ framework_relocation (string prefix)
   read_relocation_dir (prefix + "/etc/relocate/");
 
   string bindir = prefix + "/bin";
-
-#ifdef OLD_RELOCATION
-  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));
-  prepend_env_path ("GS_FONTPATH", font_dir);
-#endif
-
-  string gs_version =
-#ifdef GHOSTSCRIPT_VERSION
-    GHOSTSCRIPT_VERSION
-#else
-    "ghostscript-version-undefined"
-#endif
-    ;
-  
-  if (char const *cur = getenv ("LILYPOND_GS_VERSION"))
-    gs_version = cur;
-  
-  prepend_env_path ("GS_FONTPATH", datadir + "/ghostscript/" + gs_version + "/fonts");
-  prepend_env_path ("GS_LIB", datadir + "/ghostscript/" + gs_version + "/Resource");
-  prepend_env_path ("GS_LIB", datadir + "/ghostscript/" + gs_version + "/lib");
-
-  prepend_env_path ("GS_FONTPATH", datadir + "/gs/fonts");
-  prepend_env_path ("GS_LIB", datadir + "/gs/Resource");
-  prepend_env_path ("GS_LIB", datadir + "/gs/lib");
-  
-  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);
-
-#endif
-  
   
   prepend_env_path ("PATH", bindir);
 }
 
+/*
+  UGH : this is a complete mess.
+*/
 void
 setup_paths (char const *argv0_ptr)
 {
   File_name argv0_filename (argv0_ptr);
   
-  prefix_directory = LILYPOND_DATADIR;
-  if (relocate_binary
-      && getenv ("LILYPOND_RELOCATE_PREFIX"))
+  if (relocate_binary)
     {
-      string prefix = getenv ("LILYPOND_RELOCATE_PREFIX");
+      string prefix_directory;
+      if (getenv ("LILYPOND_RELOCATE_PREFIX"))
+       {
+         prefix_directory = getenv ("LILYPOND_RELOCATE_PREFIX");
 #ifdef __MINGW32__
-      /* Normalize file name.  */
-      prefix = File_name (prefix).to_string ();
+         /* Normalize file name.  */
+         prefix_directory = File_name (prefix_directory).to_string ();
 #endif /* __MINGW32__ */
-      prefix_relocation (prefix);
-      string bindir = prefix + "/bin";
-      framework_relocation (bindir);
-    }
-  else if (relocate_binary)
-    {
-      string argv0_abs;
-      if (argv0_filename.is_absolute ())
-       {
-         argv0_abs = argv0_filename.to_string ();
-         if (be_verbose_global)
-           warning (_f ("Relocation: is absolute: argv0=%s", argv0_ptr));
+      
+         prefix_relocation (prefix_directory);
+         string bindir = prefix_directory + "/bin";
+         framework_relocation (bindir);
        }
-      else if (argv0_filename.dir_.length ())
+      else if (relocate_binary)
        {
-         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"));
+         string argv0_abs;
+         if (argv0_filename.is_absolute ())
+           {
+             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 ());
+             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 ().c_str (), argv0_ptr));
+             if (be_verbose_global)
+               warning (_f ("Relocation: from PATH=%s\nargv0=%s",
+                            path.to_string ().c_str (), argv0_ptr));
 
 #ifndef __MINGW32__
-         argv0_abs = path.find (argv0_filename.to_string ());
+             argv0_abs = path.find (argv0_filename.to_string ());
 #else /* __MINGW32__ */
-         char const *ext[] = {"exe", "", 0 };
-         argv0_abs = path.find (argv0_filename.to_string (), ext);
+             char const *ext[] = {"exe", "", 0 };
+             argv0_abs = path.find (argv0_filename.to_string (), ext);
 #endif /* __MINGW32__ */
 
-         if (argv0_abs.empty ())
-           programming_error ("can't find absolute argv0.");
+             if (argv0_abs.empty ())
+               programming_error ("cannot find absolute argv0");
+           }
+
+         string bindir = dir_name (argv0_abs);
+         string argv0_prefix = dir_name (bindir);
+         string compile_prefix = dir_name (dir_name (dir_name (lilypond_datadir)));
+         if (argv0_prefix != compile_prefix)
+           {
+             prefix_relocation (argv0_prefix);
+             prefix_directory = argv0_prefix;
+           }
+         if (argv0_prefix != compile_prefix || string (FRAMEWORKDIR) != "..")
+           {
+             framework_relocation (bindir + "/" + FRAMEWORKDIR);
+             prefix_directory = bindir + "/" + FRAMEWORKDIR;
+           }
        }
 
-      string bindir = dir_name (argv0_abs);
-      string argv0_prefix = dir_name (bindir);
-      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);
+      lilypond_datadir = prefix_directory
+       + "/share/lilypond/" TOPLEVEL_VERSION;
     }
 
-  /* FIXME: use LILYPOND_DATADIR.  */
-  if (char const *env = getenv ("LILYPONDPREFIX"))
-    {
+  if (getenv ("LILYPONDPREFIX"))
+    error (_ ("LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR"));
 
-#ifdef __MINGW32__
+  if (char const *env = getenv ("LILYPOND_DATADIR"))
+    {
       /* Normalize file name.  */
-      prefix_directory = File_name (env).to_string ();
-#else
-      prefix_directory = env;
-#endif
+      lilypond_datadir = File_name (env).to_string ();
     }
 
-  global_path.append ("");
-
-
-  /*
-    When running from build dir, a full LILYPOND_PREFIX is set-up at
-
-        $(OUTBASE)/share/lilypond/TOPLEVEL_VERSION
+  /* When running from build dir, a full LILYPOND_DATADIR is set-up at
+     $(OUTBASE)/{share, lib}/lilypond/current.  Configure lily using
+     ./configure --prefix=$(pwd)/out */
+  string build_datadir_current = dir_name (lilypond_datadir) + "/current";
+  if (!is_dir (lilypond_datadir.c_str ())
+      && is_dir (build_datadir_current.c_str ()))
+    lilypond_datadir = build_datadir_current;
 
-     This historical hack will allow the shorthand
 
-        LILYPONDPREFIX=out lily/out/lilypond ...
-
-  */
-  
-  string build_prefix_current = prefix_directory + "/share/lilypond/" "current";
-  string build_prefix_version = prefix_directory + "/share/lilypond/" TOPLEVEL_VERSION;
-  if (is_dir (build_prefix_version.c_str ()))
-    prefix_directory = build_prefix_version;
-  else if (is_dir (build_prefix_current.c_str ()))
-    prefix_directory = build_prefix_current;
+  lilypond_datadir = File_name (lilypond_datadir).canonicalized().to_string();
   
+  global_path.append ("");
+
   /* Adding mf/out make lilypond unchanged source directory, when setting
      LILYPONDPREFIX to lilypond-x.y.z */
   char const *suffixes[] = {"ly", "ps", "scm", 0 };
@@ -282,26 +254,24 @@ setup_paths (char const *argv0_ptr)
   vector<string> dirs;
   for (char const **s = suffixes; *s; s++)
     {
-      string path = prefix_directory + to_string ('/') + string (*s);
+      string path = lilypond_datadir + to_string ('/') + string (*s);
       dirs.push_back (path);
     }
   
-  dirs.push_back (prefix_directory + "/fonts/otf/");
-  dirs.push_back (prefix_directory + "/fonts/type1/");
-  dirs.push_back (prefix_directory + "/fonts/svg/");
+  dirs.push_back (lilypond_datadir + "/fonts/otf/");
+  dirs.push_back (lilypond_datadir + "/fonts/type1/");
+  dirs.push_back (lilypond_datadir + "/fonts/svg/");
   
   for (vsize i = 0; i < dirs.size (); i++)
     global_path.prepend (dirs[i]);
 }
 
-
-
 string
 expand_environment_variables (string orig)
 {
-  const char *start_ptr = orig.c_str();
-  const char *ptr = orig.c_str();
-  size_t len = orig.length();
+  const char *start_ptr = orig.c_str ();
+  const char *ptr = orig.c_str ();
+  size_t len = orig.length ();
 
   string out;
   while (ptr < start_ptr + len)
@@ -337,7 +307,7 @@ expand_environment_variables (string orig)
            {
              /*
                Hmm. what to do for $1 , $~ etc.?
-              */
+             */
              do
                {
                  end_var ++;
@@ -349,7 +319,7 @@ expand_environment_variables (string orig)
          if (start_var < end_var)
            {
              string var_name (start_var, end_var - start_var);
-             const char *value = getenv (var_name.c_str());
+             const char *value = getenv (var_name.c_str ());
              if (value != NULL)
                out += string (value);
 
@@ -366,15 +336,15 @@ expand_environment_variables (string orig)
   return out;
 }
 
-
-string
+// Ugh - very inefficient, but safer than fgets.
+static string
 read_line (FILE *f)
 {
   string out;
   
   int c = 0;
   while ((c = fgetc (f)) != EOF && c != '\n')
-    out += c;
+    out += char(c);
 
   return out;
 }
@@ -383,12 +353,13 @@ void
 read_relocation_file (string filename)
 {
   if (be_verbose_global)
-    progress_indication (_f ("Relocation file %s\n", filename.c_str ()));
+    progress_indication (_f ("Relocation file: %s", filename.c_str ())
+                        + "\n");
       
   char const *cname = filename.c_str ();
   FILE *f = fopen (cname, "r");
   if (!f)
-    error (_f ("can't open file %s", cname));
+    error (_f ("cannot open file: `%s'", cname));
 
   while (!feof (f))
     {
@@ -410,15 +381,15 @@ read_relocation_file (string filename)
       value = expand_environment_variables (value);
 
       if (command == "set")
-       sane_putenv (variable.c_str(), value, true);
+       sane_putenv (variable.c_str (), value, true);
       else if (command == "setdir")
-       set_env_dir (variable.c_str(), value);
+       set_env_dir (variable.c_str (), value);
       else if (command == "setfile")
-       set_env_file (variable.c_str(), value);
+       set_env_file (variable.c_str (), value);
       else if (command == "prependdir")
        prepend_env_path (variable.c_str (), value);
       else
-       error ( _f("Unknown relocation command %s", command));
+       error (_f ("Unknown relocation command %s", command));
     }
 
   fclose (f);
@@ -427,14 +398,11 @@ read_relocation_file (string filename)
 void
 read_relocation_dir (string dirname)
 {
-  DIR *dir = opendir  (dirname.c_str ());
-
-  while (struct dirent *ent = readdir (dir))
-    {
-      File_name name (ent->d_name);
-      if (name.ext_ == "reloc")
-       {
+  if (DIR *dir = opendir (dirname.c_str ()))
+    while (struct dirent *ent = readdir (dir))
+      {
+       File_name name (ent->d_name);
+       if (name.ext_ == "reloc")
          read_relocation_file (dirname + "/" + name.to_string ());
-       }
-    }
+      }
 }