summaryrefslogtreecommitdiff
path: root/Source/CursesDialog/ccmake.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/CursesDialog/ccmake.cxx')
-rw-r--r--Source/CursesDialog/ccmake.cxx217
1 files changed, 217 insertions, 0 deletions
diff --git a/Source/CursesDialog/ccmake.cxx b/Source/CursesDialog/ccmake.cxx
new file mode 100644
index 000000000..623d7d3a5
--- /dev/null
+++ b/Source/CursesDialog/ccmake.cxx
@@ -0,0 +1,217 @@
+/*============================================================================
+ CMake - Cross Platform Makefile Generator
+ Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
+
+ Distributed under the OSI-approved BSD License (the "License");
+ see accompanying file Copyright.txt for details.
+
+ 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.
+============================================================================*/
+#include "../cmCacheManager.h"
+#include "../cmSystemTools.h"
+#include "../cmake.h"
+#include "../cmDocumentation.h"
+
+#include <signal.h>
+#include <sys/ioctl.h>
+
+#include "cmCursesMainForm.h"
+#include "cmCursesStandardIncludes.h"
+
+#include <form.h>
+
+//----------------------------------------------------------------------------
+static const char * cmDocumentationName[][3] =
+{
+ {0,
+ " ccmake - Curses Interface for CMake.", 0},
+ {0,0,0}
+};
+
+//----------------------------------------------------------------------------
+static const char * cmDocumentationUsage[][3] =
+{
+ {0,
+ " ccmake <path-to-source>\n"
+ " ccmake <path-to-existing-build>", 0},
+ {0,0,0}
+};
+
+//----------------------------------------------------------------------------
+static const char * cmDocumentationDescription[][3] =
+{
+ {0,
+ "The \"ccmake\" executable is the CMake curses interface. Project "
+ "configuration settings may be specified interactively through "
+ "this GUI. Brief instructions are provided at the bottom of the "
+ "terminal when the program is running.", 0},
+ CMAKE_STANDARD_INTRODUCTION,
+ {0,0,0}
+};
+
+//----------------------------------------------------------------------------
+static const char * cmDocumentationOptions[][3] =
+{
+ CMAKE_STANDARD_OPTIONS_TABLE,
+ {0,0,0}
+};
+
+//----------------------------------------------------------------------------
+static const char * cmDocumentationSeeAlso[][3] =
+{
+ {0, "cmake", 0},
+ {0, "ctest", 0},
+ {0, 0, 0}
+};
+
+cmCursesForm* cmCursesForm::CurrentForm=0;
+
+extern "C"
+{
+
+void onsig(int)
+{
+ if (cmCursesForm::CurrentForm)
+ {
+ endwin();
+ initscr(); /* Initialization */
+ noecho(); /* Echo off */
+ cbreak(); /* nl- or cr not needed */
+ keypad(stdscr,TRUE); /* Use key symbols as
+ KEY_DOWN*/
+ refresh();
+ int x,y;
+ getmaxyx(stdscr, y, x);
+ cmCursesForm::CurrentForm->Render(1,1,x,y);
+ cmCursesForm::CurrentForm->UpdateStatusBar();
+ }
+ signal(SIGWINCH, onsig);
+}
+
+}
+
+void CMakeErrorHandler(const char* message, const char* title, bool&, void* clientData)
+{
+ cmCursesForm* self = static_cast<cmCursesForm*>( clientData );
+ self->AddError(message, title);
+}
+
+int main(int argc, char** argv)
+{
+ cmSystemTools::FindExecutableDirectory(argv[0]);
+ cmDocumentation doc;
+ doc.addCMakeStandardDocSections();
+ if(doc.CheckOptions(argc, argv))
+ {
+ cmake hcm;
+ std::vector<cmDocumentationEntry> commands;
+ std::vector<cmDocumentationEntry> compatCommands;
+ std::vector<cmDocumentationEntry> generators;
+ hcm.GetCommandDocumentation(commands, true, false);
+ hcm.GetCommandDocumentation(compatCommands, false, true);
+ hcm.GetGeneratorDocumentation(generators);
+ doc.SetName("ccmake");
+ doc.SetSection("Name",cmDocumentationName);
+ doc.SetSection("Usage",cmDocumentationUsage);
+ doc.SetSection("Description",cmDocumentationDescription);
+ doc.SetSection("Generators",generators);
+ doc.PrependSection("Options",cmDocumentationOptions);
+ doc.SetSection("Command",commands);
+ doc.SetSection("Compatibility Commands",compatCommands);
+ doc.SetSeeAlsoList(cmDocumentationSeeAlso);
+ return doc.PrintRequestedDocumentation(std::cout)? 0:1;
+ }
+
+ bool debug = false;
+ unsigned int i;
+ int j;
+ std::vector<std::string> args;
+ for(j =0; j < argc; ++j)
+ {
+ if(strcmp(argv[j], "-debug") == 0)
+ {
+ debug = true;
+ }
+ else
+ {
+ args.push_back(argv[j]);
+ }
+ }
+
+ std::string cacheDir = cmSystemTools::GetCurrentWorkingDirectory();
+ for(i=1; i < args.size(); ++i)
+ {
+ std::string arg = args[i];
+ if(arg.find("-B",0) == 0)
+ {
+ cacheDir = arg.substr(2);
+ }
+ }
+
+ cmSystemTools::DisableRunCommandOutput();
+
+ if (debug)
+ {
+ cmCursesForm::DebugStart();
+ }
+
+ initscr(); /* Initialization */
+ noecho(); /* Echo off */
+ cbreak(); /* nl- or cr not needed */
+ keypad(stdscr,TRUE); /* Use key symbols as
+ KEY_DOWN*/
+
+ signal(SIGWINCH, onsig);
+
+ int x,y;
+ getmaxyx(stdscr, y, x);
+ if ( x < cmCursesMainForm::MIN_WIDTH ||
+ y < cmCursesMainForm::MIN_HEIGHT )
+ {
+ endwin();
+ std::cerr << "Window is too small. A size of at least "
+ << cmCursesMainForm::MIN_WIDTH << " x "
+ << cmCursesMainForm::MIN_HEIGHT
+ << " is required to run ccmake." << std::endl;
+ return 1;
+ }
+
+
+ cmCursesMainForm* myform;
+
+ myform = new cmCursesMainForm(args, x);
+ if(myform->LoadCache(cacheDir.c_str()))
+ {
+ curses_clear();
+ touchwin(stdscr);
+ endwin();
+ delete myform;
+ std::cerr << "Error running cmake::LoadCache(). Aborting.\n";
+ return 1;
+ }
+
+ cmSystemTools::SetErrorCallback(CMakeErrorHandler, myform);
+
+ cmCursesForm::CurrentForm = myform;
+
+ myform->InitializeUI();
+ if ( myform->Configure(1) == 0 )
+ {
+ myform->Render(1, 1, x, y);
+ myform->HandleInput();
+ }
+
+ // Need to clean-up better
+ curses_clear();
+ touchwin(stdscr);
+ endwin();
+ delete cmCursesForm::CurrentForm;
+ cmCursesForm::CurrentForm = 0;
+
+ std::cout << std::endl << std::endl;
+
+ return 0;
+
+}