]> git.lyx.org Git - lyx.git/blobdiff - src/support/os.cpp
Fix some warnings
[lyx.git] / src / support / os.cpp
index 9840ad3f4574b8673f18bdb60541d5078b4393a6..616b9c6936d4a16594f239fbb2dc1d2332db1358 100644 (file)
 
 #include <config.h>
 
+#ifdef _WIN32
+# define _WIN32_WINNT 0x0600
+#endif
+
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/filetools.h"
@@ -48,8 +52,7 @@ int timeout_min()
 
 static string const python23_call(string const & binary, bool verbose = false)
 {
-       const string version_info = " -c 'from __future__ import print_function;import sys; print(sys.version_info[:2], end=\"\")'";
-       static regex const python_reg("\\((\\d*), (\\d*)\\)");
+       const string version_info = " -c \"from __future__ import print_function;import sys; print(sys.version_info[:2], end=\\\"\\\")\"";
        // Default to "python" if no binary is given.
        if (binary.empty())
                return "python -tt";
@@ -60,12 +63,18 @@ static string const python23_call(string const & binary, bool verbose = false)
        cmd_ret const out = runCommand(binary + version_info);
 
        smatch sm;
-       if (out.first < 0 || !regex_match(out.second, sm, python_reg))
+       try {
+               static regex const python_reg("\\((\\d*), (\\d*)\\)");
+               if (out.first < 0 || !regex_match(out.second, sm, python_reg))
+                       return string();
+       } catch(regex_error const & /*e*/) {
+               LYXERR0("Regex error! This should not happen.");
                return string();
+       }
 
        int major = convert<int>(sm.str(1));
        int minor = convert<int>(sm.str(2));
-       if((major == 2 && minor < 7) || (major == 3 && minor < 4))
+       if((major == 2 && minor < 7) || (major == 3 && minor < 5))
                return string();
 
        if (verbose)
@@ -84,49 +93,76 @@ static string const find_python_binary()
        // PEP 397 -- Python launcher for Windows
        // https://www.python.org/dev/peps/pep-0397/
 
+#ifdef _WIN32
+       // Check through python launcher whether python 3 is
+       // installed on computer.
+       string command = python23_call("py -3");
+#else
        // Check whether python3 in PATH is the right one.
        string command = python23_call("python3");
+#endif // _WIN32
        if (!command.empty())
                return command;
 
+#ifndef _WIN32
        // python3 does not exists, let us try to find python3.x in PATH
        // the search is probably broader than required
        // but we are trying hard to find a valid python binary
        vector<string> const path = getEnvPath("PATH");
        lyxerr << "Looking for python 3.x ...\n";
-       for (auto bin: path) {
+       for (auto bin : path) {
                QString const dir = toqstr(bin);
                string const localdir = dir.toLocal8Bit().constData();
                QDir qdir(dir);
                qdir.setFilter(QDir::Files | QDir::Executable);
                QStringList list = qdir.entryList(QStringList("python3*"));
-               for (auto bin: list) {
-                       string const binary = addName(localdir,
-                               bin.toLocal8Bit().constData());
+               for (auto bin: list) {
+                       string const binary = "\"" + addName(localdir,
+                               bin2.toLocal8Bit().constData()) + "\"";
                        command = python23_call(binary, true);
                        if (!command.empty())
                                return command;
                }
        }
+#endif // !_WIN32
 
        // python 3 was not found let us look for python 2
+#ifdef _WIN32
+       command = python23_call("py -2");
+#else
        command = python23_call("python2");
+#endif // _WIN32
        if (!command.empty())
                return command;
 
+#ifdef _WIN32
+       // python launcher is not installed, let cmd auto check 
+       // PATH for a python.exe
+       command = python23_call("python");
+       if (!command.empty())
+               return command;
+
+       //failed, prepare to search PATH manually
+       vector<string> const path = getEnvPath("PATH");
+       lyxerr << "Manually looking for python in PATH ...\n";
+       QString const exeName = "python*";
+#else
        // python2 does not exists, let us try to find python2.x in PATH
        // the search is probably broader than required
        // but we are trying hard to find a valid python binary
        lyxerr << "Looking for python 2.x ...\n";
-       for (auto bin: path) {
+       QString const exeName = "python2*";
+#endif // _WIN32
+
+       for (auto bin : path) {
                QString const dir = toqstr(bin);
                string const localdir = dir.toLocal8Bit().constData();
                QDir qdir(dir);
                qdir.setFilter(QDir::Files | QDir::Executable);
-               QStringList list = qdir.entryList(QStringList("python2*"));
-               for (auto bin: list) {
-                       string const binary = addName(localdir,
-                               bin.toLocal8Bit().constData());
+               QStringList list = qdir.entryList(QStringList(exeName));
+               for (auto bin: list) {
+                       string const binary = "\"" + addName(localdir,
+                               bin2.toLocal8Bit().constData()) + "\"";
                        command = python23_call(binary, true);
                        if (!command.empty())
                                return command;