165 lines
5.1 KiB
C++
165 lines
5.1 KiB
C++
/*=========================================================================
|
|
|
|
Program: CMake - Cross-Platform Makefile Generator
|
|
Module: $RCSfile$
|
|
Language: C++
|
|
Date: $Date$
|
|
Version: $Revision$
|
|
|
|
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
|
|
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
|
|
|
|
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.
|
|
|
|
=========================================================================*/
|
|
|
|
#include "cmGlobalUnixMakefileGenerator.h"
|
|
#include "cmLocalUnixMakefileGenerator.h"
|
|
#include "cmMakefile.h"
|
|
#include "cmake.h"
|
|
|
|
void cmGlobalUnixMakefileGenerator::EnableLanguage(const char* lang,
|
|
cmMakefile *mf)
|
|
{
|
|
bool isLocal = m_CMakeInstance->GetLocal();
|
|
// if no lang specified use CXX
|
|
if(!lang )
|
|
{
|
|
lang = "CXX";
|
|
}
|
|
std::string root
|
|
= cmSystemTools::ConvertToOutputPath(mf->GetDefinition("CMAKE_ROOT"));
|
|
std::string rootBin = mf->GetHomeOutputDirectory();
|
|
if(m_ConfiguredFilesPath.size())
|
|
{
|
|
rootBin = m_ConfiguredFilesPath;
|
|
}
|
|
bool needCBackwards = false;
|
|
bool needCXXBackwards = false;
|
|
|
|
// check for a C compiler and configure it
|
|
if(!isLocal &&
|
|
!this->GetLanguageEnabled("C") &&
|
|
lang[0] == 'C')
|
|
{
|
|
if (m_CMakeInstance->GetIsInTryCompile())
|
|
{
|
|
cmSystemTools::Error("This should not have happen. "
|
|
"If you see this message, you are probably using a "
|
|
"broken CMakeLists.txt file or a problematic release of "
|
|
"CMake");
|
|
}
|
|
needCBackwards = true;
|
|
// Read the DetermineSystem file
|
|
std::string systemFile = root;
|
|
systemFile += "/Modules/CMakeDetermineSystem.cmake";
|
|
mf->ReadListFile(0, systemFile.c_str());
|
|
// read determine C compiler
|
|
std::string determineCFile = root;
|
|
determineCFile += "/Modules/CMakeDetermineCCompiler.cmake";
|
|
mf->ReadListFile(0,determineCFile.c_str());
|
|
this->SetLanguageEnabled("C");
|
|
}
|
|
|
|
// check for a CXX compiler and configure it
|
|
if(!isLocal &&
|
|
!this->GetLanguageEnabled("CXX") &&
|
|
strcmp(lang, "CXX") == 0)
|
|
{
|
|
needCXXBackwards = true;
|
|
std::string determineCFile = root;
|
|
determineCFile += "/Modules/CMakeDetermineCXXCompiler.cmake";
|
|
mf->ReadListFile(0,determineCFile.c_str());
|
|
this->SetLanguageEnabled("CXX");
|
|
}
|
|
|
|
|
|
std::string fpath = rootBin;
|
|
if(!mf->GetDefinition("CMAKE_SYSTEM_LOADED"))
|
|
{
|
|
fpath += "/CMakeSystem.cmake";
|
|
mf->ReadListFile(0,fpath.c_str());
|
|
}
|
|
// if C, then enable C
|
|
if(lang[0] == 'C' && !mf->GetDefinition("CMAKE_C_COMPILER_LOADED"))
|
|
{
|
|
fpath = rootBin;
|
|
fpath += "/CMakeCCompiler.cmake";
|
|
mf->ReadListFile(0,fpath.c_str());
|
|
}
|
|
if(strcmp(lang, "CXX") == 0 && !mf->GetDefinition("CMAKE_CXX_COMPILER_LOADED"))
|
|
{
|
|
fpath = rootBin;
|
|
fpath += "/CMakeCXXCompiler.cmake";
|
|
mf->ReadListFile(0,fpath.c_str());
|
|
}
|
|
if(!mf->GetDefinition("CMAKE_SYSTEM_SPECIFIC_INFORMATION_LOADED"))
|
|
{
|
|
fpath = root;
|
|
fpath += "/Modules/CMakeSystemSpecificInformation.cmake";
|
|
mf->ReadListFile(0,fpath.c_str());
|
|
}
|
|
|
|
if(!isLocal)
|
|
{
|
|
// At this point we should have enough info for a try compile
|
|
// which is used in the backward stuff
|
|
if(needCBackwards)
|
|
{
|
|
if (!m_CMakeInstance->GetIsInTryCompile())
|
|
{
|
|
// for old versions of CMake ListFiles
|
|
const char* versionValue
|
|
= mf->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION");
|
|
if (!versionValue || atof(versionValue) <= 1.4)
|
|
{
|
|
std::string ifpath = root + "/Modules/CMakeBackwardCompatibilityC.cmake";
|
|
mf->ReadListFile(0,ifpath.c_str());
|
|
}
|
|
}
|
|
}
|
|
if(needCXXBackwards)
|
|
{
|
|
if (!m_CMakeInstance->GetIsInTryCompile())
|
|
{
|
|
// for old versions of CMake ListFiles
|
|
const char* versionValue
|
|
= mf->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION");
|
|
if (!versionValue || atof(versionValue) <= 1.4)
|
|
{
|
|
std::string fpath = root + "/Modules/CMakeBackwardCompatibilityCXX.cmake";
|
|
mf->ReadListFile(0,fpath.c_str());
|
|
}
|
|
}
|
|
}
|
|
// if we are from the top, always define this
|
|
mf->AddDefinition("RUN_CONFIGURE", true);
|
|
}
|
|
}
|
|
|
|
///! Create a local generator appropriate to this Global Generator
|
|
cmLocalGenerator *cmGlobalUnixMakefileGenerator::CreateLocalGenerator()
|
|
{
|
|
cmLocalGenerator *lg = new cmLocalUnixMakefileGenerator;
|
|
lg->SetGlobalGenerator(this);
|
|
return lg;
|
|
}
|
|
|
|
void cmGlobalUnixMakefileGenerator::EnableLanguagesFromGenerator(cmGlobalGenerator *gen)
|
|
{
|
|
this->SetConfiguredFilesPath(gen->GetCMakeInstance()->GetHomeOutputDirectory());
|
|
// if C, then enable C
|
|
if(gen->GetLanguageEnabled("C"))
|
|
{
|
|
this->SetLanguageEnabled("C");
|
|
}
|
|
|
|
// if CXX
|
|
if(gen->GetLanguageEnabled("CXX"))
|
|
{
|
|
this->SetLanguageEnabled("CXX");
|
|
}
|
|
}
|