[sldev]
Re: CMake 2.4.8 vs 2.6 (Re: Missing cares, apr in Mac build)
Aimee Walton
aimee at ama-zing.co.uk
Fri Jul 18 11:42:45 PDT 2008
On Jul 18, 2008, at 18:51, Rob Lanphier wrote:
>
> Does anyone know if there a fundamental incompatibility between
> CMake 2.4.8 and 2.6, or is CMake 2.6 support something that can be
> made to work without too much hassle? This seems like a FAQ in the
> making.
This is the problem ...
aimee$ ./cmake --help-policy CMP0003
cmake version 2.6-patch 0
------------------------------------------------------------------------
------
CMP0003
Libraries linked via full path no longer produce linker
search paths.
This policy affects how libraries whose full paths are NOT
known are
found at link time, but was created due to a change in how
CMake deals
with libraries whose full paths are known. Consider the code
target_link_libraries(myexe /path/to/libA.so)
CMake 2.4 and below implemented linking to libraries whose
full paths
are known by splitting them on the link line into separate
components
consisting of the linker search path and the library name. The
example code might have produced something like
... -L/path/to -lA ...
in order to link to library A. An analysis was performed to
order
multiple link directories such that the linker would find
library A in
the desired location, but there are cases in which this does
not work.
CMake versions 2.6 and above use the more reliable approach
of passing
the full path to libraries directly to the linker in most
cases. The
example code now produces something like
... /path/to/libA.so ....
Unfortunately this change can break code like
target_link_libraries(myexe /path/to/libA.so B)
where "B" is meant to find "/path/to/libB.so". This code is
wrong
because the user is asking the linker to find library B but
has not
provided a linker search path (which may be added with the
link_directories command). However, with the old linking
implementation the code would work accidentally because the
linker
search path added for library A allowed library B to be found.
In order to support projects depending on linker search paths
added by
linking to libraries with known full paths, the OLD behavior
for this
policy will add the linker search paths even though they are not
needed for their own libraries. When this policy is set to
OLD, CMake
will produce a link line such as
... -L/path/to /path/to/libA.so -lB ...
which will allow library B to be found as it was previously.
When
this policy is set to NEW, CMake will produce a link line
such as
... /path/to/libA.so -lB ...
which more accurately matches what the project specified.
The setting for this policy used when generating the link
line is that
in effect when the target is created by an add_executable or
add_library command. For the example described above, the code
cmake_policy(SET CMP0003 OLD) # or cmake_policy(VERSION 2.4)
add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so B)
will work and suppress the warning for this policy. It may
also be
updated to work with the corrected linking approach:
cmake_policy(SET CMP0003 NEW) # or cmake_policy(VERSION 2.6)
link_directories(/path/to) # needed to find library B
add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so B)
Even better, library B may be specified with a full path:
add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so /path/to/libB.so)
When all items on the link line have known paths CMake does
not check
this policy so it has no effect.
Note that the warning for this policy will be issued for at
most one
target. This avoids flooding users with messages for every
target
when setting the policy once will probably fix all targets.
This policy was introduced in CMake version 2.6.0. CMake
version 2.6
warns when the policy is not set and uses OLD behavior. Use the
cmake_policy command to set it to OLD or NEW explicitly.
telstar-airport:/Applications/Development/CMake 2.6-0.app/Contents/
bin aimee$
More information about the SLDev
mailing list