diff options
author | Ken Martin <ken.martin@kitware.com> | 2001-04-30 10:44:00 -0400 |
---|---|---|
committer | Ken Martin <ken.martin@kitware.com> | 2001-04-30 10:44:00 -0400 |
commit | 2da0c57d46d5b68e19b60c4e6560fbd80f808ab0 (patch) | |
tree | 92bda106078e740b25b5d3922a89db1a6f6a996b /Source | |
parent | 13143f51d2f7096efc90624045f2b9ae26cc1fcd (diff) | |
download | cmake-2da0c57d46d5b68e19b60c4e6560fbd80f808ab0.tar.gz |
added TARGET_LINK_LIBRARY command and support for debug and release libraries to link against
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmCommands.cxx | 4 | ||||
-rw-r--r-- | Source/cmDSPMakefile.cxx | 10 | ||||
-rw-r--r-- | Source/cmDSPWriter.cxx | 10 | ||||
-rw-r--r-- | Source/cmDSWMakefile.cxx | 19 | ||||
-rw-r--r-- | Source/cmDSWWriter.cxx | 19 | ||||
-rw-r--r-- | Source/cmFindIncludeCommand.cxx | 9 | ||||
-rw-r--r-- | Source/cmFindLibraryCommand.cxx | 2 | ||||
-rw-r--r-- | Source/cmLinkLibrariesCommand.cxx | 4 | ||||
-rw-r--r-- | Source/cmLinkLibrariesCommand.h | 3 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 94 | ||||
-rw-r--r-- | Source/cmMakefile.h | 35 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 15 | ||||
-rw-r--r-- | Source/cmTarget.h | 14 | ||||
-rw-r--r-- | Source/cmTargetLinkLibrariesCommand.cxx | 76 | ||||
-rw-r--r-- | Source/cmTargetLinkLibrariesCommand.h | 104 | ||||
-rw-r--r-- | Source/cmUnixMakefileGenerator.cxx | 17 | ||||
-rw-r--r-- | Source/cmUnixMakefileGenerator.h | 2 |
17 files changed, 375 insertions, 62 deletions
diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index 71d2ae5f54..8c2224e514 100644 --- a/Source/cmCommands.cxx +++ b/Source/cmCommands.cxx @@ -14,6 +14,7 @@ #include "cmIncludeDirectoryCommand.cxx" #include "cmLinkDirectoriesCommand.cxx" #include "cmLinkLibrariesCommand.cxx" +#include "cmTargetLinkLibrariesCommand.cxx" #include "cmProjectCommand.cxx" #include "cmSourceFilesCommand.cxx" #include "cmSourceFilesRequireCommand.cxx" @@ -24,6 +25,7 @@ #include "cmWin32DefinesCommand.cxx" #include "cmWin32LibrariesCommand.cxx" #include "cmWin32IncludeDirectoryCommand.cxx" +#include "cmConfigureFile.cxx" #include "cmConfigureFileNoAutoconf.cxx" #include "cmCableCommand.cxx" #include "cmCableData.cxx" @@ -64,6 +66,7 @@ void GetPredefinedCommands(std::list<cmCommand*>& commands) commands.push_back(new cmIncludeDirectoryCommand); commands.push_back(new cmLinkDirectoriesCommand); commands.push_back(new cmLinkLibrariesCommand); + commands.push_back(new cmTargetLinkLibrariesCommand); commands.push_back(new cmProjectCommand); commands.push_back(new cmSourceFilesCommand); commands.push_back(new cmSourceFilesRequireCommand); @@ -74,6 +77,7 @@ void GetPredefinedCommands(std::list<cmCommand*>& commands) commands.push_back(new cmWin32DefinesCommand); commands.push_back(new cmWin32LibrariesCommand); commands.push_back(new cmWin32IncludeDirectoryCommand); + commands.push_back(new cmConfigureFile); commands.push_back(new cmConfigureFileNoAutoconf); commands.push_back(new cmCableDefineSetCommand); commands.push_back(new cmCableOpenNamespaceCommand); diff --git a/Source/cmDSPMakefile.cxx b/Source/cmDSPMakefile.cxx index 5b4073c282..104e6211f9 100644 --- a/Source/cmDSPMakefile.cxx +++ b/Source/cmDSPMakefile.cxx @@ -415,8 +415,8 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName, libOptions += "\" "; } // find link libraries - cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries(); - cmMakefile::LinkLibraries::const_iterator j; + const cmTarget::LinkLibraries& libs = target.GetLinkLibraries(); + cmTarget::LinkLibraries::const_iterator j; for(j = libs.begin(); j != libs.end(); ++j) { // add libraries to executables and dlls (but never include @@ -424,19 +424,19 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName, if (!target.IsALibrary() || (m_LibraryBuildType == DLL && libName != j->first)) { - if (j->second == cmMakefile::GENERAL) + if (j->second == cmTarget::GENERAL) { libOptions += " "; libOptions += j->first; libOptions += ".lib "; } - if (j->second == cmMakefile::DEBUG) + if (j->second == cmTarget::DEBUG) { libDebugOptions += " "; libDebugOptions += j->first; libDebugOptions += ".lib "; } - if (j->second == cmMakefile::OPTIMIZED) + if (j->second == cmTarget::OPTIMIZED) { libOptimizedOptions += " "; libOptimizedOptions += j->first; diff --git a/Source/cmDSPWriter.cxx b/Source/cmDSPWriter.cxx index 5b4073c282..104e6211f9 100644 --- a/Source/cmDSPWriter.cxx +++ b/Source/cmDSPWriter.cxx @@ -415,8 +415,8 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName, libOptions += "\" "; } // find link libraries - cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries(); - cmMakefile::LinkLibraries::const_iterator j; + const cmTarget::LinkLibraries& libs = target.GetLinkLibraries(); + cmTarget::LinkLibraries::const_iterator j; for(j = libs.begin(); j != libs.end(); ++j) { // add libraries to executables and dlls (but never include @@ -424,19 +424,19 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName, if (!target.IsALibrary() || (m_LibraryBuildType == DLL && libName != j->first)) { - if (j->second == cmMakefile::GENERAL) + if (j->second == cmTarget::GENERAL) { libOptions += " "; libOptions += j->first; libOptions += ".lib "; } - if (j->second == cmMakefile::DEBUG) + if (j->second == cmTarget::DEBUG) { libDebugOptions += " "; libDebugOptions += j->first; libDebugOptions += ".lib "; } - if (j->second == cmMakefile::OPTIMIZED) + if (j->second == cmTarget::OPTIMIZED) { libOptimizedOptions += " "; libOptimizedOptions += j->first; diff --git a/Source/cmDSWMakefile.cxx b/Source/cmDSWMakefile.cxx index 2b50cf1f57..b03ece64b9 100644 --- a/Source/cmDSWMakefile.cxx +++ b/Source/cmDSWMakefile.cxx @@ -43,6 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "cmSystemTools.h" #include "cmDSPMakefile.h" #include "cmMSProjectGenerator.h" +#include "cmCacheManager.h" cmDSWMakefile::cmDSWMakefile(cmMakefile* m) @@ -151,9 +152,9 @@ void cmDSWMakefile::WriteProject(std::ostream& fout, fout << "{{{\n"; // insert Begin Project Dependency Project_Dep_Name project stuff here - cmMakefile::LinkLibraries::const_iterator j, jend; - j = project->GetMakefile()->GetLinkLibraries().begin(); - jend = project->GetMakefile()->GetLinkLibraries().end(); + cmTarget::LinkLibraries::const_iterator j, jend; + j = l.GetLinkLibraries().begin(); + jend = l.GetLinkLibraries().end(); for(;j!= jend; ++j) { if(j->first != dspname) @@ -161,9 +162,15 @@ void cmDSWMakefile::WriteProject(std::ostream& fout, if (!l.IsALibrary() || project->GetLibraryBuildType() == cmDSPMakefile::DLL) { - fout << "Begin Project Dependency\n"; - fout << "Project_Dep_Name " << j->first << "\n"; - fout << "End Project Dependency\n"; + // is the library part of this DSW ? If so add dependency + const char* cacheValue + = cmCacheManager::GetInstance()->GetCacheValue(j->first.c_str()); + if(cacheValue) + { + fout << "Begin Project Dependency\n"; + fout << "Project_Dep_Name " << j->first << "\n"; + fout << "End Project Dependency\n"; + } } } } diff --git a/Source/cmDSWWriter.cxx b/Source/cmDSWWriter.cxx index 2b50cf1f57..b03ece64b9 100644 --- a/Source/cmDSWWriter.cxx +++ b/Source/cmDSWWriter.cxx @@ -43,6 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "cmSystemTools.h" #include "cmDSPMakefile.h" #include "cmMSProjectGenerator.h" +#include "cmCacheManager.h" cmDSWMakefile::cmDSWMakefile(cmMakefile* m) @@ -151,9 +152,9 @@ void cmDSWMakefile::WriteProject(std::ostream& fout, fout << "{{{\n"; // insert Begin Project Dependency Project_Dep_Name project stuff here - cmMakefile::LinkLibraries::const_iterator j, jend; - j = project->GetMakefile()->GetLinkLibraries().begin(); - jend = project->GetMakefile()->GetLinkLibraries().end(); + cmTarget::LinkLibraries::const_iterator j, jend; + j = l.GetLinkLibraries().begin(); + jend = l.GetLinkLibraries().end(); for(;j!= jend; ++j) { if(j->first != dspname) @@ -161,9 +162,15 @@ void cmDSWMakefile::WriteProject(std::ostream& fout, if (!l.IsALibrary() || project->GetLibraryBuildType() == cmDSPMakefile::DLL) { - fout << "Begin Project Dependency\n"; - fout << "Project_Dep_Name " << j->first << "\n"; - fout << "End Project Dependency\n"; + // is the library part of this DSW ? If so add dependency + const char* cacheValue + = cmCacheManager::GetInstance()->GetCacheValue(j->first.c_str()); + if(cacheValue) + { + fout << "Begin Project Dependency\n"; + fout << "Project_Dep_Name " << j->first << "\n"; + fout << "End Project Dependency\n"; + } } } } diff --git a/Source/cmFindIncludeCommand.cxx b/Source/cmFindIncludeCommand.cxx index dacb2f594f..b66c5070fc 100644 --- a/Source/cmFindIncludeCommand.cxx +++ b/Source/cmFindIncludeCommand.cxx @@ -44,11 +44,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // cmFindIncludeCommand bool cmFindIncludeCommand::Invoke(std::vector<std::string>& args) { - if(args.size() < 2 ) - { - this->SetError("called with incorrect number of arguments"); - return false; - } + this->SetError("This has been deprecated, please use FIND_PATH command instead "); + return false; + + // Now check and see if the value has been stored in the cache // already, if so use that value and don't look for the program const char* cacheValue diff --git a/Source/cmFindLibraryCommand.cxx b/Source/cmFindLibraryCommand.cxx index 42de715fce..0794101ba6 100644 --- a/Source/cmFindLibraryCommand.cxx +++ b/Source/cmFindLibraryCommand.cxx @@ -132,6 +132,6 @@ bool cmFindLibraryCommand::Invoke(std::vector<std::string>& args) "NOTFOUND", helpString.c_str(), cmCacheManager::PATH); - return false; + return true; } diff --git a/Source/cmLinkLibrariesCommand.cxx b/Source/cmLinkLibrariesCommand.cxx index 3f52e16a2c..2d4a843c25 100644 --- a/Source/cmLinkLibrariesCommand.cxx +++ b/Source/cmLinkLibrariesCommand.cxx @@ -57,13 +57,13 @@ bool cmLinkLibrariesCommand::Invoke(std::vector<std::string>& args) { ++i; m_Makefile->AddLinkLibrary(i->c_str(), - cmMakefile::DEBUG); + cmTarget::DEBUG); } else if (*i == "optimized") { ++i; m_Makefile->AddLinkLibrary(i->c_str(), - cmMakefile::OPTIMIZED); + cmTarget::OPTIMIZED); } else { diff --git a/Source/cmLinkLibrariesCommand.h b/Source/cmLinkLibrariesCommand.h index bc2eaeb70b..9c635f2129 100644 --- a/Source/cmLinkLibrariesCommand.h +++ b/Source/cmLinkLibrariesCommand.h @@ -98,8 +98,7 @@ public: "LINK_LIBRARIES(library1 <debug | optimized> library2 ...)\n" "Specify a list of libraries to be linked into\n" "executables or shared objects. This command is passed\n" - "down to all other commands. The library name should be\n" - "the same as the name used in the LIBRARY(library) command.\n" + "down to all other commands. \n" "The debug and optimized strings may be used to indicate that\n" "the next library listed is to be used only for that specific\n" "type of build"; diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 54067ffe8f..fa26995023 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -83,8 +83,39 @@ void cmMakefile::AddDefaultCommands() #if defined(__CYGWIN__) this->AddDefinition("UNIX", "1"); #endif + } +void cmMakefile::ReadSystemConfiguration(const char *fname) +{ + std::ifstream fin(fname); + if(!fin) + { + cmSystemTools::Error("error can not open file ", fname); + return; + } + + cmRegularExpression aDef("^Define[ \t]*([A-Za-z_0-9]*)[ \t]*([A-Za-z_0-9]*)[ \t]*$"); + const int BUFFER_SIZE = 4096; + char inbuffer[BUFFER_SIZE]; + while (fin) + { + if(fin.getline(inbuffer, BUFFER_SIZE ) ) + { + if(aDef.find(inbuffer)) + { + // the arguments are the second match + std::string def = aDef.match(1); + std::string val = aDef.match(2); + // add the definition if true + if (cmSystemTools::IsOn(val.c_str())) + { + this->AddDefinition(def.c_str(),val.c_str()); + } + } + } + } +} cmMakefile::~cmMakefile() { @@ -309,6 +340,12 @@ void cmMakefile::GenerateMakefile() { (*i)->FinalPass(); } + // merge libraries + for (cmTargets::iterator l = m_Targets.begin(); + l != m_Targets.end(); l++) + { + l->second.MergeLibraries(m_LinkLibraries); + } // now do the generation m_MakefileGenerator->GenerateMakefile(); } @@ -359,15 +396,27 @@ void cmMakefile::AddUtilityDirectory(const char* dir) m_UtilityDirectories.push_back(dir); } -void cmMakefile::AddLinkLibrary(const char* lib, LinkLibraryType llt) +void cmMakefile::AddLinkLibrary(const char* lib, cmTarget::LinkLibraryType llt) { m_LinkLibraries.push_back( - std::pair<std::string, LinkLibraryType>(lib,llt)); + std::pair<std::string, cmTarget::LinkLibraryType>(lib,llt)); +} + +void cmMakefile::AddLinkLibraryForTarget(const char *target, + const char* lib, + cmTarget::LinkLibraryType llt) +{ + if (m_Targets.find(target) != m_Targets.end()) + { + m_Targets[target].GetLinkLibraries(). + push_back( + std::pair<std::string, cmTarget::LinkLibraryType>(lib,llt)); + } } void cmMakefile::AddLinkLibrary(const char* lib) { - this->AddLinkLibrary(lib,GENERAL); + this->AddLinkLibrary(lib,cmTarget::GENERAL); } void cmMakefile::AddLinkDirectory(const char* dir) @@ -513,7 +562,7 @@ void cmMakefile::ExpandVariables() { this->ExpandVariablesInString(*j); } - LinkLibraries::iterator j2, end2; + cmTarget::LinkLibraries::iterator j2, end2; j2 = m_LinkLibraries.begin(); end2 = m_LinkLibraries.end(); for(; j2 != end2; ++j2) @@ -581,6 +630,19 @@ void cmMakefile::ExpandVariablesInString(std::string& source) const } } +void cmMakefile::RemoveVariablesInString(std::string& source) const +{ + cmRegularExpression var("(\\${[A-Za-z_0-9]*})"); + cmRegularExpression var2("(@[A-Za-z_0-9]*@)"); + while (var.find(source)) + { + source.erase(var.start(),var.end()); + } + while (var2.find(source)) + { + source.erase(var2.start(),var2.end()); + } +} // recursive function to create a vector of cmMakefile objects // This is done by reading the sub directory CMakeLists.txt files, @@ -774,3 +836,27 @@ void cmMakefile::RemoveFunctionBlocker(const char *name, return; } + +void cmMakefile::SetHomeDirectory(const char* dir) +{ + m_cmHomeDirectory = dir; + cmSystemTools::ConvertToUnixSlashes(m_cmHomeDirectory); + this->AddDefinition("CMAKE_SOURCE_DIR", this->GetHomeDirectory()); +#if defined(_WIN32) && !defined(__CYGWIN__) + std::string fpath = dir; + fpath += "/CMake/CMakeWindowsSystemConfig.txt"; + this->ReadSystemConfiguration(fpath.c_str()); +#endif +} + +void cmMakefile::SetHomeOutputDirectory(const char* lib) +{ + m_HomeOutputDirectory = lib; + cmSystemTools::ConvertToUnixSlashes(m_HomeOutputDirectory); + this->AddDefinition("CMAKE_BINARY_DIR", this->GetHomeOutputDirectory()); +#if !defined(_WIN32) || defined(__CYGWIN__) + std::string fpath = lib; + fpath += "/CMakeSystemConfig.txt"; + this->ReadSystemConfiguration(fpath.c_str()); +#endif +} diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 470a9c3b8c..500ae447b6 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -146,9 +146,7 @@ public: /** * Get a list of link libraries in the build. */ - enum LinkLibraryType {GENERAL, DEBUG, OPTIMIZED}; - typedef std::vector<std::pair<std::string,LinkLibraryType> > LinkLibraries; - LinkLibraries& GetLinkLibraries() + cmTarget::LinkLibraries& GetLinkLibraries() { return m_LinkLibraries; } @@ -157,7 +155,9 @@ public: * Add a link library to the build. */ void AddLinkLibrary(const char*); - void AddLinkLibrary(const char*, LinkLibraryType type); + void AddLinkLibrary(const char*, cmTarget::LinkLibraryType type); + void AddLinkLibraryForTarget(const char *tgt, const char*, + cmTarget::LinkLibraryType type); /** * Add a link directory to the build. @@ -236,22 +236,12 @@ public: * CMakeLists files by recursing up the tree starting at the StartDirectory * and going up until it reaches the HomeDirectory. */ - void SetHomeDirectory(const char* dir) - { - m_cmHomeDirectory = dir; - cmSystemTools::ConvertToUnixSlashes(m_cmHomeDirectory); - this->AddDefinition("CMAKE_SOURCE_DIR", this->GetHomeDirectory()); - } + void SetHomeDirectory(const char* dir); const char* GetHomeDirectory() const { return m_cmHomeDirectory.c_str(); } - void SetHomeOutputDirectory(const char* lib) - { - m_HomeOutputDirectory = lib; - cmSystemTools::ConvertToUnixSlashes(m_HomeOutputDirectory); - this->AddDefinition("CMAKE_BINARY_DIR", this->GetHomeOutputDirectory()); - } + void SetHomeOutputDirectory(const char* lib); const char* GetHomeOutputDirectory() const { return m_HomeOutputDirectory.c_str(); @@ -427,6 +417,12 @@ public: void ExpandVariablesInString(std::string& source) const; /** + * Remove any remaining variables in the string. Anything with ${var} or + * @var@ will be removed. + */ + void RemoveVariablesInString(std::string& source) const; + + /** * Expand variables in the makefiles ivars such as link directories etc */ void ExpandVariables(); @@ -448,6 +444,11 @@ public: /** * find what source group this source is in */ + void ReadSystemConfiguration(const char *fname); + + /** + * find what source group this source is in + */ cmSourceGroup& FindSourceGroup(const char* source, std::vector<cmSourceGroup> &groups); @@ -474,7 +475,7 @@ protected: std::vector<std::string> m_LinkDirectories; std::vector<std::string> m_Utilities; std::vector<std::string> m_UtilityDirectories; - LinkLibraries m_LinkLibraries; + cmTarget::LinkLibraries m_LinkLibraries; std::string m_IncludeFileRegularExpression; std::string m_DefineFlags; std::vector<cmSourceGroup> m_SourceGroups; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 7479f3a438..0c7fba19b3 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -67,3 +67,18 @@ void cmTarget::GenerateSourceFilesFromSourceLists(const cmMakefile &mf) } } } + +void cmTarget::MergeLibraries(const LinkLibraries &ll) +{ + typedef std::vector<std::pair<std::string,LinkLibraryType> > LinkLibraries; + + LinkLibraries::const_iterator p = ll.begin(); + for (;p != ll.end(); ++p) + { + if (std::find(m_LinkLibraries.begin(),m_LinkLibraries.end(),*p) == m_LinkLibraries.end()) + { + m_LinkLibraries.push_back(*p); + } + } +} + diff --git a/Source/cmTarget.h b/Source/cmTarget.h index b9ba231192..6164e28723 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -82,6 +82,19 @@ public: std::vector<cmSourceFile> &GetSourceFiles() {return m_SourceFiles;} /** + * Get the list of the source files used by this target + */ + enum LinkLibraryType {GENERAL, DEBUG, OPTIMIZED}; + typedef std::vector<std::pair<std::string,LinkLibraryType> > LinkLibraries; + const LinkLibraries &GetLinkLibraries() const {return m_LinkLibraries;} + LinkLibraries &GetLinkLibraries() {return m_LinkLibraries;} + + /** + * Merge Link LIbraries into this targets current list + */ + void MergeLibraries(const LinkLibraries &ll); + + /** * Generate the SourceFilesList from the SourceLists. This should only be * done once to be safe. */ @@ -92,6 +105,7 @@ private: std::vector<std::string> m_SourceLists; bool m_IsALibrary; std::vector<cmSourceFile> m_SourceFiles; + LinkLibraries m_LinkLibraries; }; typedef std::map<std::string,cmTarget> cmTargets; diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx new file mode 100644 index 0000000000..2ae962a110 --- /dev/null +++ b/Source/cmTargetLinkLibrariesCommand.cxx @@ -0,0 +1,76 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + +Copyright (c) 2001 Insight Consortium +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * The name of the Insight Consortium, nor the names of any consortium members, + nor of any contributors, may be used to endorse or promote products derived + from this software without specific prior written permission. + + * Modified source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================*/ +#include "cmTargetLinkLibrariesCommand.h" + +// cmTargetLinkLibrariesCommand +bool cmTargetLinkLibrariesCommand::Invoke(std::vector<std::string>& args) +{ + if(args.size() < 2) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + // add libraries, nothe that there is an optional prefix + // of debug and optimized than can be used + for(std::vector<std::string>::iterator i = args.begin(); + i != args.end(); ++i) + { + if (*i == "debug") + { + ++i; + m_Makefile->AddLinkLibraryForTarget(args[0].c_str(),i->c_str(), + cmTarget::DEBUG); + } + else if (*i == "optimized") + { + ++i; + m_Makefile->AddLinkLibraryForTarget(args[0].c_str(),i->c_str(), + cmTarget::OPTIMIZED); + } + else + { + m_Makefile->AddLinkLibraryForTarget(args[0].c_str(),i->c_str(), + cmTarget::GENERAL); + } + } + return true; +} + diff --git a/Source/cmTargetLinkLibrariesCommand.h b/Source/cmTargetLinkLibrariesCommand.h new file mode 100644 index 0000000000..18a2ac4e2b --- /dev/null +++ b/Source/cmTargetLinkLibrariesCommand.h @@ -0,0 +1,104 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + +Copyright (c) 2001 Insight Consortium +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * The name of the Insight Consortium, nor the names of any consortium members, + nor of any contributors, may be used to endorse or promote products derived + from this software without specific prior written permission. + + * Modified source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================*/ +#ifndef cmTargetLinkLibrariesCommand_h +#define cmTargetLinkLibrariesCommand_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +/** \class cmTargetLinkLibrariesCommand + * \brief Specify a list of libraries to link into executables. + * + * cmTargetLinkLibrariesCommand is used to specify a list of libraries to link + * into executable(s) or shared objects. The names of the libraries + * should be those defined by the LIBRARY(library) command(s). + */ +class cmTargetLinkLibrariesCommand : public cmCommand +{ +public: + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + return new cmTargetLinkLibrariesCommand; + } + + /** + * This is called when the command is first encountered in + * the CMakeLists.txt file. + */ + virtual bool Invoke(std::vector<std::string>& args); + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "TARGET_LINK_LIBRARIES";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return + "Specify a list of libraries to be linked into\n" + "executables or shared objects."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ...)\n" + "Specify a list of libraries to be linked into the specified target\n" + "The debug and optimized strings may be used to indicate that\n" + "the next library listed is to be used only for that specific\n" + "type of build"; + } + + cmTypeMacro(cmTargetLinkLibrariesCommand, cmCommand); +}; + + + +#endif diff --git a/Source/cmUnixMakefileGenerator.cxx b/Source/cmUnixMakefileGenerator.cxx index 82b18211c4..4e621f7e32 100644 --- a/Source/cmUnixMakefileGenerator.cxx +++ b/Source/cmUnixMakefileGenerator.cxx @@ -140,7 +140,8 @@ void cmUnixMakefileGenerator::OutputTargetRules(std::ostream& fout) * to the name of the library. This will not link a library against itself. */ void cmUnixMakefileGenerator::OutputLinkLibraries(std::ostream& fout, - const char* targetLibrary) + const char* targetLibrary, + const cmTarget &tgt) { // collect all the flags needed for linking libraries std::string linkLibs; @@ -158,14 +159,14 @@ void cmUnixMakefileGenerator::OutputLinkLibraries(std::ostream& fout, linkLibs += " "; } std::string librariesLinked; - cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries(); - cmMakefile::LinkLibraries::const_iterator j2; + const cmTarget::LinkLibraries& libs = tgt.GetLinkLibraries(); + cmTarget::LinkLibraries::const_iterator j2; for(j2 = libs.begin(); j2 != libs.end(); ++j2) { // Don't link the library against itself! if(targetLibrary && (j2->first == targetLibrary)) continue; // don't look at debug libraries - if (j2->second == cmMakefile::DEBUG) continue; + if (j2->second == cmTarget::DEBUG) continue; std::string::size_type pos = j2->first.find("-l"); if((pos == std::string::npos || pos > 0) && j2->first.find("${") == std::string::npos) @@ -213,7 +214,7 @@ void cmUnixMakefileGenerator::OutputTargets(std::ostream& fout) fout << "\t lib" << l->first << "$(SHLIB_SUFFIX) \\\n"; fout << "\t ${KIT_OBJ} ${" << l->first << "_SRC_OBJS} "; - this->OutputLinkLibraries(fout, l->first.c_str()); + this->OutputLinkLibraries(fout, l->first.c_str(), l->second); fout << "\n\n"; } else @@ -222,7 +223,7 @@ void cmUnixMakefileGenerator::OutputTargets(std::ostream& fout) l->first << "_SRC_OBJS} ${CMAKE_DEPEND_LIBS}\n"; fout << "\t${CXX} ${CXX_FLAGS} ${" << l->first << "_SRC_OBJS} "; - this->OutputLinkLibraries(fout, NULL); + this->OutputLinkLibraries(fout, NULL,l->second); fout << " -o " << l->first << "\n\n"; } } @@ -234,8 +235,8 @@ void cmUnixMakefileGenerator::OutputTargets(std::ostream& fout) void cmUnixMakefileGenerator::OutputDependencies(std::ostream& fout) { fout << "CMAKE_DEPEND_LIBS = "; - cmMakefile::LinkLibraries& libs = m_Makefile->GetLinkLibraries(); - cmMakefile::LinkLibraries::const_iterator lib2; + cmTarget::LinkLibraries& libs = m_Makefile->GetLinkLibraries(); + cmTarget::LinkLibraries::const_iterator lib2; // Search the list of libraries that will be linked into // the executable for(lib2 = libs.begin(); lib2 != libs.end(); ++lib2) diff --git a/Source/cmUnixMakefileGenerator.h b/Source/cmUnixMakefileGenerator.h index fbb111ae52..4e8b069ea0 100644 --- a/Source/cmUnixMakefileGenerator.h +++ b/Source/cmUnixMakefileGenerator.h @@ -70,7 +70,7 @@ protected: void OutputMakeFlags(std::ostream&); void OutputVerbatim(std::ostream&); void OutputTargetRules(std::ostream& fout); - void OutputLinkLibraries(std::ostream&, const char*); + void OutputLinkLibraries(std::ostream&, const char*, const cmTarget &); void OutputTargets(std::ostream&); void OutputSubDirectoryRules(std::ostream&); void OutputDependInformation(std::ostream&); |