Browse Source

Merge topic 'cmake-gui-reference-manual'

0fe2ee3d43 CMake GUI: Add "CMake Reference Manual" help item
391ff1ec51 Refactor: Modernize cmSystemTools::FindCMakeResources()

Acked-by: Kitware Robot <[email protected]>
Merge-request: !5302
Brad King 5 years ago
parent
commit
cb8c51a08e

+ 16 - 2
Source/QtDialog/CMakeSetupDialog.cxx

@@ -181,11 +181,25 @@ CMakeSetupDialog::CMakeSetupDialog()
                    &QCMakeCacheView::collapseAll);
 
   QMenu* HelpMenu = this->menuBar()->addMenu(tr("&Help"));
-  a = HelpMenu->addAction(tr("About"));
-  QObject::connect(a, &QAction::triggered, this, &CMakeSetupDialog::doAbout);
   a = HelpMenu->addAction(tr("Help"));
   QObject::connect(a, &QAction::triggered, this, &CMakeSetupDialog::doHelp);
   a->setShortcut(QKeySequence::HelpContents);
+  a = HelpMenu->addAction(tr("CMake Reference Manual"));
+  QObject::connect(a, &QAction::triggered, this, []() {
+    QString urlFormat("https://cmake.org/cmake/help/v%1.%2/");
+    QUrl url(urlFormat.arg(QString::number(cmVersion::GetMajorVersion()),
+                           QString::number(cmVersion::GetMinorVersion())));
+
+    if (!cmSystemTools::GetHTMLDoc().empty()) {
+      url = QUrl::fromLocalFile(
+        QDir(QString::fromLocal8Bit(cmSystemTools::GetHTMLDoc().data()))
+          .filePath("index.html"));
+    }
+
+    QDesktopServices::openUrl(url);
+  });
+  a = HelpMenu->addAction(tr("About"));
+  QObject::connect(a, &QAction::triggered, this, &CMakeSetupDialog::doAbout);
 
   this->setAcceptDrops(true);
 

+ 1 - 0
Source/cmConfigure.cmake.h.in

@@ -21,6 +21,7 @@
 #define CMake_DEFAULT_RECURSION_LIMIT @CMake_DEFAULT_RECURSION_LIMIT@
 #define CMAKE_BIN_DIR "/@CMAKE_BIN_DIR@"
 #define CMAKE_DATA_DIR "/@CMAKE_DATA_DIR@"
+#define CMAKE_DOC_DIR "/@CMAKE_DOC_DIR@"
 
 #define CM_FALLTHROUGH cmsys_FALLTHROUGH
 

+ 22 - 6
Source/cmSystemTools.cxx

@@ -2077,6 +2077,7 @@ static std::string cmSystemToolsCMakeCursesCommand;
 static std::string cmSystemToolsCMakeGUICommand;
 static std::string cmSystemToolsCMClDepsCommand;
 static std::string cmSystemToolsCMakeRoot;
+static std::string cmSystemToolsHTMLDoc;
 void cmSystemTools::FindCMakeResources(const char* argv0)
 {
   std::string exe_dir;
@@ -2166,18 +2167,23 @@ void cmSystemTools::FindCMakeResources(const char* argv0)
   // Install tree has
   // - "<prefix><CMAKE_BIN_DIR>/cmake"
   // - "<prefix><CMAKE_DATA_DIR>"
-  if (cmHasSuffix(exe_dir, CMAKE_BIN_DIR)) {
+  // - "<prefix><CMAKE_DOC_DIR>"
+  if (cmHasLiteralSuffix(exe_dir, CMAKE_BIN_DIR)) {
     std::string const prefix =
-      exe_dir.substr(0, exe_dir.size() - strlen(CMAKE_BIN_DIR));
-    cmSystemToolsCMakeRoot = prefix + CMAKE_DATA_DIR;
+      exe_dir.substr(0, exe_dir.size() - cmStrLen(CMAKE_BIN_DIR));
+    cmSystemToolsCMakeRoot = cmStrCat(prefix, CMAKE_DATA_DIR);
+    if (cmSystemTools::FileExists(
+          cmStrCat(prefix, CMAKE_DOC_DIR "/html/index.html"))) {
+      cmSystemToolsHTMLDoc = cmStrCat(prefix, CMAKE_DOC_DIR "/html");
+    }
   }
   if (cmSystemToolsCMakeRoot.empty() ||
       !cmSystemTools::FileExists(
-        (cmSystemToolsCMakeRoot + "/Modules/CMake.cmake"))) {
+        cmStrCat(cmSystemToolsCMakeRoot, "/Modules/CMake.cmake"))) {
     // Build tree has "<build>/bin[/<config>]/cmake" and
     // "<build>/CMakeFiles/CMakeSourceDir.txt".
     std::string dir = cmSystemTools::GetFilenamePath(exe_dir);
-    std::string src_dir_txt = dir + "/CMakeFiles/CMakeSourceDir.txt";
+    std::string src_dir_txt = cmStrCat(dir, "/CMakeFiles/CMakeSourceDir.txt");
     cmsys::ifstream fin(src_dir_txt.c_str());
     std::string src_dir;
     if (fin && cmSystemTools::GetLineFromStream(fin, src_dir) &&
@@ -2185,13 +2191,18 @@ void cmSystemTools::FindCMakeResources(const char* argv0)
       cmSystemToolsCMakeRoot = src_dir;
     } else {
       dir = cmSystemTools::GetFilenamePath(dir);
-      src_dir_txt = dir + "/CMakeFiles/CMakeSourceDir.txt";
+      src_dir_txt = cmStrCat(dir, "/CMakeFiles/CMakeSourceDir.txt");
       cmsys::ifstream fin2(src_dir_txt.c_str());
       if (fin2 && cmSystemTools::GetLineFromStream(fin2, src_dir) &&
           cmSystemTools::FileIsDirectory(src_dir)) {
         cmSystemToolsCMakeRoot = src_dir;
       }
     }
+    if (!cmSystemToolsCMakeRoot.empty() && cmSystemToolsHTMLDoc.empty() &&
+        cmSystemTools::FileExists(
+          cmStrCat(dir, "/Utilities/Sphinx/html/index.html"))) {
+      cmSystemToolsHTMLDoc = cmStrCat(dir, "/Utilities/Sphinx/html");
+    }
   }
 #else
   // Bootstrap build knows its source.
@@ -2234,6 +2245,11 @@ std::string const& cmSystemTools::GetCMakeRoot()
   return cmSystemToolsCMakeRoot;
 }
 
+std::string const& cmSystemTools::GetHTMLDoc()
+{
+  return cmSystemToolsHTMLDoc;
+}
+
 std::string cmSystemTools::GetCurrentWorkingDirectory()
 {
   return cmSystemTools::CollapseFullPath(

+ 1 - 0
Source/cmSystemTools.h

@@ -389,6 +389,7 @@ public:
   static std::string const& GetCMakeCursesCommand();
   static std::string const& GetCMClDepsCommand();
   static std::string const& GetCMakeRoot();
+  static std::string const& GetHTMLDoc();
 
   /** Get the CWD mapped through the KWSys translation map.  */
   static std::string GetCurrentWorkingDirectory();