summaryrefslogtreecommitdiffstats
path: root/Source/cmGlobalXCodeGenerator.cxx
diff options
context:
space:
mode:
authorBill Hoffman <bill.hoffman@kitware.com>2005-02-01 18:07:42 (GMT)
committerBill Hoffman <bill.hoffman@kitware.com>2005-02-01 18:07:42 (GMT)
commitb08e6ecb38798aab89bb35450658c6c0a85860ce (patch)
tree9f36bee7057fa2355cf4c9fab33a151fe2cdd922 /Source/cmGlobalXCodeGenerator.cxx
parentc98687ed9e78878d3ce3a92d99672964fbb5761c (diff)
downloadCMake-b08e6ecb38798aab89bb35450658c6c0a85860ce.zip
CMake-b08e6ecb38798aab89bb35450658c6c0a85860ce.tar.gz
CMake-b08e6ecb38798aab89bb35450658c6c0a85860ce.tar.bz2
ENH: add trycompile code for xcode
Diffstat (limited to 'Source/cmGlobalXCodeGenerator.cxx')
-rw-r--r--Source/cmGlobalXCodeGenerator.cxx188
1 files changed, 174 insertions, 14 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx
index 3422a2b..27125ed 100644
--- a/Source/cmGlobalXCodeGenerator.cxx
+++ b/Source/cmGlobalXCodeGenerator.cxx
@@ -30,22 +30,67 @@ cmGlobalXCodeGenerator::cmGlobalXCodeGenerator()
}
//----------------------------------------------------------------------------
-void cmGlobalXCodeGenerator::EnableLanguage(std::vector<std::string>const& ,
- cmMakefile *)
-{
- //this->cmGlobalGenerator::EnableLanguage(lang, mf);
+void cmGlobalXCodeGenerator::EnableLanguage(std::vector<std::string>const& lang,
+ cmMakefile * mf)
+{
+ mf->AddDefinition("CMAKE_GENERATOR_CC", "gcc");
+ mf->AddDefinition("CMAKE_GENERATOR_CXX", "g++");
+ this->cmGlobalGenerator::EnableLanguage(lang, mf);
}
//----------------------------------------------------------------------------
int cmGlobalXCodeGenerator::TryCompile(const char *,
- const char *,
- const char *,
- const char *,
- std::string *,
- cmMakefile* )
+ const char * bindir,
+ const char * projectName,
+ const char * targetName,
+ std::string * output,
+ cmMakefile* mf)
{
- // FIXME
- return 1;
+ // now build the test
+ std::string makeCommand =
+ m_CMakeInstance->GetCacheManager()->GetCacheValue("CMAKE_MAKE_PROGRAM");
+ if(makeCommand.size() == 0)
+ {
+ cmSystemTools::Error(
+ "Generator cannot find the appropriate make command.");
+ return 1;
+ }
+ makeCommand = cmSystemTools::ConvertToOutputPath(makeCommand.c_str());
+ std::string lowerCaseCommand = makeCommand;
+ cmSystemTools::LowerCase(lowerCaseCommand);
+
+ /**
+ * Run an executable command and put the stdout in output.
+ */
+ std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
+ cmSystemTools::ChangeDirectory(bindir);
+// Usage: xcodebuild [-project <projectname>] [-activetarget]
+// [-alltargets] [-target <targetname>]... [-activebuildstyle]
+// [-buildstyle <buildstylename>] [-optionalbuildstyle <buildstylename>]
+// [<buildsetting>=<value>]... [<buildaction>]...
+// xcodebuild [-list]
+
+ makeCommand += " -project ";
+ makeCommand += projectName;
+ makeCommand += " build ";
+ if (targetName)
+ {
+ makeCommand += "-target ";
+ makeCommand += targetName;
+ }
+
+ int retVal;
+ int timeout = cmGlobalGenerator::s_TryCompileTimeout;
+ if (!cmSystemTools::RunSingleCommand(makeCommand.c_str(), output, &retVal,
+ 0, false, timeout))
+ {
+ cmSystemTools::Error("Generator: execution of xcodebuild failed.");
+ // return to the original directory
+ cmSystemTools::ChangeDirectory(cwd.c_str());
+ return 1;
+ }
+ cmSystemTools::ChangeDirectory(cwd.c_str());
+ return retVal;
}
//----------------------------------------------------------------------------
@@ -183,10 +228,13 @@ void cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
switch(l->second.GetType())
{
case cmTarget::STATIC_LIBRARY:
+ targets.push_back(this->CreateStaticLibrary(l->second, buildPhases));
break;
case cmTarget::SHARED_LIBRARY:
+ targets.push_back(this->CreateSharedLibrary(l->second, buildPhases));
break;
case cmTarget::MODULE_LIBRARY:
+ targets.push_back(this->CreateSharedLibrary(l->second, buildPhases));
break;
case cmTarget::EXECUTABLE:
targets.push_back(this->CreateExecutable(l->second, buildPhases));
@@ -200,7 +248,16 @@ void cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
}
}
}
-
+
+// 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;
+//};
cmXCodeObject* cmGlobalXCodeGenerator::CreateExecutable(cmTarget& cmtarget,
cmXCodeObject* buildPhases)
{
@@ -244,12 +301,115 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateExecutable(cmTarget& cmtarget,
return target;
}
+//----------------------------------------------------------------------------
+cmXCodeObject* cmGlobalXCodeGenerator::CreateStaticLibrary(cmTarget& cmtarget,
+ cmXCodeObject* buildPhases)
+{
+ cmXCodeObject* target = this->CreateObject(cmXCodeObject::PBXNativeTarget);
+ target->AddAttribute("buildPhases", buildPhases);
+ cmXCodeObject* buildRules = this->CreateObject(cmXCodeObject::OBJECT_LIST);
+ target->AddAttribute("buildRules", buildRules);
+ cmXCodeObject* buildSettings =
+ this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
+ buildSettings->AddAttribute("INSTALL_PATH",
+ this->CreateString("/usr/local/bin"));
+ buildSettings->AddAttribute("LIBRARY_STYLE",
+ this->CreateString("STATIC"));
+ buildSettings->AddAttribute("OPTIMIZATION_CFLAGS",
+ this->CreateString(""));
+ buildSettings->AddAttribute("OTHER_CFLAGS",
+ this->CreateString(""));
+ buildSettings->AddAttribute("OTHER_LDFLAGS",
+ this->CreateString(""));
+ buildSettings->AddAttribute("OTHER_REZFLAGS",
+ this->CreateString(""));
+ buildSettings->AddAttribute("PRODUCT_NAME",
+ this->CreateString(cmtarget.GetName()));
+ buildSettings->AddAttribute("SECTORDER_FLAGS",
+ this->CreateString(""));
+ buildSettings->AddAttribute("WARNING_CFLAGS",
+ this->CreateString("-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"));
+ target->AddAttribute("buildSettings", buildSettings);
+ cmXCodeObject* dependencies = this->CreateObject(cmXCodeObject::OBJECT_LIST);
+ target->AddAttribute("dependencies", dependencies);
+ target->AddAttribute("name", this->CreateString(cmtarget.GetName()));
+ target->AddAttribute("productName",this->CreateString(cmtarget.GetName()));
+ cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
+ fileRef->AddAttribute("explicitFileType",
+ this->CreateString("\"compiled.mach-o.archive.ar\""));
+ fileRef->AddAttribute("includedInIndex", this->CreateString("0"));
+ fileRef->AddAttribute("path", this->CreateString(cmtarget.GetName()));
+ fileRef->AddAttribute("refType", this->CreateString("3"));
+ fileRef->AddAttribute("sourceTree", this->CreateString("BUILT_PRODUCTS_DIR"));
+ target->AddAttribute("productReference", this->CreateObjectReference(fileRef));
+ target->AddAttribute("productType",
+ this->CreateString("\"com.apple.product-type.library.static\""));
+ return target;
+}
+
+//----------------------------------------------------------------------------
+cmXCodeObject* cmGlobalXCodeGenerator::CreateSharedLibrary(cmTarget& cmtarget,
+ cmXCodeObject* buildPhases)
+{
+ cmXCodeObject* target = this->CreateObject(cmXCodeObject::PBXNativeTarget);
+ target->AddAttribute("buildPhases", buildPhases);
+ cmXCodeObject* buildRules = this->CreateObject(cmXCodeObject::OBJECT_LIST);
+ target->AddAttribute("buildRules", buildRules);
+ cmXCodeObject* buildSettings =
+ this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
+ buildSettings->AddAttribute("DYLIB_COMPATIBILITY_VERSION",
+ this->CreateString("1"));
+ buildSettings->AddAttribute("DYLIB_CURRENT_VERSION",
+ this->CreateString("1"));
+ buildSettings->AddAttribute("INSTALL_PATH",
+ this->CreateString("/usr/local/lib"));
+ buildSettings->AddAttribute("LIBRARY_STYLE",
+ this->CreateString("DYNAMIC"));
+ buildSettings->AddAttribute("OPTIMIZATION_CFLAGS",
+ this->CreateString(""));
+ buildSettings->AddAttribute("OTHER_CFLAGS",
+ this->CreateString(""));
+ const char* libFlag = "-dynamiclib";
+ if(cmtarget.GetType() == cmTarget::MODULE_LIBRARY)
+ {
+ libFlag = "-bundle";
+ }
+ buildSettings->AddAttribute("OTHER_LDFLAGS",
+ this->CreateString(libFlag));
+
+ buildSettings->AddAttribute("OTHER_REZFLAGS",
+ this->CreateString(""));
+ buildSettings->AddAttribute("PRODUCT_NAME",
+ this->CreateString(cmtarget.GetName()));
+ buildSettings->AddAttribute("SECTORDER_FLAGS",
+ this->CreateString(""));
+ buildSettings->AddAttribute("WARNING_CFLAGS",
+ this->CreateString("-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"));
+ target->AddAttribute("buildSettings", buildSettings);
+ cmXCodeObject* dependencies = this->CreateObject(cmXCodeObject::OBJECT_LIST);
+ target->AddAttribute("dependencies", dependencies);
+ target->AddAttribute("name", this->CreateString(cmtarget.GetName()));
+ target->AddAttribute("productName",this->CreateString(cmtarget.GetName()));
+ cmXCodeObject* fileRef = this->CreateObject(cmXCodeObject::PBXFileReference);
+ fileRef->AddAttribute("explicitFileType",
+ this->CreateString("\"compiled.mach-o.dylib\""));
+ fileRef->AddAttribute("includedInIndex", this->CreateString("0"));
+ std::string path = cmtarget.GetName();
+ path += ".dylib";
+ fileRef->AddAttribute("path", this->CreateString(path.c_str()));
+ fileRef->AddAttribute("refType", this->CreateString("3"));
+ fileRef->AddAttribute("sourceTree", this->CreateString("BUILT_PRODUCTS_DIR"));
+ target->AddAttribute("productReference", this->CreateObjectReference(fileRef));
+ target->AddAttribute("productType",
+ this->CreateString("\"com.apple.product-type.library.dynamic\""));
+ return target;
+}
//----------------------------------------------------------------------------
void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* ,
std::vector<cmLocalGenerator*>&
generators
- )
+ )
{
delete m_RootObject;
this->ClearXCodeObjects();
@@ -327,7 +487,7 @@ void cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root,
void cmGlobalXCodeGenerator::WriteXCodePBXProj(std::ostream& fout,
cmLocalGenerator* ,
std::vector<cmLocalGenerator*>&
- )
+ )
{
fout << "// !$*UTF8*$!\n";
fout << "{\n";