From: Bo Peng Date: Sat, 28 Apr 2007 15:05:08 +0000 (+0000) Subject: Rename version.C.in to version.cpp.in, and Package.C.in to package.cpp.in X-Git-Tag: 1.6.10~10007 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=153c9b04613bce7e22a5b23fba7be9a8cc21f2a0;p=features.git Rename version.C.in to version.cpp.in, and Package.C.in to package.cpp.in git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18074 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/configure.ac b/configure.ac index 4bed38db1a..854dc3d0f3 100644 --- a/configure.ac +++ b/configure.ac @@ -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 \ diff --git a/development/cmake/src/CMakeLists.txt b/development/cmake/src/CMakeLists.txt index e310bf3df1..1ec22a98dc 100644 --- a/development/cmake/src/CMakeLists.txt +++ b/development/cmake/src/CMakeLists.txt @@ -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}) diff --git a/development/cmake/src/support/CMakeLists.txt b/development/cmake/src/support/CMakeLists.txt index fb513b9eff..a91e287481 100644 --- a/development/cmake/src/support/CMakeLists.txt +++ b/development/cmake/src/support/CMakeLists.txt @@ -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}) diff --git a/development/scons/SConstruct b/development/scons/SConstruct index f4b81eb614..2107b5963f 100644 --- a/development/scons/SConstruct +++ b/development/scons/SConstruct @@ -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') diff --git a/po/Makefile.in.in b/po/Makefile.in.in index c9ac36567b..11daa1a0dd 100644 --- a/po/Makefile.in.in +++ b/po/Makefile.in.in @@ -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 $@ diff --git a/po/POTFILES.in b/po/POTFILES.in index e3d7cfc596..a50bff47cc 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -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 diff --git a/src/Makefile.am b/src/Makefile.am index abc4820e31..8301b89135 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/support/Makefile.am b/src/support/Makefile.am index 2b1e3d0475..598c3fb996 100644 --- a/src/support/Makefile.am +++ b/src/support/Makefile.am @@ -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 index c72bd7932a..0000000000 --- a/src/support/Package.C.in +++ /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 - -#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 -#include - -#include -#include - -#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 // 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 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 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] - << "\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' - << "\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 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 / - // The 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 const path = getEnvPath("PATH"); - std::vector::const_iterator it = path.begin(); - std::vector::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 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) / / PACKAGE / - // PACKAGE is hardcoded in config.h. Eg "lyx" or "lyx-1.3.6cvs". - // 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::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 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(store), PATH_MAX); - if (status_code != 0) - return FileName(); - - return FileName(addPath(reinterpret_cast(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 index 0000000000..f02b5e5d30 --- /dev/null +++ b/src/support/Package.cpp.in @@ -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 + +#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 +#include + +#include +#include + +#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 // 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 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 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] + << "\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' + << "\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 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 / + // The 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 const path = getEnvPath("PATH"); + std::vector::const_iterator it = path.begin(); + std::vector::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 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) / / PACKAGE / + // PACKAGE is hardcoded in config.h. Eg "lyx" or "lyx-1.3.6cvs". + // 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::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 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(store), PATH_MAX); + if (status_code != 0) + return FileName(); + + return FileName(addPath(reinterpret_cast(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 index 37fe7c2fa7..0000000000 --- a/src/version.C.in +++ /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 index 0000000000..e9100cb72c --- /dev/null +++ b/src/version.cpp.in @@ -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@";