[cmake-developers] [CMake 0016040]: Generated Xcode Projects Have Wrong Paths to Object Library Dependencies
Mantis Bug Tracker
mantis at public.kitware.com
Wed Mar 30 16:57:56 EDT 2016
The following issue has been SUBMITTED.
======================================================================
https://public.kitware.com/Bug/view.php?id=16040
======================================================================
Reported By: Colin Cornaby
Assigned To:
======================================================================
Project: CMake
Issue ID: 16040
Category: CMake
Reproducibility: always
Severity: major
Priority: high
Status: new
======================================================================
Date Submitted: 2016-03-30 16:57 EDT
Last Modified: 2016-03-30 16:57 EDT
======================================================================
Summary: Generated Xcode Projects Have Wrong Paths to Object
Library Dependencies
Description:
We have a CMake project that has object libraries, and then a parent build
target that wraps those object libraries into a static library. When I generate
the Xcode output, the parent build target is referencing different paths than
what the .o's were outputted to.
I have a patch that fixes the issue, but I wanted to open a bug first,
especially if I'm duplicating something (apologies, this is my first CMake bug.)
The section of code that seems to be the issue in the Xcode generator is here:
cmGlobalXCodeGenerator::GetObjectsNormalDirectory(
const std::string &projName,
const std::string &configName,
const cmGeneratorTarget *t) const
{
std::string dir =
t->GetLocalGenerator()->GetCurrentBinaryDirectory();
dir += "/";
dir += projName;
dir += ".build/";
dir += configName;
dir += "/";
dir += t->GetName();
dir += ".build/Objects-normal/";
return dir;
}
There are a few things wrong here:
- The configuration name should be part of this path. Specifically the section
of that path that is "foo.build/release" should be "foo.build/release-iphoneos".
This behavior could be different for Mac targets, but I'm pretty sure it isn't.
One reason I'm not straight submitting the patch yet.
- The .o files get written to the temporary objects directory, not the binary
output directory. I've wrapped this in a new function:
std::string
cmGlobalXCodeGenerator::GetTemporaryFilesDirectory(
const std::string &projName,
const std::string &configName,
const cmGeneratorTarget *t)
const
{
std::string dir =
t->GetLocalGenerator()->GetCurrentBinaryDirectory();
dir += "/";
dir += projName;
dir += ".build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/";
return dir;
}
I've then altered a few functions. GetObjectsNormalDirectory becomes:
//----------------------------------------------------------------------------
std::string
cmGlobalXCodeGenerator::GetObjectsNormalDirectory(
const std::string &projName,
const std::string &configName,
const cmGeneratorTarget *t) const
{
std::string dir = GetTemporaryFilesDirectory(projName, configName, t);
dir += t->GetName();
dir += ".build/Objects-normal/";
return dir;
}
The build setting creation gets altered a bit a well with:
if(this->XcodeVersion >= 21)
{
std::string pncdir = this->GetObjectsNormalDirectory(
this->CurrentProject,
configName, gtgt);
std::string tempdir = this->GetTemporaryFilesDirectory(
this->CurrentProject,
configName, gtgt);
buildSettings->AddAttribute("CONFIGURATION_BUILD_DIR",
this->CreateString(pncdir.c_str()));
buildSettings->AddAttribute("CONFIGURATION_TEMP_DIR",
this->CreateString(tempdir.c_str()));
}
else
{
buildSettings->AddAttribute("OBJROOT",
this->CreateString(pndir.c_str()));
pndir = this->GetObjectsNormalDirectory(
this->CurrentProject, configName, gtgt);
}
}
Again, mostly submitting this bug because I'm new to Cmake and I don't know if
this is patching on top of behavior that is platform dependent. Please let me
know if there is something I am missing here, or if I'm breaking something else
with these patches!
(I'm attaching a Git patch as well)
======================================================================
Issue History
Date Modified Username Field Change
======================================================================
2016-03-30 16:57 Colin Cornaby New Issue
2016-03-30 16:57 Colin Cornaby File Added: 0001-Fixes-for-.o-generation.patch
======================================================================
More information about the cmake-developers
mailing list