|  | @@ -915,6 +915,9 @@ void cmLocalGenerator::GetTargetFlags(
 | 
	
		
			
				|  |  |    const char* libraryLinkVariable =
 | 
	
		
			
				|  |  |      "CMAKE_SHARED_LINKER_FLAGS"; // default to shared library
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  const std::string linkLanguage =
 | 
	
		
			
				|  |  | +    linkLineComputer->GetLinkerLanguage(target, buildType);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    switch (target->GetType()) {
 | 
	
		
			
				|  |  |      case cmStateEnums::STATIC_LIBRARY:
 | 
	
		
			
				|  |  |        this->GetStaticLibraryFlags(linkFlags, buildType, target);
 | 
	
	
		
			
				|  | @@ -976,9 +979,6 @@ void cmLocalGenerator::GetTargetFlags(
 | 
	
		
			
				|  |  |          linkFlags += this->Makefile->GetSafeDefinition(build);
 | 
	
		
			
				|  |  |          linkFlags += " ";
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      const std::string linkLanguage =
 | 
	
		
			
				|  |  | -        linkLineComputer->GetLinkerLanguage(target, buildType);
 | 
	
		
			
				|  |  |        if (linkLanguage.empty()) {
 | 
	
		
			
				|  |  |          cmSystemTools::Error(
 | 
	
		
			
				|  |  |            "CMake can not determine linker language for target: ",
 | 
	
	
		
			
				|  | @@ -1040,6 +1040,8 @@ void cmLocalGenerator::GetTargetFlags(
 | 
	
		
			
				|  |  |      default:
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  this->AppendIPOLinkerFlags(linkFlags, target, config, linkLanguage);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void cmLocalGenerator::GetTargetCompileFlags(cmGeneratorTarget* target,
 | 
	
	
		
			
				|  | @@ -1769,6 +1771,38 @@ void cmLocalGenerator::AppendFlagEscape(std::string& flags,
 | 
	
		
			
				|  |  |    this->AppendFlags(flags, this->EscapeForShell(rawFlag));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void cmLocalGenerator::AppendIPOLinkerFlags(std::string& flags,
 | 
	
		
			
				|  |  | +                                            cmGeneratorTarget* target,
 | 
	
		
			
				|  |  | +                                            const std::string& config,
 | 
	
		
			
				|  |  | +                                            const std::string& lang)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  if (!target->IsIPOEnabled(config)) {
 | 
	
		
			
				|  |  | +    return;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  switch (target->GetType()) {
 | 
	
		
			
				|  |  | +    case cmStateEnums::EXECUTABLE:
 | 
	
		
			
				|  |  | +    case cmStateEnums::SHARED_LIBRARY:
 | 
	
		
			
				|  |  | +    case cmStateEnums::MODULE_LIBRARY:
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  | +    default:
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const std::string name = "CMAKE_" + lang + "_LINK_OPTIONS_IPO";
 | 
	
		
			
				|  |  | +  const char* rawFlagsList = this->Makefile->GetDefinition(name);
 | 
	
		
			
				|  |  | +  if (rawFlagsList == CM_NULLPTR) {
 | 
	
		
			
				|  |  | +    return;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  std::vector<std::string> flagsList;
 | 
	
		
			
				|  |  | +  cmSystemTools::ExpandListArgument(rawFlagsList, flagsList);
 | 
	
		
			
				|  |  | +  for (std::vector<std::string>::const_iterator oi = flagsList.begin();
 | 
	
		
			
				|  |  | +       oi != flagsList.end(); ++oi) {
 | 
	
		
			
				|  |  | +    this->AppendFlagEscape(flags, *oi);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void cmLocalGenerator::AppendDefines(std::set<std::string>& defines,
 | 
	
		
			
				|  |  |                                       const char* defines_list) const
 | 
	
		
			
				|  |  |  {
 |