mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-03 20:29:56 -06:00
Xcode: Put object files in a place that Xcode cleans
Since commit dc5fc898f6 (Xcode: Set object file locations using
TARGET_TEMP_DIR, 2022-09-29, v3.25.0-rc1~64^2~1), `xcodebuild clean`
does not remove the object files in our explicit `TARGET_TEMP_DIR`
because it is not under the `SYMROOT`. Put it there.
Fixes: #24096
This commit is contained in:
@@ -2544,8 +2544,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (gtgt->CanCompileSources()) {
|
if (gtgt->CanCompileSources()) {
|
||||||
std::string tmpDir =
|
std::string const tmpDir =
|
||||||
cmStrCat(gtgt->GetSupportDirectory(), '/', this->GetCMakeCFGIntDir());
|
this->GetTargetTempDir(gtgt, this->GetCMakeCFGIntDir());
|
||||||
buildSettings->AddAttribute("TARGET_TEMP_DIR", this->CreateString(tmpDir));
|
buildSettings->AddAttribute("TARGET_TEMP_DIR", this->CreateString(tmpDir));
|
||||||
|
|
||||||
std::string outDir;
|
std::string outDir;
|
||||||
@@ -4399,7 +4399,7 @@ bool cmGlobalXCodeGenerator::CreateXCodeObjects(
|
|||||||
this->CreateString(swiftVersion));
|
this->CreateString(swiftVersion));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string symroot = cmStrCat(root->GetCurrentBinaryDirectory(), "/build");
|
std::string const symroot = this->GetSymrootDir();
|
||||||
buildSettings->AddAttribute("SYMROOT", this->CreateString(symroot));
|
buildSettings->AddAttribute("SYMROOT", this->CreateString(symroot));
|
||||||
|
|
||||||
// Inside a try_compile project, do not require signing on any platform.
|
// Inside a try_compile project, do not require signing on any platform.
|
||||||
@@ -4498,6 +4498,19 @@ bool cmGlobalXCodeGenerator::CreateXCodeObjects(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string cmGlobalXCodeGenerator::GetSymrootDir() const
|
||||||
|
{
|
||||||
|
return cmStrCat(this->CMakeInstance->GetHomeOutputDirectory(), "/build");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string cmGlobalXCodeGenerator::GetTargetTempDir(
|
||||||
|
cmGeneratorTarget const* gt, std::string const& configName) const
|
||||||
|
{
|
||||||
|
// Use a path inside the SYMROOT.
|
||||||
|
return cmStrCat(this->GetSymrootDir(), '/', gt->GetName(), ".build/",
|
||||||
|
configName);
|
||||||
|
}
|
||||||
|
|
||||||
void cmGlobalXCodeGenerator::ComputeArchitectures(cmMakefile* mf)
|
void cmGlobalXCodeGenerator::ComputeArchitectures(cmMakefile* mf)
|
||||||
{
|
{
|
||||||
this->Architectures.clear();
|
this->Architectures.clear();
|
||||||
@@ -4621,8 +4634,8 @@ void cmGlobalXCodeGenerator::CreateXCodeDependHackMakefile(
|
|||||||
for (auto objLib : objlibs) {
|
for (auto objLib : objlibs) {
|
||||||
|
|
||||||
const std::string objLibName = objLib->GetName();
|
const std::string objLibName = objLib->GetName();
|
||||||
std::string d = cmStrCat(objLib->GetSupportDirectory(), '/',
|
std::string d = cmStrCat(this->GetTargetTempDir(gt, configName),
|
||||||
configName, "/lib", objLibName, ".a");
|
"/lib", objLibName, ".a");
|
||||||
|
|
||||||
std::string dependency = this->ConvertToRelativeForMake(d);
|
std::string dependency = this->ConvertToRelativeForMake(d);
|
||||||
makefileStream << "\\\n\t" << dependency;
|
makefileStream << "\\\n\t" << dependency;
|
||||||
@@ -4636,8 +4649,8 @@ void cmGlobalXCodeGenerator::CreateXCodeDependHackMakefile(
|
|||||||
// if building for more than one architecture
|
// if building for more than one architecture
|
||||||
// then remove those executables as well
|
// then remove those executables as well
|
||||||
if (this->Architectures.size() > 1) {
|
if (this->Architectures.size() > 1) {
|
||||||
std::string universal = cmStrCat(gt->GetSupportDirectory(), '/',
|
std::string universal =
|
||||||
configName, "/$(OBJDIR)/");
|
cmStrCat(this->GetTargetTempDir(gt, configName), "/$(OBJDIR)/");
|
||||||
for (const auto& architecture : this->Architectures) {
|
for (const auto& architecture : this->Architectures) {
|
||||||
std::string universalFile = cmStrCat(universal, architecture, '/',
|
std::string universalFile = cmStrCat(universal, architecture, '/',
|
||||||
gt->GetFullName(configName));
|
gt->GetFullName(configName));
|
||||||
@@ -5036,7 +5049,7 @@ void cmGlobalXCodeGenerator::ComputeTargetObjectDirectory(
|
|||||||
{
|
{
|
||||||
auto objectDirArch = GetTargetObjectDirArch(*gt, this->ObjectDirArch);
|
auto objectDirArch = GetTargetObjectDirArch(*gt, this->ObjectDirArch);
|
||||||
gt->ObjectDirectory =
|
gt->ObjectDirectory =
|
||||||
cmStrCat(gt->GetSupportDirectory(), '/', this->GetCMakeCFGIntDir(),
|
cmStrCat(this->GetTargetTempDir(gt, this->GetCMakeCFGIntDir()),
|
||||||
"/$(OBJECT_FILE_DIR_normal:base)/", objectDirArch, '/');
|
"/$(OBJECT_FILE_DIR_normal:base)/", objectDirArch, '/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -339,6 +339,10 @@ private:
|
|||||||
|
|
||||||
std::string GetLibraryOrFrameworkPath(const std::string& path) const;
|
std::string GetLibraryOrFrameworkPath(const std::string& path) const;
|
||||||
|
|
||||||
|
std::string GetSymrootDir() const;
|
||||||
|
std::string GetTargetTempDir(cmGeneratorTarget const* gt,
|
||||||
|
std::string const& configName) const;
|
||||||
|
|
||||||
static std::string GetDeploymentPlatform(const cmMakefile* mf);
|
static std::string GetDeploymentPlatform(const cmMakefile* mf);
|
||||||
|
|
||||||
void ComputeArchitectures(cmMakefile* mf);
|
void ComputeArchitectures(cmMakefile* mf);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.c)?\\.o(bj)?$",
|
"path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/(object|build/c_object_lib\\.build)/.*/empty(\\.c)?\\.o(bj)?$",
|
||||||
"isGenerated": true,
|
"isGenerated": true,
|
||||||
"sourceGroupName": "Object Libraries",
|
"sourceGroupName": "Object Libraries",
|
||||||
"compileGroupLanguage": null,
|
"compileGroupLanguage": null,
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Object Libraries",
|
"name": "Object Libraries",
|
||||||
"sourcePaths": [
|
"sourcePaths": [
|
||||||
"^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.c)?\\.o(bj)?$"
|
"^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/(object|build/c_object_lib\\.build)/.*/empty(\\.c)?\\.o(bj)?$"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
"nameOnDisk": null,
|
"nameOnDisk": null,
|
||||||
"artifacts": [
|
"artifacts": [
|
||||||
{
|
{
|
||||||
"path": "^object/.*/empty(\\.c)?\\.o(bj)?$",
|
"path": "^(object|build/c_object_lib\\.build)/.*/empty(\\.c)?\\.o(bj)?$",
|
||||||
"_dllExtra": false
|
"_dllExtra": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.cxx)?\\.o(bj)?$",
|
"path": "^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/(object|build/cxx_object_lib\\.build)/.*/empty(\\.cxx)?\\.o(bj)?$",
|
||||||
"isGenerated": true,
|
"isGenerated": true,
|
||||||
"sourceGroupName": "Object Libraries",
|
"sourceGroupName": "Object Libraries",
|
||||||
"compileGroupLanguage": null,
|
"compileGroupLanguage": null,
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Object Libraries",
|
"name": "Object Libraries",
|
||||||
"sourcePaths": [
|
"sourcePaths": [
|
||||||
"^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/object/.*/empty(\\.cxx)?\\.o(bj)?$"
|
"^.*/Tests/RunCMake/FileAPI/codemodel-v2-build/(object|build/cxx_object_lib\\.build)/.*/empty(\\.cxx)?\\.o(bj)?$"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
"nameOnDisk": null,
|
"nameOnDisk": null,
|
||||||
"artifacts": [
|
"artifacts": [
|
||||||
{
|
{
|
||||||
"path": "^object/.*/empty(\\.cxx)?\\.o(bj)?$",
|
"path": "^(object|build/cxx_object_lib\\.build)/.*/empty(\\.cxx)?\\.o(bj)?$",
|
||||||
"_dllExtra": false
|
"_dllExtra": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
5
Tests/RunCMake/XcodeProject/Clean-build-check.cmake
Normal file
5
Tests/RunCMake/XcodeProject/Clean-build-check.cmake
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
set(pattern "${RunCMake_TEST_BINARY_DIR}/build/empty.build/Debug/Objects-normal/*/empty.o")
|
||||||
|
file(GLOB objs "${pattern}")
|
||||||
|
if(NOT objs)
|
||||||
|
set(RunCMake_TEST_FAILED "Expected object does not exist:\n ${pattern}")
|
||||||
|
endif()
|
||||||
5
Tests/RunCMake/XcodeProject/Clean-clean-check.cmake
Normal file
5
Tests/RunCMake/XcodeProject/Clean-clean-check.cmake
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
set(pattern "${RunCMake_TEST_BINARY_DIR}/build/empty.build/Debug/Objects-normal/*/empty.o")
|
||||||
|
file(GLOB objs "${pattern}")
|
||||||
|
if(objs)
|
||||||
|
set(RunCMake_TEST_FAILED "Object file(s) not cleaned:\n ${objs}")
|
||||||
|
endif()
|
||||||
@@ -2,9 +2,10 @@ include(RunCMake)
|
|||||||
|
|
||||||
function(RunClean)
|
function(RunClean)
|
||||||
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Clean-build)
|
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Clean-build)
|
||||||
run_cmake(Clean)
|
run_cmake(Clean -DCMAKE_CONFIGURATION_TYPES=Debug)
|
||||||
set(RunCMake_TEST_NO_CLEAN 1)
|
set(RunCMake_TEST_NO_CLEAN 1)
|
||||||
run_cmake_command(Clean-build xcodebuild clean)
|
run_cmake_command(Clean-build xcodebuild)
|
||||||
|
run_cmake_command(Clean-clean xcodebuild clean)
|
||||||
endfunction()
|
endfunction()
|
||||||
RunClean()
|
RunClean()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user