mirror of
https://github.com/reactos/CMake.git
synced 2025-01-10 05:31:02 +00:00
16d040c958
Teach the project() command to recognize an optional "LANGUAGES" keyword after the project name and prior to the list of languages. Do not allow multiple copies of the keyword. If the keyword is specified and no languages are listed, imply NONE.
119 lines
3.6 KiB
C++
119 lines
3.6 KiB
C++
/*============================================================================
|
|
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 "cmProjectCommand.h"
|
|
|
|
// cmProjectCommand
|
|
bool cmProjectCommand
|
|
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
|
|
{
|
|
if(args.size() < 1 )
|
|
{
|
|
this->SetError("PROJECT called with incorrect number of arguments");
|
|
return false;
|
|
}
|
|
this->Makefile->SetProjectName(args[0].c_str());
|
|
|
|
std::string bindir = args[0];
|
|
bindir += "_BINARY_DIR";
|
|
std::string srcdir = args[0];
|
|
srcdir += "_SOURCE_DIR";
|
|
|
|
this->Makefile->AddCacheDefinition
|
|
(bindir.c_str(),
|
|
this->Makefile->GetCurrentOutputDirectory(),
|
|
"Value Computed by CMake", cmCacheManager::STATIC);
|
|
this->Makefile->AddCacheDefinition
|
|
(srcdir.c_str(),
|
|
this->Makefile->GetCurrentDirectory(),
|
|
"Value Computed by CMake", cmCacheManager::STATIC);
|
|
|
|
bindir = "PROJECT_BINARY_DIR";
|
|
srcdir = "PROJECT_SOURCE_DIR";
|
|
|
|
this->Makefile->AddDefinition(bindir.c_str(),
|
|
this->Makefile->GetCurrentOutputDirectory());
|
|
this->Makefile->AddDefinition(srcdir.c_str(),
|
|
this->Makefile->GetCurrentDirectory());
|
|
|
|
this->Makefile->AddDefinition("PROJECT_NAME", args[0].c_str());
|
|
|
|
// Set the CMAKE_PROJECT_NAME variable to be the highest-level
|
|
// project name in the tree. If there are two project commands
|
|
// in the same CMakeLists.txt file, and it is the top level
|
|
// CMakeLists.txt file, then go with the last one, so that
|
|
// CMAKE_PROJECT_NAME will match PROJECT_NAME, and cmake --build
|
|
// will work.
|
|
if(!this->Makefile->GetDefinition("CMAKE_PROJECT_NAME")
|
|
|| (this->Makefile->GetLocalGenerator()->GetParent() == 0) )
|
|
{
|
|
this->Makefile->AddDefinition("CMAKE_PROJECT_NAME", args[0].c_str());
|
|
this->Makefile->AddCacheDefinition
|
|
("CMAKE_PROJECT_NAME",
|
|
args[0].c_str(),
|
|
"Value Computed by CMake", cmCacheManager::STATIC);
|
|
}
|
|
|
|
bool haveLanguages = false;
|
|
std::vector<std::string> languages;
|
|
for(size_t i = 1; i < args.size(); ++i)
|
|
{
|
|
if(args[i] == "LANGUAGES")
|
|
{
|
|
if(haveLanguages)
|
|
{
|
|
this->Makefile->IssueMessage
|
|
(cmake::FATAL_ERROR, "LANGUAGES may be specified at most once.");
|
|
cmSystemTools::SetFatalErrorOccured();
|
|
return true;
|
|
}
|
|
haveLanguages = true;
|
|
}
|
|
else
|
|
{
|
|
languages.push_back(args[i]);
|
|
}
|
|
}
|
|
|
|
if (haveLanguages && languages.empty())
|
|
{
|
|
languages.push_back("NONE");
|
|
}
|
|
|
|
if (languages.empty())
|
|
{
|
|
// if no language is specified do c and c++
|
|
languages.push_back("C");
|
|
languages.push_back("CXX");
|
|
}
|
|
this->Makefile->EnableLanguage(languages, false);
|
|
std::string extraInclude = "CMAKE_PROJECT_" + args[0] + "_INCLUDE";
|
|
const char* include = this->Makefile->GetDefinition(extraInclude.c_str());
|
|
if(include)
|
|
{
|
|
std::string fullFilePath;
|
|
bool readit =
|
|
this->Makefile->ReadListFile( this->Makefile->GetCurrentListFile(),
|
|
include);
|
|
if(!readit && !cmSystemTools::GetFatalErrorOccured())
|
|
{
|
|
std::string m =
|
|
"could not find file:\n"
|
|
" ";
|
|
m += include;
|
|
this->SetError(m.c_str());
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|