diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 2cbd3ed62..b3e2e7a83 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -1480,7 +1480,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target, BuildObjectListOrString ppDefs(this, this->XcodeVersion >= 30); if(this->XcodeVersion > 15) { - this->AppendDefines(ppDefs, "CMAKE_INTDIR=\"$(CONFIGURATION)\""); + this->AppendDefines(ppDefs, + "CMAKE_INTDIR=\"$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\""); } if(const char* exportMacro = target.GetExportMacro()) { @@ -1597,9 +1598,12 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target, { if(this->XcodeVersion >= 21) { - std::string pncdir = target.GetDirectory(configName); - buildSettings->AddAttribute("CONFIGURATION_BUILD_DIR", - this->CreateString(pncdir.c_str())); + if(!target.UsesDefaultOutputDir(configName, false)) + { + std::string pncdir = target.GetDirectory(configName); + buildSettings->AddAttribute("CONFIGURATION_BUILD_DIR", + this->CreateString(pncdir.c_str())); + } } else { @@ -2399,10 +2403,11 @@ void cmGlobalXCodeGenerator { if(this->XcodeVersion > 15) { - // now add the same one but append $(CONFIGURATION) to it: + // Now add the same one but append + // $(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) to it: linkDirs += " "; linkDirs += this->XCodeEscapePath( - (*libDir + "/$(CONFIGURATION)").c_str()); + (*libDir + "/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)").c_str()); } linkDirs += " "; linkDirs += this->XCodeEscapePath(libDir->c_str()); @@ -3173,7 +3178,8 @@ cmGlobalXCodeGenerator::WriteXCodePBXProj(std::ostream& fout, //---------------------------------------------------------------------------- const char* cmGlobalXCodeGenerator::GetCMakeCFGInitDirectory() { - return this->XcodeVersion >= 21? "$(CONFIGURATION)" : "."; + return this->XcodeVersion >= 21 ? + "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)" : "."; } //---------------------------------------------------------------------------- diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 191de3851..e10ba4acb 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3689,9 +3689,11 @@ const char* cmTarget::GetOutputTargetType(bool implib) } //---------------------------------------------------------------------------- -void cmTarget::ComputeOutputDir(const char* config, +bool cmTarget::ComputeOutputDir(const char* config, bool implib, std::string& out) { + bool usesDefaultOutputDir = false; + // Look for a target property defining the target output directory // based on the target type. std::string targetTypeName = this->GetOutputTargetType(implib); @@ -3743,6 +3745,7 @@ void cmTarget::ComputeOutputDir(const char* config, if(out.empty()) { // Default to the current output directory. + usesDefaultOutputDir = true; out = "."; } @@ -3758,6 +3761,15 @@ void cmTarget::ComputeOutputDir(const char* config, this->Makefile->GetLocalGenerator()->GetGlobalGenerator()-> AppendDirectoryForConfig("/", config, "", out); } + + return usesDefaultOutputDir; +} + +//---------------------------------------------------------------------------- +bool cmTarget::UsesDefaultOutputDir(const char* config, bool implib) +{ + std::string dir; + return this->ComputeOutputDir(config, implib, dir); } //---------------------------------------------------------------------------- diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 6f5dac813..26fcef289 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -446,6 +446,10 @@ public: /** Get a build-tree directory in which to place target support files. */ std::string GetSupportDirectory() const; + /** Return whether this target uses the default value for its output + directory. */ + bool UsesDefaultOutputDir(const char* config, bool implib); + private: /** * A list of direct dependencies. Use in conjunction with DependencyMap. @@ -558,7 +562,7 @@ private: // Cache target output paths for each configuration. struct OutputInfo; OutputInfo const* GetOutputInfo(const char* config); - void ComputeOutputDir(const char* config, bool implib, std::string& out); + bool ComputeOutputDir(const char* config, bool implib, std::string& out); // Cache import information from properties for each configuration. struct ImportInfo;