diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 3f941259a..ce95b2c6c 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1647,6 +1647,7 @@ void cmMakefile::Configure() std::vector::iterator sdi = subdirs.begin(); for (; sdi != subdirs.end(); ++sdi) { + (*sdi)->StateSnapshot.InitializeFromParent_ForSubdirsCommand(); this->ConfigureSubDirectory(*sdi); } diff --git a/Source/cmState.cxx b/Source/cmState.cxx index 01fd4e200..825204c1e 100644 --- a/Source/cmState.cxx +++ b/Source/cmState.cxx @@ -1447,6 +1447,20 @@ std::string cmState::Snapshot::GetProjectName() const 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( cmLinkedTree::iterator iter, const cmState::Snapshot& snapshot) diff --git a/Source/cmState.h b/Source/cmState.h index 3e8a4654a..f2c0c6fb0 100644 --- a/Source/cmState.h +++ b/Source/cmState.h @@ -90,6 +90,8 @@ public: void SetProjectName(std::string const& name); std::string GetProjectName() const; + void InitializeFromParent_ForSubdirsCommand(); + struct StrictWeakOrder { bool operator()(const cmState::Snapshot& lhs, diff --git a/Tests/SubDir/CMakeLists.txt b/Tests/SubDir/CMakeLists.txt index 6822e6bd9..32aa93ffc 100644 --- a/Tests/SubDir/CMakeLists.txt +++ b/Tests/SubDir/CMakeLists.txt @@ -1,6 +1,10 @@ cmake_minimum_required (VERSION 2.6) project(SUBDIR) + subdirs(Executable EXCLUDE_FROM_ALL Examples) + +set(DEFINED_AFTER_SUBDIRS_COMMAND 42) + write_file(${SUBDIR_BINARY_DIR}/ShouldBeHere "This file should exist.") #WATCOM WMAKE does not support + in the name of a file! if(WATCOM) diff --git a/Tests/SubDir/Executable/CMakeLists.txt b/Tests/SubDir/Executable/CMakeLists.txt index 77e6751cd..fbe338ef4 100644 --- a/Tests/SubDir/Executable/CMakeLists.txt +++ b/Tests/SubDir/Executable/CMakeLists.txt @@ -1 +1,13 @@ 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()