CMakeSetup.cxx 5.71 KB
Newer Older
1
2
3
/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
4

5
6
  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.
7

8
9
10
11
  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
12
#include "QCMake.h"  // include to disable MS warnings
13
#include <QApplication>
14
#include <QDir>
15
#include <QTranslator>
16
#include <QLocale>
17
#include "QMacInstallDialog.h"
18
#include "CMakeSetupDialog.h"
19
20
#include "cmDocumentation.h"
#include "cmake.h"
21
#include "cmVersion.h"
22
#include <cmsys/CommandLineArguments.hxx>
23
#include <cmsys/SystemTools.hxx>
24
25
26
27
28

//----------------------------------------------------------------------------
static const char * cmDocumentationName[][3] =
{
  {0,
29
   "  cmake-gui - CMake GUI.", 0},
30
31
32
33
34
35
36
  {0,0,0}
};

//----------------------------------------------------------------------------
static const char * cmDocumentationUsage[][3] =
{
  {0,
37
38
39
   "  cmake-gui [options]\n"
   "  cmake-gui [options] <path-to-source>\n"
   "  cmake-gui [options] <path-to-existing-build>", 0},
40
41
42
43
44
45
46
47
  {0,0,0}
};

//----------------------------------------------------------------------------
static const char * cmDocumentationOptions[][3] =
{
  {0,0,0}
};
48
49
50

int main(int argc, char** argv)
{
51
  cmSystemTools::FindExecutableDirectory(argv[0]);
52
53
54
  // check docs first so that X is not need to get docs
  // do docs, if args were given
  cmDocumentation doc;
55
  doc.addCMakeStandardDocSections();
56
  if(argc >1 && doc.CheckOptions(argc, argv))
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    {
    // Construct and print requested documentation.
    cmake hcm;
    hcm.AddCMakePaths();
    // just incase the install is bad avoid a seg fault
    const char* root = hcm.GetCacheDefinition("CMAKE_ROOT");
    if(root)
      {
      doc.SetCMakeRoot(root);
      }

    std::vector<cmDocumentationEntry> generators;
    hcm.GetGeneratorDocumentation(generators);
    doc.SetName("cmake");
    doc.SetSection("Name",cmDocumentationName);
    doc.SetSection("Usage",cmDocumentationUsage);
    doc.AppendSection("Generators",generators);
    doc.PrependSection("Options",cmDocumentationOptions);

    return (doc.PrintRequestedDocumentation(std::cout)? 0:1);
    }

79
  QApplication app(argc, argv);
80

Clinton Stimpson's avatar
 
Clinton Stimpson committed
81
82
83
84
85
86
  // clean out standard Qt paths for plugins, which we don't use anyway
  // when creating Mac bundles, it potentially causes problems
  foreach(QString p, QApplication::libraryPaths())
    {
    QApplication::removeLibraryPath(p);
    }
87
88

  // if arg for install
89
90
91
92
93
94
95
96
97
  for(int i =0; i < argc; i++)
    {
    if(strcmp(argv[i], "--mac-install") == 0)
      {
      QMacInstallDialog setupdialog(0);
      setupdialog.exec();
      return 0;
      }
    }
98
  // tell the cmake library where cmake is
99
100
101
102
  QDir cmExecDir(QApplication::applicationDirPath());
#if defined(Q_OS_MAC)
  cmExecDir.cd("../../../");
#endif
103

104
105
  // pick up translation files if they exists in the data directory
  QDir translationsDir = cmExecDir;
106
  translationsDir.cd(QString::fromLocal8Bit(".." CMAKE_DATA_DIR));
107
  translationsDir.cd("i18n");
108
109
  QTranslator translator;
  QString transfile = QString("cmake_%1").arg(QLocale::system().name());
110
  translator.load(transfile, translationsDir.path());
111
  app.installTranslator(&translator);
112

113
  // app setup
114
115
  app.setApplicationName("CMakeSetup");
  app.setOrganizationName("Kitware");
116
117
118
119
  QIcon appIcon;
  appIcon.addFile(":/Icons/CMakeSetup32.png");
  appIcon.addFile(":/Icons/CMakeSetup128.png");
  app.setWindowIcon(appIcon);
120

121
122
  CMakeSetupDialog dialog;
  dialog.show();
123

124
125
126
127
128
  cmsys::CommandLineArguments arg;
  arg.Initialize(argc, argv);
  std::string binaryDirectory;
  std::string sourceDirectory;
  typedef cmsys::CommandLineArguments argT;
129
  arg.AddArgument("-B", argT::CONCAT_ARGUMENT,
130
131
132
133
134
135
136
                  &binaryDirectory, "Binary Directory");
  arg.AddArgument("-H", argT::CONCAT_ARGUMENT,
                  &sourceDirectory, "Source Directory");
  // do not complain about unknown options
  arg.StoreUnusedArguments(true);
  arg.Parse();
  if(!sourceDirectory.empty() && !binaryDirectory.empty())
137
    {
138
139
    dialog.setSourceDirectory(QString::fromLocal8Bit(sourceDirectory.c_str()));
    dialog.setBinaryDirectory(QString::fromLocal8Bit(binaryDirectory.c_str()));
140
141
142
143
144
    }
  else
    {
    QStringList args = app.arguments();
    if(args.count() == 2)
145
      {
146
      cmsys_stl::string filePath = cmSystemTools::CollapseFullPath(args[1].toLocal8Bit().data());
147
148

      // check if argument is a directory containing CMakeCache.txt
149
150
      cmsys_stl::string buildFilePath =
        cmSystemTools::CollapseFullPath("CMakeCache.txt", filePath.c_str());
151
152
153
154
155
156
157
158
159

      // check if argument is a CMakeCache.txt file
      if(cmSystemTools::GetFilenameName(filePath) == "CMakeCache.txt" &&
         cmSystemTools::FileExists(filePath.c_str()))
        {
        buildFilePath = filePath;
        }

      // check if argument is a directory containing CMakeLists.txt
160
161
      cmsys_stl::string srcFilePath =
        cmSystemTools::CollapseFullPath("CMakeLists.txt", filePath.c_str());
162

163
      if(cmSystemTools::FileExists(buildFilePath.c_str()))
164
        {
165
166
167
168
169
        dialog.setBinaryDirectory(
          QString::fromLocal8Bit(
            cmSystemTools::GetFilenamePath(buildFilePath).c_str()
            )
          );
170
        }
171
      else if(cmSystemTools::FileExists(srcFilePath.c_str()))
172
        {
173
174
175
176
        dialog.setSourceDirectory(QString::fromLocal8Bit(filePath.c_str()));
        dialog.setBinaryDirectory(
          QString::fromLocal8Bit(cmSystemTools::CollapseFullPath(".").c_str())
          );
177
        }
178
179
      }
    }
180

181
182
183
  return app.exec();
}