]> git.lyx.org Git - features.git/commitdiff
Rename version.C.in to version.cpp.in, and Package.C.in to package.cpp.in
authorBo Peng <bpeng@lyx.org>
Sat, 28 Apr 2007 15:05:08 +0000 (15:05 +0000)
committerBo Peng <bpeng@lyx.org>
Sat, 28 Apr 2007 15:05:08 +0000 (15:05 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18074 a592a061-630c-0410-9148-cb99ea01b6c8

12 files changed:
configure.ac
development/cmake/src/CMakeLists.txt
development/cmake/src/support/CMakeLists.txt
development/scons/SConstruct
po/Makefile.in.in
po/POTFILES.in
src/Makefile.am
src/support/Makefile.am
src/support/Package.C.in [deleted file]
src/support/Package.cpp.in [new file with mode: 0644]
src/version.C.in [deleted file]
src/version.cpp.in [new file with mode: 0644]

index 4bed38db1a41a907f4c22399204f1a06f61f3a36..854dc3d0f35f2e6f6c262f2a7e6d22118ac06b3b 100644 (file)
@@ -417,7 +417,7 @@ AC_CONFIG_FILES([Makefile  m4/Makefile \
        sourcedoc/Makefile \
        src/client/Makefile \
        src/Makefile \
-       src/version.C-tmp:src/version.C.in \
+       src/version.C-tmp:src/version.cpp.in \
        src/tex2lyx/Makefile \
        src/mathed/Makefile \
        src/graphics/Makefile \
index e310bf3df1f5ba6c8745fbea8738bb3f81858f9b..1ec22a98dcd88546f3ae3932f190bfed88254bf3 100644 (file)
@@ -18,7 +18,7 @@ if(NOT MERGE_FILES)
 endif(NOT MERGE_FILES)
 
 
-configure_file(${TOP_SRC_DIR}/src/version.C.in ${CMAKE_CURRENT_BINARY_DIR}/version.C)
+configure_file(${TOP_SRC_DIR}/src/version.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/version.C)
 
 file(GLOB lyx_sources ${TOP_SRC_DIR}/src/${LYX_CPP_FILES})
 file(GLOB lyx_headers ${TOP_SRC_DIR}/src/${LYX_HPP_FILES})
index fb513b9effbc2b5192ce8d4a870b2ffa3a90d1e3..a91e2874812c410ac69483d46eea5f26d4743511 100644 (file)
@@ -6,7 +6,7 @@
 
 project(support)
 
-configure_file(${TOP_SRC_DIR}/src/support/Package.C.in 
+configure_file(${TOP_SRC_DIR}/src/support/Package.cpp.in 
                ${CMAKE_CURRENT_BINARY_DIR}/package.C)
 
 file(GLOB support_sources ${TOP_SRC_DIR}/src/support/${LYX_CPP_FILES})
index f4b81eb6142f3b2d57ddd4a63908d8e2412e3361..2107b5963f06d1308cd7c517a19e45becd8124df 100644 (file)
@@ -362,17 +362,17 @@ env.AppendUnique(LIBPATH = ['$LOCALLIBPATH'])
 # 3. compiler commands and flags like CCFLAGS.
 #     MSGFMT used to process po files
 # 4. Variables that will be used to replace variables in some_file.in
-#     src/support/Package.C.in:
+#     src/support/Package.cpp.in:
 #       TOP_SRCDIR, LOCALEDIR, LYX_DIR, PROGRAM_SUFFIX
 #     lib/lyx2lyx/lyx2lyx_version.py.in
 #       PACKAGE_VERSION
-#     src/version.C.in
+#     src/version.cpp.in
 #       PACKAGE_VERSION, LYX_DATE, VERSION_INFO
 
 # full path name is used to build msvs project files
 # and to replace TOP_SRCDIR in package.C
 env['TOP_SRCDIR'] = Dir(top_src_dir).abspath
-# needed by src/version.C.in => src/version.C
+# needed by src/version.cpp.in => src/version.C
 env['PACKAGE_VERSION'] = package_version
 env['LYX_DATE'] = time.asctime()
 
@@ -400,12 +400,12 @@ if env.has_key('version_suffix'):
         program_suffix = env['version_suffix']
 else:
     program_suffix = ''
-# used by Package.C.in
+# used by Package.cpp.in
 env['PROGRAM_SUFFIX'] = program_suffix
 
 # whether or not add suffix to file and directory names
 add_suffix = packaging_method != 'windows'
-# LYX_DIR are different (used in Package.C.in)
+# LYX_DIR are different (used in Package.cpp.in)
 if add_suffix:
     env['LYX_DIR'] = Dir(os.path.join(prefix, share_dir + program_suffix)).abspath
 else:
@@ -1639,7 +1639,7 @@ if build_support:
     print "Processing files in src/support..."
 
     frontend_env.Depends('$BUILDDIR/common/support/package.C', '$BUILDDIR/common/config.h')
-    env.substFile('$BUILDDIR/common/support/package.C', '$TOP_SRCDIR/src/support/Package.C.in')
+    env.substFile('$BUILDDIR/common/support/package.C', '$TOP_SRCDIR/src/support/Package.cpp.in')
 
     support = frontend_env.StaticLibrary(
         target = '$LOCALLIBPATH/support',
@@ -1821,7 +1821,7 @@ if build_lyxbase:
     print "Processing files in src..."
 
     env.Depends('$BUILDDIR/common/version.C', '$BUILDDIR/common/config.h')
-    env.substFile('$BUILDDIR/common/version.C', '$TOP_SRCDIR/src/version.C.in')
+    env.substFile('$BUILDDIR/common/version.C', '$TOP_SRCDIR/src/version.cpp.in')
 
     if env.has_key('USE_ASPELL') and env['USE_ASPELL']:
         src_post_files.append('ASpell.cpp')
index c9ac36567b3663d57a8f74d8122e81a7f56268f8..11daa1a0dd0a09bd670d71690473f1befc371dc3 100644 (file)
@@ -371,8 +371,8 @@ ${srcdir}/POTFILES.in: $(POTFILE_IN_DEPS)
        LC_ALL=C ; export LC_ALL ; \
        rm -f $@-t \
        && ( cd $(top_srcdir); \
-            grep -l "_(\".*\")" `find src \( -name '*.[ch]' -o -name '*.cpp' -o -name '*.C.in' \) -print` |\
-            grep -v -e "src/support/package.C$$" |\
+            grep -l "_(\".*\")" `find src \( -name '*.[ch]' -o -name '*.cpp' -o -name '*.cpp.in' \) -print` |\
+            grep -v -e "src/support/Package.cpp$$" |\
             sort | uniq ) > $@-t \
        && mv $@-t $@
 
index e3d7cfc59642ab505c4183a7d5880900075d33bd..a50bff47cc59bee4a29a65cf4fdb9135f993bc79 100644 (file)
@@ -134,7 +134,7 @@ src/output.cpp
 src/output_plaintext.cpp
 src/rowpainter.cpp
 src/support/FileFilterList.cpp
-src/support/Package.C.in
+src/support/Package.cpp.in
 src/support/os_win32.cpp
 src/support/userinfo.cpp
 src/tex-strings.cpp
index abc4820e31eaaf093aad23498fee432beea10e0d..8301b8913534f47ad60782b4277b5be68d58704a 100644 (file)
@@ -10,7 +10,7 @@ endif
 
 SUBDIRS = mathed insets graphics support frontends . $(CLIENT) tex2lyx
 
-EXTRA_DIST = config.h.in stamp-h.in version.C.in \
+EXTRA_DIST = config.h.in stamp-h.in version.cpp.in \
        Section.h \
        Section.cpp \
        Variables.cpp \
index 2b1e3d04759e34c181e3f7a9a720b8ed3d719b32..598c3fb99617edd5a74a649408cbf4a045c9906b 100644 (file)
@@ -4,7 +4,7 @@ SUBDIRS = . tests
 
 CLEANFILES += $(BUILT_SOURCES)
 
-EXTRA_DIST = Package.C.in pch.h \
+EXTRA_DIST = Package.cpp.in pch.h \
        os_cygwin.cpp os_unix.cpp os_win32.cpp os_win32.h
 
 noinst_LTLIBRARIES = libsupport.la
@@ -92,13 +92,13 @@ libsupport_la_SOURCES = \
 package.C: build_package
 
 # Solaris sed does not like spaces bewteen the ;-delimited commands
-build_package: Package.C.in
+build_package: Package.cpp.in
        @rm -f tmp_package ;\
        sed "s,@LYX_DIR@,$(LYX_ABS_INSTALLED_DATADIR),;\
 s,@LOCALEDIR@,$(LYX_ABS_INSTALLED_LOCALEDIR),;\
 s,@TOP_SRCDIR@,$(LYX_ABS_TOP_SRCDIR),;\
 s,@PROGRAM_SUFFIX@,$(program_suffix)," \
-               $(srcdir)/Package.C.in > tmp_package ;\
+               $(srcdir)/Package.cpp.in > tmp_package ;\
        if cmp -s tmp_package package.C ; then \
                rm -f tmp_package ;\
        else \
diff --git a/src/support/Package.C.in b/src/support/Package.C.in
deleted file mode 100644 (file)
index c72bd79..0000000
+++ /dev/null
@@ -1,745 +0,0 @@
-// -*- C++ -*-
-/**
- * \file package.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 Package.C.in.
- * All changes to this file will be lost.
- */
-
-#include <config.h>
-
-#include "support/Package.h"
-
-#include "debug.h"
-#include "gettext.h"
-
-#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)
-# include "support/os_win32.h"
-#endif
-
-#include <boost/filesystem/operations.hpp>
-#include <boost/tuple/tuple.hpp>
-
-#include <list>
-#include <utility>
-
-#if !defined (USE_WINDOWS_PACKAGING) && \
-    !defined (USE_MACOSX_PACKAGING) && \
-    !defined (USE_POSIX_PACKAGING)
-#error USE_FOO_PACKAGING must be defined for FOO = WINDOWS, MACOSX or POSIX.
-#endif
-
-#if defined (USE_MACOSX_PACKAGING)
-# include <CoreServices/CoreServices.h> // FSFindFolder, FSRefMakePath
-#endif
-
-using std::string;
-
-namespace fs = boost::filesystem;
-
-namespace lyx {
-namespace support {
-
-namespace {
-
-Package package_;
-bool initialised_ = false;
-
-} // namespace anon
-
-
-void init_package(string const & command_line_arg0,
-                 string const & command_line_system_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_)
-               return;
-
-       package_ = Package(command_line_arg0,
-                          command_line_system_support_dir,
-                          command_line_user_support_dir,
-                          top_build_dir_location);
-       initialised_ = true;
-}
-
-
-Package const & package()
-{
-       // Commented out because package().locale_dir() can be called
-       // from the message translation code in Messages.cpp before
-       // init_package() is called. Lars is on the case...
-       // BOOST_ASSERT(initialised_);
-       return package_;
-}
-
-
-namespace {
-
-FileName const abs_path_from_binary_name(string const & exe);
-
-std::pair<FileName, FileName> const
-get_build_dirs(FileName const & abs_binary,
-              exe_build_dir_to_top_build_dir top_build_dir_location);
-
-FileName const get_document_dir(FileName const & home_dir);
-
-FileName const get_home_dir();
-
-FileName const get_locale_dir(FileName const & system_support_dir);
-
-FileName const get_system_support_dir(FileName const & abs_binary,
-                                   string const & command_line_system_support_dir);
-
-FileName const get_temp_dir();
-
-FileName const get_default_user_support_dir(FileName const & home_dir);
-
-std::pair<FileName, bool> const
-get_user_support_dir(FileName 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,
-                exe_build_dir_to_top_build_dir top_build_dir_location)
-       : explicit_user_support_dir_(false)
-{
-       home_dir_ = get_home_dir();
-       system_temp_dir_ = get_temp_dir();
-       temp_dir_ = system_temp_dir_;
-       document_dir_ = get_document_dir(home_dir_);
-
-       FileName const abs_binary = abs_path_from_binary_name(command_line_arg0);
-       binary_dir_ = FileName(onlyPath(abs_binary.absFilename()));
-
-       // Is LyX being run in-place from the build tree?
-       boost::tie(build_support_dir_, system_support_dir_) =
-               get_build_dirs(abs_binary, top_build_dir_location);
-
-       if (build_support_dir_.empty())
-               system_support_dir_ =
-                       get_system_support_dir(abs_binary,
-                                              command_line_system_support_dir);
-
-       locale_dir_ = get_locale_dir(system_support_dir_);
-
-       FileName const default_user_support_dir =
-               get_default_user_support_dir(home_dir_);
-       boost::tie(user_support_dir_, explicit_user_support_dir_) =
-               get_user_support_dir(default_user_support_dir,
-                                    command_line_user_support_dir);
-
-       FileName const configure_script(addName(system_support().absFilename(), "configure.py"));
-       configure_command_ = os::python() + ' ' +
-                       quoteName(configure_script.toFilesystemEncoding()) +
-                       with_version_suffix();
-
-       lyxerr[Debug::INIT]
-               << "<package>\n"
-               << "\tbinary_dir " << binary_dir().absFilename() << '\n'
-               << "\tsystem_support " << system_support().absFilename() << '\n'
-               << "\tbuild_support " << build_support().absFilename() << '\n'
-               << "\tuser_support " << user_support().absFilename() << '\n'
-               << "\tlocale_dir " << locale_dir().absFilename() << '\n'
-               << "\tdocument_dir " << document_dir().absFilename() << '\n'
-               << "\ttemp_dir " << temp_dir().absFilename() << '\n'
-               << "\thome_dir " << home_dir().absFilename() << '\n'
-               << "</package>\n" << std::endl;
-}
-
-
-namespace {
-
-// These next functions contain the stuff that is substituted at
-// configuration-time.
-FileName const hardcoded_localedir()
-{
-       // FIXME UNICODE
-       // The build system needs to make sure that this is in utf8 encoding.
-       return FileName("@LOCALEDIR@");
-}
-
-
-FileName const hardcoded_system_support_dir()
-{
-       // FIXME UNICODE
-       // The build system needs to make sure that this is in utf8 encoding.
-       return FileName("@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
-
-
-FileName const & Package::top_srcdir()
-{
-       // FIXME UNICODE
-       // The build system needs to make sure that this is in utf8 encoding.
-       static FileName const dir("@TOP_SRCDIR@");
-       return dir;
-}
-
-
-namespace {
-
-bool check_command_line_dir(string const & dir,
-                           string const & file,
-                           string const & command_line_switch);
-
-FileName const extract_env_var_dir(string const & env_var);
-
-bool check_env_var_dir(FileName const & dir,
-                      string const & env_var);
-
-bool check_env_var_dir(FileName const & dir,
-                      string const & file,
-                      string const & env_var);
-
-string const relative_locale_dir();
-
-string const relative_system_support_dir();
-
-
-/**
- * Convert \p name to internal path and strip a trailing slash, since it
- * comes from user input (commandline or environment).
- * \p name is encoded in utf8.
- */
-string const fix_dir_name(string const & name)
-{
-       return rtrim(os::internal_path(name), "/");
-}
-
-
-FileName const
-get_build_support_dir(string const & binary_dir,
-                     exe_build_dir_to_top_build_dir top_build_dir_location)
-{
-       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 FileName(normalizePath(addPath(binary_dir, indirection)));
-}
-
-
-std::pair<FileName, FileName> const
-get_build_dirs(FileName 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 "Makefile" in a directory
-       //   binary_dir/../lib
-       // We're also looking for "chkconfig.ltx" in a directory
-       //   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.
-       // If that is the case, then we follow the links too.
-       FileName binary = abs_binary;
-       while (true) {
-               // Try and find "lyxrc.defaults".
-               string const binary_dir = onlyPath(binary.absFilename());
-               FileName const build_support_dir =
-                       get_build_support_dir(binary_dir, top_build_dir_location);
-
-               if (!fileSearch(build_support_dir.absFilename(), "Makefile").empty()) {
-                       // Try and find "chkconfig.ltx".
-                       string const system_support_dir =
-                               addPath(Package::top_srcdir().absFilename(), "lib");
-
-                       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.toFilesystemEncoding()))
-                       break;
-
-               FileName link;
-               if (readLink(binary, link)) {
-                       binary = link;
-               } else {
-                       // Unable to resolve the link.
-                       break;
-               }
-       }
-
-       lyxerr[Debug::INIT] << check_text << " no" << std::endl;
-       return std::make_pair(FileName(), FileName());
-}
-
-
-// Specification of document_dir_ may be reset by LyXRC,
-// but the default is fixed for a given OS.
-FileName const get_document_dir(FileName const & home_dir)
-{
-#if defined (USE_WINDOWS_PACKAGING)
-       (void)home_dir; // Silence warning about unused variable.
-       os::GetFolderPath win32_folder_path;
-       return FileName(win32_folder_path(os::GetFolderPath::PERSONAL));
-#else // Posix-like.
-       return home_dir;
-#endif
-}
-
-
-// The specification of home_dir_ is fixed for a given OS.
-// A typical example on Windows: "C:/Documents and Settings/USERNAME"
-// and on a Posix-like machine: "/home/USERNAME".
-FileName const get_home_dir()
-{
-#if defined (USE_WINDOWS_PACKAGING)
-       string const home_dir = getEnv("USERPROFILE");
-#else // Posix-like.
-       string const home_dir = getEnv("HOME");
-#endif
-
-       return FileName(fix_dir_name(home_dir));
-}
-
-
-// Several sources are probed to ascertain the locale directory.
-// The only requirement is that the result is indeed a directory.
-FileName const get_locale_dir(FileName const & system_support_dir)
-{
-       // 1. Use the "LYX_LOCALEDIR" environment variable.
-       FileName 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/".)
-       FileName path(normalizePath(addPath(system_support_dir.absFilename(),
-                                           relative_locale_dir())));
-
-       if (fs::exists(path.toFilesystemEncoding()) &&
-           fs::is_directory(path.toFilesystemEncoding()))
-               return path;
-
-       // 3. Fall back to the hard-coded LOCALEDIR.
-       path = hardcoded_localedir();
-       if (fs::exists(path.toFilesystemEncoding()) &&
-           fs::is_directory(path.toFilesystemEncoding()))
-               return path;
-
-       return FileName();
-}
-
-
-// Specification of temp_dir_ may be reset by LyXRC,
-// but the default is fixed for a given OS.
-FileName const get_temp_dir()
-{
-#if defined (USE_WINDOWS_PACKAGING)
-       // Typical example: C:/TEMP/.
-       char path[MAX_PATH];
-       GetTempPath(MAX_PATH, path);
-       return FileName(os::internal_path(to_utf8(from_local8bit(path))));
-#else // Posix-like.
-       return FileName("/tmp");
-#endif
-}
-
-
-// Extracts the absolute path from the foo of "-sysdir foo" or "-userdir foo"
-FileName const abs_path_from_command_line(string const & command_line)
-{
-       if (command_line.empty())
-               return FileName();
-
-       string const path = fix_dir_name(command_line);
-       return os::is_absolute_path(path) ? FileName(path) : makeAbsPath(path);
-}
-
-
-// Does the grunt work for abs_path_from_binary_name()
-FileName 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 FileName(exe_path);
-
-       // Two possibilities present themselves.
-       // 1. The binary is relative to the CWD.
-       FileName const abs_exe_path = makeAbsPath(exe_path);
-       if (fs::exists(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);
-       if (exe_name != exe_path)
-               return FileName();
-
-       std::vector<string> const path = getEnvPath("PATH");
-       std::vector<string>::const_iterator it = path.begin();
-       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).absFilename();
-
-               FileName const exe_path(addName(exe_dir, exe_name));
-               if (fs::exists(exe_path.toFilesystemEncoding()))
-                       return exe_path;
-       }
-
-       // Didn't find anything.
-       return FileName();
-}
-
-
-// Extracts the absolute path to the binary name received as argv[0].
-FileName const abs_path_from_binary_name(string const & exe)
-{
-       FileName const abs_binary = get_binary_path(exe);
-       if (abs_binary.empty()) {
-               // 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"),
-                               from_utf8(exe)));
-       }
-       return abs_binary;
-}
-
-
-// A plethora of directories is searched to ascertain the system
-// lyxdir which is defined as the first directory to contain
-// "chkconfig.ltx".
-FileName const
-get_system_support_dir(FileName const & abs_binary,
-                 string const & command_line_system_support_dir)
-{
-       string const chkconfig_ltx = "chkconfig.ltx";
-
-       // searched_dirs is used for diagnostic purposes only in the case
-       // that "chkconfig.ltx" is not found.
-       std::list<FileName> searched_dirs;
-
-       // 1. Use the -sysdir command line parameter.
-       FileName path = abs_path_from_command_line(command_line_system_support_dir);
-       if (!path.empty()) {
-               searched_dirs.push_back(path);
-               if (check_command_line_dir(path.absFilename(), chkconfig_ltx, "-sysdir"))
-                       return path;
-       }
-
-       // 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_15x"))
-                       return path;
-       }
-
-       // 3. Search relative to the lyx binary.
-       // We're looking for "chkconfig.ltx" in a directory
-       //   OnlyPath(abs_binary) / <relative dir> / PACKAGE /
-       // PACKAGE is hardcoded in config.h. Eg "lyx" or "lyx-1.3.6cvs".
-       // <relative dir> is OS-dependent; on Unix, it will be "../share/".
-       string const relative_lyxdir = relative_system_support_dir();
-
-       // One subtlety to be aware of. The name of the lyx binary may be
-       // a symbolic link. If that is the case, then we follow the links too.
-       FileName binary = abs_binary;
-       while (true) {
-               // Try and find "chkconfig.ltx".
-               string const binary_dir = onlyPath(binary.absFilename());
-
-               FileName const lyxdir(
-                       normalizePath(addPath(binary_dir, relative_lyxdir)));
-               searched_dirs.push_back(lyxdir);
-
-               if (!fileSearch(lyxdir.absFilename(), 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.toFilesystemEncoding()))
-                       break;
-
-               FileName link;
-               if (readLink(binary, link)) {
-                       binary = link;
-               } else {
-                       // Unable to resolve the link.
-                       break;
-               }
-       }
-
-       // 4. Repeat the exercise on the directory itself.
-       FileName binary_dir(onlyPath(abs_binary.absFilename()));
-       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.toFilesystemEncoding()))
-                       break;
-
-               FileName link;
-               if (readLink(binary_dir, link)) {
-                       binary_dir = link;
-               } else {
-                       // Unable to resolve the link.
-                       break;
-               }
-
-               // Try and find "chkconfig.ltx".
-               FileName const lyxdir(
-                       normalizePath(addPath(binary_dir.absFilename(), relative_lyxdir)));
-               searched_dirs.push_back(lyxdir);
-
-               if (!fileSearch(lyxdir.absFilename(), 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.absFilename(), chkconfig_ltx).empty())
-               return path;
-
-       // Everything has failed :-(
-       // So inform the user and exit.
-       string searched_dirs_str;
-       typedef std::list<FileName>::const_iterator iterator;
-       iterator const begin = searched_dirs.begin();
-       iterator const end = searched_dirs.end();
-       for (iterator it = begin; it != end; ++it) {
-               if (it != begin)
-                       searched_dirs_str += "\n\t";
-               searched_dirs_str += it->absFilename();
-       }
-
-       // 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'."),
-                         from_utf8(searched_dirs_str)));
-
-       // Keep the compiler happy.
-       return FileName();
-}
-
-
-// Returns the absolute path to the user lyxdir, together with a flag
-// indicating whether this directory was specified explicitly (as -userdir
-// or through an environment variable) or whether it was deduced.
-std::pair<FileName, bool> const
-get_user_support_dir(FileName const & default_user_support_dir,
-                    string const & command_line_user_support_dir)
-{
-       bool explicit_userdir = true;
-
-       // 1. Use the -userdir command line parameter.
-       FileName path =
-               abs_path_from_command_line(command_line_user_support_dir);
-       if (!path.empty())
-               return std::make_pair(path, explicit_userdir);
-
-       // 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);
-
-       // 3. Use the OS-dependent default_user_support_dir
-       explicit_userdir = false;
-       return std::make_pair(default_user_support_dir, explicit_userdir);
-}
-
-
-// $HOME/.lyx on POSIX but on Win32 it will be something like
-// "C:/Documents and Settings/USERNAME/Application Data/LyX"
-FileName const get_default_user_support_dir(FileName const & home_dir)
-{
-#if defined (USE_WINDOWS_PACKAGING)
-       (void)home_dir; // Silence warning about unused variable.
-
-       os::GetFolderPath win32_folder_path;
-       return FileName(addPath(win32_folder_path(os::GetFolderPath::APPDATA), PACKAGE));
-
-#elif defined (USE_MACOSX_PACKAGING)
-       (void)home_dir; // Silence warning about unused variable.
-
-       FSRef fsref;
-       OSErr const error_code =
-               FSFindFolder(kUserDomain, kApplicationSupportFolderType,
-                            kDontCreateFolder, &fsref);
-       if (error_code != 0)
-               return FileName();
-
-       // FSRefMakePath returns the result in utf8
-       char store[PATH_MAX + 1];
-       OSStatus const status_code =
-               FSRefMakePath(&fsref,
-                             reinterpret_cast<UInt8*>(store), PATH_MAX);
-       if (status_code != 0)
-               return FileName();
-
-       return FileName(addPath(reinterpret_cast<char const *>(store), PACKAGE));
-
-#else // USE_POSIX_PACKAGING
-       return FileName(addPath(home_dir.absFilename(), string(".") + PACKAGE));
-#endif
-}
-
-
-// Check that directory @c dir contains @c file.
-// Else emit a warning about an invalid @c command_line_switch.
-bool check_command_line_dir(string const & dir,
-                           string const & file,
-                           string const & command_line_switch)
-{
-       FileName const abs_path = fileSearch(dir, file);
-       if (abs_path.empty()) {
-               // FIXME UNICODE
-               throw ExceptionMessage(WarningException, _("File not found"), bformat(
-                       _("Invalid %1$s switch.\nDirectory %2$s does not contain %3$s."),
-                       from_utf8(command_line_switch), from_utf8(dir),
-                       from_utf8(file)));
-       }
-
-       return !abs_path.empty();
-}
-
-
-// The environment variable @c env_var expands to a (single) file path.
-FileName const extract_env_var_dir(string const & env_var)
-{
-       string const dir = fix_dir_name(getEnv(env_var));
-       return dir.empty() ? FileName() : makeAbsPath(dir);
-}
-
-
-// Check that directory @c dir contains @c file.
-// Else emit a warning about an invalid @c env_var.
-bool check_env_var_dir(FileName const & dir,
-                      string const & file,
-                      string const & env_var)
-{
-       FileName const abs_path = fileSearch(dir.absFilename(), file);
-       if (abs_path.empty()) {
-               // FIXME UNICODE
-               throw ExceptionMessage(WarningException, _("File not found"), bformat(
-                       _("Invalid %1$s environment variable.\n"
-                               "Directory %2$s does not contain %3$s."),
-                       from_utf8(env_var), from_utf8(dir.absFilename()),
-                       from_utf8(file)));
-       }
-
-       return !abs_path.empty();
-}
-
-
-// Check that directory @c dir is indeed a directory.
-// Else emit a warning about an invalid @c env_var.
-bool check_env_var_dir(FileName const & dir,
-                      string const & env_var)
-{
-       string const encoded(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.
-               // FIXME UNICODE
-               docstring const fmt =
-                       _("Invalid %1$s environment variable.\n%2$s is not a directory.");
-
-               throw ExceptionMessage(WarningException, _("Directory not found"), bformat(
-                       fmt, from_utf8(env_var), from_utf8(dir.absFilename())));
-       }
-
-       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
-}
-
-
-// The system lyxdir is relative to the directory containing the LyX binary.
-string const relative_system_support_dir()
-{
-       string result;
-
-#if defined (USE_WINDOWS_PACKAGING) || defined (USE_MACOSX_PACKAGING)
-       result = "../Resources/";
-#else // Posix-like.
-       result = addPath("../share/", PACKAGE);
-#endif
-
-       return result;
-}
-
-} // namespace anon
-
-} // namespace support
-} // namespace lyx
diff --git a/src/support/Package.cpp.in b/src/support/Package.cpp.in
new file mode 100644 (file)
index 0000000..f02b5e5
--- /dev/null
@@ -0,0 +1,745 @@
+// -*- C++ -*-
+/**
+ * \file package.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 Package.cpp.in.
+ * All changes to this file will be lost.
+ */
+
+#include <config.h>
+
+#include "support/Package.h"
+
+#include "debug.h"
+#include "gettext.h"
+
+#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)
+# include "support/os_win32.h"
+#endif
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/tuple/tuple.hpp>
+
+#include <list>
+#include <utility>
+
+#if !defined (USE_WINDOWS_PACKAGING) && \
+    !defined (USE_MACOSX_PACKAGING) && \
+    !defined (USE_POSIX_PACKAGING)
+#error USE_FOO_PACKAGING must be defined for FOO = WINDOWS, MACOSX or POSIX.
+#endif
+
+#if defined (USE_MACOSX_PACKAGING)
+# include <CoreServices/CoreServices.h> // FSFindFolder, FSRefMakePath
+#endif
+
+using std::string;
+
+namespace fs = boost::filesystem;
+
+namespace lyx {
+namespace support {
+
+namespace {
+
+Package package_;
+bool initialised_ = false;
+
+} // namespace anon
+
+
+void init_package(string const & command_line_arg0,
+                 string const & command_line_system_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_)
+               return;
+
+       package_ = Package(command_line_arg0,
+                          command_line_system_support_dir,
+                          command_line_user_support_dir,
+                          top_build_dir_location);
+       initialised_ = true;
+}
+
+
+Package const & package()
+{
+       // Commented out because package().locale_dir() can be called
+       // from the message translation code in Messages.cpp before
+       // init_package() is called. Lars is on the case...
+       // BOOST_ASSERT(initialised_);
+       return package_;
+}
+
+
+namespace {
+
+FileName const abs_path_from_binary_name(string const & exe);
+
+std::pair<FileName, FileName> const
+get_build_dirs(FileName const & abs_binary,
+              exe_build_dir_to_top_build_dir top_build_dir_location);
+
+FileName const get_document_dir(FileName const & home_dir);
+
+FileName const get_home_dir();
+
+FileName const get_locale_dir(FileName const & system_support_dir);
+
+FileName const get_system_support_dir(FileName const & abs_binary,
+                                   string const & command_line_system_support_dir);
+
+FileName const get_temp_dir();
+
+FileName const get_default_user_support_dir(FileName const & home_dir);
+
+std::pair<FileName, bool> const
+get_user_support_dir(FileName 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,
+                exe_build_dir_to_top_build_dir top_build_dir_location)
+       : explicit_user_support_dir_(false)
+{
+       home_dir_ = get_home_dir();
+       system_temp_dir_ = get_temp_dir();
+       temp_dir_ = system_temp_dir_;
+       document_dir_ = get_document_dir(home_dir_);
+
+       FileName const abs_binary = abs_path_from_binary_name(command_line_arg0);
+       binary_dir_ = FileName(onlyPath(abs_binary.absFilename()));
+
+       // Is LyX being run in-place from the build tree?
+       boost::tie(build_support_dir_, system_support_dir_) =
+               get_build_dirs(abs_binary, top_build_dir_location);
+
+       if (build_support_dir_.empty())
+               system_support_dir_ =
+                       get_system_support_dir(abs_binary,
+                                              command_line_system_support_dir);
+
+       locale_dir_ = get_locale_dir(system_support_dir_);
+
+       FileName const default_user_support_dir =
+               get_default_user_support_dir(home_dir_);
+       boost::tie(user_support_dir_, explicit_user_support_dir_) =
+               get_user_support_dir(default_user_support_dir,
+                                    command_line_user_support_dir);
+
+       FileName const configure_script(addName(system_support().absFilename(), "configure.py"));
+       configure_command_ = os::python() + ' ' +
+                       quoteName(configure_script.toFilesystemEncoding()) +
+                       with_version_suffix();
+
+       lyxerr[Debug::INIT]
+               << "<package>\n"
+               << "\tbinary_dir " << binary_dir().absFilename() << '\n'
+               << "\tsystem_support " << system_support().absFilename() << '\n'
+               << "\tbuild_support " << build_support().absFilename() << '\n'
+               << "\tuser_support " << user_support().absFilename() << '\n'
+               << "\tlocale_dir " << locale_dir().absFilename() << '\n'
+               << "\tdocument_dir " << document_dir().absFilename() << '\n'
+               << "\ttemp_dir " << temp_dir().absFilename() << '\n'
+               << "\thome_dir " << home_dir().absFilename() << '\n'
+               << "</package>\n" << std::endl;
+}
+
+
+namespace {
+
+// These next functions contain the stuff that is substituted at
+// configuration-time.
+FileName const hardcoded_localedir()
+{
+       // FIXME UNICODE
+       // The build system needs to make sure that this is in utf8 encoding.
+       return FileName("@LOCALEDIR@");
+}
+
+
+FileName const hardcoded_system_support_dir()
+{
+       // FIXME UNICODE
+       // The build system needs to make sure that this is in utf8 encoding.
+       return FileName("@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
+
+
+FileName const & Package::top_srcdir()
+{
+       // FIXME UNICODE
+       // The build system needs to make sure that this is in utf8 encoding.
+       static FileName const dir("@TOP_SRCDIR@");
+       return dir;
+}
+
+
+namespace {
+
+bool check_command_line_dir(string const & dir,
+                           string const & file,
+                           string const & command_line_switch);
+
+FileName const extract_env_var_dir(string const & env_var);
+
+bool check_env_var_dir(FileName const & dir,
+                      string const & env_var);
+
+bool check_env_var_dir(FileName const & dir,
+                      string const & file,
+                      string const & env_var);
+
+string const relative_locale_dir();
+
+string const relative_system_support_dir();
+
+
+/**
+ * Convert \p name to internal path and strip a trailing slash, since it
+ * comes from user input (commandline or environment).
+ * \p name is encoded in utf8.
+ */
+string const fix_dir_name(string const & name)
+{
+       return rtrim(os::internal_path(name), "/");
+}
+
+
+FileName const
+get_build_support_dir(string const & binary_dir,
+                     exe_build_dir_to_top_build_dir top_build_dir_location)
+{
+       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 FileName(normalizePath(addPath(binary_dir, indirection)));
+}
+
+
+std::pair<FileName, FileName> const
+get_build_dirs(FileName 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 "Makefile" in a directory
+       //   binary_dir/../lib
+       // We're also looking for "chkconfig.ltx" in a directory
+       //   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.
+       // If that is the case, then we follow the links too.
+       FileName binary = abs_binary;
+       while (true) {
+               // Try and find "lyxrc.defaults".
+               string const binary_dir = onlyPath(binary.absFilename());
+               FileName const build_support_dir =
+                       get_build_support_dir(binary_dir, top_build_dir_location);
+
+               if (!fileSearch(build_support_dir.absFilename(), "Makefile").empty()) {
+                       // Try and find "chkconfig.ltx".
+                       string const system_support_dir =
+                               addPath(Package::top_srcdir().absFilename(), "lib");
+
+                       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.toFilesystemEncoding()))
+                       break;
+
+               FileName link;
+               if (readLink(binary, link)) {
+                       binary = link;
+               } else {
+                       // Unable to resolve the link.
+                       break;
+               }
+       }
+
+       lyxerr[Debug::INIT] << check_text << " no" << std::endl;
+       return std::make_pair(FileName(), FileName());
+}
+
+
+// Specification of document_dir_ may be reset by LyXRC,
+// but the default is fixed for a given OS.
+FileName const get_document_dir(FileName const & home_dir)
+{
+#if defined (USE_WINDOWS_PACKAGING)
+       (void)home_dir; // Silence warning about unused variable.
+       os::GetFolderPath win32_folder_path;
+       return FileName(win32_folder_path(os::GetFolderPath::PERSONAL));
+#else // Posix-like.
+       return home_dir;
+#endif
+}
+
+
+// The specification of home_dir_ is fixed for a given OS.
+// A typical example on Windows: "C:/Documents and Settings/USERNAME"
+// and on a Posix-like machine: "/home/USERNAME".
+FileName const get_home_dir()
+{
+#if defined (USE_WINDOWS_PACKAGING)
+       string const home_dir = getEnv("USERPROFILE");
+#else // Posix-like.
+       string const home_dir = getEnv("HOME");
+#endif
+
+       return FileName(fix_dir_name(home_dir));
+}
+
+
+// Several sources are probed to ascertain the locale directory.
+// The only requirement is that the result is indeed a directory.
+FileName const get_locale_dir(FileName const & system_support_dir)
+{
+       // 1. Use the "LYX_LOCALEDIR" environment variable.
+       FileName 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/".)
+       FileName path(normalizePath(addPath(system_support_dir.absFilename(),
+                                           relative_locale_dir())));
+
+       if (fs::exists(path.toFilesystemEncoding()) &&
+           fs::is_directory(path.toFilesystemEncoding()))
+               return path;
+
+       // 3. Fall back to the hard-coded LOCALEDIR.
+       path = hardcoded_localedir();
+       if (fs::exists(path.toFilesystemEncoding()) &&
+           fs::is_directory(path.toFilesystemEncoding()))
+               return path;
+
+       return FileName();
+}
+
+
+// Specification of temp_dir_ may be reset by LyXRC,
+// but the default is fixed for a given OS.
+FileName const get_temp_dir()
+{
+#if defined (USE_WINDOWS_PACKAGING)
+       // Typical example: C:/TEMP/.
+       char path[MAX_PATH];
+       GetTempPath(MAX_PATH, path);
+       return FileName(os::internal_path(to_utf8(from_local8bit(path))));
+#else // Posix-like.
+       return FileName("/tmp");
+#endif
+}
+
+
+// Extracts the absolute path from the foo of "-sysdir foo" or "-userdir foo"
+FileName const abs_path_from_command_line(string const & command_line)
+{
+       if (command_line.empty())
+               return FileName();
+
+       string const path = fix_dir_name(command_line);
+       return os::is_absolute_path(path) ? FileName(path) : makeAbsPath(path);
+}
+
+
+// Does the grunt work for abs_path_from_binary_name()
+FileName 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 FileName(exe_path);
+
+       // Two possibilities present themselves.
+       // 1. The binary is relative to the CWD.
+       FileName const abs_exe_path = makeAbsPath(exe_path);
+       if (fs::exists(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);
+       if (exe_name != exe_path)
+               return FileName();
+
+       std::vector<string> const path = getEnvPath("PATH");
+       std::vector<string>::const_iterator it = path.begin();
+       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).absFilename();
+
+               FileName const exe_path(addName(exe_dir, exe_name));
+               if (fs::exists(exe_path.toFilesystemEncoding()))
+                       return exe_path;
+       }
+
+       // Didn't find anything.
+       return FileName();
+}
+
+
+// Extracts the absolute path to the binary name received as argv[0].
+FileName const abs_path_from_binary_name(string const & exe)
+{
+       FileName const abs_binary = get_binary_path(exe);
+       if (abs_binary.empty()) {
+               // 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"),
+                               from_utf8(exe)));
+       }
+       return abs_binary;
+}
+
+
+// A plethora of directories is searched to ascertain the system
+// lyxdir which is defined as the first directory to contain
+// "chkconfig.ltx".
+FileName const
+get_system_support_dir(FileName const & abs_binary,
+                 string const & command_line_system_support_dir)
+{
+       string const chkconfig_ltx = "chkconfig.ltx";
+
+       // searched_dirs is used for diagnostic purposes only in the case
+       // that "chkconfig.ltx" is not found.
+       std::list<FileName> searched_dirs;
+
+       // 1. Use the -sysdir command line parameter.
+       FileName path = abs_path_from_command_line(command_line_system_support_dir);
+       if (!path.empty()) {
+               searched_dirs.push_back(path);
+               if (check_command_line_dir(path.absFilename(), chkconfig_ltx, "-sysdir"))
+                       return path;
+       }
+
+       // 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_15x"))
+                       return path;
+       }
+
+       // 3. Search relative to the lyx binary.
+       // We're looking for "chkconfig.ltx" in a directory
+       //   OnlyPath(abs_binary) / <relative dir> / PACKAGE /
+       // PACKAGE is hardcoded in config.h. Eg "lyx" or "lyx-1.3.6cvs".
+       // <relative dir> is OS-dependent; on Unix, it will be "../share/".
+       string const relative_lyxdir = relative_system_support_dir();
+
+       // One subtlety to be aware of. The name of the lyx binary may be
+       // a symbolic link. If that is the case, then we follow the links too.
+       FileName binary = abs_binary;
+       while (true) {
+               // Try and find "chkconfig.ltx".
+               string const binary_dir = onlyPath(binary.absFilename());
+
+               FileName const lyxdir(
+                       normalizePath(addPath(binary_dir, relative_lyxdir)));
+               searched_dirs.push_back(lyxdir);
+
+               if (!fileSearch(lyxdir.absFilename(), 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.toFilesystemEncoding()))
+                       break;
+
+               FileName link;
+               if (readLink(binary, link)) {
+                       binary = link;
+               } else {
+                       // Unable to resolve the link.
+                       break;
+               }
+       }
+
+       // 4. Repeat the exercise on the directory itself.
+       FileName binary_dir(onlyPath(abs_binary.absFilename()));
+       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.toFilesystemEncoding()))
+                       break;
+
+               FileName link;
+               if (readLink(binary_dir, link)) {
+                       binary_dir = link;
+               } else {
+                       // Unable to resolve the link.
+                       break;
+               }
+
+               // Try and find "chkconfig.ltx".
+               FileName const lyxdir(
+                       normalizePath(addPath(binary_dir.absFilename(), relative_lyxdir)));
+               searched_dirs.push_back(lyxdir);
+
+               if (!fileSearch(lyxdir.absFilename(), 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.absFilename(), chkconfig_ltx).empty())
+               return path;
+
+       // Everything has failed :-(
+       // So inform the user and exit.
+       string searched_dirs_str;
+       typedef std::list<FileName>::const_iterator iterator;
+       iterator const begin = searched_dirs.begin();
+       iterator const end = searched_dirs.end();
+       for (iterator it = begin; it != end; ++it) {
+               if (it != begin)
+                       searched_dirs_str += "\n\t";
+               searched_dirs_str += it->absFilename();
+       }
+
+       // 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'."),
+                         from_utf8(searched_dirs_str)));
+
+       // Keep the compiler happy.
+       return FileName();
+}
+
+
+// Returns the absolute path to the user lyxdir, together with a flag
+// indicating whether this directory was specified explicitly (as -userdir
+// or through an environment variable) or whether it was deduced.
+std::pair<FileName, bool> const
+get_user_support_dir(FileName const & default_user_support_dir,
+                    string const & command_line_user_support_dir)
+{
+       bool explicit_userdir = true;
+
+       // 1. Use the -userdir command line parameter.
+       FileName path =
+               abs_path_from_command_line(command_line_user_support_dir);
+       if (!path.empty())
+               return std::make_pair(path, explicit_userdir);
+
+       // 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);
+
+       // 3. Use the OS-dependent default_user_support_dir
+       explicit_userdir = false;
+       return std::make_pair(default_user_support_dir, explicit_userdir);
+}
+
+
+// $HOME/.lyx on POSIX but on Win32 it will be something like
+// "C:/Documents and Settings/USERNAME/Application Data/LyX"
+FileName const get_default_user_support_dir(FileName const & home_dir)
+{
+#if defined (USE_WINDOWS_PACKAGING)
+       (void)home_dir; // Silence warning about unused variable.
+
+       os::GetFolderPath win32_folder_path;
+       return FileName(addPath(win32_folder_path(os::GetFolderPath::APPDATA), PACKAGE));
+
+#elif defined (USE_MACOSX_PACKAGING)
+       (void)home_dir; // Silence warning about unused variable.
+
+       FSRef fsref;
+       OSErr const error_code =
+               FSFindFolder(kUserDomain, kApplicationSupportFolderType,
+                            kDontCreateFolder, &fsref);
+       if (error_code != 0)
+               return FileName();
+
+       // FSRefMakePath returns the result in utf8
+       char store[PATH_MAX + 1];
+       OSStatus const status_code =
+               FSRefMakePath(&fsref,
+                             reinterpret_cast<UInt8*>(store), PATH_MAX);
+       if (status_code != 0)
+               return FileName();
+
+       return FileName(addPath(reinterpret_cast<char const *>(store), PACKAGE));
+
+#else // USE_POSIX_PACKAGING
+       return FileName(addPath(home_dir.absFilename(), string(".") + PACKAGE));
+#endif
+}
+
+
+// Check that directory @c dir contains @c file.
+// Else emit a warning about an invalid @c command_line_switch.
+bool check_command_line_dir(string const & dir,
+                           string const & file,
+                           string const & command_line_switch)
+{
+       FileName const abs_path = fileSearch(dir, file);
+       if (abs_path.empty()) {
+               // FIXME UNICODE
+               throw ExceptionMessage(WarningException, _("File not found"), bformat(
+                       _("Invalid %1$s switch.\nDirectory %2$s does not contain %3$s."),
+                       from_utf8(command_line_switch), from_utf8(dir),
+                       from_utf8(file)));
+       }
+
+       return !abs_path.empty();
+}
+
+
+// The environment variable @c env_var expands to a (single) file path.
+FileName const extract_env_var_dir(string const & env_var)
+{
+       string const dir = fix_dir_name(getEnv(env_var));
+       return dir.empty() ? FileName() : makeAbsPath(dir);
+}
+
+
+// Check that directory @c dir contains @c file.
+// Else emit a warning about an invalid @c env_var.
+bool check_env_var_dir(FileName const & dir,
+                      string const & file,
+                      string const & env_var)
+{
+       FileName const abs_path = fileSearch(dir.absFilename(), file);
+       if (abs_path.empty()) {
+               // FIXME UNICODE
+               throw ExceptionMessage(WarningException, _("File not found"), bformat(
+                       _("Invalid %1$s environment variable.\n"
+                               "Directory %2$s does not contain %3$s."),
+                       from_utf8(env_var), from_utf8(dir.absFilename()),
+                       from_utf8(file)));
+       }
+
+       return !abs_path.empty();
+}
+
+
+// Check that directory @c dir is indeed a directory.
+// Else emit a warning about an invalid @c env_var.
+bool check_env_var_dir(FileName const & dir,
+                      string const & env_var)
+{
+       string const encoded(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.cpp.in as a file containing strings that need
+               // translation.
+               // FIXME UNICODE
+               docstring const fmt =
+                       _("Invalid %1$s environment variable.\n%2$s is not a directory.");
+
+               throw ExceptionMessage(WarningException, _("Directory not found"), bformat(
+                       fmt, from_utf8(env_var), from_utf8(dir.absFilename())));
+       }
+
+       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
+}
+
+
+// The system lyxdir is relative to the directory containing the LyX binary.
+string const relative_system_support_dir()
+{
+       string result;
+
+#if defined (USE_WINDOWS_PACKAGING) || defined (USE_MACOSX_PACKAGING)
+       result = "../Resources/";
+#else // Posix-like.
+       result = addPath("../share/", PACKAGE);
+#endif
+
+       return result;
+}
+
+} // namespace anon
+
+} // namespace support
+} // namespace lyx
diff --git a/src/version.C.in b/src/version.C.in
deleted file mode 100644 (file)
index 37fe7c2..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* -*- C++ -*- */
-/**
- * \file version.C
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Jean-Marc Lasgouttes
- *
- * Full author contact details are available in file CREDITS.
- *
- * Warning! This file is autogenerated from version.C.in.
- * All changes to this file will be lost.
- */
-
-///
-char const * lyx_version = "@PACKAGE_VERSION@";
-///
-char const * lyx_release_date = "@LYX_DATE@";
-
-/// This is the version information shown by 'lyx -version'
-char const * lyx_version_info = "@VERSION_INFO@";
diff --git a/src/version.cpp.in b/src/version.cpp.in
new file mode 100644 (file)
index 0000000..e9100cb
--- /dev/null
@@ -0,0 +1,21 @@
+/* -*- C++ -*- */
+/**
+ * \file version.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Jean-Marc Lasgouttes
+ *
+ * Full author contact details are available in file CREDITS.
+ *
+ * Warning! This file is autogenerated from version.cpp.in.
+ * All changes to this file will be lost.
+ */
+
+///
+char const * lyx_version = "@PACKAGE_VERSION@";
+///
+char const * lyx_release_date = "@LYX_DATE@";
+
+/// This is the version information shown by 'lyx -version'
+char const * lyx_version_info = "@VERSION_INFO@";