From 8700a256d37abb326464072f4e5be221b8ddb3bd Mon Sep 17 00:00:00 2001 From: Angus Leeming Date: Sun, 27 Jul 2003 19:26:36 +0000 Subject: [PATCH] All day for not very much... Well, Ok, tex2lyx now has reasonable values for the build_lyxdir, system_lyxdir, user_lyxdir variables. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7394 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/ChangeLog | 10 +- src/Makefile.am | 12 -- src/lyx_main.C | 187 +------------------------- src/support/.cvsignore | 1 + src/support/ChangeLog | 13 ++ src/support/Makefile.am | 25 +++- src/support/path_defines.C.in | 244 ++++++++++++++++++++++++++++++++++ src/support/path_defines.h | 28 ++++ src/tex2lyx/tex2lyx.C | 8 +- 9 files changed, 328 insertions(+), 200 deletions(-) create mode 100644 src/support/path_defines.C.in create mode 100644 src/support/path_defines.h diff --git a/src/ChangeLog b/src/ChangeLog index 20667e07e3..8d0062cf9c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,11 +1,17 @@ +2003-07-27 Angus Leeming + + * Makefile.am: remove special casing for configure-time setting of + LYX_DIR, TOP_SRCDIR and LOCALEDIR. + + * lyx_main.C (init): remove all Jean-Marc's magic setting of + system_lyxdir, build_lyxdir and user_lyxdir into the support lib. 2003-07-26 André Pönitz - * lyxtext.h: + * lyxtext.h: * text.C: * text2.C: get rid of LyXText::need_break_row - 2003-07-27 Lars Gullik Bjønnes * toc.[Ch]: put namespace toc inside namespace lyx diff --git a/src/Makefile.am b/src/Makefile.am index ec132ac665..81b9e7f1b7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,8 +39,6 @@ lyx_DEPENDENCIES = $(LYX_CONV_LIBS) $(BOOST_LIBS) $(INTLLIBS) INCLUDES = $(BOOST_INCLUDES) -localedir = $(datadir)/locale - BUILT_SOURCES = version.C lyx_SOURCES = \ @@ -251,15 +249,5 @@ lyx_SOURCES = \ vspace.C \ vspace.h -lyx_main.o: lyx_main.C lyx_main.h config.h version.h \ - lyxrc.h support/path.h support/filetools.h \ - bufferlist.h debug.h support/FileInfo.h lastfiles.h intl.h \ - lyxserver.h layout.h gettext.h kbmap.h lfuns.h language.h - $(CXXCOMPILE) -DLYX_DIR=\"$(pkgdatadir)\" \ - -DTOP_SRCDIR=\"$(top_srcdir)\" -c $(top_srcdir)/src/lyx_main.C - -messages.o: messages.C messages.h config.h LString.h support/filetools.h - $(CXXCOMPILE) -DLOCALEDIR=\"$(localedir)\" -c $(top_srcdir)/src/messages.C - dist-hook: cd $(distdir) ; rm -rf `find cheaders -name \*CVS\*` diff --git a/src/lyx_main.C b/src/lyx_main.C index eb44e0bb29..8374a02104 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -13,9 +13,9 @@ #include "support/filetools.h" #include "support/lyxlib.h" -#include "support/os.h" #include "support/FileInfo.h" #include "support/path.h" +#include "support/path_defines.h" #include "debug.h" #include "gettext.h" #include "lyxlex.h" @@ -64,9 +64,9 @@ extern void QuitLyX(); extern LyXServer * lyxserver; -string system_lyxdir; -string build_lyxdir; -string user_lyxdir; +extern string system_lyxdir; +extern string build_lyxdir; +extern string user_lyxdir; DebugStream lyxerr; @@ -237,184 +237,7 @@ void LyX::init(bool gui) signal(SIGINT, error_handler); signal(SIGTERM, error_handler); - // - // Determine path of binary - // - - string binpath = os::binpath(); - string binname = os::binname(); - string fullbinname = MakeAbsPath(binname, binpath); - - if (binpath.empty()) { - lyxerr << _("Warning: could not determine path of binary.") - << "\n" - << _("If you have problems, try starting LyX with an absolute path.") - << endl; - } - lyxerr[Debug::INIT] << "Name of binary: " << binname << endl; - lyxerr[Debug::INIT] << "Path of binary: " << binpath << endl; - - // - // Determine system directory. - // - - // Directories are searched in this order: - // 1) -sysdir command line parameter - // 2) LYX_DIR_14x environment variable - // 3) Maybe /TOP_SRCDIR/lib - // 4) /../share// - // 4a) repeat 4 after following the Symlink if is a symbolic link. - // 5) hardcoded lyx_dir - // The directory is checked for the presence of the file - // "chkconfig.ltx", and if that is present, the directory - // is accepted as the system directory. - // If no chkconfig.ltx file is found, a warning is given, - // and the hardcoded lyx_dir is used. - - // If we had a command line switch, system_lyxdir is already set - string searchpath; - if (!system_lyxdir.empty()) - searchpath = MakeAbsPath(system_lyxdir) + ';'; - - string const lyxdir = GetEnvPath("LYX_DIR_14x"); - - if (!lyxdir.empty()) { - lyxerr[Debug::INIT] << "LYX_DIR_14x: " << lyxdir << endl; - searchpath += lyxdir + ';'; - } - - string fullbinpath = binpath; - FileInfo file(fullbinname, true); - if (file.isLink()) { - lyxerr[Debug::INIT] << "binary is a link" << endl; - string link; - if (LyXReadLink(fullbinname, link, true)) { - // Path of binary/../share/name of binary/ - searchpath += NormalizePath(AddPath(binpath, - "../share/") - + OnlyFilename(binname)); - searchpath += ';'; - fullbinpath = link; - binpath = MakeAbsPath(OnlyPath(fullbinpath)); - } - } - - bool followlink; - do { - // Path of binary/../share/name of binary/ - searchpath += NormalizePath(AddPath(binpath, "../share/") + - OnlyFilename(binname)) + ';'; - - // Follow Symlinks - FileInfo file(fullbinpath, true); - followlink = file.isLink(); - if (followlink) { - lyxerr[Debug::INIT] << " directory " << fullbinpath - << " is a link" << endl; - string link; - if (LyXReadLink(fullbinpath, link, true)) { - fullbinpath = link; - binpath = MakeAbsPath(OnlyPath(fullbinpath)); - } - else { - followlink = false; - } - } - } while (followlink); - - // /TOP_SRCDIR/lib - build_lyxdir = MakeAbsPath("../lib", binpath); - if (!FileSearch(build_lyxdir, "lyxrc.defaults").empty()) { - searchpath += MakeAbsPath(AddPath(TOP_SRCDIR, "lib"), - binpath) + ';'; - lyxerr[Debug::INIT] << "Checking whether LyX is run in " - "place... yes" << endl; - } else { - lyxerr[Debug::INIT] - << "Checking whether LyX is run in place... no" - << endl; - build_lyxdir.erase(); - } - - // Hardcoded dir - searchpath += LYX_DIR; - - lyxerr[Debug::INIT] << "System directory search path: " - << searchpath << endl; - - string const filename = "chkconfig.ltx"; - string const temp = FileOpenSearch(searchpath, filename, string()); - system_lyxdir = OnlyPath(temp); - - // Reduce "path/../path" stuff out of system directory - system_lyxdir = NormalizePath(system_lyxdir); - - bool path_shown = false; - - // Warn if environment variable is set, but unusable - if (!lyxdir.empty()) { - if (system_lyxdir != NormalizePath(lyxdir)) { - lyxerr <<_("LYX_DIR_14x environment variable no good.") - << '\n' - << _("System directory set to: ") - << system_lyxdir << endl; - path_shown = true; - } - } - - // Warn the user if we couldn't find "chkconfig.ltx" - if (system_lyxdir == "./") { - lyxerr <<_("LyX Warning! Couldn't determine system directory. ") - <<_("Try the '-sysdir' command line parameter or ") - <<_("set the environment variable LYX_DIR_14x to the " - "LyX system directory ") - << _("containing the file `chkconfig.ltx'.") << endl; - if (!path_shown) { - FileInfo fi(LYX_DIR); - if (!fi.exist()) { - lyxerr << "Couldn't even find the default LYX_DIR." << endl - << "Giving up." << endl; - exit(1); - } - lyxerr << bformat(_("Using built-in default %1$s but expect problems."), - LYX_DIR) << endl; - } else { - lyxerr << _("Expect problems.") << endl; - } - system_lyxdir = LYX_DIR; - path_shown = true; - } - - if (!path_shown) - lyxerr[Debug::INIT] << "System directory: '" - << system_lyxdir << '\'' << endl; - - // - // Determine user lyx-dir - // - - // Directories are searched in this order: - // 1) -userdir command line parameter - // 2) LYX_USERDIR_14x environment variable - // 3) $HOME/. - - // If we had a command line switch, user_lyxdir is already set - bool explicit_userdir = true; - if (user_lyxdir.empty()) { - - // LYX_USERDIR_14x environment variable - user_lyxdir = GetEnvPath("LYX_USERDIR_14x"); - - // default behaviour - if (user_lyxdir.empty()) - user_lyxdir = AddPath(GetEnvPath("HOME"), - string(".") + PACKAGE); - explicit_userdir = false; - } - - lyxerr[Debug::INIT] << "User LyX directory: '" - << user_lyxdir << '\'' << endl; + bool const explicit_userdir = setLyxPaths(); // Check that user LyX directory is ok. We don't do that if // running in batch mode. diff --git a/src/support/.cvsignore b/src/support/.cvsignore index 6bb7dee5c6..077d2d5243 100644 --- a/src/support/.cvsignore +++ b/src/support/.cvsignore @@ -4,3 +4,4 @@ Makefile *.lo libsupport.la .libs +path_defines.C diff --git a/src/support/ChangeLog b/src/support/ChangeLog index 5548ac2a3d..57fa3627be 100644 --- a/src/support/ChangeLog +++ b/src/support/ChangeLog @@ -1,3 +1,16 @@ +2003-07-27 Angus Leeming + + * path_defines.{h,C.in}, : new files. Store/set the various lyx + paths, lyx_dir, top_srcdir, localedir, system_lyxdir, build_lyxdir + user_lyxdir. + + * Makefile.am: add some magic to enable the user to set the path to + the system-level lyx support files, the top of the lyx build tree + and the system-level lyx locale directory at _make_ time rather + than configure time. + + * .cvsignore: add path_defines.C. + 2003-07-26 Angus Leeming * os.h: remove irrelevant discussion of system_tempdir. diff --git a/src/support/Makefile.am b/src/support/Makefile.am index 245610485b..55d486b7d1 100644 --- a/src/support/Makefile.am +++ b/src/support/Makefile.am @@ -1,16 +1,21 @@ include $(top_srcdir)/config/common.am +nodist_include_HEADERS = path_defines.C noinst_LTLIBRARIES = libsupport.la +CLEANFILES = path_defines.C + INCLUDES = -I$(srcdir)/../ $(BOOST_INCLUDES) -EXTRA_DIST = lyxstring.C lyxstring.h \ +EXTRA_DIST = path_defines.C.in lyxstring.C lyxstring.h \ os_unix.C os_win32.C os_os2.C if USE_LYXSTRING LYXSTRING = lyxstring.C lyxstring.h endif +BUILT_SOURCES = path_defines.C + libsupport_la_SOURCES = \ BoostFormat.h \ DebugStream.C \ @@ -58,6 +63,7 @@ libsupport_la_SOURCES = \ os2_errortable.h \ path.C \ path.h \ + path_defines.C \ putenv.C \ rename.C \ rmdir.C \ @@ -75,3 +81,20 @@ libsupport_la_SOURCES = \ userinfo.C \ userinfo.h \ unlink.C + + +path_defines.C: build_path_defines + +build_path_defines: path_defines.C.in + @rm -f tmp_path_defines ;\ + ABS_SRCDIR=`cd $(top_srcdir) && pwd` ;\ + sed "s,%LYX_DIR%,$(pkgdatadir), ;\ + s,%LOCALEDIR%,$(datadir)/locale, ;\ + s,%TOP_SRCDIR%,$${ABS_SRCDIR}," \ + $(srcdir)/path_defines.C.in > tmp_path_defines ;\ + if cmp -s tmp_path_defines path_defines.C ; then \ + rm -f tmp_path_defines ;\ + else \ + rm -f path_defines.C ;\ + mv tmp_path_defines path_defines.C ;\ + fi diff --git a/src/support/path_defines.C.in b/src/support/path_defines.C.in new file mode 100644 index 0000000000..c55d577677 --- /dev/null +++ b/src/support/path_defines.C.in @@ -0,0 +1,244 @@ +// -*- C++ -*- +/** + * \file path_defines.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Angus Leeming + * + * Full author contact details are available in file CREDITS + * + * Warning! This file is autogenerated from path_defines.C.in. + * All changes to this file will be lost. + */ + +#include + +#include "path_defines.h" + +#include "debug.h" +#include "gettext.h" + +#include "FileInfo.h" +#include "filetools.h" +#include "lstrings.h" +#include "os.h" + +using std::endl; + + +string build_lyxdir; +string system_lyxdir; +string user_lyxdir; + + +namespace { + +/* The absolute path to the system-level lyx support files. + * (Compile-time value.) + */ +string const & lyx_dir() +{ + static string const ld = "%LYX_DIR%"; + return ld; +} + + +/* The absolute path to the top of the lyx build tree. + * (Compile-time value.) + */ +string const & lyx_top_srcdir() +{ + static string const lts = "%TOP_SRCDIR%"; + return lts; +} + + +/* The absolute path to the system-level lyx locale directory. + * (Compile-time value.) + */ +string const & lyx_localedir() +{ + static string const ll = "%LOCALEDIR%"; + return ll; +} + +} // namespace anon + + +namespace lyx { +namespace support { + +bool setLyxPaths() +{ + // + // Determine path of binary + // + + string binpath = os::binpath(); + string binname = os::binname(); + string fullbinname = MakeAbsPath(binname, binpath); + + if (binpath.empty()) { + lyxerr << _("Warning: could not determine path of binary.") + << "\n" + << _("If you have problems, try starting LyX with an absolute path.") + << endl; + } + lyxerr[Debug::INIT] << "Name of binary: " << binname << endl; + lyxerr[Debug::INIT] << "Path of binary: " << binpath << endl; + + // + // Determine system directory. + // + + // Directories are searched in this order: + // 1) -sysdir command line parameter + // 2) LYX_DIR_14x environment variable + // 3) Maybe /TOP_SRCDIR/lib + // 4) /../share// + // 4a) repeat 4 after following the Symlink if is a symbolic link. + // 5) hardcoded lyx_dir + // The directory is checked for the presence of the file + // "chkconfig.ltx", and if that is present, the directory + // is accepted as the system directory. + // If no chkconfig.ltx file is found, a warning is given, + // and the hardcoded lyx_dir is used. + + // If we had a command line switch, system_lyxdir is already set + string searchpath; + if (!system_lyxdir.empty()) + searchpath = MakeAbsPath(system_lyxdir) + ';'; + + string const lyxdir = GetEnvPath("LYX_DIR_14x"); + + if (!lyxdir.empty()) { + lyxerr[Debug::INIT] << "LYX_DIR_14x: " << lyxdir << endl; + searchpath += lyxdir + ';'; + } + + string fullbinpath = binpath; + FileInfo file(fullbinname, true); + if (file.isLink()) { + lyxerr[Debug::INIT] << "binary is a link" << endl; + string link; + if (LyXReadLink(fullbinname, link, true)) { + // Path of binary/../share/name of binary/ + searchpath += NormalizePath(AddPath(binpath, + "../share/") + + OnlyFilename(binname)); + searchpath += ';'; + fullbinpath = link; + binpath = MakeAbsPath(OnlyPath(fullbinpath)); + } + } + + bool followlink; + do { + // Path of binary/../share/name of binary/ + searchpath += NormalizePath(AddPath(binpath, "../share/") + + OnlyFilename(binname)) + ';'; + + // Follow Symlinks + FileInfo file(fullbinpath, true); + followlink = file.isLink(); + if (followlink) { + lyxerr[Debug::INIT] << " directory " << fullbinpath + << " is a link" << endl; + string link; + if (LyXReadLink(fullbinpath, link, true)) { + fullbinpath = link; + binpath = MakeAbsPath(OnlyPath(fullbinpath)); + } + else { + followlink = false; + } + } + } while (followlink); + + // /lib + searchpath += AddPath(lyx_top_srcdir(), "lib") + ';'; + // Hardcoded dir + searchpath += lyx_dir(); + + lyxerr[Debug::INIT] << "System directory search path: " + << searchpath << endl; + + string const filename = "chkconfig.ltx"; + string const temp = FileOpenSearch(searchpath, filename, string()); + system_lyxdir = OnlyPath(temp); + + // Reduce "path/../path" stuff out of system directory + system_lyxdir = NormalizePath(system_lyxdir); + + bool path_shown = false; + + // Warn if environment variable is set, but unusable + if (!lyxdir.empty()) { + if (system_lyxdir != NormalizePath(lyxdir)) { + lyxerr <<_("LYX_DIR_14x environment variable no good.") + << '\n' + << _("System directory set to: ") + << system_lyxdir << endl; + path_shown = true; + } + } + + // Warn the user if we couldn't find "chkconfig.ltx" + if (system_lyxdir == "./") { + lyxerr <<_("LyX Warning! Couldn't determine system directory. ") + <<_("Try the '-sysdir' command line parameter or ") + <<_("set the environment variable LYX_DIR_14x to the " + "LyX system directory ") + << _("containing the file `chkconfig.ltx'.") << endl; + if (!path_shown) { + FileInfo fi(lyx_dir()); + if (!fi.exist()) { + lyxerr << "Couldn't even find the default LYX_DIR." << endl + << "Giving up." << endl; + exit(1); + } + lyxerr << bformat(_("Using built-in default %1$s but expect problems."), + lyx_dir()) << endl; + } else { + lyxerr << _("Expect problems.") << endl; + } + system_lyxdir = lyx_dir(); + path_shown = true; + } + + if (!path_shown) + lyxerr[Debug::INIT] << "System directory: '" + << system_lyxdir << '\'' << endl; + + // + // Determine user lyx-dir + // + + // Directories are searched in this order: + // 1) -userdir command line parameter + // 2) LYX_USERDIR_14x environment variable + // 3) $HOME/. + + // If we had a command line switch, user_lyxdir is already set + bool explicit_userdir = true; + if (user_lyxdir.empty()) { + + // LYX_USERDIR_14x environment variable + user_lyxdir = GetEnvPath("LYX_USERDIR_14x"); + + // default behaviour + if (user_lyxdir.empty()) + user_lyxdir = AddPath(GetEnvPath("HOME"), + string(".") + PACKAGE); + explicit_userdir = false; + } + + lyxerr[Debug::INIT] << "User LyX directory: '" + << user_lyxdir << '\'' << endl; + return explicit_userdir; +} + +} // namespace support +} // namespace lyx diff --git a/src/support/path_defines.h b/src/support/path_defines.h new file mode 100644 index 0000000000..0ad829afae --- /dev/null +++ b/src/support/path_defines.h @@ -0,0 +1,28 @@ +// -*- C++ -*- +/** + * \file path_defines.h + * 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 + */ + +#ifndef PATH_DEFINES_H +#define PATH_DEFINES_H + +#include "LString.h" + +namespace lyx { +namespace support { + +/** \returns true if the user lyx dir existed already and did not need + * to be created afresh. + */ +bool setLyxPaths(); + +} // namespace support +} // namespace lyx + +#endif // NOT PATH_DEFINES_H diff --git a/src/tex2lyx/tex2lyx.C b/src/tex2lyx/tex2lyx.C index 66326bef18..9412dfec02 100644 --- a/src/tex2lyx/tex2lyx.C +++ b/src/tex2lyx/tex2lyx.C @@ -9,6 +9,8 @@ #include "debug.h" #include "lyx_main.h" #include "lyxtextclass.h" +#include "support/path_defines.h" +#include "support/os.h" #include #include @@ -31,9 +33,6 @@ using std::string; using std::vector; // Hacks to allow the thing to link in the lyxlayout stuff -string system_lyxdir = "../../../lib"; -string build_lyxdir = "../../lib"; -string user_lyxdir = "."; Debug::type const Debug::ANY = Debug::type(0); DebugStream lyxerr; @@ -150,6 +149,9 @@ int main(int argc, char * argv[]) return 2; } + lyx::support::os::init(&argc, &argv); + lyx::support::setLyxPaths(); + ifstream is(argv[1]); Parser p(is); //p.dump(); -- 2.39.2