• Samuel Martin's avatar
    cmake/OpenCVGenPkgconfig.cmake: rework opencv.pc generation · eceada58
    Samuel Martin authored
    Using absolute path to locate the components in the "Libs:" field of the
    *.pc can badly break cross-compilation, especially when building
    statically linked objects.
    
    Indeed, pkg-config automatically replaces the '-I...' and '-L...' paths
    when the PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_LIBDIR environment
    variables are set [1]. This feature is very helpful and common in
    cross-compilation framework like Buildroot [2,3].
    
    When there are absolute paths in the *.pc files, pkg-config won't be
    able to do the path substitions for these paths when the afromentioned
    environment variables are set.
    In such case, since the prefix is the target one, not the sysroot one,
    these libraries' abolute paths will point to:
    - in the best case: a non-existing file (i.e. these files do not exists
      on the host system;
    - at worst: the host system's libraries. This will make the linking
      failed because these host system's libraries will most likely not be
      build for the target architecture [4].
    
    So, this patch replace the components' absolute paths by the form:
      -L<libdir> -l<libname>
    
    This way, the linker will be able to resolve each dependency path,
    whatever the kind of objects/build (shared object or static build) it
    is dealing with.
    
    Note that for static link, the library order does matter [5]. The order
    of the opencv components has been carefully chosen to comply with this
    requirement.
    
    Fixes #3931
    
    [1] http://linux.die.net/man/1/pkg-config
    [2] http://buildroot.org/
    [3] http://git.buildroot.net/buildroot/tree/package/pkgconf/pkg-config.in
    [4] http://autobuild.buildroot.net/results/e8a/e8a859276db34aff87ef181b0cce98916b0afc90/build-end.log
    [5] http://stackoverflow.com/questions/45135/linker-order-gccSigned-off-by: 's avatarSamuel Martin <s.martin49@gmail.com>
    
    ---
    Note: this patch properly applies on top of the master branch, though it
          has been written on top of the 2.4 branch.
    eceada58
OpenCVGenPkgconfig.cmake 3.72 KB