diff options
Diffstat (limited to 'Source/cmTargetLinkLibrariesCommand.h')
-rw-r--r-- | Source/cmTargetLinkLibrariesCommand.h | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/Source/cmTargetLinkLibrariesCommand.h b/Source/cmTargetLinkLibrariesCommand.h new file mode 100644 index 000000000..63114d209 --- /dev/null +++ b/Source/cmTargetLinkLibrariesCommand.h @@ -0,0 +1,167 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#ifndef cmTargetLinkLibrariesCommand_h +#define cmTargetLinkLibrariesCommand_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 InitialPass(std::vector<std::string> const& args, + cmExecutionStatus &status); + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() const { return "target_link_libraries";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() const + { + return + "Link a target to given libraries."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() const + { + return + " target_link_libraries(<target> [item1 [item2 [...]]]\n" + " [[debug|optimized|general] <item>] ...)\n" + "Specify libraries or flags to use when linking a given target. " + "The named <target> must have been created in the current directory " + "by a command such as add_executable or add_library. " + "The remaining arguments specify library names or flags. " + "Repeated calls for the same <target> append items in the order called." + "\n" + "If a library name matches that of another target in the project " + "a dependency will automatically be added in the build system to make " + "sure the library being linked is up-to-date before the target links. " + "Item names starting with '-', but not '-l' or '-framework', are " + "treated as linker flags." + "\n" + "A \"debug\", \"optimized\", or \"general\" keyword indicates that " + "the library immediately following it is to be used only for the " + "corresponding build configuration. " + "The \"debug\" keyword corresponds to the Debug configuration " + "(or to configurations named in the DEBUG_CONFIGURATIONS global " + "property if it is set). " + "The \"optimized\" keyword corresponds to all other configurations. " + "The \"general\" keyword corresponds to all configurations, and is " + "purely optional (assumed if omitted). " + "Higher granularity may be achieved for per-configuration rules " + "by creating and linking to IMPORTED library targets. " + "See the IMPORTED mode of the add_library command for more " + "information. " + "\n" + "Library dependencies are transitive by default. " + "When this target is linked into another target then the libraries " + "linked to this target will appear on the link line for the other " + "target too. " + "See the LINK_INTERFACE_LIBRARIES target property to override the " + "set of transitive link dependencies for a target." + "\n" + " target_link_libraries(<target> LINK_INTERFACE_LIBRARIES\n" + " [[debug|optimized|general] <lib>] ...)\n" + "The LINK_INTERFACE_LIBRARIES mode appends the libraries " + "to the LINK_INTERFACE_LIBRARIES and its per-configuration equivalent " + "target properties instead of using them for linking. " + "Libraries specified as \"debug\" are appended to the " + "the LINK_INTERFACE_LIBRARIES_DEBUG property (or to the properties " + "corresponding to configurations listed in the DEBUG_CONFIGURATIONS " + "global property if it is set). " + "Libraries specified as \"optimized\" are appended to the " + "the LINK_INTERFACE_LIBRARIES property. " + "Libraries specified as \"general\" (or without any keyword) are " + "treated as if specified for both \"debug\" and \"optimized\"." + "\n" + " target_link_libraries(<target>\n" + " <LINK_PRIVATE|LINK_PUBLIC>\n" + " [[debug|optimized|general] <lib>] ...\n" + " [<LINK_PRIVATE|LINK_PUBLIC>\n" + " [[debug|optimized|general] <lib>] ...])\n" + "The LINK_PUBLIC and LINK_PRIVATE modes can be used to specify both " + "the link dependencies and the link interface in one command. " + "Libraries and targets following LINK_PUBLIC are linked to, and are " + "made part of the LINK_INTERFACE_LIBRARIES. Libraries and targets " + "following LINK_PRIVATE are linked to, but are not made part of the " + "LINK_INTERFACE_LIBRARIES. " + "\n" + "The library dependency graph is normally acyclic (a DAG), but in the " + "case of mutually-dependent STATIC libraries CMake allows the graph " + "to contain cycles (strongly connected components). " + "When another target links to one of the libraries CMake repeats " + "the entire connected component. " + "For example, the code\n" + " add_library(A STATIC a.c)\n" + " add_library(B STATIC b.c)\n" + " target_link_libraries(A B)\n" + " target_link_libraries(B A)\n" + " add_executable(main main.c)\n" + " target_link_libraries(main A)\n" + "links 'main' to 'A B A B'. " + "(" + "While one repetition is usually sufficient, pathological object " + "file and symbol arrangements can require more. " + "One may handle such cases by manually repeating the component in " + "the last target_link_libraries call. " + "However, if two archives are really so interdependent they should " + "probably be combined into a single archive." + ")" + ; + } + + cmTypeMacro(cmTargetLinkLibrariesCommand, cmCommand); +private: + void LinkLibraryTypeSpecifierWarning(int left, int right); + static const char* LinkLibraryTypeNames[3]; + + cmTarget* Target; + enum ProcessingState { + ProcessingLinkLibraries, + ProcessingLinkInterface, + ProcessingPublicInterface, + ProcessingPrivateInterface + }; + + ProcessingState CurrentProcessingState; + + void HandleLibrary(const char* lib, cmTarget::LinkLibraryType llt); +}; + + + +#endif |