| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt 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.c_str(), |
| "Stored GUID", |
| cmStateEnums::INTERNAL); |
| } |
| |
| // Create a target instance for this utility. |
| cmTarget* target = mf.AddNewTarget(cmStateEnums::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; |
| } |