Hi,

FYI:

I just had a run-in with a cmake-based project that found the correct libpng 
binary during the configure phase but for a rather nasty reason tried to link 
to another version installed elsewhere. That was on Linux, but there's no 
guarantee that the same issue cannot occur on OS X.

- find(PNG) correctly set PNG_LIBRARIES to 
`$prefix/lib/libpng.dylib:$prefix/lib/libz.dylib`
- however, the compiler/linker command had `-lpng -lz` instead, and no 
preceding -L$prefix/lib and thus found libpng in a standard location (I learned 
that CMake calls those "implicit link directories").

Normally this would have been fine because "base" sets LIBRARY_PATH to 
$prefix/lib, and indeed that suffices with gcc. Not so with clang (tested only 
with 4.0).

When diagnosing this I noticed that 
- gcc translates LIBRARY_PATH=/path to -L/path BEFORE the first -lfoo option on 
the actual linker commandline
- clang does something similar, but adds the -L/path AFTER the -lfoo options 
given by the user.

IOW, with clang, LIBRARY_PATH only affects the search path for libraries added 
automatically, not those specified by the user.

To cut a long story short, it is possible to deactivate this automatic libspec 
rewriting (see the `CMAKE_<LANG>_IMPLICIT_LINK_DIRECTORIES` documentation) by 
setting policy CMP0060 to NEW.

I've done this in the still-pending update to my cmake-1.1 PG by adding 
`-DCMAKE_POLICY_DEFAULT_CMP0060=NEW` to the default configure.args list.

In the case of the project in question (and linking to libpng in general), one 
also avoids the issue by using `PNG::PNG` instead of `${PNG_LIBRARIES}`.

R.

Reply via email to