#include "debug.h"
#include "gettext.h"
+#include "support/environment.h"
#include "support/filetools.h"
#include "support/lstrings.h"
#include "support/os.h"
-#include <boost/assert.hpp>
+#if defined (USE_WINDOWS_PACKAGING)
+# include "support/os_win32.h"
+#endif
+
#include <boost/filesystem/operations.hpp>
#include <boost/tuple/tuple.hpp>
#error USE_FOO_PACKAGING must be defined for FOO = WINDOWS, MACOSX or POSIX.
#endif
-#if defined (USE_WINDOWS_PACKAGING)
-# include <windows.h>
-# include <shlobj.h> // SHGetFolderPath
-
- // Needed for MinGW:
-# ifndef SHGFP_TYPE_CURRENT
-# define SHGFP_TYPE_CURRENT 0
-# endif
-
-#elif defined (USE_MACOSX_PACKAGING)
+#if defined (USE_MACOSX_PACKAGING)
# include <CoreServices/CoreServices.h> // FSFindFolder, FSRefMakePath
#endif
void init_package(string const & command_line_arg0,
string const & command_line_system_support_dir,
- string const & command_line_user_support_dir)
+ string const & command_line_user_support_dir,
+ exe_build_dir_to_top_build_dir top_build_dir_location)
{
// Can do so only once.
if (initialised_)
package_ = Package(command_line_arg0,
command_line_system_support_dir,
- command_line_user_support_dir);
+ command_line_user_support_dir,
+ top_build_dir_location);
initialised_ = true;
}
string const abs_path_from_binary_name(string const & exe);
-std::pair<string, string> const get_build_dirs(string const & abs_binary);
+std::pair<string, string> const
+get_build_dirs(string const & abs_binary,
+ exe_build_dir_to_top_build_dir top_build_dir_location);
string const get_document_dir(string const & home_dir);
get_user_support_dir(string const & default_user_support_dir,
string const & command_line_user_support_dir);
+
+string const & with_version_suffix();
+
} // namespace anon
Package::Package(string const & command_line_arg0,
string const & command_line_system_support_dir,
- string const & command_line_user_support_dir)
+ string const & command_line_user_support_dir,
+ exe_build_dir_to_top_build_dir top_build_dir_location)
: explicit_user_support_dir_(false)
{
home_dir_ = get_home_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_build_dirs(abs_binary);
+ get_build_dirs(abs_binary, top_build_dir_location);
if (build_support_dir_.empty())
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'
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 relative_system_support_dir();
-#if defined (USE_WINDOWS_PACKAGING)
-// Given a folder ID, returns the folder name (in unix-style format).
-// Eg CSIDL_PERSONAL -> "C:/Documents and Settings/USERNAME/My Documents"
-string const win32_folder_path(int folder_id)
+std::string const
+get_build_support_dir(std::string const & binary_dir,
+ exe_build_dir_to_top_build_dir top_build_dir_location)
{
- char folder_path[PATH_MAX + 1];
- if (SUCCEEDED(SHGetFolderPath(0, folder_id, 0,
- SHGFP_TYPE_CURRENT, folder_path)))
- return os::internal_path(folder_path);
- return string();
+ string indirection;
+ switch (top_build_dir_location) {
+ case top_build_dir_is_one_level_up:
+ indirection = "../lib";
+ break;
+ case top_build_dir_is_two_levels_up:
+ indirection = "../../lib";
+ break;
+ }
+
+ return normalizePath(addPath(binary_dir, indirection));
}
-#endif
-std::pair<string, string> const get_build_dirs(string const & abs_binary)
+std::pair<string, string> const
+get_build_dirs(string const & abs_binary,
+ exe_build_dir_to_top_build_dir top_build_dir_location)
{
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 =
- NormalizePath(AddPath(binary_dir, "../lib"));
+ 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);
break;
string link;
- if (LyXReadLink(binary, link, true)) {
+ if (readLink(binary, link, true)) {
binary = link;
} else {
// Unable to resolve the link.
{
#if defined (USE_WINDOWS_PACKAGING)
(void)home_dir; // Silence warning about unused variable.
- return win32_folder_path(CSIDL_PERSONAL);
+ os::GetFolderPath win32_folder_path;
+ return win32_folder_path(os::GetFolderPath::PERSONAL);
#else // Posix-like.
return home_dir;
#endif
string const get_home_dir()
{
#if defined (USE_WINDOWS_PACKAGING)
- string const home_dir = GetEnv("USERPROFILE");
+ string const home_dir = getEnv("USERPROFILE");
#else // Posix-like.
- string const home_dir = GetEnv("HOME");
+ string const home_dir = getEnv("HOME");
#endif
return os::internal_path(home_dir);
// 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()));
+ path = normalizePath(addPath(system_support_dir, relative_locale_dir()));
if (fs::exists(path) && fs::is_directory(path))
return path;
{
#if defined (USE_WINDOWS_PACKAGING)
// Typical example: C:/TEMP/.
- char path[PATH_MAX + 1];
- GetTempPath(PATH_MAX, path);
+ char path[MAX_PATH];
+ GetTempPath(MAX_PATH, path);
return os::internal_path(path);
#else // Posix-like.
return "/tmp";
}
-// If we use a 'lazy' lyxerr in the hope of setting the locale before
-// printing any messages, then we should ensure that it is flushed first.
void bail_out()
{
#ifndef CXX_GLOBAL_CSTD
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);
}
// Does the grunt work for abs_path_from_binary_name()
string const get_binary_path(string const & exe)
{
+#if defined (USE_WINDOWS_PACKAGING)
+ // The executable may have been invoked either with or
+ // without the .exe extension.
+ // Ensure that it is present.
+ string const as_internal_path = os::internal_path(exe);
+ string const exe_path = suffixIs(as_internal_path, ".exe") ?
+ as_internal_path : as_internal_path + ".exe";
+#else
string const exe_path = os::internal_path(exe);
+#endif
if (os::is_absolute_path(exe_path))
return exe_path;
// Two possibilities present themselves.
// 1. The binary is relative to the CWD.
- string const abs_exe_path = MakeAbsPath(exe_path);
+ string const abs_exe_path = makeAbsPath(exe_path);
if (fs::exists(abs_exe_path))
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);
- string const exe_path = AddName(exe_dir, exe_name);
+ string const exe_path = addName(exe_dir, exe_name);
if (fs::exists(exe_path))
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)
+ // FIXME UNICODE
+ lyxerr << lyx::to_utf8(bformat(_("Unable to determine the path to the "
+ "LyX binary from the command line %1$s"),
+ lyx::from_utf8(exe)))
<< std::endl;
bail_out();
}
return path;
}
- // 2. Use the "LYX_DIR_13x" environment variable.
- path = extract_env_var_dir("LYX_DIR_13x");
+ // 2. Use the "LYX_DIR_14x" environment variable.
+ path = extract_env_var_dir("LYX_DIR_14x");
if (!path.empty()) {
searched_dirs.push_back(path);
- if (check_env_var_dir(path, chkconfig_ltx, "LYX_DIR_13x"))
+ if (check_env_var_dir(path, chkconfig_ltx, "LYX_DIR_14x"))
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;
}
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".
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_13x to "
- "the LyX system directory containing the file "
- "`chkconfig.ltx'."),
- searched_dirs_str)
+ // FIXME UNICODE
+ lyxerr << lyx::to_utf8(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_14x to "
+ "the LyX system directory containing the file "
+ "`chkconfig.ltx'."),
+ lyx::from_utf8(searched_dirs_str)))
<< std::endl;
bail_out();
if (!path.empty())
return std::make_pair(path, explicit_userdir);
- // 2. Use the LYX_USERDIR_13x environment variable.
- path = extract_env_var_dir("LYX_USERDIR_13x");
+ // 2. Use the LYX_USERDIR_14x environment variable.
+ path = extract_env_var_dir("LYX_USERDIR_14x");
if (!path.empty())
return std::make_pair(path, explicit_userdir);
}
-// $HOME/.lyx on all platforms but Win32 where it will be something like
-// "C:/Documents and Settings/USERNAME/Application Data/lyx"
+// $HOME/.lyx on POSIX but on Win32 it will be something like
+// "C:/Documents and Settings/USERNAME/Application Data/LyX"
string const get_default_user_support_dir(string const & home_dir)
{
#if defined (USE_WINDOWS_PACKAGING)
(void)home_dir; // Silence warning about unused variable.
- return AddPath(win32_folder_path(CSIDL_APPDATA), PACKAGE);
+ os::GetFolderPath win32_folder_path;
+ 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)
+ // FIXME UNICODE
+ lyxerr << lyx::to_utf8(bformat(_("Invalid %1$s switch.\n"
+ "Directory %2$s does not contain %3$s."),
+ lyx::from_utf8(command_line_switch), lyx::from_utf8(dir),
+ lyx::from_utf8(file)))
<< std::endl;
}
// The environment variable @c env_var expands to a (single) file path.
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);
+ string const dir = os::internal_path(getEnv(env_var));
+ return dir.empty() ? dir : makeAbsPath(dir);
}
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)
+ // FIXME UNICODE
+ lyxerr << lyx::to_utf8(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)))
<< std::endl;
}
// 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)
+ lyxerr << lyx::to_utf8(bformat(fmt, lyx::from_utf8(env_var), lyx::from_utf8(dir)))
<< std::endl;
}
// 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
}
string result;
#if defined (USE_WINDOWS_PACKAGING) || defined (USE_MACOSX_PACKAGING)
- result = AddPath("../Resources/", PACKAGE);
+ result = "../Resources/";
#else // Posix-like.
- result = AddPath("../share/", PACKAGE);
+ result = addPath("../share/", PACKAGE);
#endif
return result;