Merge topic 'refactor-state-initialization'

2bf7de16 Subdirs: Initialize from parent before configuring.
0aa34de5 cmState: Initialize properties immediately.
20b95ef8 cmState: Initialize default definitions immediately.
841164cb cmState: Initialize current directories immediately.
2c219baf cmState: Initialize top level source directories immediately.
84e0776e cmMakefile: Set default internal definitions directly.
871ab98d cmMakefile: Set internal definitions directly.
This commit is contained in:
Brad King 2015-10-14 13:35:56 -04:00 committed by CMake Topic Stage
commit 2380896a05
17 changed files with 142 additions and 88 deletions

View File

@ -717,6 +717,7 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects(
cmake cm; cmake cm;
cm.SetHomeDirectory(""); cm.SetHomeDirectory("");
cm.SetHomeOutputDirectory(""); cm.SetHomeOutputDirectory("");
cm.GetCurrentSnapshot().SetDefaultDefinitions();
cm.AddCMakePaths(); cm.AddCMakePaths();
cm.SetProgressCallback(cmCPackGeneratorProgress, this); cm.SetProgressCallback(cmCPackGeneratorProgress, this);
cmGlobalGenerator gg(&cm); cmGlobalGenerator gg(&cm);

View File

@ -199,6 +199,7 @@ int main (int argc, char const* const* argv)
cmake cminst; cmake cminst;
cminst.SetHomeDirectory(""); cminst.SetHomeDirectory("");
cminst.SetHomeOutputDirectory(""); cminst.SetHomeOutputDirectory("");
cminst.GetCurrentSnapshot().SetDefaultDefinitions();
cminst.GetState()->RemoveUnscriptableCommands(); cminst.GetState()->RemoveUnscriptableCommands();
cmGlobalGenerator cmgg(&cminst); cmGlobalGenerator cmgg(&cminst);
cmsys::auto_ptr<cmMakefile> globalMF( cmsys::auto_ptr<cmMakefile> globalMF(

View File

@ -736,6 +736,7 @@ void cmCTestLaunch::LoadConfig()
cmake cm; cmake cm;
cm.SetHomeDirectory(""); cm.SetHomeDirectory("");
cm.SetHomeOutputDirectory(""); cm.SetHomeOutputDirectory("");
cm.GetCurrentSnapshot().SetDefaultDefinitions();
cmGlobalGenerator gg(&cm); cmGlobalGenerator gg(&cm);
cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(&gg, cm.GetCurrentSnapshot())); cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(&gg, cm.GetCurrentSnapshot()));
std::string fname = this->LogDir; std::string fname = this->LogDir;

View File

@ -314,6 +314,7 @@ void cmCTestScriptHandler::CreateCMake()
this->CMake = new cmake; this->CMake = new cmake;
this->CMake->SetHomeDirectory(""); this->CMake->SetHomeDirectory("");
this->CMake->SetHomeOutputDirectory(""); this->CMake->SetHomeOutputDirectory("");
this->CMake->GetCurrentSnapshot().SetDefaultDefinitions();
this->CMake->AddCMakePaths(); this->CMake->AddCMakePaths();
this->GlobalGenerator = new cmGlobalGenerator(this->CMake); this->GlobalGenerator = new cmGlobalGenerator(this->CMake);

View File

@ -1590,6 +1590,7 @@ void cmCTestTestHandler::GetListOfTests()
cmake cm; cmake cm;
cm.SetHomeDirectory(""); cm.SetHomeDirectory("");
cm.SetHomeOutputDirectory(""); cm.SetHomeOutputDirectory("");
cm.GetCurrentSnapshot().SetDefaultDefinitions();
cmGlobalGenerator gg(&cm); cmGlobalGenerator gg(&cm);
cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(&gg, cm.GetCurrentSnapshot())); cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(&gg, cm.GetCurrentSnapshot()));
mf->AddDefinition("CTEST_CONFIGURATION_TYPE", mf->AddDefinition("CTEST_CONFIGURATION_TYPE",

View File

@ -517,6 +517,7 @@ int cmCTest::Initialize(const char* binary_dir, cmCTestStartCommand* command)
cmake cm; cmake cm;
cm.SetHomeDirectory(""); cm.SetHomeDirectory("");
cm.SetHomeOutputDirectory(""); cm.SetHomeOutputDirectory("");
cm.GetCurrentSnapshot().SetDefaultDefinitions();
cmGlobalGenerator gg(&cm); cmGlobalGenerator gg(&cm);
cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(&gg, cm.GetCurrentSnapshot())); cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(&gg, cm.GetCurrentSnapshot()));
if ( !this->ReadCustomConfigurationFileTree(this->BinaryDir.c_str(), if ( !this->ReadCustomConfigurationFileTree(this->BinaryDir.c_str(),

View File

@ -589,6 +589,7 @@ void cmGlobalUnixMakefileGenerator3
(this->CMakeInstance->GetHomeDirectory()); (this->CMakeInstance->GetHomeDirectory());
snapshot.GetDirectory().SetCurrentBinary snapshot.GetDirectory().SetCurrentBinary
(this->CMakeInstance->GetHomeOutputDirectory()); (this->CMakeInstance->GetHomeOutputDirectory());
snapshot.SetDefaultDefinitions();
mf = new cmMakefile(this, snapshot); mf = new cmMakefile(this, snapshot);
} }

View File

@ -67,6 +67,7 @@ void cmGraphVizWriter::ReadSettings(const char* settingsFileName,
cmake cm; cmake cm;
cm.SetHomeDirectory(""); cm.SetHomeDirectory("");
cm.SetHomeOutputDirectory(""); cm.SetHomeOutputDirectory("");
cm.GetCurrentSnapshot().SetDefaultDefinitions();
cmGlobalGenerator ggi(&cm); cmGlobalGenerator ggi(&cm);
cmsys::auto_ptr<cmMakefile> mf( cmsys::auto_ptr<cmMakefile> mf(
new cmMakefile(&ggi, cm.GetCurrentSnapshot())); new cmMakefile(&ggi, cm.GetCurrentSnapshot()));

View File

@ -50,14 +50,11 @@ cmMakefile::cmMakefile(cmGlobalGenerator* globalGenerator,
{ {
this->IsSourceFileTryCompile = false; this->IsSourceFileTryCompile = false;
// Initialize these first since AddDefaultDefinitions calls AddDefinition
this->WarnUnused = this->GetCMakeInstance()->GetWarnUnused(); this->WarnUnused = this->GetCMakeInstance()->GetWarnUnused();
this->CheckSystemVars = this->GetCMakeInstance()->GetCheckSystemVars(); this->CheckSystemVars = this->GetCMakeInstance()->GetCheckSystemVars();
this->SuppressWatches = false; this->SuppressWatches = false;
// Setup the default include file regular expression (match everything).
this->SetProperty("INCLUDE_REGULAR_EXPRESSION", "^.*$");
// Setup the default include complaint regular expression (match nothing). // Setup the default include complaint regular expression (match nothing).
this->ComplainFileRegularExpression = "^$"; this->ComplainFileRegularExpression = "^$";
// Source and header file extensions that we can handle // Source and header file extensions that we can handle
@ -88,8 +85,6 @@ cmMakefile::cmMakefile(cmGlobalGenerator* globalGenerator,
this->DefineFlags = " "; this->DefineFlags = " ";
this->AddDefaultDefinitions();
this->cmDefineRegex.compile("#cmakedefine[ \t]+([A-Za-z_0-9]*)"); this->cmDefineRegex.compile("#cmakedefine[ \t]+([A-Za-z_0-9]*)");
this->cmDefine01Regex.compile("#cmakedefine01[ \t]+([A-Za-z_0-9]*)"); this->cmDefine01Regex.compile("#cmakedefine01[ \t]+([A-Za-z_0-9]*)");
this->cmAtVarRegex.compile("(@[A-Za-z_0-9/.+-]+@)"); this->cmAtVarRegex.compile("(@[A-Za-z_0-9/.+-]+@)");
@ -119,36 +114,6 @@ cmMakefile::cmMakefile(cmGlobalGenerator* globalGenerator,
this->AddSourceGroup("Resources", "\\.plist$"); this->AddSourceGroup("Resources", "\\.plist$");
this->AddSourceGroup("Object Files", "\\.(lo|o|obj)$"); this->AddSourceGroup("Object Files", "\\.(lo|o|obj)$");
#endif #endif
this->AddDefinition("CMAKE_SOURCE_DIR",
this->GetCMakeInstance()->GetHomeDirectory());
this->AddDefinition("CMAKE_BINARY_DIR",
this->GetCMakeInstance()->GetHomeOutputDirectory());
{
const char* dir = this->StateSnapshot.GetDirectory().GetCurrentSource();
if (dir)
{
this->AddDefinition("CMAKE_CURRENT_SOURCE_DIR", dir);
}
else
{
this->AddDefinition("CMAKE_CURRENT_SOURCE_DIR",
this->GetCMakeInstance()->GetHomeDirectory());
}
}
{
const char* dir = this->StateSnapshot.GetDirectory().GetCurrentBinary();
if (dir)
{
cmSystemTools::MakeDirectory(dir);
this->AddDefinition("CMAKE_CURRENT_BINARY_DIR", dir);
}
else
{
this->AddDefinition("CMAKE_CURRENT_BINARY_DIR",
this->GetCMakeInstance()->GetHomeOutputDirectory());
}
}
} }
cmMakefile::~cmMakefile() cmMakefile::~cmMakefile()
@ -1682,6 +1647,7 @@ void cmMakefile::Configure()
std::vector<cmMakefile*>::iterator sdi = subdirs.begin(); std::vector<cmMakefile*>::iterator sdi = subdirs.begin();
for (; sdi != subdirs.end(); ++sdi) for (; sdi != subdirs.end(); ++sdi)
{ {
(*sdi)->StateSnapshot.InitializeFromParent_ForSubdirsCommand();
this->ConfigureSubDirectory(*sdi); this->ConfigureSubDirectory(*sdi);
} }
@ -1761,6 +1727,8 @@ void cmMakefile::AddSubDirectory(const std::string& srcPath,
newSnapshot.GetDirectory().SetCurrentSource(srcPath); newSnapshot.GetDirectory().SetCurrentSource(srcPath);
newSnapshot.GetDirectory().SetCurrentBinary(binPath); newSnapshot.GetDirectory().SetCurrentBinary(binPath);
cmSystemTools::MakeDirectory(binPath.c_str());
cmMakefile* subMf = new cmMakefile(this->GlobalGenerator, newSnapshot); cmMakefile* subMf = new cmMakefile(this->GlobalGenerator, newSnapshot);
this->GetGlobalGenerator()->AddMakefile(subMf); this->GetGlobalGenerator()->AddMakefile(subMf);
@ -3152,58 +3120,6 @@ void cmMakefile::RemoveVariablesInString(std::string& source,
} }
} }
/**
* Add the default definitions to the makefile. These values must not
* be dependent on anything that isn't known when this cmMakefile instance
* is constructed.
*/
void cmMakefile::AddDefaultDefinitions()
{
/* Up to CMake 2.4 here only WIN32, UNIX and APPLE were set.
With CMake must separate between target and host platform. In most cases
the tests for WIN32, UNIX and APPLE will be for the target system, so an
additional set of variables for the host system is required ->
CMAKE_HOST_WIN32, CMAKE_HOST_UNIX, CMAKE_HOST_APPLE.
WIN32, UNIX and APPLE are now set in the platform files in
Modules/Platforms/.
To keep cmake scripts (-P) and custom language and compiler modules
working, these variables are still also set here in this place, but they
will be reset in CMakeSystemSpecificInformation.cmake before the platform
files are executed. */
#if defined(_WIN32)
this->AddDefinition("WIN32", "1");
this->AddDefinition("CMAKE_HOST_WIN32", "1");
#else
this->AddDefinition("UNIX", "1");
this->AddDefinition("CMAKE_HOST_UNIX", "1");
#endif
#if defined(__CYGWIN__)
if(cmSystemTools::IsOn(cmSystemTools::GetEnv("CMAKE_LEGACY_CYGWIN_WIN32")))
{
this->AddDefinition("WIN32", "1");
this->AddDefinition("CMAKE_HOST_WIN32", "1");
}
#endif
#if defined(__APPLE__)
this->AddDefinition("APPLE", "1");
this->AddDefinition("CMAKE_HOST_APPLE", "1");
#endif
char temp[1024];
sprintf(temp, "%d", cmVersion::GetMinorVersion());
this->AddDefinition("CMAKE_MINOR_VERSION", temp);
sprintf(temp, "%d", cmVersion::GetMajorVersion());
this->AddDefinition("CMAKE_MAJOR_VERSION", temp);
sprintf(temp, "%d", cmVersion::GetPatchVersion());
this->AddDefinition("CMAKE_PATCH_VERSION", temp);
sprintf(temp, "%d", cmVersion::GetTweakVersion());
this->AddDefinition("CMAKE_TWEAK_VERSION", temp);
this->AddDefinition("CMAKE_VERSION", cmVersion::GetCMakeVersion());
this->AddDefinition("CMAKE_FILES_DIRECTORY",
cmake::GetCMakeFilesDirectory());
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
std::string std::string
cmMakefile::GetConfigurations(std::vector<std::string>& configs, cmMakefile::GetConfigurations(std::vector<std::string>& configs,

View File

@ -867,7 +867,6 @@ private:
friend class cmMakeDepend; // make depend needs direct access friend class cmMakeDepend; // make depend needs direct access
// to the Sources array // to the Sources array
void AddDefaultDefinitions();
typedef std::vector<cmFunctionBlocker*> FunctionBlockersType; typedef std::vector<cmFunctionBlocker*> FunctionBlockersType;
FunctionBlockersType FunctionBlockers; FunctionBlockersType FunctionBlockers;
std::vector<FunctionBlockersType::size_type> FunctionBlockerBarriers; std::vector<FunctionBlockersType::size_type> FunctionBlockerBarriers;

View File

@ -175,6 +175,7 @@ bool cmQtAutoGenerators::Run(const std::string& targetDirectory,
cmake cm; cmake cm;
cm.SetHomeOutputDirectory(targetDirectory); cm.SetHomeOutputDirectory(targetDirectory);
cm.SetHomeDirectory(targetDirectory); cm.SetHomeDirectory(targetDirectory);
cm.GetCurrentSnapshot().SetDefaultDefinitions();
cmGlobalGenerator gg(&cm); cmGlobalGenerator gg(&cm);
cmState::Snapshot snapshot = cm.GetCurrentSnapshot(); cmState::Snapshot snapshot = cm.GetCurrentSnapshot();

View File

@ -12,6 +12,7 @@
#include "cmState.h" #include "cmState.h"
#include "cmake.h" #include "cmake.h"
#include "cmVersion.h"
#include "cmCacheManager.h" #include "cmCacheManager.h"
#include "cmCommand.h" #include "cmCommand.h"
#include "cmAlgorithms.h" #include "cmAlgorithms.h"
@ -306,11 +307,21 @@ cmState::Snapshot cmState::Reset()
pos->PolicyScope = this->PolicyStack.Root(); pos->PolicyScope = this->PolicyStack.Root();
assert(pos->Policies.IsValid()); assert(pos->Policies.IsValid());
assert(pos->PolicyRoot.IsValid()); assert(pos->PolicyRoot.IsValid());
{
std::string srcDir =
cmDefinitions::Get("CMAKE_SOURCE_DIR", pos->Vars, pos->Root);
std::string binDir =
cmDefinitions::Get("CMAKE_BINARY_DIR", pos->Vars, pos->Root);
this->VarTree.Clear(); this->VarTree.Clear();
pos->Vars = this->VarTree.Extend(this->VarTree.Root()); pos->Vars = this->VarTree.Extend(this->VarTree.Root());
pos->Parent = this->VarTree.Root(); pos->Parent = this->VarTree.Root();
pos->Root = this->VarTree.Root(); pos->Root = this->VarTree.Root();
pos->Vars->Set("CMAKE_SOURCE_DIR", srcDir.c_str());
pos->Vars->Set("CMAKE_BINARY_DIR", binDir.c_str());
}
this->DefineProperty this->DefineProperty
("RULE_LAUNCH_COMPILE", cmProperty::DIRECTORY, ("RULE_LAUNCH_COMPILE", cmProperty::DIRECTORY,
"", "", true); "", "", true);
@ -837,7 +848,9 @@ cmState::CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot,
cmState::Snapshot snapshot = cmState::Snapshot(this, pos); cmState::Snapshot snapshot = cmState::Snapshot(this, pos);
originSnapshot.Position->BuildSystemDirectory->Children.push_back(snapshot); originSnapshot.Position->BuildSystemDirectory->Children.push_back(snapshot);
snapshot.SetDefaultDefinitions();
snapshot.InitializeFromParent(); snapshot.InitializeFromParent();
snapshot.SetDirectoryDefinitions();
return snapshot; return snapshot;
} }
@ -1009,6 +1022,8 @@ void cmState::Directory::SetCurrentSource(std::string const& dir)
loc, loc,
this->DirectoryState->CurrentSourceDirectoryComponents); this->DirectoryState->CurrentSourceDirectoryComponents);
this->ComputeRelativePathTopSource(); this->ComputeRelativePathTopSource();
this->Snapshot_.SetDefinition("CMAKE_CURRENT_SOURCE_DIR", loc.c_str());
} }
const char* cmState::Directory::GetCurrentBinary() const const char* cmState::Directory::GetCurrentBinary() const
@ -1027,6 +1042,8 @@ void cmState::Directory::SetCurrentBinary(std::string const& dir)
loc, loc,
this->DirectoryState->CurrentBinaryDirectoryComponents); this->DirectoryState->CurrentBinaryDirectoryComponents);
this->ComputeRelativePathTopBinary(); this->ComputeRelativePathTopBinary();
this->Snapshot_.SetDefinition("CMAKE_CURRENT_BINARY_DIR", loc.c_str());
} }
void cmState::Snapshot::SetListFile(const std::string& listfile) void cmState::Snapshot::SetListFile(const std::string& listfile)
@ -1318,6 +1335,70 @@ void InitializeContentFromParent(T& parentContent,
contentEndPosition = thisContent.size(); contentEndPosition = thisContent.size();
} }
void cmState::Snapshot::SetDefaultDefinitions()
{
/* Up to CMake 2.4 here only WIN32, UNIX and APPLE were set.
With CMake must separate between target and host platform. In most cases
the tests for WIN32, UNIX and APPLE will be for the target system, so an
additional set of variables for the host system is required ->
CMAKE_HOST_WIN32, CMAKE_HOST_UNIX, CMAKE_HOST_APPLE.
WIN32, UNIX and APPLE are now set in the platform files in
Modules/Platforms/.
To keep cmake scripts (-P) and custom language and compiler modules
working, these variables are still also set here in this place, but they
will be reset in CMakeSystemSpecificInformation.cmake before the platform
files are executed. */
#if defined(_WIN32)
this->SetDefinition("WIN32", "1");
this->SetDefinition("CMAKE_HOST_WIN32", "1");
#else
this->SetDefinition("UNIX", "1");
this->SetDefinition("CMAKE_HOST_UNIX", "1");
#endif
#if defined(__CYGWIN__)
if(cmSystemTools::IsOn(cmSystemTools::GetEnv("CMAKE_LEGACY_CYGWIN_WIN32")))
{
this->SetDefinition("WIN32", "1");
this->SetDefinition("CMAKE_HOST_WIN32", "1");
}
#endif
#if defined(__APPLE__)
this->SetDefinition("APPLE", "1");
this->SetDefinition("CMAKE_HOST_APPLE", "1");
#endif
char temp[1024];
sprintf(temp, "%d", cmVersion::GetMinorVersion());
this->SetDefinition("CMAKE_MINOR_VERSION", temp);
sprintf(temp, "%d", cmVersion::GetMajorVersion());
this->SetDefinition("CMAKE_MAJOR_VERSION", temp);
sprintf(temp, "%d", cmVersion::GetPatchVersion());
this->SetDefinition("CMAKE_PATCH_VERSION", temp);
sprintf(temp, "%d", cmVersion::GetTweakVersion());
this->SetDefinition("CMAKE_TWEAK_VERSION", temp);
this->SetDefinition("CMAKE_VERSION",
cmVersion::GetCMakeVersion());
this->SetDefinition("CMAKE_FILES_DIRECTORY",
cmake::GetCMakeFilesDirectory());
// Setup the default include file regular expression (match everything).
this->Position->BuildSystemDirectory
->Properties.SetProperty("INCLUDE_REGULAR_EXPRESSION", "^.*$");
}
void cmState::Snapshot::SetDirectoryDefinitions()
{
this->SetDefinition("CMAKE_SOURCE_DIR",
this->State->GetSourceDirectory());
this->SetDefinition("CMAKE_CURRENT_SOURCE_DIR",
this->State->GetSourceDirectory());
this->SetDefinition("CMAKE_BINARY_DIR",
this->State->GetBinaryDirectory());
this->SetDefinition("CMAKE_CURRENT_BINARY_DIR",
this->State->GetBinaryDirectory());
}
void cmState::Snapshot::InitializeFromParent() void cmState::Snapshot::InitializeFromParent()
{ {
PositionType parent = this->Position->DirectoryParent; PositionType parent = this->Position->DirectoryParent;
@ -1366,6 +1447,20 @@ std::string cmState::Snapshot::GetProjectName() const
return this->Position->BuildSystemDirectory->ProjectName; return this->Position->BuildSystemDirectory->ProjectName;
} }
void cmState::Snapshot::InitializeFromParent_ForSubdirsCommand()
{
std::string currentSrcDir = this->GetDefinition("CMAKE_CURRENT_SOURCE_DIR");
std::string currentBinDir = this->GetDefinition("CMAKE_CURRENT_BINARY_DIR");
this->InitializeFromParent();
this->SetDefinition("CMAKE_SOURCE_DIR",
this->State->GetSourceDirectory());
this->SetDefinition("CMAKE_BINARY_DIR",
this->State->GetBinaryDirectory());
this->SetDefinition("CMAKE_CURRENT_SOURCE_DIR", currentSrcDir.c_str());
this->SetDefinition("CMAKE_CURRENT_BINARY_DIR", currentBinDir.c_str());
}
cmState::Directory::Directory( cmState::Directory::Directory(
cmLinkedTree<BuildsystemDirectoryStateType>::iterator iter, cmLinkedTree<BuildsystemDirectoryStateType>::iterator iter,
const cmState::Snapshot& snapshot) const cmState::Snapshot& snapshot)

View File

@ -90,12 +90,17 @@ public:
void SetProjectName(std::string const& name); void SetProjectName(std::string const& name);
std::string GetProjectName() const; std::string GetProjectName() const;
void InitializeFromParent_ForSubdirsCommand();
struct StrictWeakOrder struct StrictWeakOrder
{ {
bool operator()(const cmState::Snapshot& lhs, bool operator()(const cmState::Snapshot& lhs,
const cmState::Snapshot& rhs) const; const cmState::Snapshot& rhs) const;
}; };
void SetDirectoryDefinitions();
void SetDefaultDefinitions();
private: private:
friend bool operator==(const cmState::Snapshot& lhs, friend bool operator==(const cmState::Snapshot& lhs,
const cmState::Snapshot& rhs); const cmState::Snapshot& rhs);

View File

@ -186,6 +186,7 @@ void cmake::CleanupCommandsAndMacros()
{ {
this->CurrentSnapshot = this->State->Reset(); this->CurrentSnapshot = this->State->Reset();
this->State->RemoveUserDefinedCommands(); this->State->RemoveUserDefinedCommands();
this->CurrentSnapshot.SetDefaultDefinitions();
} }
// Parse the args // Parse the args
@ -378,6 +379,7 @@ void cmake::ReadListFile(const std::vector<std::string>& args,
(cmSystemTools::GetCurrentWorkingDirectory()); (cmSystemTools::GetCurrentWorkingDirectory());
snapshot.GetDirectory().SetCurrentSource snapshot.GetDirectory().SetCurrentSource
(cmSystemTools::GetCurrentWorkingDirectory()); (cmSystemTools::GetCurrentWorkingDirectory());
snapshot.SetDefaultDefinitions();
cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(gg, snapshot)); cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(gg, snapshot));
if (this->GetWorkingMode() != NORMAL_MODE) if (this->GetWorkingMode() != NORMAL_MODE)
{ {
@ -420,6 +422,7 @@ bool cmake::FindPackage(const std::vector<std::string>& args)
snapshot.GetDirectory().SetCurrentSource snapshot.GetDirectory().SetCurrentSource
(cmSystemTools::GetCurrentWorkingDirectory()); (cmSystemTools::GetCurrentWorkingDirectory());
// read in the list file to fill the cache // read in the list file to fill the cache
snapshot.SetDefaultDefinitions();
cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(gg, snapshot)); cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(gg, snapshot));
cmsys::auto_ptr<cmLocalGenerator> lg(gg->CreateLocalGenerator(mf.get())); cmsys::auto_ptr<cmLocalGenerator> lg(gg->CreateLocalGenerator(mf.get()));
@ -980,6 +983,10 @@ cmGlobalGenerator* cmake::CreateGlobalGenerator(const std::string& gname)
void cmake::SetHomeDirectory(const std::string& dir) void cmake::SetHomeDirectory(const std::string& dir)
{ {
this->State->SetSourceDirectory(dir); this->State->SetSourceDirectory(dir);
if (this->CurrentSnapshot.IsValid())
{
this->CurrentSnapshot.SetDefinition("CMAKE_SOURCE_DIR", dir);
}
} }
const char* cmake::GetHomeDirectory() const const char* cmake::GetHomeDirectory() const
@ -990,6 +997,10 @@ const char* cmake::GetHomeDirectory() const
void cmake::SetHomeOutputDirectory(const std::string& dir) void cmake::SetHomeOutputDirectory(const std::string& dir)
{ {
this->State->SetBinaryDirectory(dir); this->State->SetBinaryDirectory(dir);
if (this->CurrentSnapshot.IsValid())
{
this->CurrentSnapshot.SetDefinition("CMAKE_BINARY_DIR", dir);
}
} }
const char* cmake::GetHomeOutputDirectory() const const char* cmake::GetHomeOutputDirectory() const
@ -1920,6 +1931,7 @@ int cmake::CheckBuildSystem()
cmake cm; cmake cm;
cm.SetHomeDirectory(""); cm.SetHomeDirectory("");
cm.SetHomeOutputDirectory(""); cm.SetHomeOutputDirectory("");
cm.GetCurrentSnapshot().SetDefaultDefinitions();
cmGlobalGenerator gg(&cm); cmGlobalGenerator gg(&cm);
cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(&gg, cm.GetCurrentSnapshot())); cmsys::auto_ptr<cmMakefile> mf(new cmMakefile(&gg, cm.GetCurrentSnapshot()));
if(!mf->ReadListFile(this->CheckBuildSystemArgument.c_str()) || if(!mf->ReadListFile(this->CheckBuildSystemArgument.c_str()) ||
@ -1950,6 +1962,7 @@ int cmake::CheckBuildSystem()
ggd(this->CreateGlobalGenerator(genName)); ggd(this->CreateGlobalGenerator(genName));
if(ggd.get()) if(ggd.get())
{ {
cm.GetCurrentSnapshot().SetDefaultDefinitions();
cmsys::auto_ptr<cmMakefile> mfd(new cmMakefile(ggd.get(), cmsys::auto_ptr<cmMakefile> mfd(new cmMakefile(ggd.get(),
cm.GetCurrentSnapshot())); cm.GetCurrentSnapshot()));
cmsys::auto_ptr<cmLocalGenerator> lgd( cmsys::auto_ptr<cmLocalGenerator> lgd(

View File

@ -765,6 +765,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
startOutDir = cmSystemTools::CollapseFullPath(startOutDir); startOutDir = cmSystemTools::CollapseFullPath(startOutDir);
cm.SetHomeDirectory(homeDir); cm.SetHomeDirectory(homeDir);
cm.SetHomeOutputDirectory(homeOutDir); cm.SetHomeOutputDirectory(homeOutDir);
cm.GetCurrentSnapshot().SetDefaultDefinitions();
if(cmGlobalGenerator* ggd = cm.CreateGlobalGenerator(gen)) if(cmGlobalGenerator* ggd = cm.CreateGlobalGenerator(gen))
{ {
cm.SetGlobalGenerator(ggd); cm.SetGlobalGenerator(ggd);

View File

@ -1,6 +1,10 @@
cmake_minimum_required (VERSION 2.6) cmake_minimum_required (VERSION 2.6)
project(SUBDIR) project(SUBDIR)
subdirs(Executable EXCLUDE_FROM_ALL Examples) subdirs(Executable EXCLUDE_FROM_ALL Examples)
set(DEFINED_AFTER_SUBDIRS_COMMAND 42)
write_file(${SUBDIR_BINARY_DIR}/ShouldBeHere "This file should exist.") write_file(${SUBDIR_BINARY_DIR}/ShouldBeHere "This file should exist.")
#WATCOM WMAKE does not support + in the name of a file! #WATCOM WMAKE does not support + in the name of a file!
if(WATCOM) if(WATCOM)

View File

@ -1 +1,13 @@
add_executable(test test.cxx) add_executable(test test.cxx)
if (NOT DEFINED_AFTER_SUBDIRS_COMMAND)
message(FATAL_ERROR "DEFINED_AFTER_SUBDIRS_COMMAND should be defined.")
endif()
string(FIND "${CMAKE_CURRENT_BINARY_DIR}" "SubDir/Executable" location)
string(LENGTH "${CMAKE_CURRENT_BINARY_DIR}" dirLength)
math(EXPR suffixLength "${dirLength} - ${location}")
if (NOT suffixLength EQUAL 17)
message(FATAL_ERROR "CMAKE_CURRENT_BINARY_DIR does not end with \"SubDir/Executable\"")
endif()