| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst or https://cmake.org/licensing for details. */ | |
| #include "cmIncludeExternalMSProjectCommand.h" | |
| #include "cmExecutionStatus.h" | |
| #ifdef _WIN32 | |
| # include "cmGlobalGenerator.h" | |
| # include "cmMakefile.h" | |
| # include "cmStateTypes.h" | |
| # include "cmSystemTools.h" | |
| # include "cmTarget.h" | |
| # include "cmake.h" | |
| #endif | |
| bool cmIncludeExternalMSProjectCommand(std::vector<std::string> const& args, | |
| cmExecutionStatus& status) | |
| { | |
| if (args.size() < 2) { | |
| status.SetError("INCLUDE_EXTERNAL_MSPROJECT called with incorrect " | |
| "number of arguments"); | |
| return false; | |
| } | |
| // only compile this for win32 to avoid coverage errors | |
| #ifdef _WIN32 | |
| cmMakefile& mf = status.GetMakefile(); | |
| if (mf.GetDefinition("WIN32") || | |
| mf.GetGlobalGenerator()->IsIncludeExternalMSProjectSupported()) { | |
| enum Doing | |
| { | |
| DoingNone, | |
| DoingType, | |
| DoingGuid, | |
| DoingPlatform | |
| }; | |
| Doing doing = DoingNone; | |
| std::string customType; | |
| std::string customGuid; | |
| std::string platformMapping; | |
| std::vector<std::string> depends; | |
| for (unsigned int i = 2; i < args.size(); ++i) { | |
| if (args[i] == "TYPE") { | |
| doing = DoingType; | |
| } else if (args[i] == "GUID") { | |
| doing = DoingGuid; | |
| } else if (args[i] == "PLATFORM") { | |
| doing = DoingPlatform; | |
| } else { | |
| switch (doing) { | |
| case DoingNone: | |
| depends.push_back(args[i]); | |
| break; | |
| case DoingType: | |
| customType = args[i]; | |
| break; | |
| case DoingGuid: | |
| customGuid = args[i]; | |
| break; | |
| case DoingPlatform: | |
| platformMapping = args[i]; | |
| break; | |
| } | |
| doing = DoingNone; | |
| } | |
| } | |
| // Hack together a utility target storing enough information | |
| // to reproduce the target inclusion. | |
| std::string utility_name = args[0]; | |
| std::string path = args[1]; | |
| cmSystemTools::ConvertToUnixSlashes(path); | |
| if (!customGuid.empty()) { | |
| std::string guidVariable = utility_name + "_GUID_CMAKE"; | |
| mf.GetCMakeInstance()->AddCacheEntry( | |
| guidVariable, customGuid, "Stored GUID", cmStateEnums::INTERNAL); | |
| } | |
| // Create a target instance for this utility. | |
| cmTarget* target = mf.AddNewTarget(cm::TargetType::UTILITY, utility_name); | |
| if (mf.GetPropertyAsBool("EXCLUDE_FROM_ALL")) { | |
| target->SetProperty("EXCLUDE_FROM_ALL", "TRUE"); | |
| } | |
| target->SetProperty("GENERATOR_FILE_NAME", utility_name); | |
| target->SetProperty("EXTERNAL_MSPROJECT", path); | |
| if (!customType.empty()) | |
| target->SetProperty("VS_PROJECT_TYPE", customType); | |
| if (!platformMapping.empty()) | |
| target->SetProperty("VS_PLATFORM_MAPPING", platformMapping); | |
| for (std::string const& d : depends) { | |
| target->AddUtility(d, false); | |
| } | |
| } | |
| #endif | |
| return true; | |
| } |