summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Cole <david.cole@kitware.com>2012-02-01 14:49:10 -0500
committerCMake Topic Stage <kwrobot@kitware.com>2012-02-01 14:49:10 -0500
commit3e0eeb9fc832cde370ea70b1b3c8e7ebb42c860a (patch)
treee2577e3854711cdb0b5c29619462b01df6b9fb79
parent94af99d38813236bc381d2a8df2901fab09ea595 (diff)
parentf9c1c6225c4366918465b86e4c6976ecc266245f (diff)
downloadcmake-3e0eeb9fc832cde370ea70b1b3c8e7ebb42c860a.tar.gz
Merge topic 'imported-target-visibility'
f9c1c62 Add test covering imported target scope rules ca39c5c Optionally allow IMPORTED targets to be globally visible
-rw-r--r--Source/cmAddExecutableCommand.cxx9
-rw-r--r--Source/cmAddExecutableCommand.h4
-rw-r--r--Source/cmAddLibraryCommand.cxx8
-rw-r--r--Source/cmAddLibraryCommand.h5
-rw-r--r--Source/cmGlobalGenerator.cxx17
-rw-r--r--Source/cmGlobalGenerator.h3
-rw-r--r--Source/cmMakefile.cxx9
-rw-r--r--Source/cmMakefile.h3
-rw-r--r--Tests/CMakeOnly/CMakeLists.txt2
-rw-r--r--Tests/CMakeOnly/TargetScope/CMakeLists.txt13
-rw-r--r--Tests/CMakeOnly/TargetScope/Sib/CMakeLists.txt6
-rw-r--r--Tests/CMakeOnly/TargetScope/Sub/CMakeLists.txt9
-rw-r--r--Tests/CMakeOnly/TargetScope/Sub/Sub/CMakeLists.txt6
13 files changed, 81 insertions, 13 deletions
diff --git a/Source/cmAddExecutableCommand.cxx b/Source/cmAddExecutableCommand.cxx
index bac243039a..6dd8e5c644 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 f90e82697d..6834f58854 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(<name> IMPORTED)\n"
+ " add_executable(<name> 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 efa29e6c99..9a776fbdea 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<std::string>::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 07fbb06ad9..edca1bb037 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(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED)\n"
+ " add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> 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 124519ada4..8dce05348b 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 ded3345db8..1a0e41a0fe 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -230,7 +230,7 @@ public:
std::set<cmStdString> 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<cmStdString,cmTarget *> TotalTargets;
+ std::map<cmStdString,cmTarget *> ImportedTargets;
virtual const char* GetPredefinedTargetsFolder();
virtual bool UseFolderProperty();
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 7939d7322d..fdf5b31d11 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<cmTarget> 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 123678783a..1c46a733b4 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);
diff --git a/Tests/CMakeOnly/CMakeLists.txt b/Tests/CMakeOnly/CMakeLists.txt
index 20e6a3aba7..96b9972aa4 100644
--- a/Tests/CMakeOnly/CMakeLists.txt
+++ b/Tests/CMakeOnly/CMakeLists.txt
@@ -16,3 +16,5 @@ add_CMakeOnly_test(CheckSymbolExists)
add_CMakeOnly_test(CheckCXXSymbolExists)
add_CMakeOnly_test(AllFindModules)
+
+add_CMakeOnly_test(TargetScope)
diff --git a/Tests/CMakeOnly/TargetScope/CMakeLists.txt b/Tests/CMakeOnly/TargetScope/CMakeLists.txt
new file mode 100644
index 0000000000..fa5d8e2342
--- /dev/null
+++ b/Tests/CMakeOnly/TargetScope/CMakeLists.txt
@@ -0,0 +1,13 @@
+cmake_minimum_required (VERSION 2.8)
+project(TargetScope NONE)
+
+add_subdirectory(Sub)
+
+if(TARGET SubLibLocal)
+ message(FATAL_ERROR "SubLibLocal visible in top directory")
+endif()
+if(NOT TARGET SubLibGlobal)
+ message(FATAL_ERROR "SubLibGlobal not visible in top directory")
+endif()
+
+add_subdirectory(Sib)
diff --git a/Tests/CMakeOnly/TargetScope/Sib/CMakeLists.txt b/Tests/CMakeOnly/TargetScope/Sib/CMakeLists.txt
new file mode 100644
index 0000000000..7f6f4e8fdc
--- /dev/null
+++ b/Tests/CMakeOnly/TargetScope/Sib/CMakeLists.txt
@@ -0,0 +1,6 @@
+if(TARGET SubLibLocal)
+ message(FATAL_ERROR "SubLibLocal visible in sibling directory")
+endif()
+if(NOT TARGET SubLibGlobal)
+ message(FATAL_ERROR "SubLibGlobal not visible in sibling directory")
+endif()
diff --git a/Tests/CMakeOnly/TargetScope/Sub/CMakeLists.txt b/Tests/CMakeOnly/TargetScope/Sub/CMakeLists.txt
new file mode 100644
index 0000000000..27318f5853
--- /dev/null
+++ b/Tests/CMakeOnly/TargetScope/Sub/CMakeLists.txt
@@ -0,0 +1,9 @@
+add_library(SubLibLocal UNKNOWN IMPORTED)
+add_library(SubLibGlobal UNKNOWN IMPORTED GLOBAL)
+add_subdirectory(Sub)
+if(NOT TARGET SubLibLocal)
+ message(FATAL_ERROR "SubLibLocal not visible in own directory")
+endif()
+if(NOT TARGET SubLibGlobal)
+ message(FATAL_ERROR "SubLibGlobal not visible in own directory")
+endif()
diff --git a/Tests/CMakeOnly/TargetScope/Sub/Sub/CMakeLists.txt b/Tests/CMakeOnly/TargetScope/Sub/Sub/CMakeLists.txt
new file mode 100644
index 0000000000..a351daadfc
--- /dev/null
+++ b/Tests/CMakeOnly/TargetScope/Sub/Sub/CMakeLists.txt
@@ -0,0 +1,6 @@
+if(NOT TARGET SubLibLocal)
+ message(FATAL_ERROR "SubLibLocal not visible in subdirectory")
+endif()
+if(NOT TARGET SubLibGlobal)
+ message(FATAL_ERROR "SubLibGlobal not visible in subdirectory")
+endif()