// -*- C++ -*- /** * \file path_defines.C * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * * \author Angus Leeming * * Full author contact details are available in file CREDITS. * * Warning! This file is autogenerated from path_defines.C.in. * All changes to this file will be lost. */ #include #include "path_defines.h" #include "debug.h" #include "gettext.h" #include "FileInfo.h" #include "filetools.h" #include "lstrings.h" #include "os.h" #include "lyxlib.h" using std::string; using std::endl; namespace { // Store for the path to the lyx support files we're actually going to use. string system_lyxdir_; // Store for the path to the autogenerated files when running in place string build_lyxdir_; // Store for the path to the user-level support files. string user_lyxdir_; // Store for the path to the locale directory. string localedir_; /* The absolute path to the system-level lyx support files. * (Make-time value.) */ string const & lyx_dir() { static string const ld = "%LYX_DIR%"; return ld; } } // namespace anon namespace lyx { namespace support { /* The absolute path to the top of the lyx build tree. * (Make-time value.) */ string const & top_srcdir() { static string const lts = "%TOP_SRCDIR%"; return lts; } /* The absolute path to the system-level lyx locale directory. * (Make-time value.) */ string const & lyx_localedir() { static string const ll = "%LOCALEDIR%"; if (localedir_.empty()) return ll; else return localedir_; } string const & build_dir() { static string const bl = "%BUILDDIR%"; return bl; } string const & build_lyxdir() { return build_lyxdir_; } void build_lyxdir(string const & sld) { build_lyxdir_ = sld; } string const & system_lyxdir() { return system_lyxdir_; } void system_lyxdir(string const & sld) { system_lyxdir_ = sld; } string const & user_lyxdir() { return user_lyxdir_; } void user_lyxdir(string const & uld) { user_lyxdir_ = uld; } bool setLyxPaths() { // // Determine path of binary // string binpath = os::binpath(); string binname = os::binname(); string fullbinname = MakeAbsPath(binname, binpath); if (binpath.empty()) { lyxerr << _("Warning: could not determine path of binary.") << "\n" << _("If you have problems, try starting LyX with an absolute path.") << endl; } lyxerr[Debug::INIT] << "Name of binary: " << binname << endl; lyxerr[Debug::INIT] << "Path of binary: " << binpath << endl; string searchpath; // // Determine whether we are running in place and set // build_lyxdir accordingly // string const buildlyxdir = MakeAbsPath("../lib", binpath); if (!FileSearch(buildlyxdir, "lyxrc.defaults").empty()) { searchpath += AddPath(top_srcdir(), "lib") + ';'; build_lyxdir(buildlyxdir); lyxerr[Debug::INIT] << "Checking whether LyX is run in " "place... yes" << endl; } else { lyxerr[Debug::INIT] << "Checking whether LyX is run in place... no" << endl; } // // Determine system directory. // // Directories are searched in this order: // 1) -sysdir command line parameter // 2) LYX_DIR_14x environment variable // 3) Maybe /TOP_SRCDIR/lib // 4) /../Resources// [for LyX/Mac] // 5) /../share// // 5a) repeat 4 after following the Symlink if is a symbolic link. // 6) hardcoded lyx_dir // The directory is checked for the presence of the file // "chkconfig.ltx", and if that is present, the directory // is accepted as the system directory. // If no chkconfig.ltx file is found, a warning is given, // and the hardcoded lyx_dir is used. // If we had a command line switch, system_lyxdir_ is already set if (!system_lyxdir_.empty()) searchpath = MakeAbsPath(system_lyxdir_) + ';'; string const lyxdir = GetEnvPath("LYX_DIR_14x"); if (!lyxdir.empty()) { lyxerr[Debug::INIT] << "LYX_DIR_14x: " << lyxdir << endl; searchpath += lyxdir + ';'; } // Path of binary/../Resources/ searchpath += NormalizePath(AddPath(binpath, "../Resources/") + OnlyFilename(binname)) + ';'; string fullbinpath = binpath; FileInfo file(fullbinname, true); if (file.isLink()) { lyxerr[Debug::INIT] << "binary is a link" << endl; string link; if (LyXReadLink(fullbinname, link, true)) { // Path of binary/../share/name of binary/ searchpath += NormalizePath(AddPath(binpath, "../share/") + OnlyFilename(binname)); searchpath += ';'; fullbinpath = link; binpath = MakeAbsPath(OnlyPath(fullbinpath)); } } bool followlink; do { // Path of binary/../share/name of binary/ searchpath += NormalizePath(AddPath(binpath, "../share/") + OnlyFilename(binname)) + ';'; // Follow Symlinks FileInfo file(fullbinpath, true); followlink = file.isLink(); if (followlink) { lyxerr[Debug::INIT] << " directory " << fullbinpath << " is a link" << endl; string link; if (LyXReadLink(fullbinpath, link, true)) { fullbinpath = link; binpath = MakeAbsPath(OnlyPath(fullbinpath)); } else { followlink = false; } } } while (followlink); // /lib searchpath += AddPath(top_srcdir(), "lib") + ';'; // Hardcoded dir searchpath += lyx_dir(); lyxerr[Debug::INIT] << "System directory search path: " << searchpath << endl; string const filename = "chkconfig.ltx"; string const temp = FileOpenSearch(searchpath, filename, string()); system_lyxdir_ = OnlyPath(temp); // Reduce "path/../path" stuff out of system directory system_lyxdir_ = NormalizePath(system_lyxdir_); bool path_shown = false; // Warn if environment variable is set, but unusable if (!lyxdir.empty()) { if (system_lyxdir_ != NormalizePath(lyxdir)) { lyxerr <<_("LYX_DIR_14x environment variable no good.") << '\n' << _("System directory set to: ") << system_lyxdir_ << endl; path_shown = true; } } // Warn the user if we couldn't find "chkconfig.ltx" if (system_lyxdir_ == "./") { lyxerr <<_("LyX Warning! Couldn't determine system directory. ") <<_("Try the '-sysdir' command line parameter or ") <<_("set the environment variable LYX_DIR_14x to the " "LyX system directory ") << _("containing the file `chkconfig.ltx'.") << endl; if (!path_shown) { FileInfo fi(lyx_dir()); if (!fi.exist()) { lyxerr << "Couldn't even find the default LYX_DIR." << endl << "Giving up." << endl; exit(1); } lyxerr << bformat(_("Using built-in default %1$s but expect problems."), lyx_dir()) << endl; } else { lyxerr << _("Expect problems.") << endl; } system_lyxdir_ = lyx_dir(); path_shown = true; } if (!path_shown) lyxerr[Debug::INIT] << "System directory: '" << system_lyxdir_ << '\'' << endl; // This is true when we are running from a Mac OS X bundle // (for LyX/Mac) bool const inOSXBundle = system_lyxdir_ == NormalizePath(AddPath(binpath, "../Resources/") + OnlyFilename(binname)); if (inOSXBundle) lyxerr[Debug::INIT] << "Running from LyX/Mac bundle." << endl; // // Set PATH for LyX/Mac // LyX/Mac is a relocatable application bundle; here we add to // the PATH so it can find binaries like reLyX inside its own // application bundle, and also append PATH elements that it // needs to run latex, previewers, etc. // if (inOSXBundle) { const string newpath = GetEnv("PATH") + ":" + binpath + ":/sw/bin:/usr/local/bin" + ":/usr/local/teTeX/bin/powerpc-apple-darwin-current"; lyx::support::putenv("PATH", newpath); lyxerr[Debug::INIT] << "LyX/Mac: setting PATH to: " << GetEnv("PATH") << endl; } // // Determine locale directory // if (!GetEnv("LYX_LOCALEDIR").empty()) { localedir_ = GetEnv("LYX_LOCALEDIR"); lyxerr[Debug::INIT] << "LYX_LOCALEDIR=" << localedir_ << endl; } else if (inOSXBundle) { string const maybe_localedir = NormalizePath(AddPath(system_lyxdir_, "../locale")); FileInfo fi(maybe_localedir); if (fi.isOK() && fi.isDir()) { lyxerr[Debug::INIT] << "LyX/Mac: setting locale directory to " << maybe_localedir << endl; localedir_ = maybe_localedir; } } // // Determine user lyx-dir // // Directories are searched in this order: // 1) -userdir command line parameter // 2) LYX_USERDIR_14x environment variable // 3) $HOME/. // If we had a command line switch, user_lyxdir_ is already set bool explicit_userdir = true; if (user_lyxdir_.empty()) { // LYX_USERDIR_14x environment variable user_lyxdir_ = GetEnvPath("LYX_USERDIR_14x"); // default behaviour if (user_lyxdir_.empty()) if (inOSXBundle) user_lyxdir_ = AddPath(GetEnvPath("HOME"), "Library/Preferences/LyX"); else user_lyxdir_ = AddPath(GetEnvPath("HOME"), string(".") + PACKAGE); explicit_userdir = false; } lyxerr[Debug::INIT] << "User LyX directory: '" << user_lyxdir_ << '\'' << endl; return explicit_userdir; } } // namespace support } // namespace lyx