diff options
Diffstat (limited to 'Source/CursesDialog/ccmake.cxx')
-rw-r--r-- | Source/CursesDialog/ccmake.cxx | 217 |
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; + +} |