Xcode: Fix OBJECT library support for Xcode 5 (#14254)

Xcode 2.1 through 4 supported $(CURRENT_ARCH) in a PBXFileReference
'path' value used in the "Link Binary with Libraries" build phase.
CMake uses this to reference object file locations on link lines to
bring in OBJECT library content.  However, Xcode 5 now evaluates the
$(CURRENT_ARCH) reference in this context as "undefined_arch" so the
wrong path is given to the linker.  There seems to be no alternative way
to produce an architecture-specific value in a PBXFileReference.

Fortunately Xcode 5 now also handles link dependencies for paths linked
through OTHER_LDFLAGS.  For Xcode >= 5, move the OBJECT library object
file references from the link build phase to OTHER_LDFLAGS.  We can
still show the object files in the source group listing in either case.
This commit is contained in:
Brad King 2013-10-02 11:52:18 -04:00
parent dff8d113b4
commit a3194ff4a7
1 changed files with 39 additions and 18 deletions

View File

@ -1031,18 +1031,21 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
} }
} }
// Add object library contents as external objects. (Equivalent to if(this->XcodeVersion < 50)
// the externalObjFiles above, except each one is not a cmSourceFile
// within the target.)
std::vector<std::string> objs;
this->GetGeneratorTarget(&cmtarget)->UseObjectLibraries(objs);
for(std::vector<std::string>::const_iterator
oi = objs.begin(); oi != objs.end(); ++oi)
{ {
std::string obj = *oi; // Add object library contents as external objects. (Equivalent to
cmXCodeObject* xsf = // the externalObjFiles above, except each one is not a cmSourceFile
this->CreateXCodeSourceFileFromPath(obj, cmtarget, ""); // within the target.)
externalObjFiles.push_back(xsf); std::vector<std::string> objs;
this->GetGeneratorTarget(&cmtarget)->UseObjectLibraries(objs);
for(std::vector<std::string>::const_iterator
oi = objs.begin(); oi != objs.end(); ++oi)
{
std::string obj = *oi;
cmXCodeObject* xsf =
this->CreateXCodeSourceFileFromPath(obj, cmtarget, "");
externalObjFiles.push_back(xsf);
}
} }
// some build phases only apply to bundles and/or frameworks // some build phases only apply to bundles and/or frameworks
@ -2769,13 +2772,6 @@ void cmGlobalXCodeGenerator
} }
} }
// Skip link information for static libraries.
if(cmtarget->GetType() == cmTarget::OBJECT_LIBRARY ||
cmtarget->GetType() == cmTarget::STATIC_LIBRARY)
{
return;
}
// Loop over configuration types and set per-configuration info. // Loop over configuration types and set per-configuration info.
for(std::vector<std::string>::iterator i = for(std::vector<std::string>::iterator i =
this->CurrentConfigurationTypes.begin(); this->CurrentConfigurationTypes.begin();
@ -2788,6 +2784,31 @@ void cmGlobalXCodeGenerator
configName = 0; configName = 0;
} }
if(this->XcodeVersion >= 50)
{
// Add object library contents as link flags.
std::string linkObjs;
const char* sep = "";
std::vector<std::string> objs;
this->GetGeneratorTarget(cmtarget)->UseObjectLibraries(objs);
for(std::vector<std::string>::const_iterator
oi = objs.begin(); oi != objs.end(); ++oi)
{
linkObjs += sep;
sep = " ";
linkObjs += this->XCodeEscapePath(oi->c_str());
}
this->AppendBuildSettingAttribute(target, "OTHER_LDFLAGS",
linkObjs.c_str(), configName);
}
// Skip link information for object libraries.
if(cmtarget->GetType() == cmTarget::OBJECT_LIBRARY ||
cmtarget->GetType() == cmTarget::STATIC_LIBRARY)
{
continue;
}
// Compute the link library and directory information. // Compute the link library and directory information.
cmComputeLinkInformation* pcli = cmtarget->GetLinkInformation(configName); cmComputeLinkInformation* pcli = cmtarget->GetLinkInformation(configName);
if(!pcli) if(!pcli)