| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*=========================================================================
- Program: CMake - Cross-Platform Makefile Generator
- Module: $RCSfile$
- Language: C++
- Date: $Date$
- Version: $Revision$
- 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
- PURPOSE. See the above copyright notices for more information.
- =========================================================================*/
- #include "cmTargetLinkLibrariesCommand.h"
- const char* cmTargetLinkLibrariesCommand::LinkLibraryTypeNames[3] =
- {
- "general",
- "debug",
- "optimized"
- };
- // cmTargetLinkLibrariesCommand
- bool cmTargetLinkLibrariesCommand
- ::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
- {
- // must have one argument
- if(args.size() < 1)
- {
- this->SetError("called with incorrect number of arguments");
- return false;
- }
- // but we might not have any libs after variable expansion
- if(args.size() < 2)
- {
- return true;
- }
- // Keep track of link configuration specifiers.
- cmTarget::LinkLibraryType llt = cmTarget::GENERAL;
- bool haveLLT = false;
- // add libraries, nothe that there is an optional prefix
- // of debug and optimized than can be used
- std::vector<std::string>::const_iterator i = args.begin();
-
- for(++i; i != args.end(); ++i)
- {
- if(*i == "debug")
- {
- if(haveLLT)
- {
- this->LinkLibraryTypeSpecifierWarning(llt, cmTarget::DEBUG);
- }
- llt = cmTarget::DEBUG;
- haveLLT = true;
- }
- else if(*i == "optimized")
- {
- if(haveLLT)
- {
- this->LinkLibraryTypeSpecifierWarning(llt, cmTarget::OPTIMIZED);
- }
- llt = cmTarget::OPTIMIZED;
- haveLLT = true;
- }
- else if(*i == "general")
- {
- if(haveLLT)
- {
- this->LinkLibraryTypeSpecifierWarning(llt, cmTarget::GENERAL);
- }
- llt = cmTarget::GENERAL;
- haveLLT = true;
- }
- else if(haveLLT)
- {
- // The link type was specified by the previous argument.
- haveLLT = false;
- this->Makefile->AddLinkLibraryForTarget(args[0].c_str(),
- i->c_str(), llt);
- }
- else
- {
- // Lookup old-style cache entry if type is unspecified. So if you
- // do a target_link_libraries(foo optimized bar) it will stay optimized
- // and not use the lookup. As there maybe the case where someone has
- // specifed that a library is both debug and optimized. (this check is
- // only there for backwards compatibility when mixing projects built
- // with old versions of CMake and new)
- llt = cmTarget::GENERAL;
- std::string linkType = args[0];
- linkType += "_LINK_TYPE";
- const char* linkTypeString =
- this->Makefile->GetDefinition( linkType.c_str() );
- if(linkTypeString)
- {
- if(strcmp(linkTypeString, "debug") == 0)
- {
- llt = cmTarget::DEBUG;
- }
- if(strcmp(linkTypeString, "optimized") == 0)
- {
- llt = cmTarget::OPTIMIZED;
- }
- }
- this->Makefile->AddLinkLibraryForTarget(args[0].c_str(),i->c_str(),llt);
- }
- }
- // Make sure the last argument was not a library type specifier.
- if(haveLLT)
- {
- cmOStringStream e;
- e << "The \"" << this->LinkLibraryTypeNames[llt]
- << "\" argument must be followed by a library.";
- this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
- cmSystemTools::SetFatalErrorOccured();
- }
- return true;
- }
- //----------------------------------------------------------------------------
- void
- cmTargetLinkLibrariesCommand
- ::LinkLibraryTypeSpecifierWarning(int left, int right)
- {
- cmOStringStream w;
- w << "Link library type specifier \""
- << this->LinkLibraryTypeNames[left] << "\" is followed by specifier \""
- << this->LinkLibraryTypeNames[right] << "\" instead of a library name. "
- << "The first specifier will be ignored.";
- this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, w.str());
- }
|