[CMake] [PATCH] Optionally skip link dependencies on shared library files
Leif Walsh
leif.walsh at gmail.com
Fri Oct 26 09:43:37 EDT 2012
This is exactly what I wanted, and the results were incredible. Thank
you.
I'll patch all my installs with this and hope it gets in a public release
soon.
Leif Walsh <leif.walsh at gmail.com> writes:
> Cool, thanks. I'll try this!
>
> Sent from my iPhone
>
> On Oct 26, 2012, at 8:43, Brad King <brad.king at kitware.com> wrote:
>
>> Add target property LINK_DEPENDS_NO_SHARED and initialization variable
>> CMAKE_LINK_DEPENDS_NO_SHARED to enable this behavior.
>>
>> Suggested-by: Leif Walsh <leif.walsh at gmail.com>
>> ---
>>
>> On 08/03/2012 04:57 PM, Leif Walsh wrote:
>>> On 3 Aug, 2012, at 4:44 PM, Andreas Pakulat <apaku at gmx.de> wrote:
>>>> Actually no, adding new public API, changing existing API in
>>>> compatible ways are things you can do with a shared library which
>>>> needs relinking.
>>>
>>> Not without changing the header files, which forces
>>> recompilation. As the author of a shared library, your header
>>> files are your contract with your clients.
>>
>> Great point. Please try this patch on top of 2.8.10-rc3.
>> Then build with -DCMAKE_LINK_DEPENDS_NO_SHARED=1 or add
>>
>> set(CMAKE_LINK_DEPENDS_NO_SHARED 1)
>>
>> to the top of your project.
>>
>> -Brad
>>
>> Source/cmComputeLinkInformation.cxx | 10 +++++++++-
>> Source/cmComputeLinkInformation.h | 1 +
>> Source/cmDocumentVariables.cxx | 9 +++++++++
>> Source/cmTarget.cxx | 17 +++++++++++++++++
>> 4 files changed, 36 insertions(+), 1 deletion(-)
>>
>> diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx
>> index cd3ef59..d8ffb5e 100644
>> --- a/Source/cmComputeLinkInformation.cxx
>> +++ b/Source/cmComputeLinkInformation.cxx
>> @@ -277,6 +277,10 @@ cmComputeLinkInformation
>> this->UseImportLibrary =
>> this->Makefile->GetDefinition("CMAKE_IMPORT_LIBRARY_SUFFIX")?true:false;
>>
>> + // Check whether we should skip dependencies on shared library files.
>> + this->LinkDependsNoShared =
>> + this->Target->GetPropertyAsBool("LINK_DEPENDS_NO_SHARED");
>> +
>> // On platforms without import libraries there may be a special flag
>> // to use when creating a plugin (module) that obtains symbols from
>> // the program that will load it.
>> @@ -650,7 +654,11 @@ void cmComputeLinkInformation::AddItem(std::string const& item, cmTarget* tgt)
>>
>> // Pass the full path to the target file.
>> std::string lib = tgt->GetFullPath(config, implib, true);
>> - this->Depends.push_back(lib);
>> + if(!this->LinkDependsNoShared ||
>> + tgt->GetType() != cmTarget::SHARED_LIBRARY)
>> + {
>> + this->Depends.push_back(lib);
>> + }
>>
>> this->AddTargetItem(lib, tgt);
>> this->AddLibraryRuntimeInfo(lib, tgt);
>> diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h
>> index f60f8d3..e0078af 100644
>> --- a/Source/cmComputeLinkInformation.h
>> +++ b/Source/cmComputeLinkInformation.h
>> @@ -82,6 +82,7 @@ private:
>> // Configuration information.
>> const char* Config;
>> const char* LinkLanguage;
>> + bool LinkDependsNoShared;
>>
>> // Modes for dealing with dependent shared libraries.
>> enum SharedDepMode
>> diff --git a/Source/cmDocumentVariables.cxx b/Source/cmDocumentVariables.cxx
>> index 8db0e8f..55d70f8 100644
>> --- a/Source/cmDocumentVariables.cxx
>> +++ b/Source/cmDocumentVariables.cxx
>> @@ -1222,6 +1222,15 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
>> "Variables that Control the Build");
>>
>> cm->DefineProperty
>> + ("CMAKE_LINK_DEPENDS_NO_SHARED", cmProperty::VARIABLE,
>> + "Whether to skip link dependencies on shared library files.",
>> + "This variable initializes the LINK_DEPENDS_NO_SHARED "
>> + "property on targets when they are created. "
>> + "See that target property for additional information.",
>> + false,
>> + "Variables that Control the Build");
>> +
>> + cm->DefineProperty
>> ("CMAKE_AUTOMOC", cmProperty::VARIABLE,
>> "Whether to handle moc automatically for Qt targets.",
>> "This variable is used to initialize the "
>> diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
>> index 423b350..9cfcb63 100644
>> --- a/Source/cmTarget.cxx
>> +++ b/Source/cmTarget.cxx
>> @@ -651,6 +651,22 @@ void cmTarget::DefineProperties(cmake *cm)
>> "custom Makefile link rules.");
>>
>> cm->DefineProperty
>> + ("LINK_DEPENDS_NO_SHARED", cmProperty::TARGET,
>> + "Do not depend on linked shared library files.",
>> + "Set this property to true to tell CMake generators not to add "
>> + "file-level dependencies on the shared library files linked by "
>> + "this target. "
>> + "Modification to the shared libraries will not be sufficient to "
>> + "re-link this target. "
>> + "Logical target-level dependencies will not be affected so the "
>> + "linked shared libraries will still be brought up to date before "
>> + "this target is built."
>> + "\n"
>> + "This property is initialized by the value of the variable "
>> + "CMAKE_LINK_DEPENDS_NO_SHARED if it is set when a target is "
>> + "created.");
>> +
>> + cm->DefineProperty
>> ("LINK_INTERFACE_LIBRARIES", cmProperty::TARGET,
>> "List public interface libraries for a shared library or executable.",
>> "By default linking to a shared library target transitively "
>> @@ -1314,6 +1330,7 @@ void cmTarget::SetMakefile(cmMakefile* mf)
>> this->SetPropertyDefault("OSX_ARCHITECTURES", 0);
>> this->SetPropertyDefault("AUTOMOC", 0);
>> this->SetPropertyDefault("AUTOMOC_MOC_OPTIONS", 0);
>> + this->SetPropertyDefault("LINK_DEPENDS_NO_SHARED", 0);
>> this->SetPropertyDefault("LINK_INTERFACE_LIBRARIES", 0);
>> this->SetPropertyDefault("WIN32_EXECUTABLE", 0);
>> this->SetPropertyDefault("MACOSX_BUNDLE", 0);
>> --
>> 1.7.10.4
>>
--
Cheers,
Leif
More information about the CMake
mailing list