CMake/Source/QtDialog/CMakeSetup.cxx
Brad King 98c51ff6dc ENH: Overhaul CMake version numbering
This moves the version numbers into an isolated configured header so
that not all of CMake needs to rebuild when the version changes.

Previously we had spaces, dashes and/or the word 'patch' randomly chosen
before the patch number.  Now we always report version numbers in the
traditional format "<major>.<minor>.<patch>[-rc<rc>]".

We still use odd minor numbers for development versions.  Now we also
use the CCYYMMDD date as the patch number of development versions, thus
allowing tests for exact CMake versions.
2009-03-05 15:17:07 -05:00

190 lines
5.8 KiB
C++

/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#include "QCMake.h" // include to disable MS warnings
#include <QApplication>
#include <QFileInfo>
#include <QDir>
#include <QTranslator>
#include <QLocale>
#include "QMacInstallDialog.h"
#include "CMakeSetupDialog.h"
#include "cmDocumentation.h"
#include "cmake.h"
#include "cmVersion.h"
#include <cmsys/CommandLineArguments.hxx>
//----------------------------------------------------------------------------
static const char * cmDocumentationName[][3] =
{
{0,
" cmake-gui - CMake GUI.", 0},
{0,0,0}
};
//----------------------------------------------------------------------------
static const char * cmDocumentationUsage[][3] =
{
{0,
" cmake-gui [options]\n"
" cmake-gui [options] <path-to-source>\n"
" cmake-gui [options] <path-to-existing-build>", 0},
{0,0,0}
};
//----------------------------------------------------------------------------
static const char * cmDocumentationDescription[][3] =
{
{0,
"The \"cmake-gui\" executable is the CMake GUI. Project "
"configuration settings may be specified interactively. "
"Brief instructions are provided at the bottom of the "
"window when the program is running.", 0},
CMAKE_STANDARD_INTRODUCTION,
{0,0,0}
};
//----------------------------------------------------------------------------
static const char * cmDocumentationOptions[][3] =
{
{0,0,0}
};
int main(int argc, char** argv)
{
cmSystemTools::FindExecutableDirectory(argv[0]);
// check docs first so that X is not need to get docs
// do docs, if args were given
cmDocumentation doc;
if(argc >1 && doc.CheckOptions(argc, argv))
{
// 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> commands;
std::vector<cmDocumentationEntry> compatCommands;
std::map<std::string,cmDocumentationSection *> propDocs;
std::vector<cmDocumentationEntry> generators;
hcm.GetCommandDocumentation(commands, true, false);
hcm.GetCommandDocumentation(compatCommands, false, true);
hcm.GetGeneratorDocumentation(generators);
hcm.GetPropertiesDocumentation(propDocs);
doc.SetName("cmake");
doc.SetSection("Name",cmDocumentationName);
doc.SetSection("Usage",cmDocumentationUsage);
doc.SetSection("Description",cmDocumentationDescription);
doc.AppendSection("Generators",generators);
doc.PrependSection("Options",cmDocumentationOptions);
doc.SetSection("Commands",commands);
doc.SetSection("Compatilbility Commands", compatCommands);
doc.SetSections(propDocs);
return (doc.PrintRequestedDocumentation(std::cout)? 0:1);
}
QApplication app(argc, argv);
// 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);
}
// if arg for install
for(int i =0; i < argc; i++)
{
if(strcmp(argv[i], "--mac-install") == 0)
{
QMacInstallDialog setupdialog(0);
setupdialog.exec();
return 0;
}
}
// tell the cmake library where cmake is
QDir cmExecDir(QApplication::applicationDirPath());
#if defined(Q_OS_MAC)
cmExecDir.cd("../../../");
#endif
// pick up translation files if they exists in the data directory
QDir translationsDir = cmExecDir;
translationsDir.cd(".." CMAKE_DATA_DIR);
translationsDir.cd("i18n");
QTranslator translator;
QString transfile = QString("cmake_%1").arg(QLocale::system().name());
translator.load(transfile, translationsDir.path());
app.installTranslator(&translator);
// app setup
app.setApplicationName("CMakeSetup");
app.setOrganizationName("Kitware");
app.setWindowIcon(QIcon(":/Icons/CMakeSetup.png"));
CMakeSetupDialog dialog;
QString title = QString("CMake %1");
title = title.arg(cmVersion::GetCMakeVersion());
dialog.setWindowTitle(title);
dialog.show();
cmsys::CommandLineArguments arg;
arg.Initialize(argc, argv);
std::string binaryDirectory;
std::string sourceDirectory;
typedef cmsys::CommandLineArguments argT;
arg.AddArgument("-B", argT::CONCAT_ARGUMENT,
&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())
{
dialog.setSourceDirectory(sourceDirectory.c_str());
dialog.setBinaryDirectory(binaryDirectory.c_str());
}
else
{
QStringList args = app.arguments();
if(args.count() == 2)
{
QFileInfo buildFileInfo(args[1], "CMakeCache.txt");
QFileInfo srcFileInfo(args[1], "CMakeLists.txt");
if(buildFileInfo.exists())
{
dialog.setBinaryDirectory(buildFileInfo.absolutePath());
}
else if(srcFileInfo.exists())
{
dialog.setSourceDirectory(srcFileInfo.absolutePath());
dialog.setBinaryDirectory(QDir::currentPath());
}
}
}
return app.exec();
}