more work on linking flags

This commit is contained in:
Bill Hoffman 2005-02-11 14:25:05 -05:00
parent f3f123fe46
commit ef5db04e24
2 changed files with 68 additions and 22 deletions

View File

@ -24,7 +24,17 @@
//TODO //TODO
// per file flags // EXECUTABLE_OUTPUT_PATH/LIBRARY_OUTPUT_PATH
// LinkDirectories
// correct placment of include paths
// custom commands
// custom targets
// ALL_BUILD
// RUN_TESTS
// per file flags howto
// 115281011528101152810000 = { // 115281011528101152810000 = {
// fileEncoding = 4; // fileEncoding = 4;
// isa = PBXFileReference; // isa = PBXFileReference;
@ -188,11 +198,17 @@ cmXCodeObject*
cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg, cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg,
cmSourceFile* sf) cmSourceFile* sf)
{ {
std::string flags;
// Add flags from source file properties.
m_CurrentLocalGenerator
->AppendFlags(flags, sf->GetProperty("COMPILE_FLAGS"));
cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference); cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
m_MainGroupChildren->AddObject(fileRef); m_MainGroupChildren->AddObject(fileRef);
cmXCodeObject* buildFile = this->CreateObject(cmXCodeObject::PBXBuildFile); cmXCodeObject* buildFile = this->CreateObject(cmXCodeObject::PBXBuildFile);
buildFile->AddAttribute("fileRef", this->CreateObjectReference(fileRef)); buildFile->AddAttribute("fileRef", this->CreateObjectReference(fileRef));
cmXCodeObject* settings = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP); cmXCodeObject* settings = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
settings->AddAttribute("COMPILER_FLAGS", this->CreateString(flags.c_str()));
buildFile->AddAttribute("settings", settings); buildFile->AddAttribute("settings", settings);
fileRef->AddAttribute("fileEncoding", this->CreateString("4")); fileRef->AddAttribute("fileEncoding", this->CreateString("4"));
const char* lang = const char* lang =
@ -212,7 +228,7 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg,
// default to c++ // default to c++
else else
{ {
sourcecode += ".cpp.cpp"; sourcecode += ".cpp.cpp";
} }
fileRef->AddAttribute("lastKnownFileType", fileRef->AddAttribute("lastKnownFileType",
@ -300,6 +316,20 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
std::string flags; std::string flags;
bool shared = ((target.GetType() == cmTarget::SHARED_LIBRARY) || bool shared = ((target.GetType() == cmTarget::SHARED_LIBRARY) ||
(target.GetType() == cmTarget::MODULE_LIBRARY)); (target.GetType() == cmTarget::MODULE_LIBRARY));
if(shared)
{
flags += "-D";
if(const char* custom_export_name = target.GetProperty("DEFINE_SYMBOL"))
{
flags += custom_export_name;
}
else
{
std::string in = target.GetName();
in += "_EXPORTS";
flags += cmSystemTools::MakeCindentifier(in.c_str());
}
}
const char* lang = target.GetLinkerLanguage(this); const char* lang = target.GetLinkerLanguage(this);
if(lang) if(lang)
{ {
@ -309,6 +339,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
// Add shared-library flags if needed. // Add shared-library flags if needed.
m_CurrentLocalGenerator->AddSharedFlags(flags, lang, shared); m_CurrentLocalGenerator->AddSharedFlags(flags, lang, shared);
} }
// Add include directory flags. // Add include directory flags.
m_CurrentLocalGenerator-> m_CurrentLocalGenerator->
AppendFlags(flags, m_CurrentLocalGenerator->GetIncludeFlags(lang)); AppendFlags(flags, m_CurrentLocalGenerator->GetIncludeFlags(lang));
@ -546,12 +577,15 @@ void cmGlobalXCodeGenerator::AddLinkTarget(cmXCodeObject* target ,
files->AddObject(buildfile); files->AddObject(buildfile);
} }
void cmGlobalXCodeGenerator::AddLinkFlag(cmXCodeObject* target, void cmGlobalXCodeGenerator::AddLinkLibrary(cmXCodeObject* target,
const char* flag) const char* library)
{ {
if(cmSystemTools::FileIsFullPath(flag)) // if the library is a full path then create a file reference
// and build file and add them to the PBXFrameworksBuildPhase
// for the target
if(cmSystemTools::FileIsFullPath(library))
{ {
std::string libPath = flag; std::string libPath = library;
cmXCodeObject* fileRef = cmXCodeObject* fileRef =
this->CreateObject(cmXCodeObject::PBXFileReference); this->CreateObject(cmXCodeObject::PBXFileReference);
if(libPath[libPath.size()-1] == 'a') if(libPath[libPath.size()-1] == 'a')
@ -586,12 +620,20 @@ void cmGlobalXCodeGenerator::AddLinkFlag(cmXCodeObject* target,
} }
else else
{ {
// if the library is not a full path then add it with a -l flag
// to the settings of the target
cmXCodeObject* settings = target->GetObject("buildSettings"); cmXCodeObject* settings = target->GetObject("buildSettings");
cmXCodeObject* ldflags = settings->GetObject("OTHER_LDFLAGS"); cmXCodeObject* ldflags = settings->GetObject("OTHER_LDFLAGS");
std::string link = ldflags->GetString(); std::string link = ldflags->GetString();
cmSystemTools::ReplaceString(link, "\"", ""); cmSystemTools::ReplaceString(link, "\"", "");
link += " -l"; cmsys::RegularExpression reg("^([ \t]*\\-[lWRB])|([ \t]*\\-framework)|(\\${)|([ \t]*\\-pthread)|([ \t]*`)");
link += flag; // if the library is not already in the form required by the compiler
// add a -l infront of the name
if(!reg.find(library))
{
link += " -l";
}
link += library;
ldflags->SetString(link.c_str()); ldflags->SetString(link.c_str());
} }
} }
@ -624,7 +666,7 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
{ {
if(cmtarget->GetType() != cmTarget::STATIC_LIBRARY) if(cmtarget->GetType() != cmTarget::STATIC_LIBRARY)
{ {
this->AddLinkFlag(target, j->first.c_str()); this->AddLinkLibrary(target, j->first.c_str());
} }
} }
} }
@ -668,13 +710,15 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
m_MainGroupChildren = 0; m_MainGroupChildren = 0;
cmXCodeObject* group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP); cmXCodeObject* group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("NO")); group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("NO"));
cmXCodeObject* developBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle); cmXCodeObject* developBuildStyle =
this->CreateObject(cmXCodeObject::PBXBuildStyle);
developBuildStyle->AddAttribute("name", this->CreateString("Development")); developBuildStyle->AddAttribute("name", this->CreateString("Development"));
developBuildStyle->AddAttribute("buildSettings", group); developBuildStyle->AddAttribute("buildSettings", group);
group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP); group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("YES")); group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("YES"));
cmXCodeObject* deployBuildStyle = this->CreateObject(cmXCodeObject::PBXBuildStyle); cmXCodeObject* deployBuildStyle =
this->CreateObject(cmXCodeObject::PBXBuildStyle);
deployBuildStyle->AddAttribute("name", this->CreateString("Deployment")); deployBuildStyle->AddAttribute("name", this->CreateString("Deployment"));
deployBuildStyle->AddAttribute("buildSettings", group); deployBuildStyle->AddAttribute("buildSettings", group);
@ -730,9 +774,10 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root, void
std::vector<cmLocalGenerator*>& cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root,
generators) std::vector<cmLocalGenerator*>&
generators)
{ {
if(generators.size() == 0) if(generators.size() == 0)
{ {
@ -757,10 +802,10 @@ void cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root,
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmGlobalXCodeGenerator::WriteXCodePBXProj(std::ostream& fout, void
cmLocalGenerator* , cmGlobalXCodeGenerator::WriteXCodePBXProj(std::ostream& fout,
std::vector<cmLocalGenerator*>& cmLocalGenerator* ,
) std::vector<cmLocalGenerator*>& )
{ {
fout << "// !$*UTF8*$!\n"; fout << "// !$*UTF8*$!\n";
fout << "{\n"; fout << "{\n";
@ -779,9 +824,10 @@ void cmGlobalXCodeGenerator::WriteXCodePBXProj(std::ostream& fout,
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmGlobalXCodeGenerator::GetDocumentation(cmDocumentationEntry& entry) const void cmGlobalXCodeGenerator::GetDocumentation(cmDocumentationEntry& entry)
const
{ {
entry.name = this->GetName(); entry.name = this->GetName();
entry.brief = "NOT YET WORKING, Will generates XCode project files."; entry.brief = "Generate XCode project files.";
entry.full = ""; entry.full = "";
} }

View File

@ -99,8 +99,8 @@ private:
cmXCodeObject* dependTarget); cmXCodeObject* dependTarget);
void AddLinkTarget(cmXCodeObject* target, void AddLinkTarget(cmXCodeObject* target,
cmXCodeObject* dependTarget); cmXCodeObject* dependTarget);
void AddLinkFlag(cmXCodeObject* target, void AddLinkLibrary(cmXCodeObject* target,
const char*); const char*);
private: private:
std::vector<cmXCodeObject*> m_XCodeObjects; std::vector<cmXCodeObject*> m_XCodeObjects;
cmXCodeObject* m_RootObject; cmXCodeObject* m_RootObject;