|
|
@@ -9,8 +9,8 @@
|
|
|
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
|
|
|
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
|
|
|
|
|
|
- This software is distributed WITHOUT ANY WARRANTY; without even
|
|
|
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
+ This software is distributed WITHOUT ANY WARRANTY; without even
|
|
|
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
PURPOSE. See the above copyright notices for more information.
|
|
|
|
|
|
=========================================================================*/
|
|
|
@@ -41,11 +41,11 @@ cmTarget::cmTarget()
|
|
|
this->IsImportedTarget = false;
|
|
|
}
|
|
|
|
|
|
-// define properties
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::DefineProperties(cmake *cm)
|
|
|
{
|
|
|
cm->DefineProperty
|
|
|
- ("BUILD_WITH_INSTALL_RPATH", cmProperty::TARGET,
|
|
|
+ ("BUILD_WITH_INSTALL_RPATH", cmProperty::TARGET,
|
|
|
"Should build tree targets have install tree rpaths.",
|
|
|
"BUILD_WITH_INSTALL_RPATH is a boolean specifying whether to link "
|
|
|
"the target in the build tree with the INSTALL_RPATH. This takes "
|
|
|
@@ -53,7 +53,7 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"before installation.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("CLEAN_DIRECT_OUTPUT", cmProperty::TARGET,
|
|
|
+ ("CLEAN_DIRECT_OUTPUT", cmProperty::TARGET,
|
|
|
"Do not delete other varients of this target.",
|
|
|
"When a library is built CMake by default generates code to remove "
|
|
|
"any existing library using all possible names. This is needed "
|
|
|
@@ -64,14 +64,14 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"prevented by setting the CLEAN_DIRECT_OUTPUT property to 1.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("COMPILE_FLAGS", cmProperty::TARGET,
|
|
|
+ ("COMPILE_FLAGS", cmProperty::TARGET,
|
|
|
"Additional flags to yse when compiling this target's sources.",
|
|
|
"The COMPILE_FLAGS property sets additional compiler flags used "
|
|
|
"to build sources within the target. It may also be used to pass "
|
|
|
"additional preprocessor definitions.");
|
|
|
-
|
|
|
+
|
|
|
cm->DefineProperty
|
|
|
- ("DEFINE_SYMBOL", cmProperty::TARGET,
|
|
|
+ ("DEFINE_SYMBOL", cmProperty::TARGET,
|
|
|
"Define a symbol when compiling this target's sources.",
|
|
|
"DEFINE_SYMBOL sets the name of the preprocessor symbol defined when "
|
|
|
"compiling sources in a shared library. "
|
|
|
@@ -80,29 +80,29 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"identifier). This is useful for headers to know whether they are "
|
|
|
"being included from inside their library our outside to properly "
|
|
|
"setup dllexport/dllimport decorations. ");
|
|
|
-
|
|
|
+
|
|
|
cm->DefineProperty
|
|
|
- ("DEBUG_POSTFIX", cmProperty::TARGET,
|
|
|
+ ("DEBUG_POSTFIX", cmProperty::TARGET,
|
|
|
"A postfix that will be applied to this target when build debug.",
|
|
|
"A property on a target that sepcifies a postfix to add to the "
|
|
|
"target name when built in debug mode. For example foo.dll "
|
|
|
"versus fooD.dll");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("EchoString", cmProperty::TARGET,
|
|
|
+ ("EchoString", cmProperty::TARGET,
|
|
|
"A message to be displayed when the target is built.",
|
|
|
"A message to display on some generaters (such as makefiles) when "
|
|
|
"the target is built.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("HAS_CXX", cmProperty::TARGET,
|
|
|
+ ("HAS_CXX", cmProperty::TARGET,
|
|
|
"Force a target to use the CXX linker.",
|
|
|
"Setting HAS_CXX on a target will force the target to use the "
|
|
|
"C++ linker (and C++ runtime libraries) for linking even if the "
|
|
|
"target has no C++ code in it.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("IMPORT_PREFIX", cmProperty::TARGET,
|
|
|
+ ("IMPORT_PREFIX", cmProperty::TARGET,
|
|
|
"What comes before the import library name.",
|
|
|
"Similar to the target property PREFIX, but used for import libraries "
|
|
|
"(typically corresponding to a DLL) instead of regular libraries. "
|
|
|
@@ -110,7 +110,7 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"(such as \"lib\") on an import library name.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("IMPORT_SUFFIX", cmProperty::TARGET,
|
|
|
+ ("IMPORT_SUFFIX", cmProperty::TARGET,
|
|
|
"What comes after the import library name.",
|
|
|
"Similar to the target property SUFFIX, but used for import libraries "
|
|
|
"(typically corresponding to a DLL) instead of regular libraries. "
|
|
|
@@ -118,7 +118,7 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"(such as \".lib\") on an import library name.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("EXCLUDE_FROM_ALL", cmProperty::TARGET,
|
|
|
+ ("EXCLUDE_FROM_ALL", cmProperty::TARGET,
|
|
|
"Exclude the target from the all target.",
|
|
|
"A property on a target that indicates if the target is excluded "
|
|
|
"from the default build target. If it is not, then with a Makefile "
|
|
|
@@ -127,27 +127,27 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
true);
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("INSTALL_NAME_DIR", cmProperty::TARGET,
|
|
|
+ ("INSTALL_NAME_DIR", cmProperty::TARGET,
|
|
|
"Mac OSX directory name for installed targets.",
|
|
|
"INSTALL_NAME_DIR is a string specifying the "
|
|
|
"directory portion of the \"install_name\" field of shared libraries "
|
|
|
"on Mac OSX to use in the installed targets. ");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("INSTALL_RPATH", cmProperty::TARGET,
|
|
|
+ ("INSTALL_RPATH", cmProperty::TARGET,
|
|
|
"The rpath to use for installed targets.",
|
|
|
"A semicolon-separated list specifying the rpath "
|
|
|
"to use in installed targets (for platforms that support it).");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("INSTALL_RPATH_USE_LINK_PATH", cmProperty::TARGET,
|
|
|
+ ("INSTALL_RPATH_USE_LINK_PATH", cmProperty::TARGET,
|
|
|
"Add paths to linker search and installed rpath.",
|
|
|
"INSTALL_RPATH_USE_LINK_PATH is a boolean that if set to true will "
|
|
|
"append directories in the linker search path and outside the "
|
|
|
"project to the INSTALL_RPATH. ");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("LINK_FLAGS", cmProperty::TARGET,
|
|
|
+ ("LINK_FLAGS", cmProperty::TARGET,
|
|
|
"Additional flags to use when linking this target.",
|
|
|
"The LINK_FLAGS property can be used to add extra flags to the "
|
|
|
"link step of a target. LINK_FLAGS_<CONFIG> will add to the "
|
|
|
@@ -155,7 +155,7 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"for example, DEBUG, RELEASE, MINSIZEREL, RELWITHDEBINFO. ");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("LINKER_LANGUAGE", cmProperty::TARGET,
|
|
|
+ ("LINKER_LANGUAGE", cmProperty::TARGET,
|
|
|
"What tool to use for linking, based on language.",
|
|
|
"The LINKER_LANGUAGE property is used to change the tool "
|
|
|
"used to link an executable or shared library. The default is "
|
|
|
@@ -163,7 +163,7 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"are common values for this property.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("LOCATION", cmProperty::TARGET,
|
|
|
+ ("LOCATION", cmProperty::TARGET,
|
|
|
"Where a target will be written on disk.",
|
|
|
"A read only property on a target that indicates where that target "
|
|
|
"will be written. For libraries and execuatables this will be where "
|
|
|
@@ -171,7 +171,7 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"number of other settings.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("OUTPUT_NAME", cmProperty::TARGET,
|
|
|
+ ("OUTPUT_NAME", cmProperty::TARGET,
|
|
|
"Sets the real name of a target when it is built.",
|
|
|
"Sets the real name of a target when it is built and "
|
|
|
"can be used to help create two targets of the same name even though "
|
|
|
@@ -180,7 +180,7 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"per-configuration basis.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("PRE_INSTALL_SCRIPT", cmProperty::TARGET,
|
|
|
+ ("PRE_INSTALL_SCRIPT", cmProperty::TARGET,
|
|
|
"Deprecated install support.",
|
|
|
"The PRE_INSTALL_SCRIPT and POST_INSTALL_SCRIPT properties are the "
|
|
|
"old way to specify CMake scripts to run before and after "
|
|
|
@@ -189,13 +189,13 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"INSTALL command instead.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("PREFIX", cmProperty::TARGET,
|
|
|
+ ("PREFIX", cmProperty::TARGET,
|
|
|
"What comes before the library name.",
|
|
|
"A target property that can be set to override the prefix "
|
|
|
"(such as \"lib\") on a library name.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("POST_INSTALL_SCRIPT", cmProperty::TARGET,
|
|
|
+ ("POST_INSTALL_SCRIPT", cmProperty::TARGET,
|
|
|
"Deprecated install support.",
|
|
|
"The PRE_INSTALL_SCRIPT and POST_INSTALL_SCRIPT properties are the "
|
|
|
"old way to specify CMake scripts to run before and after "
|
|
|
@@ -204,14 +204,14 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"INSTALL command instead.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("SKIP_BUILD_RPATH", cmProperty::TARGET,
|
|
|
+ ("SKIP_BUILD_RPATH", cmProperty::TARGET,
|
|
|
"Should rpaths be used for the build tree.",
|
|
|
"SKIP_BUILD_RPATH is a boolean specifying whether to skip automatic "
|
|
|
"generation of an rpath allowing the target to run from the "
|
|
|
"build tree. ");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("SOVERSION", cmProperty::TARGET,
|
|
|
+ ("SOVERSION", cmProperty::TARGET,
|
|
|
"What version number is this target.",
|
|
|
"For shared libraries VERSION and SOVERSION can be used to specify "
|
|
|
"the build version and api version respectively. When building or "
|
|
|
@@ -224,18 +224,18 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"These numbers are used as the image version of the binary. ");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("STATIC_LIBRARY_FLAGS", cmProperty::TARGET,
|
|
|
+ ("STATIC_LIBRARY_FLAGS", cmProperty::TARGET,
|
|
|
"Extra flags to use when linking static libraries.",
|
|
|
"Extra flags to use when linking a static library.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("SUFFIX", cmProperty::TARGET,
|
|
|
+ ("SUFFIX", cmProperty::TARGET,
|
|
|
"What comes after the library name.",
|
|
|
"A target property that can be set to override the suffix "
|
|
|
"(such as \".so\") on a library name.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("VERSION", cmProperty::TARGET,
|
|
|
+ ("VERSION", cmProperty::TARGET,
|
|
|
"What version number is this target.",
|
|
|
"For shared libraries VERSION and SOVERSION can be used to specify "
|
|
|
"the build version and api version respectively. When building or "
|
|
|
@@ -252,7 +252,7 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("WIN32_EXECUTABLE", cmProperty::TARGET,
|
|
|
+ ("WIN32_EXECUTABLE", cmProperty::TARGET,
|
|
|
"Used to specify Windows executable with a WinMain entry point.",
|
|
|
"This can be set to indicate that a target is a Windows executable "
|
|
|
"in contrast to a console application for example. This changes "
|
|
|
@@ -276,14 +276,14 @@ void cmTarget::DefineProperties(cmake *cm)
|
|
|
"All Windows-based systems including Cygwin are DLL platforms.");
|
|
|
|
|
|
cm->DefineProperty
|
|
|
- ("GENERATOR_FILE_NAME", cmProperty::TARGET,
|
|
|
+ ("GENERATOR_FILE_NAME", cmProperty::TARGET,
|
|
|
"Generator's file for this target.",
|
|
|
"An internal property used by some generators to record the name of "
|
|
|
"project or dsp file associated with this target.");
|
|
|
|
|
|
#if 0
|
|
|
cm->DefineProperty
|
|
|
- ("OBJECT_FILES", cmProperty::TARGET,
|
|
|
+ ("OBJECT_FILES", cmProperty::TARGET,
|
|
|
"Used to get the resulting list of object files that make up a "
|
|
|
"target.",
|
|
|
"This can be used to put object files from one library "
|
|
|
@@ -347,12 +347,12 @@ void cmTarget::SetType(TargetType type, const char* name)
|
|
|
}
|
|
|
// only add dependency information for library targets
|
|
|
this->TargetTypeValue = type;
|
|
|
- if(this->TargetTypeValue >= STATIC_LIBRARY
|
|
|
- && this->TargetTypeValue <= MODULE_LIBRARY)
|
|
|
+ if(this->TargetTypeValue >= STATIC_LIBRARY
|
|
|
+ && this->TargetTypeValue <= MODULE_LIBRARY)
|
|
|
{
|
|
|
this->RecordDependencies = true;
|
|
|
- }
|
|
|
- else
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
this->RecordDependencies = false;
|
|
|
}
|
|
|
@@ -666,6 +666,7 @@ void cmTarget::AddSources(std::vector<std::string> const& srcs)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
cmSourceFile* cmTarget::AddSource(const char* s)
|
|
|
{
|
|
|
std::string src = s;
|
|
|
@@ -679,6 +680,7 @@ cmSourceFile* cmTarget::AddSource(const char* s)
|
|
|
return sf;
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::MergeLinkLibraries( cmMakefile& mf,
|
|
|
const char *selfname,
|
|
|
const LinkLibraryVectorType& libs )
|
|
|
@@ -750,7 +752,7 @@ const std::vector<std::string>& cmTarget::GetLinkDirectories()
|
|
|
// is an N^2 algorithm for adding the directories, but N
|
|
|
// should not get very big.
|
|
|
const char* libpath = tgt->GetDirectory(0, implib);
|
|
|
- if(std::find(this->LinkDirectories.begin(),
|
|
|
+ if(std::find(this->LinkDirectories.begin(),
|
|
|
this->LinkDirectories.end(),
|
|
|
libpath) == this->LinkDirectories.end())
|
|
|
{
|
|
|
@@ -767,7 +769,8 @@ const std::vector<std::string>& cmTarget::GetLinkDirectories()
|
|
|
return this->LinkDirectories;
|
|
|
}
|
|
|
|
|
|
-void cmTarget::ClearDependencyInformation( cmMakefile& mf,
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+void cmTarget::ClearDependencyInformation( cmMakefile& mf,
|
|
|
const char* target )
|
|
|
{
|
|
|
// Clear the dependencies. The cache variable must exist iff we are
|
|
|
@@ -789,14 +792,13 @@ void cmTarget::ClearDependencyInformation( cmMakefile& mf,
|
|
|
message += "Your cache is probably stale. Please remove the entry\n ";
|
|
|
message += depname;
|
|
|
message += "\nfrom the cache.";
|
|
|
- cmSystemTools::Error( message.c_str() );
|
|
|
+ cmSystemTools::Error( message.c_str() );
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-void cmTarget::AddLinkLibrary(const std::string& lib,
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+void cmTarget::AddLinkLibrary(const std::string& lib,
|
|
|
LinkLibraryType llt)
|
|
|
{
|
|
|
this->AddFramework(lib.c_str(), llt);
|
|
|
@@ -806,6 +808,7 @@ void cmTarget::AddLinkLibrary(const std::string& lib,
|
|
|
this->LinkLibraries.push_back(tmp);
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
bool cmTarget::AddFramework(const std::string& libname, LinkLibraryType llt)
|
|
|
{
|
|
|
(void)llt; // TODO: What is this?
|
|
|
@@ -814,7 +817,7 @@ bool cmTarget::AddFramework(const std::string& libname, LinkLibraryType llt)
|
|
|
std::string frameworkDir = libname;
|
|
|
frameworkDir += "/../";
|
|
|
frameworkDir = cmSystemTools::CollapseFullPath(frameworkDir.c_str());
|
|
|
- std::vector<std::string>::iterator i =
|
|
|
+ std::vector<std::string>::iterator i =
|
|
|
std::find(this->Frameworks.begin(),
|
|
|
this->Frameworks.end(), frameworkDir);
|
|
|
if(i == this->Frameworks.end())
|
|
|
@@ -825,8 +828,10 @@ bool cmTarget::AddFramework(const std::string& libname, LinkLibraryType llt)
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::AddLinkLibrary(cmMakefile& mf,
|
|
|
- const char *target, const char* lib,
|
|
|
+ const char *target, const char* lib,
|
|
|
LinkLibraryType llt)
|
|
|
{
|
|
|
// Never add a self dependency, even if the user asks for it.
|
|
|
@@ -874,12 +879,13 @@ void cmTarget::AddLinkLibrary(cmMakefile& mf,
|
|
|
dependencies += lib;
|
|
|
dependencies += ";";
|
|
|
mf.AddCacheDefinition( targetEntry.c_str(), dependencies.c_str(),
|
|
|
- "Dependencies for the target",
|
|
|
+ "Dependencies for the target",
|
|
|
cmCacheManager::STATIC );
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void
|
|
|
cmTarget::AnalyzeLibDependencies( const cmMakefile& mf )
|
|
|
{
|
|
|
@@ -893,7 +899,7 @@ cmTarget::AnalyzeLibDependencies( const cmMakefile& mf )
|
|
|
// The former is a more thorny issue, since it is not clear how to
|
|
|
// determine if two libraries listed on the link line refer to the a
|
|
|
// single library or not. For example, consider the link "libraries"
|
|
|
- // /usr/lib/libtiff.so -ltiff
|
|
|
+ // /usr/lib/libtiff.so -ltiff
|
|
|
// Is this one library or two? The solution implemented here is the
|
|
|
// simplest (and probably the only practical) one: two libraries are
|
|
|
// the same if their "link strings" are identical. Thus, the two
|
|
|
@@ -952,92 +958,93 @@ cmTarget::AnalyzeLibDependencies( const cmMakefile& mf )
|
|
|
// cyclic dependencies, so this is probably not a big deal. Note that
|
|
|
// the link line is always correct, just not necessary optimal.
|
|
|
|
|
|
- {
|
|
|
- // Expand variables in link library names. This is for backwards
|
|
|
- // compatibility with very early CMake versions and should
|
|
|
- // eventually be removed. This code was moved here from the end of
|
|
|
- // old source list processing code which was called just before this
|
|
|
- // method.
|
|
|
- for(LinkLibraryVectorType::iterator p = this->LinkLibraries.begin();
|
|
|
- p != this->LinkLibraries.end(); ++p)
|
|
|
- {
|
|
|
- this->Makefile->ExpandVariablesInString(p->first, true, true);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- typedef std::vector< std::string > LinkLine;
|
|
|
-
|
|
|
- // The dependency map.
|
|
|
- DependencyMap dep_map;
|
|
|
-
|
|
|
- if ( this->OriginalLinkLibraries.size() == 0 )
|
|
|
- {
|
|
|
- this->OriginalLinkLibraries = this->LinkLibraries;
|
|
|
- }
|
|
|
-
|
|
|
- // 1. Build the dependency graph
|
|
|
- //
|
|
|
- for(LinkLibraryVectorType::reverse_iterator lib
|
|
|
- = this->LinkLibraries.rbegin();
|
|
|
- lib != this->LinkLibraries.rend(); ++lib)
|
|
|
- {
|
|
|
- this->GatherDependencies( mf, *lib, dep_map);
|
|
|
- }
|
|
|
-
|
|
|
- // 2. Remove any dependencies that are already satisfied in the original
|
|
|
- // link line.
|
|
|
- //
|
|
|
- for(LinkLibraryVectorType::iterator lib = this->LinkLibraries.begin();
|
|
|
- lib != this->LinkLibraries.end(); ++lib)
|
|
|
- {
|
|
|
- for( LinkLibraryVectorType::iterator lib2 = lib;
|
|
|
- lib2 != this->LinkLibraries.end(); ++lib2)
|
|
|
- {
|
|
|
- this->DeleteDependency( dep_map, *lib, *lib2);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // 3. Create the new link line by simply emitting any dependencies that are
|
|
|
- // missing. Start from the back and keep adding.
|
|
|
- //
|
|
|
- std::set<DependencyMap::key_type> done, visited;
|
|
|
- std::vector<DependencyMap::key_type> newLinkLibraries;
|
|
|
- for(LinkLibraryVectorType::reverse_iterator lib =
|
|
|
- this->LinkLibraries.rbegin();
|
|
|
- lib != this->LinkLibraries.rend(); ++lib)
|
|
|
- {
|
|
|
- // skip zero size library entries, this may happen
|
|
|
- // if a variable expands to nothing.
|
|
|
- if (lib->first.size() != 0)
|
|
|
- {
|
|
|
- this->Emit( *lib, dep_map, done, visited, newLinkLibraries );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 4. Add the new libraries to the link line.
|
|
|
- //
|
|
|
- for( std::vector<DependencyMap::key_type>::reverse_iterator k =
|
|
|
- newLinkLibraries.rbegin();
|
|
|
- k != newLinkLibraries.rend(); ++k )
|
|
|
- {
|
|
|
- // get the llt from the dep_map
|
|
|
- this->LinkLibraries.push_back( std::make_pair(k->first,k->second) );
|
|
|
- }
|
|
|
- this->LinkLibrariesAnalyzed = true;
|
|
|
+ {
|
|
|
+ // Expand variables in link library names. This is for backwards
|
|
|
+ // compatibility with very early CMake versions and should
|
|
|
+ // eventually be removed. This code was moved here from the end of
|
|
|
+ // old source list processing code which was called just before this
|
|
|
+ // method.
|
|
|
+ for(LinkLibraryVectorType::iterator p = this->LinkLibraries.begin();
|
|
|
+ p != this->LinkLibraries.end(); ++p)
|
|
|
+ {
|
|
|
+ this->Makefile->ExpandVariablesInString(p->first, true, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ typedef std::vector< std::string > LinkLine;
|
|
|
+
|
|
|
+ // The dependency map.
|
|
|
+ DependencyMap dep_map;
|
|
|
+
|
|
|
+ if ( this->OriginalLinkLibraries.size() == 0 )
|
|
|
+ {
|
|
|
+ this->OriginalLinkLibraries = this->LinkLibraries;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 1. Build the dependency graph
|
|
|
+ //
|
|
|
+ for(LinkLibraryVectorType::reverse_iterator lib
|
|
|
+ = this->LinkLibraries.rbegin();
|
|
|
+ lib != this->LinkLibraries.rend(); ++lib)
|
|
|
+ {
|
|
|
+ this->GatherDependencies( mf, *lib, dep_map);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. Remove any dependencies that are already satisfied in the original
|
|
|
+ // link line.
|
|
|
+ //
|
|
|
+ for(LinkLibraryVectorType::iterator lib = this->LinkLibraries.begin();
|
|
|
+ lib != this->LinkLibraries.end(); ++lib)
|
|
|
+ {
|
|
|
+ for( LinkLibraryVectorType::iterator lib2 = lib;
|
|
|
+ lib2 != this->LinkLibraries.end(); ++lib2)
|
|
|
+ {
|
|
|
+ this->DeleteDependency( dep_map, *lib, *lib2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 3. Create the new link line by simply emitting any dependencies that are
|
|
|
+ // missing. Start from the back and keep adding.
|
|
|
+ //
|
|
|
+ std::set<DependencyMap::key_type> done, visited;
|
|
|
+ std::vector<DependencyMap::key_type> newLinkLibraries;
|
|
|
+ for(LinkLibraryVectorType::reverse_iterator lib =
|
|
|
+ this->LinkLibraries.rbegin();
|
|
|
+ lib != this->LinkLibraries.rend(); ++lib)
|
|
|
+ {
|
|
|
+ // skip zero size library entries, this may happen
|
|
|
+ // if a variable expands to nothing.
|
|
|
+ if (lib->first.size() != 0)
|
|
|
+ {
|
|
|
+ this->Emit( *lib, dep_map, done, visited, newLinkLibraries );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. Add the new libraries to the link line.
|
|
|
+ //
|
|
|
+ for( std::vector<DependencyMap::key_type>::reverse_iterator k =
|
|
|
+ newLinkLibraries.rbegin();
|
|
|
+ k != newLinkLibraries.rend(); ++k )
|
|
|
+ {
|
|
|
+ // get the llt from the dep_map
|
|
|
+ this->LinkLibraries.push_back( std::make_pair(k->first,k->second) );
|
|
|
+ }
|
|
|
+ this->LinkLibrariesAnalyzed = true;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::InsertDependency( DependencyMap& depMap,
|
|
|
const LibraryID& lib,
|
|
|
- const LibraryID& dep)
|
|
|
+ const LibraryID& dep)
|
|
|
{
|
|
|
depMap[lib].push_back(dep);
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::DeleteDependency( DependencyMap& depMap,
|
|
|
const LibraryID& lib,
|
|
|
- const LibraryID& dep)
|
|
|
+ const LibraryID& dep)
|
|
|
{
|
|
|
// Make sure there is an entry in the map for lib. If so, delete all
|
|
|
// dependencies to dep. There may be repeated entries because of
|
|
|
@@ -1047,7 +1054,7 @@ void cmTarget::DeleteDependency( DependencyMap& depMap,
|
|
|
{
|
|
|
DependencyList& depList = map_itr->second;
|
|
|
DependencyList::iterator itr;
|
|
|
- while( (itr = std::find(depList.begin(), depList.end(), dep)) !=
|
|
|
+ while( (itr = std::find(depList.begin(), depList.end(), dep)) !=
|
|
|
depList.end() )
|
|
|
{
|
|
|
depList.erase( itr );
|
|
|
@@ -1055,6 +1062,7 @@ void cmTarget::DeleteDependency( DependencyMap& depMap,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::Emit(const LibraryID lib,
|
|
|
const DependencyMap& dep_map,
|
|
|
std::set<LibraryID>& emitted,
|
|
|
@@ -1117,7 +1125,7 @@ void cmTarget::Emit(const LibraryID lib,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::GatherDependencies( const cmMakefile& mf,
|
|
|
const LibraryID& lib,
|
|
|
DependencyMap& dep_map)
|
|
|
@@ -1173,11 +1181,11 @@ void cmTarget::GatherDependencies( const cmMakefile& mf,
|
|
|
end = depline.find( ";", start );
|
|
|
}
|
|
|
// cannot depend on itself
|
|
|
- this->DeleteDependency( dep_map, lib, lib);
|
|
|
+ this->DeleteDependency( dep_map, lib, lib);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::SetProperty(const char* prop, const char* value)
|
|
|
{
|
|
|
if (!prop)
|
|
|
@@ -1192,11 +1200,13 @@ void cmTarget::SetProperty(const char* prop, const char* value)
|
|
|
this->Properties.SetProperty(prop, value, cmProperty::TARGET);
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::MarkAsImported()
|
|
|
{
|
|
|
this->IsImportedTarget = true;
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::GetDirectory(const char* config, bool implib)
|
|
|
{
|
|
|
if (this->IsImported())
|
|
|
@@ -1209,6 +1219,7 @@ const char* cmTarget::GetDirectory(const char* config, bool implib)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::ImportedGetDirectory(const char* config, bool)
|
|
|
{
|
|
|
const char* location=this->GetLocation(config);
|
|
|
@@ -1216,6 +1227,7 @@ const char* cmTarget::ImportedGetDirectory(const char* config, bool)
|
|
|
return directory.c_str();
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::NormalGetDirectory(const char* config, bool implib)
|
|
|
{
|
|
|
if(config && *config)
|
|
|
@@ -1232,6 +1244,7 @@ const char* cmTarget::NormalGetDirectory(const char* config, bool implib)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::GetLocation(const char* config)
|
|
|
{
|
|
|
if (this->IsImported())
|
|
|
@@ -1244,6 +1257,7 @@ const char* cmTarget::GetLocation(const char* config)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::ImportedGetLocation(const char* config)
|
|
|
{
|
|
|
if ((config) && (strlen(config)))
|
|
|
@@ -1256,10 +1270,11 @@ const char* cmTarget::ImportedGetLocation(const char* config)
|
|
|
return configLocation;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- return this->GetProperty("LOCATION");
|
|
|
+
|
|
|
+ return this->GetProperty("LOCATION");
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::NormalGetLocation(const char* config)
|
|
|
{
|
|
|
this->Location = this->GetDirectory();
|
|
|
@@ -1300,11 +1315,13 @@ void cmTarget::GetTargetVersion(int& major, int& minor)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char *cmTarget::GetProperty(const char* prop)
|
|
|
{
|
|
|
return this->GetProperty(prop, cmProperty::TARGET);
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::ComputeObjectFiles()
|
|
|
{
|
|
|
if (this->IsImported())
|
|
|
@@ -1319,7 +1336,7 @@ void cmTarget::ComputeObjectFiles()
|
|
|
std::string objectFiles;
|
|
|
std::string objExtensionLookup1 = "CMAKE_";
|
|
|
std::string objExtensionLookup2 = "_OUTPUT_EXTENSION";
|
|
|
-
|
|
|
+
|
|
|
for(std::vector<std::string>::iterator d = dirs.begin();
|
|
|
d != dirs.end(); ++d)
|
|
|
{
|
|
|
@@ -1352,7 +1369,7 @@ void cmTarget::ComputeObjectFiles()
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char *cmTarget::GetProperty(const char* prop,
|
|
|
cmProperty::ScopeType scope)
|
|
|
{
|
|
|
@@ -1361,40 +1378,41 @@ const char *cmTarget::GetProperty(const char* prop,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- // don't use GetLocation() for imported targets, because there this
|
|
|
- // calls GetProperty() to get the location...
|
|
|
- if (!this->IsImported())
|
|
|
+ // don't use GetLocation() for imported targets, because there this
|
|
|
+ // calls GetProperty() to get the location...
|
|
|
+ if (!this->IsImported())
|
|
|
+ {
|
|
|
+ // watch for special "computed" properties that are dependent on other
|
|
|
+ // properties or variables, always recompute them
|
|
|
+ if (!strcmp(prop,"LOCATION"))
|
|
|
{
|
|
|
- // watch for special "computed" properties that are dependent on other
|
|
|
- // properties or variables, always recompute them
|
|
|
- if (!strcmp(prop,"LOCATION"))
|
|
|
- {
|
|
|
- // Set the LOCATION property of the target. Note that this cannot take
|
|
|
- // into account the per-configuration name of the target because the
|
|
|
- // configuration type may not be known at CMake time. We should
|
|
|
- // deprecate this feature and instead support transforming an executable
|
|
|
- // target name given as the command part of custom commands into the
|
|
|
- // proper path at build time. Alternatively we could put environment
|
|
|
- // variable settings in all custom commands that hold the name of the
|
|
|
- // target for each configuration and then give a reference to the
|
|
|
- // variable in the location.
|
|
|
- this->SetProperty("LOCATION", this->GetLocation(0));
|
|
|
- }
|
|
|
-
|
|
|
- // Per-configuration location can be computed.
|
|
|
- int len = static_cast<int>(strlen(prop));
|
|
|
- if(len > 9 && strcmp(prop+len-9, "_LOCATION") == 0)
|
|
|
- {
|
|
|
- std::string configName(prop, len-9);
|
|
|
- this->SetProperty(prop, this->GetLocation(configName.c_str()));
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(prop, "OBJECT_FILES") == 0)
|
|
|
- {
|
|
|
- this->ComputeObjectFiles();
|
|
|
- }
|
|
|
+ // Set the LOCATION property of the target. Note that this
|
|
|
+ // cannot take into account the per-configuration name of the
|
|
|
+ // target because the configuration type may not be known at
|
|
|
+ // CMake time. We should deprecate this feature and instead
|
|
|
+ // support transforming an executable target name given as the
|
|
|
+ // command part of custom commands into the proper path at
|
|
|
+ // build time. Alternatively we could put environment
|
|
|
+ // variable settings in all custom commands that hold the name
|
|
|
+ // of the target for each configuration and then give a
|
|
|
+ // reference to the variable in the location.
|
|
|
+ this->SetProperty("LOCATION", this->GetLocation(0));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Per-configuration location can be computed.
|
|
|
+ int len = static_cast<int>(strlen(prop));
|
|
|
+ if(len > 9 && strcmp(prop+len-9, "_LOCATION") == 0)
|
|
|
+ {
|
|
|
+ std::string configName(prop, len-9);
|
|
|
+ this->SetProperty(prop, this->GetLocation(configName.c_str()));
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(prop, "OBJECT_FILES") == 0)
|
|
|
+ {
|
|
|
+ this->ComputeObjectFiles();
|
|
|
}
|
|
|
-
|
|
|
+ }
|
|
|
+
|
|
|
if (strcmp(prop,"IMPORTED") == 0)
|
|
|
{
|
|
|
return this->IsImported()?"TRUE":"FALSE";
|
|
|
@@ -1436,20 +1454,22 @@ const char *cmTarget::GetProperty(const char* prop,
|
|
|
return 0;
|
|
|
}
|
|
|
bool chain = false;
|
|
|
- const char *retVal =
|
|
|
+ const char *retVal =
|
|
|
this->Properties.GetPropertyValue(prop, scope, chain);
|
|
|
if (chain)
|
|
|
{
|
|
|
return this->Makefile->GetProperty(prop,scope);
|
|
|
}
|
|
|
- return retVal;
|
|
|
+ return retVal;
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
bool cmTarget::GetPropertyAsBool(const char* prop)
|
|
|
{
|
|
|
return cmSystemTools::IsOn(this->GetProperty(prop));
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::GetLinkerLanguage(cmGlobalGenerator* gg)
|
|
|
{
|
|
|
if(this->GetProperty("HAS_CXX"))
|
|
|
@@ -1462,7 +1482,7 @@ const char* cmTarget::GetLinkerLanguage(cmGlobalGenerator* gg)
|
|
|
return linkerLang;
|
|
|
}
|
|
|
std::set<cmStdString> languages;
|
|
|
- for(std::vector<cmSourceFile*>::const_iterator i
|
|
|
+ for(std::vector<cmSourceFile*>::const_iterator i
|
|
|
= this->SourceFiles.begin();
|
|
|
i != this->SourceFiles.end(); ++i)
|
|
|
{
|
|
|
@@ -1477,12 +1497,12 @@ const char* cmTarget::GetLinkerLanguage(cmGlobalGenerator* gg)
|
|
|
}
|
|
|
if(languages.size() == 1)
|
|
|
{
|
|
|
- const_cast<cmTarget*>(this)->SetProperty("LINKER_LANGUAGE",
|
|
|
+ const_cast<cmTarget*>(this)->SetProperty("LINKER_LANGUAGE",
|
|
|
languages.begin()->c_str());
|
|
|
return this->GetProperty("LINKER_LANGUAGE");
|
|
|
}
|
|
|
const char* prefLang = 0;
|
|
|
- for(std::set<cmStdString>::const_iterator s = languages.begin();
|
|
|
+ for(std::set<cmStdString>::const_iterator s = languages.begin();
|
|
|
s != languages.end(); ++s)
|
|
|
{
|
|
|
const char* lpref = gg->GetLinkerPreference(s->c_str());
|
|
|
@@ -1512,10 +1532,11 @@ const char* cmTarget::GetLinkerLanguage(cmGlobalGenerator* gg)
|
|
|
return this->GetProperty("LINKER_LANGUAGE");
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::GetCreateRuleVariable()
|
|
|
{
|
|
|
switch(this->GetType())
|
|
|
- {
|
|
|
+ {
|
|
|
case cmTarget::STATIC_LIBRARY:
|
|
|
return "_CREATE_STATIC_LIBRARY";
|
|
|
case cmTarget::SHARED_LIBRARY:
|
|
|
@@ -1534,6 +1555,7 @@ const char* cmTarget::GetCreateRuleVariable()
|
|
|
return "";
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::GetSuffixVariableInternal(TargetType type,
|
|
|
bool implib)
|
|
|
{
|
|
|
@@ -1564,6 +1586,7 @@ const char* cmTarget::GetSuffixVariableInternal(TargetType type,
|
|
|
}
|
|
|
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
const char* cmTarget::GetPrefixVariableInternal(TargetType type,
|
|
|
bool implib)
|
|
|
{
|
|
|
@@ -1640,12 +1663,13 @@ std::string cmTarget::GetFullNameInternal(TargetType type, const char* config,
|
|
|
return prefix+base+suffix;
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::GetFullNameInternal(TargetType type,
|
|
|
- const char* config,
|
|
|
- bool implib,
|
|
|
- std::string& outPrefix,
|
|
|
- std::string& outBase,
|
|
|
- std::string& outSuffix)
|
|
|
+ const char* config,
|
|
|
+ bool implib,
|
|
|
+ std::string& outPrefix,
|
|
|
+ std::string& outBase,
|
|
|
+ std::string& outSuffix)
|
|
|
{
|
|
|
if (this->IsImported())
|
|
|
{
|
|
|
@@ -1659,12 +1683,13 @@ void cmTarget::GetFullNameInternal(TargetType type,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::ImportedGetFullNameInternal(TargetType ,
|
|
|
- const char* config,
|
|
|
- bool ,
|
|
|
- std::string& outPrefix,
|
|
|
- std::string& outBase,
|
|
|
- std::string& outSuffix)
|
|
|
+ const char* config,
|
|
|
+ bool ,
|
|
|
+ std::string& outPrefix,
|
|
|
+ std::string& outBase,
|
|
|
+ std::string& outSuffix)
|
|
|
{
|
|
|
// find the basename, suffix and prefix from getLocation()
|
|
|
// implib ?
|
|
|
@@ -1810,6 +1835,7 @@ void cmTarget::NormalGetFullNameInternal(TargetType type,
|
|
|
outSuffix = targetSuffix?targetSuffix:"";
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::GetLibraryNames(std::string& name,
|
|
|
std::string& soName,
|
|
|
std::string& realName,
|
|
|
@@ -1822,6 +1848,7 @@ void cmTarget::GetLibraryNames(std::string& name,
|
|
|
this->GetType(), config);
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::GetLibraryCleanNames(std::string& staticName,
|
|
|
std::string& sharedName,
|
|
|
std::string& sharedSOName,
|
|
|
@@ -1858,6 +1885,7 @@ void cmTarget::GetLibraryCleanNames(std::string& staticName,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::GetLibraryNamesInternal(std::string& name,
|
|
|
std::string& soName,
|
|
|
std::string& realName,
|
|
|
@@ -1955,6 +1983,7 @@ void cmTarget::GetLibraryNamesInternal(std::string& name,
|
|
|
pdbName = prefix+base+".pdb";
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::GetExecutableNames(std::string& name,
|
|
|
std::string& realName,
|
|
|
std::string& impName,
|
|
|
@@ -1966,6 +1995,7 @@ void cmTarget::GetExecutableNames(std::string& name,
|
|
|
this->GetType(), config);
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::GetExecutableCleanNames(std::string& name,
|
|
|
std::string& realName,
|
|
|
std::string& impName,
|
|
|
@@ -1977,6 +2007,7 @@ void cmTarget::GetExecutableCleanNames(std::string& name,
|
|
|
cmTarget::EXECUTABLE, config);
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
void cmTarget::GetExecutableNamesInternal(std::string& name,
|
|
|
std::string& realName,
|
|
|
std::string& impName,
|