#include "support/environment.h"
#include "support/filetools.h"
#include "support/lstrings.h"
+#include "support/ExceptionMessage.h"
#include "support/os.h"
#if defined (USE_WINDOWS_PACKAGING)
get_user_support_dir(string const & default_user_support_dir,
string const & command_line_user_support_dir);
+
+string const & with_version_suffix();
+
} // namespace anon
: explicit_user_support_dir_(false)
{
home_dir_ = get_home_dir();
- temp_dir_ = get_temp_dir();
+ system_temp_dir_ = get_temp_dir();
+ temp_dir_ = system_temp_dir_;
document_dir_ = get_document_dir(home_dir_);
string const abs_binary = abs_path_from_binary_name(command_line_arg0);
- binary_dir_ = OnlyPath(abs_binary);
+ binary_dir_ = onlyPath(abs_binary);
// Is LyX being run in-place from the build tree?
boost::tie(build_support_dir_, system_support_dir_) =
get_user_support_dir(default_user_support_dir,
command_line_user_support_dir);
+ string const configure_script = addName(system_support(), "configure.py");
+ configure_command_ = os::python() + ' ' + quoteName(configure_script)
+ + with_version_suffix();
+
lyxerr[Debug::INIT]
<< "<package>\n"
<< "\tbinary_dir " << binary_dir() << '\n'
// configuration-time.
string const top_srcdir()
{
- static string const dir("%TOP_SRCDIR%");
+ static string const dir("@TOP_SRCDIR@");
return dir;
}
string const hardcoded_localedir()
{
- return string("%LOCALEDIR%");
+ return string("@LOCALEDIR@");
}
string const hardcoded_system_support_dir()
{
- return string("%LYX_DIR%");
+ return string("@LYX_DIR@");
+}
+
+
+string const & with_version_suffix()
+{
+ static string const program_suffix("@PROGRAM_SUFFIX@");
+ static string const
+ with_version_suffix(" --with-version-suffix=@PROGRAM_SUFFIX@");
+ return program_suffix.empty() ? program_suffix : with_version_suffix;
}
} // namespace anon
string const & Package::top_srcdir() const
{
- static string const dir("%TOP_SRCDIR%");
+ static string const dir("@TOP_SRCDIR@");
return dir;
}
break;
}
- return NormalizePath(AddPath(binary_dir, indirection));
+ return normalizePath(addPath(binary_dir, indirection));
}
{
string const check_text = "Checking whether LyX is run in place...";
- // We're looking for "lyxrc.defaults" in a directory
+ // We're looking for "Makefile" in a directory
// binary_dir/../lib
// We're also looking for "chkconfig.ltx" in a directory
- // binary_dir/top_srcdir()/lib
+ // top_srcdir()/lib
// If both are found, then we're running LyX in-place.
// Note that the name of the lyx binary may be a symbolic link.
string binary = abs_binary;
while (true) {
// Try and find "lyxrc.defaults".
- string const binary_dir = OnlyPath(binary);
+ string const binary_dir = onlyPath(binary);
string const build_support_dir =
get_build_support_dir(binary_dir, top_build_dir_location);
- if (!FileSearch(build_support_dir, "lyxrc.defaults").empty()) {
+ if (!fileSearch(build_support_dir, "Makefile").empty()) {
// Try and find "chkconfig.ltx".
string const system_support_dir =
- MakeAbsPath(AddPath(top_srcdir(), "lib"),
- AddPath(binary_dir, "support"));
+ addPath(top_srcdir(), "lib");
- if (!FileSearch(system_support_dir, "chkconfig.ltx").empty()) {
+ if (!fileSearch(system_support_dir, "chkconfig.ltx").empty()) {
lyxerr[Debug::INIT] << check_text << " yes"
<< std::endl;
return std::make_pair(build_support_dir, system_support_dir);
// Check whether binary is a symbolic link.
// If so, resolve it and repeat the exercise.
- if (!fs::symbolic_link_exists(binary))
+ if (!fs::symbolic_link_exists(FileName(binary).toFilesystemEncoding()))
break;
string link;
- if (LyXReadLink(binary, link, true)) {
+ if (readLink(binary, link, true)) {
binary = link;
} else {
// Unable to resolve the link.
string const get_locale_dir(string const & system_support_dir)
{
// 1. Use the "LYX_LOCALEDIR" environment variable.
- string path = extract_env_var_dir("LYX_LOCALEDIR");
- if (!path.empty() && check_env_var_dir(path, "LYX_LOCALEDIR"))
- return path;
+ string const path_env = extract_env_var_dir("LYX_LOCALEDIR");
+ if (!path_env.empty() && check_env_var_dir(path_env, "LYX_LOCALEDIR"))
+ return path_env;
// 2. Search for system_support_dir / <relative locale dir>
// The <relative locale dir> is OS-dependent. (On Unix, it will
// be "../locale/".)
- path = NormalizePath(AddPath(system_support_dir, relative_locale_dir()));
+ FileName path(normalizePath(addPath(system_support_dir, relative_locale_dir())));
- if (fs::exists(path) && fs::is_directory(path))
- return path;
+ if (fs::exists(path.toFilesystemEncoding()) &&
+ fs::is_directory(path.toFilesystemEncoding()))
+ return path.absFilename();
// 3. Fall back to the hard-coded LOCALEDIR.
- path = hardcoded_localedir();
- if (fs::exists(path) && fs::is_directory(path))
- return path;
+ path = FileName(hardcoded_localedir());
+ if (fs::exists(path.toFilesystemEncoding()) &&
+ fs::is_directory(path.toFilesystemEncoding()))
+ return path.absFilename();
return string();
}
{
#if defined (USE_WINDOWS_PACKAGING)
// Typical example: C:/TEMP/.
- char path[PATH_MAX];
- GetTempPath(PATH_MAX, path);
+ char path[MAX_PATH];
+ GetTempPath(MAX_PATH, path);
return os::internal_path(path);
#else // Posix-like.
return "/tmp";
}
-void bail_out()
-{
-#ifndef CXX_GLOBAL_CSTD
- using std::exit;
-#endif
- exit(1);
-}
-
-
// Extracts the absolute path from the foo of "-sysdir foo" or "-userdir foo"
string const abs_path_from_command_line(string const & command_line)
{
return string();
string const path = os::internal_path(command_line);
- return os::is_absolute_path(path) ? path : MakeAbsPath(path);
+ return os::is_absolute_path(path) ? path : makeAbsPath(path).absFilename();
}
// Two possibilities present themselves.
// 1. The binary is relative to the CWD.
- string const abs_exe_path = MakeAbsPath(exe_path);
- if (fs::exists(abs_exe_path))
+ string const abs_exe_path = makeAbsPath(exe_path).absFilename();
+ if (fs::exists(FileName(abs_exe_path).toFilesystemEncoding()))
return abs_exe_path;
// 2. exe must be the name of the binary only and it
// can be found on the PATH.
- string const exe_name = OnlyFilename(exe_path);
+ string const exe_name = onlyFilename(exe_path);
if (exe_name != exe_path)
return string();
std::vector<string>::const_iterator const end = path.end();
for (; it != end; ++it) {
// This will do nothing if *it is already absolute.
- string const exe_dir = MakeAbsPath(*it);
+ string const exe_dir = makeAbsPath(*it).absFilename();
- string const exe_path = AddName(exe_dir, exe_name);
- if (fs::exists(exe_path))
+ string const exe_path = addName(exe_dir, exe_name);
+ if (fs::exists(FileName(exe_path).toFilesystemEncoding()))
return exe_path;
}
{
string const abs_binary = get_binary_path(exe);
if (abs_binary.empty()) {
- lyxerr << bformat(_("Unable to determine the path to the "
- "LyX binary from the command line %1$s"),
- exe)
- << std::endl;
- bail_out();
+ // FIXME UNICODE
+ throw ExceptionMessage(ErrorException,
+ _("LyX binary not found"),
+ bformat(_("Unable to determine the path to the LyX binary from the command line %1$s"),
+ lyx::from_utf8(exe)));
}
return abs_binary;
}
return path;
}
- // 2. Use the "LYX_DIR_14x" environment variable.
- path = extract_env_var_dir("LYX_DIR_14x");
+ // 2. Use the "LYX_DIR_15x" environment variable.
+ path = extract_env_var_dir("LYX_DIR_15x");
if (!path.empty()) {
searched_dirs.push_back(path);
- if (check_env_var_dir(path, chkconfig_ltx, "LYX_DIR_14x"))
+ if (check_env_var_dir(path, chkconfig_ltx, "LYX_DIR_15x"))
return path;
}
string binary = abs_binary;
while (true) {
// Try and find "chkconfig.ltx".
- string const binary_dir = OnlyPath(binary);
+ string const binary_dir = onlyPath(binary);
string const lyxdir =
- NormalizePath(AddPath(binary_dir, relative_lyxdir));
+ normalizePath(addPath(binary_dir, relative_lyxdir));
searched_dirs.push_back(lyxdir);
- if (!FileSearch(lyxdir, chkconfig_ltx).empty()) {
+ if (!fileSearch(lyxdir, chkconfig_ltx).empty()) {
// Success! "chkconfig.ltx" has been found.
return lyxdir;
}
// Check whether binary is a symbolic link.
// If so, resolve it and repeat the exercise.
- if (!fs::symbolic_link_exists(binary))
+ if (!fs::symbolic_link_exists(FileName(binary).toFilesystemEncoding()))
break;
string link;
- if (LyXReadLink(binary, link, true)) {
+ if (readLink(binary, link, true)) {
binary = link;
} else {
// Unable to resolve the link.
}
// 4. Repeat the exercise on the directory itself.
- string binary_dir = OnlyPath(abs_binary);
+ string binary_dir = onlyPath(abs_binary);
while (true) {
// This time test whether the directory is a symbolic link
// *before* looking for "chkconfig.ltx".
// (We've looked relative to the original already.)
- if (!fs::symbolic_link_exists(binary))
+ if (!fs::symbolic_link_exists(FileName(binary).toFilesystemEncoding()))
break;
string link;
- if (LyXReadLink(binary_dir, link, true)) {
+ if (readLink(binary_dir, link, true)) {
binary_dir = link;
} else {
// Unable to resolve the link.
// Try and find "chkconfig.ltx".
string const lyxdir =
- NormalizePath(AddPath(binary_dir, relative_lyxdir));
+ normalizePath(addPath(binary_dir, relative_lyxdir));
searched_dirs.push_back(lyxdir);
- if (!FileSearch(lyxdir, chkconfig_ltx).empty()) {
+ if (!fileSearch(lyxdir, chkconfig_ltx).empty()) {
// Success! "chkconfig.ltx" has been found.
return lyxdir;
}
// 5. In desparation, try the hard-coded system support dir.
path = hardcoded_system_support_dir();
- if (!FileSearch(path, chkconfig_ltx).empty())
+ if (!fileSearch(path, chkconfig_ltx).empty())
return path;
// Everything has failed :-(
searched_dirs_str += *it;
}
- lyxerr << bformat(_("Unable to determine the system directory "
- "having searched\n"
- "\t%1$s\n"
- "Try the '-sysdir' command line parameter or "
- "set the environment variable LYX_DIR_14x to "
- "the LyX system directory containing the file "
- "`chkconfig.ltx'."),
- searched_dirs_str)
- << std::endl;
-
- bail_out();
+ // FIXME UNICODE
+ throw ExceptionMessage(ErrorException, _("No system directory"),
+ bformat(_("Unable to determine the system directory "
+ "having searched\n"
+ "\t%1$s\n"
+ "Use the '-sysdir' command line parameter or "
+ "set the environment variable LYX_DIR_15x to "
+ "the LyX system directory containing the file "
+ "`chkconfig.ltx'."),
+ lyx::from_utf8(searched_dirs_str)));
+
// Keep the compiler happy.
return string();
}
if (!path.empty())
return std::make_pair(path, explicit_userdir);
- // 2. Use the LYX_USERDIR_14x environment variable.
- path = extract_env_var_dir("LYX_USERDIR_14x");
+ // 2. Use the LYX_USERDIR_15x environment variable.
+ path = extract_env_var_dir("LYX_USERDIR_15x");
if (!path.empty())
return std::make_pair(path, explicit_userdir);
(void)home_dir; // Silence warning about unused variable.
os::GetFolderPath win32_folder_path;
- return AddPath(win32_folder_path(os::GetFolderPath::APPDATA), PACKAGE);
+ return addPath(win32_folder_path(os::GetFolderPath::APPDATA), PACKAGE);
#elif defined (USE_MACOSX_PACKAGING)
(void)home_dir; // Silence warning about unused variable.
if (status_code != 0)
return string();
- return AddPath(reinterpret_cast<char const *>(store), PACKAGE);
+ return addPath(reinterpret_cast<char const *>(store), PACKAGE);
#else // USE_POSIX_PACKAGING
- return AddPath(home_dir, string(".") + PACKAGE);
+ return addPath(home_dir, string(".") + PACKAGE);
#endif
}
string const & file,
string const & command_line_switch)
{
- string const abs_path = FileSearch(dir, file);
+ FileName const abs_path = fileSearch(dir, file);
if (abs_path.empty()) {
- lyxerr << bformat(_("Invalid %1$s switch.\n"
- "Directory %2$s does not contain %3$s."),
- command_line_switch, dir, file)
- << std::endl;
+ // FIXME UNICODE
+ throw ExceptionMessage(WarningException, _("File not found"), bformat(
+ _("Invalid %1$s switch.\nDirectory %2$s does not contain %3$s."),
+ lyx::from_utf8(command_line_switch), lyx::from_utf8(dir),
+ lyx::from_utf8(file)));
}
return !abs_path.empty();
string const extract_env_var_dir(string const & env_var)
{
string const dir = os::internal_path(getEnv(env_var));
- return dir.empty() ? dir : MakeAbsPath(dir);
+ return dir.empty() ? dir : makeAbsPath(dir).absFilename();
}
string const & file,
string const & env_var)
{
- string const abs_path = FileSearch(dir, file);
+ FileName const abs_path = fileSearch(dir, file);
if (abs_path.empty()) {
- lyxerr << bformat(_("Invalid %1$s environment variable.\n"
- "Directory %2$s does not contain %3$s."),
- env_var, dir, file)
- << std::endl;
+ // FIXME UNICODE
+ throw ExceptionMessage(WarningException, _("File not found"), bformat(
+ _("Invalid %1$s environment variable.\n"
+ "Directory %2$s does not contain %3$s."),
+ lyx::from_utf8(env_var), lyx::from_utf8(dir),
+ lyx::from_utf8(file)));
}
return !abs_path.empty();
bool check_env_var_dir(string const & dir,
string const & env_var)
{
- bool const success = (fs::exists(dir) && fs::is_directory(dir));
+ string const encoded(FileName(dir).toFilesystemEncoding());
+ bool const success = (fs::exists(encoded) && fs::is_directory(encoded));
if (!success) {
// Put this string on a single line so that the gettext
// search mechanism in po/Makefile.in.in will register
// package.C.in as a file containing strings that need
// translation.
- string const fmt =
- _("Invalid %1$s environment variable.\n%2$s is not a directory.");
+ // FIXME UNICODE
+ docstring const fmt =
+ _("Invalid %1$s environment variable.\n%2$s is not a directory.");
- lyxerr << bformat(fmt, env_var, dir)
- << std::endl;
+ throw ExceptionMessage(WarningException, _("Directory not found"), bformat(
+ fmt, lyx::from_utf8(env_var), lyx::from_utf8(dir)));
}
return success;
// The locale directory relative to the LyX system directory.
string const relative_locale_dir()
{
+#if defined (USE_WINDOWS_PACKAGING) || defined (USE_MACOSX_PACKAGING)
+ return "locale/";
+#else
return "../locale/";
+#endif
}
#if defined (USE_WINDOWS_PACKAGING) || defined (USE_MACOSX_PACKAGING)
result = "../Resources/";
#else // Posix-like.
- result = AddPath("../share/", PACKAGE);
+ result = addPath("../share/", PACKAGE);
#endif
return result;