diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index f9d444557..442152af7 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -526,11 +526,13 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg, buildFile->AddAttribute("settings", settings); fileRef->AddAttribute("fileEncoding", this->CreateString("4")); + const char* lang = this->CurrentLocalGenerator->GetSourceFileLanguage(*sf); std::string sourcecode = "sourcecode"; std::string ext = sf->GetExtension(); ext = cmSystemTools::LowerCase(ext); + if(ext == "o") { sourcecode = "compiled.mach-o.objfile"; @@ -541,41 +543,50 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg, } else if(ext == "m") { - sourcecode += ".cpp.objc"; + sourcecode += ".c.objc"; } else if(ext == "plist") { sourcecode += ".text.plist"; } - else if(!lang) + else if(ext == "h" || ext == "hxx" || ext == "hpp") { - sourcecode += ext; - sourcecode += "."; - sourcecode += ext; + const char* linkLanguage = cmtarget.GetLinkerLanguage(this); + if(linkLanguage && (std::string(linkLanguage) == "CXX")) + { + sourcecode += ".cpp.h"; + } + else + { + sourcecode += ".c.h"; + } } - else if(strcmp(lang, "C") == 0) - { - sourcecode += ".c.c"; - } - else if(strcmp(lang, "CXX") == 0) + else if(lang && strcmp(lang, "CXX") == 0) { sourcecode += ".cpp.cpp"; } - else + else if(lang && strcmp(lang, "C") == 0) { - sourcecode += ext; - sourcecode += "."; - sourcecode += ext; + sourcecode += ".c.c"; } + //else + // { + // // Already specialized above or we leave sourcecode == "sourcecode" + // // which is probably the most correct choice. Extensionless headers, + // // for example... Or file types unknown to Xcode that do not map to a + // // valid lastKnownFileType value. + // } + fileRef->AddAttribute("lastKnownFileType", this->CreateString(sourcecode.c_str())); - std::string path = + + std::string path = this->ConvertToRelativeForXCode(sf->GetFullPath().c_str()); std::string dir; std::string file; cmSystemTools::SplitProgramPath(sf->GetFullPath().c_str(), dir, file); - + fileRef->AddAttribute("name", this->CreateString(file.c_str())); fileRef->AddAttribute("path", this->CreateString(path.c_str())); if(this->XcodeVersion == 15) @@ -590,6 +601,7 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg, { fileRef->AddAttribute("sourceTree", this->CreateString("")); } + return buildFile; } @@ -693,7 +705,9 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen, { externalObjFiles.push_back(xsf); } - else if((*i)->GetPropertyAsBool("HEADER_FILE_ONLY")) + else if((*i)->GetPropertyAsBool("HEADER_FILE_ONLY") || + (tsFlags.Type == cmTarget::SourceFileTypePrivateHeader) || + (tsFlags.Type == cmTarget::SourceFileTypePublicHeader)) { headerFiles.push_back(xsf); } diff --git a/Tests/Framework/CMakeLists.txt b/Tests/Framework/CMakeLists.txt index 397e970f5..29f983810 100644 --- a/Tests/Framework/CMakeLists.txt +++ b/Tests/Framework/CMakeLists.txt @@ -5,8 +5,11 @@ add_library(foo SHARED foo.cxx foo.h foo2.h + fooExtensionlessResource fooPublic.h + fooPublicExtensionlessHeader fooPrivate.h + fooPrivateExtensionlessHeader fooNeither.h fooBoth.h test.lua @@ -20,9 +23,9 @@ set(foo_ver ver4) set_target_properties(foo PROPERTIES FRAMEWORK TRUE FRAMEWORK_VERSION ${foo_ver} - PRIVATE_HEADER "fooPrivate.h;fooBoth.h" - PUBLIC_HEADER "foo.h;foo2.h;fooPublic.h;fooBoth.h" - RESOURCE "test.lua" + PRIVATE_HEADER "fooPrivate.h;fooBoth.h;fooPrivateExtensionlessHeader" + PUBLIC_HEADER "foo.h;foo2.h;fooPublic.h;fooBoth.h;fooPublicExtensionlessHeader" + RESOURCE "fooExtensionlessResource;test.lua" INSTALL_NAME_DIR "@executable_path/../../../Library/Frameworks" DEBUG_POSTFIX -d ) @@ -57,11 +60,15 @@ add_library(fooStatic STATIC foo.cxx foo.h foo2.h + fooExtensionlessResource fooPublic.h + fooPublicExtensionlessHeader fooPrivate.h + fooPrivateExtensionlessHeader fooNeither.h fooBoth.h test.lua + fooDeepPublic.h ) set_target_properties(fooStatic PROPERTIES FRAMEWORK TRUE diff --git a/Tests/Framework/fooExtensionlessResource b/Tests/Framework/fooExtensionlessResource new file mode 100644 index 000000000..5122750ee --- /dev/null +++ b/Tests/Framework/fooExtensionlessResource @@ -0,0 +1 @@ +fooExtensionlessResource diff --git a/Tests/Framework/fooPrivateExtensionlessHeader b/Tests/Framework/fooPrivateExtensionlessHeader new file mode 100644 index 000000000..ac97b929e --- /dev/null +++ b/Tests/Framework/fooPrivateExtensionlessHeader @@ -0,0 +1 @@ +fooPrivateExtensionlessHeader diff --git a/Tests/Framework/fooPublicExtensionlessHeader b/Tests/Framework/fooPublicExtensionlessHeader new file mode 100644 index 000000000..972d9898d --- /dev/null +++ b/Tests/Framework/fooPublicExtensionlessHeader @@ -0,0 +1 @@ +fooPublicExtensionlessHeader