summaryrefslogtreecommitdiffstats
path: root/Source/cmGlobalXCodeGenerator.cxx
diff options
context:
space:
mode:
authorBill Hoffman <bill.hoffman@kitware.com>2005-02-14 21:46:32 (GMT)
committerBill Hoffman <bill.hoffman@kitware.com>2005-02-14 21:46:32 (GMT)
commit34e7e36caeadb9d24e77bf81e0a77f519e44300a (patch)
tree874832080cdc6469e2d5ea5aaddb1005b4aa1494 /Source/cmGlobalXCodeGenerator.cxx
parentd04a07e0c9923e5b03fda8a55454a53407ca6b26 (diff)
downloadCMake-34e7e36caeadb9d24e77bf81e0a77f519e44300a.zip
CMake-34e7e36caeadb9d24e77bf81e0a77f519e44300a.tar.gz
CMake-34e7e36caeadb9d24e77bf81e0a77f519e44300a.tar.bz2
ENH: getting closer
Diffstat (limited to 'Source/cmGlobalXCodeGenerator.cxx')
-rw-r--r--Source/cmGlobalXCodeGenerator.cxx179
1 files changed, 157 insertions, 22 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx
index 2dc717c..a8d5346 100644
--- a/Source/cmGlobalXCodeGenerator.cxx
+++ b/Source/cmGlobalXCodeGenerator.cxx
@@ -24,15 +24,14 @@
//TODO
-// EXECUTABLE_OUTPUT_PATH/LIBRARY_OUTPUT_PATH
-// LinkDirectories
-// correct placment of include paths
// custom commands
// custom targets
// ALL_BUILD
// RUN_TESTS
+// add a group for Sources Headers, and other cmake group stuff
-
+// for each target create a custom build phase that is run first
+// it can have inputs and outputs should just be a makefile
// per file flags howto
// 115281011528101152810000 = {
@@ -61,6 +60,8 @@ cmGlobalXCodeGenerator::cmGlobalXCodeGenerator()
m_FindMakeProgramFile = "CMakeFindXCode.cmake";
m_RootObject = 0;
m_MainGroupChildren = 0;
+ m_SourcesGroupChildren = 0;
+ m_ExternalGroupChildren = 0;
}
//----------------------------------------------------------------------------
@@ -132,6 +133,47 @@ int cmGlobalXCodeGenerator::TryCompile(const char *,
return retVal;
}
+
+void cmGlobalXCodeGenerator::ConfigureOutputPaths()
+{
+ // Format the library and executable output paths.
+ m_LibraryOutputPath =
+ m_CurrentMakefile->GetSafeDefinition("LIBRARY_OUTPUT_PATH");
+ if(m_LibraryOutputPath.size() == 0)
+ {
+ m_LibraryOutputPath = m_CurrentMakefile->GetCurrentOutputDirectory();
+ }
+ // make sure there is a trailing slash
+ if(m_LibraryOutputPath.size() &&
+ m_LibraryOutputPath[m_LibraryOutputPath.size()-1] != '/')
+ {
+ m_LibraryOutputPath += "/";
+ if(!cmSystemTools::MakeDirectory(m_LibraryOutputPath.c_str()))
+ {
+ cmSystemTools::Error("Error creating directory ",
+ m_LibraryOutputPath.c_str());
+ }
+ }
+ m_CurrentMakefile->AddLinkDirectory(m_LibraryOutputPath.c_str());
+ m_ExecutableOutputPath =
+ m_CurrentMakefile->GetSafeDefinition("EXECUTABLE_OUTPUT_PATH");
+ if(m_ExecutableOutputPath.size() == 0)
+ {
+ m_ExecutableOutputPath = m_CurrentMakefile->GetCurrentOutputDirectory();
+ }
+ // make sure there is a trailing slash
+ if(m_ExecutableOutputPath.size() &&
+ m_ExecutableOutputPath[m_ExecutableOutputPath.size()-1] != '/')
+ {
+ m_ExecutableOutputPath += "/";
+ if(!cmSystemTools::MakeDirectory(m_ExecutableOutputPath.c_str()))
+ {
+ cmSystemTools::Error("Error creating directory ",
+ m_ExecutableOutputPath.c_str());
+ }
+ }
+}
+
//----------------------------------------------------------------------------
///! Create a local generator appropriate to this Global Generator
cmLocalGenerator *cmGlobalXCodeGenerator::CreateLocalGenerator()
@@ -204,7 +246,7 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg,
->AppendFlags(flags, sf->GetProperty("COMPILE_FLAGS"));
cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
- m_MainGroupChildren->AddObject(fileRef);
+ m_SourcesGroupChildren->AddObject(fileRef);
cmXCodeObject* buildFile = this->CreateObject(cmXCodeObject::PBXBuildFile);
buildFile->AddAttribute("fileRef", this->CreateObjectReference(fileRef));
cmXCodeObject* settings = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
@@ -256,7 +298,10 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
cmtarget.GetType() == cmTarget::INSTALL_FILES ||
cmtarget.GetType() == cmTarget::INSTALL_PROGRAMS)
{
- targets.push_back(this->CreateUtilityTarget(cmtarget));
+ if(cmtarget.GetType() == cmTarget::UTILITY)
+ {
+ targets.push_back(this->CreateUtilityTarget(cmtarget));
+ }
continue;
}
@@ -313,6 +358,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
std::string& productType,
std::string& productName)
{
+ this->ConfigureOutputPaths();
std::string flags;
bool shared = ((target.GetType() == cmTarget::SHARED_LIBRARY) ||
(target.GetType() == cmTarget::MODULE_LIBRARY));
@@ -340,23 +386,28 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
m_CurrentLocalGenerator->AddSharedFlags(flags, lang, shared);
}
- // Add include directory flags.
- m_CurrentLocalGenerator->
- AppendFlags(flags, m_CurrentLocalGenerator->GetIncludeFlags(lang));
-
- // Add include directory flags.
+ // Add define flags
m_CurrentLocalGenerator->AppendFlags(flags,
m_CurrentMakefile->GetDefineFlags());
cmSystemTools::ReplaceString(flags, "\"", "\\\"");
productName = target.GetName();
+ bool needLinkDirs = true;
+
switch(target.GetType())
{
case cmTarget::STATIC_LIBRARY:
{
+ needLinkDirs = false;
+ if(m_LibraryOutputPath.size())
+ {
+ buildSettings->AddAttribute("SYMROOT",
+ this->CreateString
+ (m_LibraryOutputPath.c_str()));
+ }
productName += ".a";
std::string t = "lib";
t += productName;
- productName = t;
+ productName = t;
productType = "com.apple.product-type.library.static";
fileType = "archive.ar";
buildSettings->AddAttribute("LIBRARY_STYLE",
@@ -365,18 +416,39 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
}
case cmTarget::MODULE_LIBRARY:
+ {
+ if(m_LibraryOutputPath.size())
+ {
+ buildSettings->AddAttribute("SYMROOT",
+ this->CreateString
+ (m_LibraryOutputPath.c_str()));
+ }
buildSettings->AddAttribute("LIBRARY_STYLE",
this->CreateString("DYNAMIC"));
productName += ".so";
+ std::string t = "lib";
+ t += productName;
+ productName = t;
buildSettings->AddAttribute("OTHER_LDFLAGS",
this->CreateString("-bundle"));
productType = "com.apple.product-type.library.dynamic";
fileType = "compiled.mach-o.dylib";
break;
+ }
case cmTarget::SHARED_LIBRARY:
+ {
+ if(m_LibraryOutputPath.size())
+ {
+ buildSettings->AddAttribute("SYMROOT",
+ this->CreateString
+ (m_LibraryOutputPath.c_str()));
+ }
buildSettings->AddAttribute("LIBRARY_STYLE",
this->CreateString("DYNAMIC"));
productName += ".dylib";
+ std::string t = "lib";
+ t += productName;
+ productName = t;
buildSettings->AddAttribute("DYLIB_COMPATIBILITY_VERSION",
this->CreateString("1"));
buildSettings->AddAttribute("DYLIB_CURRENT_VERSION",
@@ -386,7 +458,14 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
productType = "com.apple.product-type.library.dynamic";
fileType = "compiled.mach-o.dylib";
break;
+ }
case cmTarget::EXECUTABLE:
+ if(m_ExecutableOutputPath.size())
+ {
+ buildSettings->AddAttribute("SYMROOT",
+ this->CreateString
+ (m_ExecutableOutputPath.c_str()));
+ }
fileType = "compiled.mach-o.executable";
productType = "com.apple.product-type.tool";
break;
@@ -398,6 +477,48 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
case cmTarget::INSTALL_PROGRAMS:
break;
}
+
+ std::string dirs;
+ if(needLinkDirs)
+ {
+ // Try to emit each search path once
+ std::set<cmStdString> emitted;
+ // Some search paths should never be emitted
+ emitted.insert("");
+ emitted.insert("/usr/lib");
+ std::vector<std::string> const& linkdirs =
+ target.GetLinkDirectories();
+ for(std::vector<std::string>::const_iterator l = linkdirs.begin();
+ l != linkdirs.end(); ++l)
+ {
+ std::string libpath =
+ m_CurrentLocalGenerator->ConvertToOutputForExisting(l->c_str());
+ if(emitted.insert(libpath).second)
+ {
+ dirs += libpath + " ";
+ }
+ }
+ if(dirs.size())
+ {
+ buildSettings->AddAttribute("LIBRARY_SEARCH_PATHS",
+ this->CreateString(dirs.c_str()));
+ }
+ }
+ dirs = "";
+ std::vector<std::string>& includes =
+ m_CurrentMakefile->GetIncludeDirectories();
+ std::vector<std::string>::iterator i = includes.begin();
+ for(;i != includes.end(); ++i)
+ {
+ std::string incpath =
+ m_CurrentLocalGenerator->ConvertToOutputForExisting(i->c_str());
+ dirs += incpath + " ";
+ }
+ if(dirs.size())
+ {
+ buildSettings->AddAttribute("HEADER_SEARCH_PATHS",
+ this->CreateString(dirs.c_str()));
+ }
buildSettings->AddAttribute("GCC_OPTIMIZATION_LEVEL",
this->CreateString("0"));
buildSettings->AddAttribute("INSTALL_PATH",
@@ -492,7 +613,7 @@ cmGlobalXCodeGenerator::CreateXCodeTarget(cmTarget& cmtarget,
fileRef->AddAttribute("explicitFileType",
this->CreateString(fileTypeString.c_str()));
fileRef->AddAttribute("path", this->CreateString(productName.c_str()));
- fileRef->AddAttribute("refType", this->CreateString("3"));
+ fileRef->AddAttribute("refType", this->CreateString("0"));
fileRef->AddAttribute("sourceTree",
this->CreateString("BUILT_PRODUCTS_DIR"));
@@ -616,7 +737,7 @@ void cmGlobalXCodeGenerator::AddLinkLibrary(cmXCodeObject* target,
buildPhases->GetObject(cmXCodeObject::PBXFrameworksBuildPhase);
cmXCodeObject* files = frameworkBuildPhase->GetObject("files");
files->AddObject(buildfile);
- m_MainGroupChildren->AddObject(fileRef);
+ m_ExternalGroupChildren->AddObject(fileRef);
}
else
{
@@ -690,14 +811,7 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
}
// to force the location of a target
-//6FE4372B07AAF276004FB461 = {
-//buildSettings = {
-//COPY_PHASE_STRIP = NO;
-//SYMROOT = "/Users/kitware/Bill/CMake-build/test/build/bin";
-//};
-//isa = PBXBuildStyle;
-//name = Development;
-//};
+// add this to build settings of target SYMROOT = /tmp/;
//----------------------------------------------------------------------------
void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
@@ -707,6 +821,8 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
{
this->ClearXCodeObjects();
m_RootObject = 0;
+ m_ExternalGroupChildren = 0;
+ m_SourcesGroupChildren = 0;
m_MainGroupChildren = 0;
cmXCodeObject* group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("NO"));
@@ -733,6 +849,25 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
mainGroup->AddAttribute("refType", this->CreateString("4"));
mainGroup->AddAttribute("sourceTree", this->CreateString("<group>"));
+ cmXCodeObject* sourcesGroup = this->CreateObject(cmXCodeObject::PBXGroup);
+ m_SourcesGroupChildren =
+ this->CreateObject(cmXCodeObject::OBJECT_LIST);
+ sourcesGroup->AddAttribute("name", this->CreateString("Sources"));
+ sourcesGroup->AddAttribute("children", m_SourcesGroupChildren);
+ sourcesGroup->AddAttribute("refType", this->CreateString("4"));
+ sourcesGroup->AddAttribute("sourceTree", this->CreateString("<group>"));
+ m_MainGroupChildren->AddObject(sourcesGroup);
+
+ cmXCodeObject* externalGroup = this->CreateObject(cmXCodeObject::PBXGroup);
+ m_ExternalGroupChildren =
+ this->CreateObject(cmXCodeObject::OBJECT_LIST);
+ externalGroup->AddAttribute("name",
+ this->CreateString("External Libraries and Frameworks"));
+ externalGroup->AddAttribute("children", m_ExternalGroupChildren);
+ externalGroup->AddAttribute("refType", this->CreateString("4"));
+ externalGroup->AddAttribute("sourceTree", this->CreateString("<group>"));
+ m_MainGroupChildren->AddObject(externalGroup);
+
cmXCodeObject* productGroup = this->CreateObject(cmXCodeObject::PBXGroup);
productGroup->AddAttribute("name", this->CreateString("Products"));
productGroup->AddAttribute("refType", this->CreateString("4"));