diff options
author | Bill Hoffman <bill.hoffman@kitware.com> | 2005-02-01 18:07:42 (GMT) |
---|---|---|
committer | Bill Hoffman <bill.hoffman@kitware.com> | 2005-02-01 18:07:42 (GMT) |
commit | b08e6ecb38798aab89bb35450658c6c0a85860ce (patch) | |
tree | 9f36bee7057fa2355cf4c9fab33a151fe2cdd922 /Source/cmGlobalXCodeGenerator.cxx | |
parent | c98687ed9e78878d3ce3a92d99672964fbb5761c (diff) | |
download | CMake-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.cxx | 188 |
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"; |