ENH: Added CMAKE_LINK_OLD_PATHS compatibility mode for linker search paths.
This commit is contained in:
parent
ae356560a0
commit
f27379e3f7
|
@ -31,6 +31,11 @@ SET(VTK_WGLEXT_FILE "${VTK_SOURCE_DIR}/Utilities/ParseOGLExt/headers/wglext.h"
|
|||
# work around an old bug in VTK
|
||||
SET(TIFF_RIGHT_VERSION 1)
|
||||
|
||||
# vtkRendering links to X11 with "-lXt ${X11_LIBRARIES}" because CMake
|
||||
# 2.4 and below did not provide the X11_Xt_LIB variable. We need the
|
||||
# linker search path compatiblity feature.
|
||||
SET(CMAKE_LINK_OLD_PATHS 1)
|
||||
|
||||
# for very old VTK (versions prior to 4.2)
|
||||
MACRO(SOURCE_FILES)
|
||||
message (FATAL_ERROR "You are trying to build a very old version of VTK (prior to VTK 4.2). To do this you need to use CMake 2.0 as it was the last version of CMake to support VTK 4.0.")
|
||||
|
|
|
@ -203,6 +203,26 @@ cmComputeLinkInformation
|
|||
|
||||
// Initial state.
|
||||
this->RuntimeSearchPathComputed = false;
|
||||
this->HaveUserFlagItem = false;
|
||||
|
||||
// Decide whether to enable compatible library search path mode.
|
||||
// There exists code that effectively does
|
||||
//
|
||||
// /path/to/libA.so -lB
|
||||
//
|
||||
// where -lB is meant to link to /path/to/libB.so. This is broken
|
||||
// because it specified -lB without specifying a link directory (-L)
|
||||
// in which to search for B. This worked in CMake 2.4 and below
|
||||
// because -L/path/to would be added by the -L/-l split for A. In
|
||||
// order to support such projects we need to add the directories
|
||||
// containing libraries linked with a full path to the -L path.
|
||||
this->OldLinkDirMode = false;
|
||||
if(this->Makefile->IsOn("CMAKE_LINK_OLD_PATHS") ||
|
||||
this->Makefile->GetLocalGenerator()
|
||||
->NeedBackwardsCompatibility(2, 4))
|
||||
{
|
||||
this->OldLinkDirMode = true;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -658,6 +678,13 @@ void cmComputeLinkInformation::AddFullItem(std::string const& item)
|
|||
}
|
||||
}
|
||||
|
||||
// Record the directory in which the library appears because CMake
|
||||
// 2.4 in below added these as -L paths.
|
||||
if(this->OldLinkDirMode)
|
||||
{
|
||||
this->OldLinkDirs.push_back(cmSystemTools::GetFilenamePath(item));
|
||||
}
|
||||
|
||||
// If this platform wants a flag before the full path, add it.
|
||||
if(!this->LibLinkFileFlag.empty())
|
||||
{
|
||||
|
@ -738,8 +765,11 @@ void cmComputeLinkInformation::AddUserItem(std::string const& item)
|
|||
}
|
||||
else if(item[0] == '-' || item[0] == '$' || item[0] == '`')
|
||||
{
|
||||
// This is a linker option provided by the user. Restore the
|
||||
// target link type since this item does not specify one.
|
||||
// This is a linker option provided by the user.
|
||||
this->HaveUserFlagItem = true;
|
||||
|
||||
// Restore the target link type since this item does not specify
|
||||
// one.
|
||||
this->SetCurrentLinkType(this->StartLinkType);
|
||||
|
||||
// Use the item verbatim.
|
||||
|
@ -748,9 +778,12 @@ void cmComputeLinkInformation::AddUserItem(std::string const& item)
|
|||
}
|
||||
else
|
||||
{
|
||||
// This is a name specified by the user. We must ask the linker
|
||||
// to search for a library with this name. Restore the target
|
||||
// link type since this item does not specify one.
|
||||
// This is a name specified by the user.
|
||||
this->HaveUserFlagItem = true;
|
||||
|
||||
// We must ask the linker to search for a library with this name.
|
||||
// Restore the target link type since this item does not specify
|
||||
// one.
|
||||
this->SetCurrentLinkType(this->StartLinkType);
|
||||
lib = item;
|
||||
}
|
||||
|
@ -872,6 +905,12 @@ void cmComputeLinkInformation::ComputeLinkerSearchDirectories()
|
|||
|
||||
// Get the search path entries requested by the user.
|
||||
this->AddLinkerSearchDirectories(this->Target->GetLinkDirectories());
|
||||
|
||||
// Support broken projects if necessary.
|
||||
if(this->HaveUserFlagItem && this->OldLinkDirMode)
|
||||
{
|
||||
this->AddLinkerSearchDirectories(this->OldLinkDirs);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
|
|
@ -121,6 +121,11 @@ private:
|
|||
void AddLinkerSearchDirectories(std::vector<std::string> const& dirs);
|
||||
std::set<cmStdString> DirectoriesEmmitted;
|
||||
|
||||
// Linker search path compatibility mode.
|
||||
std::vector<std::string> OldLinkDirs;
|
||||
bool OldLinkDirMode;
|
||||
bool HaveUserFlagItem;
|
||||
|
||||
// Runtime path computation.
|
||||
struct LibraryRuntimeEntry
|
||||
{
|
||||
|
|
|
@ -783,6 +783,24 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
|
|||
"The flag used before a library file path is given to the linker. "
|
||||
"This is needed only on very few platforms.", false,
|
||||
"Variables that Control the Build");
|
||||
cm->DefineProperty
|
||||
("CMAKE_LINK_OLD_PATHS", cmProperty::VARIABLE,
|
||||
"Enable linker search path compatibility mode.",
|
||||
"This option enables linking compatibility mode for broken projects. "
|
||||
"There exists code that effectively does\n"
|
||||
" target_link_libraries(myexe /path/to/libA.so -lB)\n"
|
||||
"where -lB is meant to link to /path/to/libB.so. This is broken "
|
||||
"because it specifies -lB without adding \"/path/to\" to the linker "
|
||||
"search path with the link_directories command. With CMake 2.4 and "
|
||||
"below the code worked accidentally because \"/path/to\" would be "
|
||||
"added to the linker search path by its implementation of linking to "
|
||||
"/path/to/libA.so (which passed -L/path/to -lA to the linker). "
|
||||
"This option tells CMake to add the directories containing libraries "
|
||||
"specified with a full path to the linker search path if the link "
|
||||
"line contains any items like -lB. "
|
||||
"The behavior is also enabled if CMAKE_BACKWARDS_COMPATIBILITY is "
|
||||
"set to 2.4 or lower.", false,
|
||||
"Variables that Control the Build");
|
||||
cm->DefineProperty
|
||||
("CMAKE_USE_RELATIVE_PATHS", cmProperty::VARIABLE,
|
||||
"Use relative paths (May not work!).",
|
||||
|
|
Loading…
Reference in New Issue