|  | @@ -20,6 +20,7 @@
 | 
	
		
			
				|  |  |  #include "cmInstallGenerator.h"
 | 
	
		
			
				|  |  |  #include "cmInstallScriptGenerator.h"
 | 
	
		
			
				|  |  |  #include "cmInstallTargetGenerator.h"
 | 
	
		
			
				|  |  | +#include "cmListFileCache.h"
 | 
	
		
			
				|  |  |  #include "cmMakefile.h"
 | 
	
		
			
				|  |  |  #include "cmPolicies.h"
 | 
	
		
			
				|  |  |  #include "cmStateTypes.h"
 | 
	
	
		
			
				|  | @@ -32,7 +33,8 @@ class cmExecutionStatus;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static cmInstallTargetGenerator* CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  |    cmTarget& target, const cmInstallCommandArguments& args, bool impLib,
 | 
	
		
			
				|  |  | -  bool forceOpt = false, bool namelink = false)
 | 
	
		
			
				|  |  | +  cmListFileBacktrace const& backtrace, bool forceOpt = false,
 | 
	
		
			
				|  |  | +  bool namelink = false)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |    cmInstallGenerator::MessageLevel message =
 | 
	
		
			
				|  |  |      cmInstallGenerator::SelectMessageLevel(target.GetMakefile());
 | 
	
	
		
			
				|  | @@ -42,7 +44,8 @@ static cmInstallTargetGenerator* CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  |    return new cmInstallTargetGenerator(
 | 
	
		
			
				|  |  |      target.GetName(), args.GetDestination().c_str(), impLib,
 | 
	
		
			
				|  |  |      args.GetPermissions().c_str(), args.GetConfigurations(), component,
 | 
	
		
			
				|  |  | -    message, args.GetExcludeFromAll(), args.GetOptional() || forceOpt);
 | 
	
		
			
				|  |  | +    message, args.GetExcludeFromAll(), args.GetOptional() || forceOpt,
 | 
	
		
			
				|  |  | +    backtrace);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static cmInstallFilesGenerator* CreateInstallFilesGenerator(
 | 
	
	
		
			
				|  | @@ -435,13 +438,13 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |            // This is a DLL platform.
 | 
	
		
			
				|  |  |            if (!archiveArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  |              // The import library uses the ARCHIVE properties.
 | 
	
		
			
				|  |  | -            archiveGenerator =
 | 
	
		
			
				|  |  | -              CreateInstallTargetGenerator(target, archiveArgs, true);
 | 
	
		
			
				|  |  | +            archiveGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +              target, archiveArgs, true, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |            if (!runtimeArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  |              // The DLL uses the RUNTIME properties.
 | 
	
		
			
				|  |  | -            runtimeGenerator =
 | 
	
		
			
				|  |  | -              CreateInstallTargetGenerator(target, runtimeArgs, false);
 | 
	
		
			
				|  |  | +            runtimeGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +              target, runtimeArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |            if ((archiveGenerator == nullptr) && (runtimeGenerator == nullptr)) {
 | 
	
		
			
				|  |  |              this->SetError("Library TARGETS given no DESTINATION!");
 | 
	
	
		
			
				|  | @@ -459,8 +462,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Use the FRAMEWORK properties.
 | 
	
		
			
				|  |  |              if (!frameworkArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  | -              frameworkGenerator =
 | 
	
		
			
				|  |  | -                CreateInstallTargetGenerator(target, frameworkArgs, false);
 | 
	
		
			
				|  |  | +              frameworkGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +                target, frameworkArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                std::ostringstream e;
 | 
	
		
			
				|  |  |                e << "TARGETS given no FRAMEWORK DESTINATION for shared library "
 | 
	
	
		
			
				|  | @@ -473,14 +476,15 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |              // The shared library uses the LIBRARY properties.
 | 
	
		
			
				|  |  |              if (!libraryArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  |                if (namelinkMode != cmInstallTargetGenerator::NamelinkModeOnly) {
 | 
	
		
			
				|  |  | -                libraryGenerator =
 | 
	
		
			
				|  |  | -                  CreateInstallTargetGenerator(target, libraryArgs, false);
 | 
	
		
			
				|  |  | +                libraryGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +                  target, libraryArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |                  libraryGenerator->SetNamelinkMode(
 | 
	
		
			
				|  |  |                    cmInstallTargetGenerator::NamelinkModeSkip);
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |                if (namelinkMode != cmInstallTargetGenerator::NamelinkModeSkip) {
 | 
	
		
			
				|  |  |                  namelinkGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | -                  target, libraryArgs, false, false, true);
 | 
	
		
			
				|  |  | +                  target, libraryArgs, false, this->Makefile->GetBacktrace(),
 | 
	
		
			
				|  |  | +                  false, true);
 | 
	
		
			
				|  |  |                  namelinkGenerator->SetNamelinkMode(
 | 
	
		
			
				|  |  |                    cmInstallTargetGenerator::NamelinkModeOnly);
 | 
	
		
			
				|  |  |                }
 | 
	
	
		
			
				|  | @@ -508,8 +512,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |            // Use the FRAMEWORK properties.
 | 
	
		
			
				|  |  |            if (!frameworkArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  | -            frameworkGenerator =
 | 
	
		
			
				|  |  | -              CreateInstallTargetGenerator(target, frameworkArgs, false);
 | 
	
		
			
				|  |  | +            frameworkGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +              target, frameworkArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |            } else {
 | 
	
		
			
				|  |  |              std::ostringstream e;
 | 
	
		
			
				|  |  |              e << "TARGETS given no FRAMEWORK DESTINATION for static library "
 | 
	
	
		
			
				|  | @@ -521,8 +525,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |            // Static libraries use ARCHIVE properties.
 | 
	
		
			
				|  |  |            if (!archiveArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  | -            archiveGenerator =
 | 
	
		
			
				|  |  | -              CreateInstallTargetGenerator(target, archiveArgs, false);
 | 
	
		
			
				|  |  | +            archiveGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +              target, archiveArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |            } else {
 | 
	
		
			
				|  |  |              std::ostringstream e;
 | 
	
		
			
				|  |  |              e << "TARGETS given no ARCHIVE DESTINATION for static library "
 | 
	
	
		
			
				|  | @@ -536,8 +540,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |        case cmStateEnums::MODULE_LIBRARY: {
 | 
	
		
			
				|  |  |          // Modules use LIBRARY properties.
 | 
	
		
			
				|  |  |          if (!libraryArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  | -          libraryGenerator =
 | 
	
		
			
				|  |  | -            CreateInstallTargetGenerator(target, libraryArgs, false);
 | 
	
		
			
				|  |  | +          libraryGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +            target, libraryArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |            libraryGenerator->SetNamelinkMode(namelinkMode);
 | 
	
		
			
				|  |  |            namelinkOnly =
 | 
	
		
			
				|  |  |              (namelinkMode == cmInstallTargetGenerator::NamelinkModeOnly);
 | 
	
	
		
			
				|  | @@ -563,8 +567,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |              return false;
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -          objectGenerator =
 | 
	
		
			
				|  |  | -            CreateInstallTargetGenerator(target, objectArgs, false);
 | 
	
		
			
				|  |  | +          objectGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +            target, objectArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |            // Installing an OBJECT library without a destination transforms
 | 
	
		
			
				|  |  |            // it to an INTERFACE library.  It installs no files but can be
 | 
	
	
		
			
				|  | @@ -575,15 +579,15 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |          if (target.IsAppBundleOnApple()) {
 | 
	
		
			
				|  |  |            // Application bundles use the BUNDLE properties.
 | 
	
		
			
				|  |  |            if (!bundleArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  | -            bundleGenerator =
 | 
	
		
			
				|  |  | -              CreateInstallTargetGenerator(target, bundleArgs, false);
 | 
	
		
			
				|  |  | +            bundleGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +              target, bundleArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |            } else if (!runtimeArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  |              bool failure = false;
 | 
	
		
			
				|  |  |              if (this->CheckCMP0006(failure)) {
 | 
	
		
			
				|  |  |                // For CMake 2.4 compatibility fallback to the RUNTIME
 | 
	
		
			
				|  |  |                // properties.
 | 
	
		
			
				|  |  | -              bundleGenerator =
 | 
	
		
			
				|  |  | -                CreateInstallTargetGenerator(target, runtimeArgs, false);
 | 
	
		
			
				|  |  | +              bundleGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +                target, runtimeArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |              } else if (failure) {
 | 
	
		
			
				|  |  |                return false;
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -599,8 +603,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |            // Executables use the RUNTIME properties.
 | 
	
		
			
				|  |  |            if (!runtimeArgs.GetDestination().empty()) {
 | 
	
		
			
				|  |  | -            runtimeGenerator =
 | 
	
		
			
				|  |  | -              CreateInstallTargetGenerator(target, runtimeArgs, false);
 | 
	
		
			
				|  |  | +            runtimeGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +              target, runtimeArgs, false, this->Makefile->GetBacktrace());
 | 
	
		
			
				|  |  |            } else {
 | 
	
		
			
				|  |  |              std::ostringstream e;
 | 
	
		
			
				|  |  |              e << "TARGETS given no RUNTIME DESTINATION for executable "
 | 
	
	
		
			
				|  | @@ -617,8 +621,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
 | 
	
		
			
				|  |  |          if (dll_platform && !archiveArgs.GetDestination().empty() &&
 | 
	
		
			
				|  |  |              target.IsExecutableWithExports()) {
 | 
	
		
			
				|  |  |            // The import library uses the ARCHIVE properties.
 | 
	
		
			
				|  |  | -          archiveGenerator =
 | 
	
		
			
				|  |  | -            CreateInstallTargetGenerator(target, archiveArgs, true, true);
 | 
	
		
			
				|  |  | +          archiveGenerator = CreateInstallTargetGenerator(
 | 
	
		
			
				|  |  | +            target, archiveArgs, true, this->Makefile->GetBacktrace(), true);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        } break;
 | 
	
		
			
				|  |  |        case cmStateEnums::INTERFACE_LIBRARY:
 |