| /*============================================================================ |
| 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; |
| 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.SetSection("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; |
| |
| } |