mirror of
https://github.com/reactos/CMake.git
synced 2024-11-23 03:29:47 +00:00
Xcode: Require at least Xcode 5
This commit is contained in:
parent
657b30905a
commit
afb325018e
@ -102,9 +102,6 @@ if(CMake_INSTALL_COMPONENTS)
|
|||||||
if(WIN32 AND NOT CYGWIN)
|
if(WIN32 AND NOT CYGWIN)
|
||||||
list(APPEND _CPACK_IFW_COMPONENTS_ALL cmcldeps)
|
list(APPEND _CPACK_IFW_COMPONENTS_ALL cmcldeps)
|
||||||
endif()
|
endif()
|
||||||
if(APPLE)
|
|
||||||
list(APPEND _CPACK_IFW_COMPONENTS_ALL cmakexbuild)
|
|
||||||
endif()
|
|
||||||
if(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME)
|
if(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME)
|
||||||
set(_CPACK_IFW_COMPONENT_UNSPECIFIED_NAME
|
set(_CPACK_IFW_COMPONENT_UNSPECIFIED_NAME
|
||||||
${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME})
|
${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME})
|
||||||
|
@ -109,16 +109,6 @@ if(CPACK_GENERATOR MATCHES "IFW")
|
|||||||
set(CPACK_IFW_COMPONENT_CMCLDEPS_VERSION
|
set(CPACK_IFW_COMPONENT_CMCLDEPS_VERSION
|
||||||
"@CMake_IFW_ROOT_COMPONENT_VERSION@")
|
"@CMake_IFW_ROOT_COMPONENT_VERSION@")
|
||||||
|
|
||||||
set(CPACK_COMPONENT_CMAKEXBUILD_DISPLAY_NAME "cmakexbuild")
|
|
||||||
set(CPACK_COMPONENT_CMAKEXBUILD_DESCRIPTION
|
|
||||||
"The \"cmakexbuild\" executable is a wrapper program for \"xcodebuild\"")
|
|
||||||
set(CPACK_COMPONENT_CMAKEXBUILD_REQUIRED TRUE)
|
|
||||||
set(CPACK_COMPONENT_CMAKEXBUILD_GROUP Tools)
|
|
||||||
set(CPACK_IFW_COMPONENT_CMAKEXBUILD_NAME "CMakeXBuild")
|
|
||||||
set(CPACK_IFW_COMPONENT_CMAKEXBUILD_PRIORITY 85)
|
|
||||||
set(CPACK_IFW_COMPONENT_CMAKEXBUILD_VERSION
|
|
||||||
"@CMake_IFW_ROOT_COMPONENT_VERSION@")
|
|
||||||
|
|
||||||
# Dialogs
|
# Dialogs
|
||||||
set(CPACK_COMPONENT_GROUP_DIALOGS_DISPLAY_NAME "Interactive Dialogs")
|
set(CPACK_COMPONENT_GROUP_DIALOGS_DISPLAY_NAME "Interactive Dialogs")
|
||||||
set(CPACK_COMPONENT_GROUP_DIALOGS_DESCRIPTION
|
set(CPACK_COMPONENT_GROUP_DIALOGS_DESCRIPTION
|
||||||
|
@ -3,9 +3,7 @@ Xcode
|
|||||||
|
|
||||||
Generate Xcode project files.
|
Generate Xcode project files.
|
||||||
|
|
||||||
This supports Xcode 3.0 and above. Support for Xcode versions prior
|
This supports Xcode 5.0 and above.
|
||||||
to Xcode 5 is deprecated and will be dropped in a future version of
|
|
||||||
CMake.
|
|
||||||
|
|
||||||
Toolset Selection
|
Toolset Selection
|
||||||
^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^
|
||||||
|
4
Help/release/dev/require-xcode-5.rst
Normal file
4
Help/release/dev/require-xcode-5.rst
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
require-xcode-5
|
||||||
|
---------------
|
||||||
|
|
||||||
|
* The :generator:`Xcode` generator now requires at least Xcode 5.
|
@ -19,15 +19,11 @@ to configure the project:
|
|||||||
This generator stores ``CMAKE_MAKE_PROGRAM`` in the CMake cache
|
This generator stores ``CMAKE_MAKE_PROGRAM`` in the CMake cache
|
||||||
so that it may be edited by the user.
|
so that it may be edited by the user.
|
||||||
|
|
||||||
* The :generator:`Xcode` generator sets this to ``xcodebuild`` (or possibly an
|
* The :generator:`Xcode` generator sets this to ``xcodebuild``.
|
||||||
otherwise undocumented ``cmakexbuild`` wrapper implementing some
|
|
||||||
workarounds).
|
|
||||||
|
|
||||||
This generator prefers to lookup the build tool at build time
|
This generator prefers to lookup the build tool at build time
|
||||||
rather than to store ``CMAKE_MAKE_PROGRAM`` in the CMake cache
|
rather than to store ``CMAKE_MAKE_PROGRAM`` in the CMake cache
|
||||||
ahead of time. This is because ``xcodebuild`` is easy to find,
|
ahead of time. This is because ``xcodebuild`` is easy to find.
|
||||||
the ``cmakexbuild`` wrapper is needed only for older Xcode versions,
|
|
||||||
and the path to ``cmakexbuild`` may be outdated if CMake itself moves.
|
|
||||||
|
|
||||||
For compatibility with versions of CMake prior to 3.2, if
|
For compatibility with versions of CMake prior to 3.2, if
|
||||||
a user or project explicitly adds ``CMAKE_MAKE_PROGRAM`` to
|
a user or project explicitly adds ``CMAKE_MAKE_PROGRAM`` to
|
||||||
|
@ -1060,9 +1060,6 @@ if(CPACK_ENABLE_FREEBSD_PKG AND FREEBSD_PKG_INCLUDE_DIRS AND FREEBSD_PKG_LIBRARI
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
add_executable(cmakexbuild cmakexbuild.cxx)
|
|
||||||
list(APPEND _tools cmakexbuild)
|
|
||||||
target_link_libraries(cmakexbuild CMakeLib)
|
|
||||||
add_executable(OSXScriptLauncher
|
add_executable(OSXScriptLauncher
|
||||||
CPack/OSXScriptLauncher.cxx)
|
CPack/OSXScriptLauncher.cxx)
|
||||||
target_link_libraries(OSXScriptLauncher cmsys)
|
target_link_libraries(OSXScriptLauncher cmsys)
|
||||||
|
@ -217,7 +217,7 @@ cmGlobalGenerator* cmGlobalXCodeGenerator::Factory::CreateGlobalGenerator(
|
|||||||
sscanf(version_string.c_str(), "%u.%u", &v[0], &v[1]);
|
sscanf(version_string.c_str(), "%u.%u", &v[0], &v[1]);
|
||||||
unsigned int version_number = 10 * v[0] + v[1];
|
unsigned int version_number = 10 * v[0] + v[1];
|
||||||
|
|
||||||
if (version_number < 30) {
|
if (version_number < 50) {
|
||||||
cm->IssueMessage(MessageType::FATAL_ERROR,
|
cm->IssueMessage(MessageType::FATAL_ERROR,
|
||||||
"Xcode " + version_string + " not supported.");
|
"Xcode " + version_string + " not supported.");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -256,15 +256,11 @@ std::string const& cmGlobalXCodeGenerator::GetXcodeBuildCommand()
|
|||||||
|
|
||||||
std::string cmGlobalXCodeGenerator::FindXcodeBuildCommand()
|
std::string cmGlobalXCodeGenerator::FindXcodeBuildCommand()
|
||||||
{
|
{
|
||||||
if (this->XcodeVersion >= 40) {
|
std::string makeProgram = cmSystemTools::FindProgram("xcodebuild");
|
||||||
std::string makeProgram = cmSystemTools::FindProgram("xcodebuild");
|
if (makeProgram.empty()) {
|
||||||
if (makeProgram.empty()) {
|
makeProgram = "xcodebuild";
|
||||||
makeProgram = "xcodebuild";
|
|
||||||
}
|
|
||||||
return makeProgram;
|
|
||||||
}
|
}
|
||||||
// Use cmakexbuild wrapper to suppress environment dump from output.
|
return makeProgram;
|
||||||
return cmSystemTools::GetCMakeCommand() + "xbuild";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cmGlobalXCodeGenerator::SetGeneratorToolset(std::string const& ts,
|
bool cmGlobalXCodeGenerator::SetGeneratorToolset(std::string const& ts,
|
||||||
@ -550,12 +546,7 @@ void cmGlobalXCodeGenerator::AddExtraTargets(
|
|||||||
// run the depend check makefile as a post build rule
|
// run the depend check makefile as a post build rule
|
||||||
// this will make sure that when the next target is built
|
// this will make sure that when the next target is built
|
||||||
// things are up-to-date
|
// things are up-to-date
|
||||||
if (target->GetType() == cmStateEnums::OBJECT_LIBRARY ||
|
if (target->GetType() == cmStateEnums::OBJECT_LIBRARY) {
|
||||||
(this->XcodeVersion < 50 &&
|
|
||||||
(target->GetType() == cmStateEnums::EXECUTABLE ||
|
|
||||||
target->GetType() == cmStateEnums::STATIC_LIBRARY ||
|
|
||||||
target->GetType() == cmStateEnums::SHARED_LIBRARY ||
|
|
||||||
target->GetType() == cmStateEnums::MODULE_LIBRARY))) {
|
|
||||||
makeHelper.back() = // fill placeholder
|
makeHelper.back() = // fill placeholder
|
||||||
this->PostBuildMakeTarget(target->GetName(), "$(CONFIGURATION)");
|
this->PostBuildMakeTarget(target->GetName(), "$(CONFIGURATION)");
|
||||||
cmCustomCommandLines commandLines;
|
cmCustomCommandLines commandLines;
|
||||||
@ -1183,23 +1174,6 @@ bool cmGlobalXCodeGenerator::CreateXCodeTarget(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->XcodeVersion < 50) {
|
|
||||||
// Add object library contents as external objects. (Equivalent to
|
|
||||||
// the externalObjFiles above, except each one is not a cmSourceFile
|
|
||||||
// within the target.)
|
|
||||||
std::vector<cmSourceFile const*> objs;
|
|
||||||
gtgt->GetExternalObjects(objs, "");
|
|
||||||
for (auto sourceFile : objs) {
|
|
||||||
if (sourceFile->GetObjectLibrary().empty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
std::string const& obj = sourceFile->GetFullPath();
|
|
||||||
cmXCodeObject* xsf =
|
|
||||||
this->CreateXCodeSourceFileFromPath(obj, gtgt, "", nullptr);
|
|
||||||
externalObjFiles.push_back(xsf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// some build phases only apply to bundles and/or frameworks
|
// some build phases only apply to bundles and/or frameworks
|
||||||
bool isFrameworkTarget = gtgt->IsFrameworkOnApple();
|
bool isFrameworkTarget = gtgt->IsFrameworkOnApple();
|
||||||
bool isBundleTarget = gtgt->GetPropertyAsBool("MACOSX_BUNDLE");
|
bool isBundleTarget = gtgt->GetPropertyAsBool("MACOSX_BUNDLE");
|
||||||
@ -2123,9 +2097,6 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (this->XcodeVersion < 40) {
|
|
||||||
buildSettings->AddAttribute("PREBINDING", this->CreateString("NO"));
|
|
||||||
}
|
|
||||||
|
|
||||||
BuildObjectListOrString dirs(this, true);
|
BuildObjectListOrString dirs(this, true);
|
||||||
BuildObjectListOrString fdirs(this, true);
|
BuildObjectListOrString fdirs(this, true);
|
||||||
@ -2775,8 +2746,7 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
|
|||||||
|
|
||||||
// Loop over configuration types and set per-configuration info.
|
// Loop over configuration types and set per-configuration info.
|
||||||
for (auto const& configName : this->CurrentConfigurationTypes) {
|
for (auto const& configName : this->CurrentConfigurationTypes) {
|
||||||
// Get the current configuration name.
|
{
|
||||||
if (this->XcodeVersion >= 50) {
|
|
||||||
// Add object library contents as link flags.
|
// Add object library contents as link flags.
|
||||||
std::string linkObjs;
|
std::string linkObjs;
|
||||||
const char* sep = "";
|
const char* sep = "";
|
||||||
@ -2886,7 +2856,7 @@ bool cmGlobalXCodeGenerator::CreateGroups(
|
|||||||
// Put cmSourceFile instances in proper groups:
|
// Put cmSourceFile instances in proper groups:
|
||||||
for (auto const& si : gtgt->GetAllConfigSources()) {
|
for (auto const& si : gtgt->GetAllConfigSources()) {
|
||||||
cmSourceFile const* sf = si.Source;
|
cmSourceFile const* sf = si.Source;
|
||||||
if (this->XcodeVersion >= 50 && !sf->GetObjectLibrary().empty()) {
|
if (!sf->GetObjectLibrary().empty()) {
|
||||||
// Object library files go on the link line instead.
|
// Object library files go on the link line instead.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -3076,16 +3046,8 @@ bool cmGlobalXCodeGenerator::CreateXCodeObjects(
|
|||||||
v << std::setfill('0') << std::setw(4) << XcodeVersion * 10;
|
v << std::setfill('0') << std::setw(4) << XcodeVersion * 10;
|
||||||
group->AddAttribute("LastUpgradeCheck", this->CreateString(v.str()));
|
group->AddAttribute("LastUpgradeCheck", this->CreateString(v.str()));
|
||||||
this->RootObject->AddAttribute("attributes", group);
|
this->RootObject->AddAttribute("attributes", group);
|
||||||
if (this->XcodeVersion >= 32) {
|
this->RootObject->AddAttribute("compatibilityVersion",
|
||||||
this->RootObject->AddAttribute("compatibilityVersion",
|
this->CreateString("Xcode 3.2"));
|
||||||
this->CreateString("Xcode 3.2"));
|
|
||||||
} else if (this->XcodeVersion >= 31) {
|
|
||||||
this->RootObject->AddAttribute("compatibilityVersion",
|
|
||||||
this->CreateString("Xcode 3.1"));
|
|
||||||
} else {
|
|
||||||
this->RootObject->AddAttribute("compatibilityVersion",
|
|
||||||
this->CreateString("Xcode 3.0"));
|
|
||||||
}
|
|
||||||
// Point Xcode at the top of the source tree.
|
// Point Xcode at the top of the source tree.
|
||||||
{
|
{
|
||||||
std::string pdir =
|
std::string pdir =
|
||||||
@ -3540,13 +3502,7 @@ void cmGlobalXCodeGenerator::WriteXCodePBXProj(std::ostream& fout,
|
|||||||
cmXCodeObject::Indent(1, fout);
|
cmXCodeObject::Indent(1, fout);
|
||||||
fout << "};\n";
|
fout << "};\n";
|
||||||
cmXCodeObject::Indent(1, fout);
|
cmXCodeObject::Indent(1, fout);
|
||||||
if (this->XcodeVersion >= 32) {
|
fout << "objectVersion = 46;\n";
|
||||||
fout << "objectVersion = 46;\n";
|
|
||||||
} else if (this->XcodeVersion >= 31) {
|
|
||||||
fout << "objectVersion = 45;\n";
|
|
||||||
} else {
|
|
||||||
fout << "objectVersion = 44;\n";
|
|
||||||
}
|
|
||||||
cmXCode21Object::PrintList(this->XCodeObjects, fout);
|
cmXCode21Object::PrintList(this->XCodeObjects, fout);
|
||||||
cmXCodeObject::Indent(1, fout);
|
cmXCodeObject::Indent(1, fout);
|
||||||
fout << "rootObject = " << this->RootObject->GetId()
|
fout << "rootObject = " << this->RootObject->GetId()
|
||||||
@ -3714,11 +3670,7 @@ void cmGlobalXCodeGenerator::AppendFlag(std::string& flags,
|
|||||||
// Flag value with escaped quotes and backslashes.
|
// Flag value with escaped quotes and backslashes.
|
||||||
for (auto c : flag) {
|
for (auto c : flag) {
|
||||||
if (c == '\'') {
|
if (c == '\'') {
|
||||||
if (this->XcodeVersion >= 40) {
|
flags += "'\\''";
|
||||||
flags += "'\\''";
|
|
||||||
} else {
|
|
||||||
flags += "\\'";
|
|
||||||
}
|
|
||||||
} else if (c == '\\') {
|
} else if (c == '\\') {
|
||||||
flags += "\\\\";
|
flags += "\\\\";
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,80 +0,0 @@
|
|||||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
||||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
||||||
|
|
||||||
#include "cmConfigure.h" // IWYU pragma: keep
|
|
||||||
|
|
||||||
#include "cmsys/Process.h"
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "cmDuration.h"
|
|
||||||
#include "cmSystemTools.h"
|
|
||||||
|
|
||||||
// This is a wrapper program for xcodebuild
|
|
||||||
// it calls xcodebuild, and does two things
|
|
||||||
// it removes much of the output, all the setenv
|
|
||||||
// stuff. Also, it checks for the text file busy
|
|
||||||
// error, and re-runs xcodebuild until that error does
|
|
||||||
// not show up.
|
|
||||||
|
|
||||||
int RunXCode(std::vector<const char*>& argv, bool& hitbug)
|
|
||||||
{
|
|
||||||
hitbug = false;
|
|
||||||
cmsysProcess* cp = cmsysProcess_New();
|
|
||||||
cmsysProcess_SetCommand(cp, argv.data());
|
|
||||||
cmsysProcess_SetTimeout(cp, 0);
|
|
||||||
cmsysProcess_Execute(cp);
|
|
||||||
std::vector<char> out;
|
|
||||||
std::vector<char> err;
|
|
||||||
std::string line;
|
|
||||||
int pipe =
|
|
||||||
cmSystemTools::WaitForLine(cp, line, std::chrono::seconds(100), out, err);
|
|
||||||
while (pipe != cmsysProcess_Pipe_None) {
|
|
||||||
if (line.find("/bin/sh: bad interpreter: Text file busy") !=
|
|
||||||
std::string::npos) {
|
|
||||||
hitbug = true;
|
|
||||||
std::cerr << "Hit xcodebuild bug : " << line << "\n";
|
|
||||||
}
|
|
||||||
// if the bug is hit, no more output should be generated
|
|
||||||
// because it may contain bogus errors
|
|
||||||
// also remove all output with setenv in it to tone down
|
|
||||||
// the verbosity of xcodebuild
|
|
||||||
if (!hitbug && (line.find("setenv") == std::string::npos)) {
|
|
||||||
if (pipe == cmsysProcess_Pipe_STDERR) {
|
|
||||||
std::cerr << line << "\n";
|
|
||||||
} else if (pipe == cmsysProcess_Pipe_STDOUT) {
|
|
||||||
std::cout << line << "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pipe = cmSystemTools::WaitForLine(cp, line, std::chrono::seconds(100), out,
|
|
||||||
err);
|
|
||||||
}
|
|
||||||
cmsysProcess_WaitForExit(cp, nullptr);
|
|
||||||
if (cmsysProcess_GetState(cp) == cmsysProcess_State_Exited) {
|
|
||||||
return cmsysProcess_GetExitValue(cp);
|
|
||||||
}
|
|
||||||
if (cmsysProcess_GetState(cp) == cmsysProcess_State_Error) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int ac, char* av[])
|
|
||||||
{
|
|
||||||
std::vector<const char*> argv;
|
|
||||||
argv.push_back("xcodebuild");
|
|
||||||
for (int i = 1; i < ac; i++) {
|
|
||||||
argv.push_back(av[i]);
|
|
||||||
}
|
|
||||||
argv.push_back(nullptr);
|
|
||||||
bool hitbug = true;
|
|
||||||
int ret = 0;
|
|
||||||
while (hitbug) {
|
|
||||||
ret = RunXCode(argv, hitbug);
|
|
||||||
}
|
|
||||||
if (ret < 0) {
|
|
||||||
return 255;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user