cmakemain.cxx 4.34 KB
Newer Older
Will Schroeder's avatar
Will Schroeder committed
1 2
/*=========================================================================

3
  Program:   CMake - Cross-Platform Makefile Generator
Will Schroeder's avatar
Will Schroeder committed
4 5 6 7 8
  Module:    $RCSfile$
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

9 10
  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
Will Schroeder's avatar
Will Schroeder committed
11 12 13 14 15 16

     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.

=========================================================================*/
17
#include "cmakewizard.h"
Bill Hoffman's avatar
Bill Hoffman committed
18
#include "cmake.h"
19
#include "cmCacheManager.h"
20 21
#include "cmDynamicLoader.h"
#include "cmListFileCache.h"
22 23 24 25 26
#include "cmDocumentation.h"

//----------------------------------------------------------------------------
static const cmDocumentationEntry cmDocumentationName[] =
{
27 28
  {0,
   "  cmake - Cross-Platform Makefile Generator.", 0},
29 30 31 32 33 34 35
  {0,0,0}
};

//----------------------------------------------------------------------------
static const cmDocumentationEntry cmDocumentationUsage[] =
{
  {0,
36
   "  cmake [options] <path-to-source>", 0},
37 38 39 40 41 42 43 44 45 46
  {0,0,0}
};

//----------------------------------------------------------------------------
static const cmDocumentationEntry cmDocumentationDescription[] =
{
  {0,
   "CMake reads ... ", 0},
  {0,0,0}
};
47

48 49 50
//----------------------------------------------------------------------------
static const cmDocumentationEntry cmDocumentationOptions[] =
{
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
  CMAKE_STANDARD_OPTIONS_TABLE,
  {"-i", "Run in wizard mode.",
   "Wizard mode runs cmake interactively without a GUI.  The user is "
   "prompted to answer questions about the project configuration.  "
   "The answers are used to set cmake cache values."},
  {0,0,0}
};

//----------------------------------------------------------------------------
static const cmDocumentationEntry cmDocumentationNOTE[] =
{
  {0,
   "CMake no longer configures a project when run with no arguments.  "
   "In order to configure the project in the current directory, run\n"
   "  cmake .", 0},
66 67 68
  {0,0,0}
};

69
int do_cmake(int ac, char** av);
Andy Cedilnik's avatar
Andy Cedilnik committed
70
void updateProgress(const char *msg, float prog, void *cd);
Bill Hoffman's avatar
Bill Hoffman committed
71 72

int main(int ac, char** av)
73
{
74
  cmSystemTools::EnableMSVCDebugHook();
75
  int ret = do_cmake(ac, av);
76
#ifdef CMAKE_BUILD_WITH_CMAKE
77
  cmDynamicLoader::FlushCache();
78
#endif
79 80 81 82 83
  cmListFileCache::GetInstance()->ClearCache(); 
  return ret;
}

int do_cmake(int ac, char** av)
Bill Hoffman's avatar
Bill Hoffman committed
84
{
85 86 87
  cmDocumentation doc;
  if(cmDocumentation::Type ht = doc.CheckOptions(ac, av))
    {
88
    // Construct and print requested documentation.
89 90 91
    cmake hcm;
    std::vector<cmDocumentationEntry> commands;
    hcm.GetCommandDocumentation(commands);
92 93 94 95 96 97
    doc.SetNameSection(cmDocumentationName);
    doc.SetUsageSection(cmDocumentationUsage);
    doc.SetDescriptionSection(cmDocumentationDescription);
    doc.SetOptionsSection(cmDocumentationOptions);
    doc.SetCommandsSection(&commands[0]);
    doc.PrintDocumentation(ht, std::cout);
98 99 100 101 102 103 104 105 106 107 108 109 110
  
    // If we were run with no arguments, but a CMakeLists.txt file
    // exists, the user may have been trying to use the old behavior
    // of cmake to build a project in-source.  Print a message
    // explaining the change to standard error and return an error
    // condition in case the program is running from a script.
    if((ac == 1) && cmSystemTools::FileExists("CMakeLists.txt"))
      {
      doc.ClearSections();
      doc.AddSection("NOTE", cmDocumentationNOTE);
      doc.Print(cmDocumentation::UsageForm, std::cerr);
      return 1;
      }
111 112 113
    return 0;
    }
  
114
  bool wiz = false;
Ken Martin's avatar
Ken Martin committed
115
  bool command = false;
Bill Hoffman's avatar
Bill Hoffman committed
116 117 118
  std::vector<std::string> args;
  for(int i =0; i < ac; ++i)
    {
119 120 121 122
    if(strcmp(av[i], "-i") == 0)
      {
      wiz = true;
      }
123 124 125 126 127
    else if (strcmp(av[i], "-E") == 0)
      {
      command = true;
      }
    else 
128
      {
129
      args.push_back(av[i]);
130
      }
Bill Hoffman's avatar
Bill Hoffman committed
131
    }
Ken Martin's avatar
Ken Martin committed
132 133

  if(command)
134
    {
Ken Martin's avatar
Ken Martin committed
135
    int ret = cmake::CMakeCommand(args);
136 137
    return ret;
    }
Ken Martin's avatar
Ken Martin committed
138 139 140 141 142 143
  if (wiz)
    {
    cmakewizard wizard;
    wizard.RunWizard(args); 
    return 0;
    }
Andy Cedilnik's avatar
Andy Cedilnik committed
144 145
  cmake cm;  
  cm.SetProgressCallback(updateProgress, 0);
146
  return cm.Run(args); 
Bill Hoffman's avatar
Bill Hoffman committed
147
}
Andy Cedilnik's avatar
Andy Cedilnik committed
148 149 150 151 152

void updateProgress(const char *msg, float prog, void*)
{
  if ( prog < 0 )
    {
Andy Cedilnik's avatar
Andy Cedilnik committed
153
    std::cout << "-- " << msg << std::endl;
Andy Cedilnik's avatar
Andy Cedilnik committed
154
    }
Andy Cedilnik's avatar
Andy Cedilnik committed
155 156 157 158
  //else
  //{
  //std::cout << "-- " << msg << " " << prog << std::endl;
  //}
Andy Cedilnik's avatar
Andy Cedilnik committed
159
}