From ca39c5cdd1ca28516791e00f213d6dee2179c6df Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 25 Jan 2012 13:39:26 -0500 Subject: Optionally allow IMPORTED targets to be globally visible Consider the case motivating commit e01cce28 (Allow add_dependencies() on imported targets, 2010-11-19). An imported target references a file generated at build time by a custom target on which it depends. Had the file been built directly using add_library or add_executable its target name would have been visible globally. Therefore the imported target representing the file should be globally visible also. Teach the IMPORTED signature of add_(executable|library) to accept a new "GLOBAL" option to make the imported target visible globally. --- Source/cmAddExecutableCommand.cxx | 9 ++++++++- Source/cmAddExecutableCommand.h | 4 ++-- Source/cmAddLibraryCommand.cxx | 8 +++++++- Source/cmAddLibraryCommand.h | 5 +++-- Source/cmGlobalGenerator.cxx | 17 ++++++++++++++--- Source/cmGlobalGenerator.h | 3 ++- Source/cmMakefile.cxx | 9 +++++++-- Source/cmMakefile.h | 3 ++- 8 files changed, 45 insertions(+), 13 deletions(-) diff --git a/Source/cmAddExecutableCommand.cxx b/Source/cmAddExecutableCommand.cxx index bac2430..6dd8e5c 100644 --- a/Source/cmAddExecutableCommand.cxx +++ b/Source/cmAddExecutableCommand.cxx @@ -29,6 +29,7 @@ bool cmAddExecutableCommand bool use_macbundle = false; bool excludeFromAll = false; bool importTarget = false; + bool importGlobal = false; while ( s != args.end() ) { if (*s == "WIN32") @@ -51,6 +52,11 @@ bool cmAddExecutableCommand ++s; importTarget = true; } + else if(importTarget && *s == "GLOBAL") + { + ++s; + importGlobal = true; + } else { break; @@ -92,7 +98,8 @@ bool cmAddExecutableCommand } // Create the imported target. - this->Makefile->AddImportedTarget(exename.c_str(), cmTarget::EXECUTABLE); + this->Makefile->AddImportedTarget(exename.c_str(), cmTarget::EXECUTABLE, + importGlobal); return true; } diff --git a/Source/cmAddExecutableCommand.h b/Source/cmAddExecutableCommand.h index f90e826..6834f58 100644 --- a/Source/cmAddExecutableCommand.h +++ b/Source/cmAddExecutableCommand.h @@ -92,12 +92,12 @@ public: "\n" "The add_executable command can also create IMPORTED executable " "targets using this signature:\n" - " add_executable( IMPORTED)\n" + " add_executable( IMPORTED [GLOBAL])\n" "An IMPORTED executable target references an executable file located " "outside the project. " "No rules are generated to build it. " "The target name has scope in the directory in which it is created " - "and below. " + "and below, but the GLOBAL option extends visibility. " "It may be referenced like any target built within the project. " "IMPORTED executables are useful for convenient reference from " "commands like add_custom_command. " diff --git a/Source/cmAddLibraryCommand.cxx b/Source/cmAddLibraryCommand.cxx index efa29e6..9a776fb 100644 --- a/Source/cmAddLibraryCommand.cxx +++ b/Source/cmAddLibraryCommand.cxx @@ -31,6 +31,7 @@ bool cmAddLibraryCommand } bool excludeFromAll = false; bool importTarget = false; + bool importGlobal = false; std::vector::const_iterator s = args.begin(); @@ -79,6 +80,11 @@ bool cmAddLibraryCommand ++s; importTarget = true; } + else if(importTarget && *s == "GLOBAL") + { + ++s; + importGlobal = true; + } else { break; @@ -124,7 +130,7 @@ bool cmAddLibraryCommand } // Create the imported target. - this->Makefile->AddImportedTarget(libName.c_str(), type); + this->Makefile->AddImportedTarget(libName.c_str(), type, importGlobal); return true; } diff --git a/Source/cmAddLibraryCommand.h b/Source/cmAddLibraryCommand.h index 07fbb06..edca1bb 100644 --- a/Source/cmAddLibraryCommand.h +++ b/Source/cmAddLibraryCommand.h @@ -96,12 +96,13 @@ public: "\n" "The add_library command can also create IMPORTED library " "targets using this signature:\n" - " add_library( IMPORTED)\n" + " add_library( IMPORTED\n" + " [GLOBAL])\n" "An IMPORTED library target references a library file located " "outside the project. " "No rules are generated to build it. " "The target name has scope in the directory in which it is created " - "and below. " + "and below, but the GLOBAL option extends visibility. " "It may be referenced like any target built within the project. " "IMPORTED libraries are useful for convenient reference from " "commands like target_link_libraries. " diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 124519a..8dce053 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1666,6 +1666,11 @@ cmGlobalGenerator::FindTarget(const char* project, const char* name) { return i->second; } + i = this->ImportedTargets.find(name); + if ( i != this->ImportedTargets.end() ) + { + return i->second; + } } return 0; } @@ -2046,10 +2051,16 @@ cmGlobalGenerator::GetTargetDirectDepends(cmTarget & target) return this->TargetDependencies[&target]; } -void cmGlobalGenerator::AddTarget(cmTargets::value_type &v) +void cmGlobalGenerator::AddTarget(cmTarget* t) { - assert(!v.second.IsImported()); - this->TotalTargets[v.first] = &v.second; + if(t->IsImported()) + { + this->ImportedTargets[t->GetName()] = t; + } + else + { + this->TotalTargets[t->GetName()] = t; + } } void cmGlobalGenerator::SetExternalMakefileProjectGenerator( diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index ded3345..1a0e41a 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -230,7 +230,7 @@ public: std::set const& GetDirectoryContent(std::string const& dir, bool needDisk = true); - void AddTarget(cmTargets::value_type &v); + void AddTarget(cmTarget* t); virtual const char* GetAllTargetName() const { return "ALL_BUILD"; } virtual const char* GetInstallTargetName() const { return "INSTALL"; } @@ -333,6 +333,7 @@ protected: // All targets in the entire project. std::map TotalTargets; + std::map ImportedTargets; virtual const char* GetPredefinedTargetsFolder(); virtual bool UseFolderProperty(); diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 7939d73..fdf5b31 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1937,7 +1937,7 @@ cmMakefile::AddNewTarget(cmTarget::TargetType type, const char* name) cmTarget& target = it->second; target.SetType(type, name); target.SetMakefile(this); - this->LocalGenerator->GetGlobalGenerator()->AddTarget(*it); + this->LocalGenerator->GetGlobalGenerator()->AddTarget(&it->second); return &it->second; } @@ -3894,7 +3894,8 @@ void cmMakefile::DefineProperties(cmake *cm) //---------------------------------------------------------------------------- cmTarget* -cmMakefile::AddImportedTarget(const char* name, cmTarget::TargetType type) +cmMakefile::AddImportedTarget(const char* name, cmTarget::TargetType type, + bool global) { // Create the target. cmsys::auto_ptr target(new cmTarget); @@ -3904,6 +3905,10 @@ cmMakefile::AddImportedTarget(const char* name, cmTarget::TargetType type) // Add to the set of available imported targets. this->ImportedTargets[name] = target.get(); + if(global) + { + this->LocalGenerator->GetGlobalGenerator()->AddTarget(target.get()); + } // Transfer ownership to this cmMakefile object. this->ImportedTargetsOwned.push_back(target.get()); diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 1236787..1c46a73 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -203,7 +203,8 @@ public: void RemoveDefineFlag(const char* definition); /** Create a new imported target with the name and type given. */ - cmTarget* AddImportedTarget(const char* name, cmTarget::TargetType type); + cmTarget* AddImportedTarget(const char* name, cmTarget::TargetType type, + bool global); cmTarget* AddNewTarget(cmTarget::TargetType type, const char* name); -- cgit v0.12