cmGlobalJOMMakefileGenerator.cxx 2.94 KB
Newer Older
1 2
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
3
#include "cmGlobalJOMMakefileGenerator.h"
Brad King's avatar
Brad King committed
4

5
#include "cmDocumentationEntry.h"
6 7
#include "cmLocalUnixMakefileGenerator3.h"
#include "cmMakefile.h"
8
#include "cmState.h"
9
#include "cmake.h"
10

11 12
cmGlobalJOMMakefileGenerator::cmGlobalJOMMakefileGenerator(cmake* cm)
  : cmGlobalUnixMakefileGenerator3(cm)
13 14 15 16 17
{
  this->FindMakeProgramFile = "CMakeJOMFindMake.cmake";
  this->ForceUnixPaths = false;
  this->ToolSupportsColor = true;
  this->UseLinkScript = false;
18 19
  cm->GetState()->SetWindowsShell(true);
  cm->GetState()->SetNMake(true);
20
  this->DefineWindowsNULL = true;
21
  this->PassMakeflags = true;
22
  this->UnixCD = false;
23
  this->MakeSilentFlag = "/nologo";
24 25
}

26 27
void cmGlobalJOMMakefileGenerator::EnableLanguage(
  std::vector<std::string> const& l, cmMakefile* mf, bool optional)
28
{
29
  // pick a default
30 31 32 33 34
  mf->AddDefinition("CMAKE_GENERATOR_CC", "cl");
  mf->AddDefinition("CMAKE_GENERATOR_CXX", "cl");
  this->cmGlobalUnixMakefileGenerator3::EnableLanguage(l, mf, optional);
}

35 36
void cmGlobalJOMMakefileGenerator::GetDocumentation(
  cmDocumentationEntry& entry)
37
{
38
  entry.Name = cmGlobalJOMMakefileGenerator::GetActualName();
39 40
  entry.Brief = "Generates JOM makefiles.";
}
41

42 43
void cmGlobalJOMMakefileGenerator::PrintCompilerAdvice(
  std::ostream& os, std::string const& lang, const char* envVar) const
44
{
45
  if (lang == "CXX" || lang == "C") {
46
    /* clang-format off */
47 48 49 50 51
    os <<
      "To use the JOM generator with Visual C++, cmake must be run from a "
      "shell that can use the compiler cl from the command line. This "
      "environment is unable to invoke the cl compiler. To fix this problem, "
      "run cmake from the Visual Studio Command Prompt (vcvarsall.bat).\n";
52
    /* clang-format on */
53
  }
54 55
  this->cmGlobalUnixMakefileGenerator3::PrintCompilerAdvice(os, lang, envVar);
}
56 57

void cmGlobalJOMMakefileGenerator::GenerateBuildCommand(
58
  GeneratedMakeCommand& makeCommand, const std::string& makeProgram,
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
  const std::string& projectName, const std::string& projectDir,
  const std::string& targetName, const std::string& config, bool fast,
  int jobs, bool verbose, std::vector<std::string> const& makeOptions)
{
  std::vector<std::string> jomMakeOptions;

  // Since we have full control over the invocation of JOM, let us
  // make it quiet.
  jomMakeOptions.push_back(this->MakeSilentFlag);
  jomMakeOptions.insert(jomMakeOptions.end(), makeOptions.begin(),
                        makeOptions.end());

  // JOM does parallel builds by default, the -j is only needed if a specific
  // number is given
  // see https://github.com/qt-labs/jom/blob/v1.1.2/src/jomlib/options.cpp
  if (jobs == cmake::DEFAULT_BUILD_PARALLEL_LEVEL) {
    jobs = cmake::NO_BUILD_PARALLEL_LEVEL;
  }

  cmGlobalUnixMakefileGenerator3::GenerateBuildCommand(
    makeCommand, makeProgram, projectName, projectDir, targetName, config,
    fast, jobs, verbose, jomMakeOptions);
}