[CMake] CPack install 3rd party shared libraries

Elvis Stansvik elvis.stansvik at orexplore.com
Wed Jul 19 09:57:30 EDT 2017


2017-07-19 13:42 GMT+02:00 Roman Wüger <roman.wueger at gmx.at>:
> The problem with BundleUtilities which Inder is that it doesn't support generator expressions.
>
> Maybe I do something wrong?
> But I need to specify the path to the executable (generator expression) and the paths where to look for dependencies. Right?

You don't need to use a generator to fetch the executable path. You
will know the path, since you installed the executable with
install(..) :) I think most people essentially hardcode the executable
path in their call to fixup_bundle(..).

If you really want to, I think there is a way to use generator
expressions, and that is to put the fixup_bundle(..) call in a
separate file (say InstallStuff.cmake.in), and then process that file
with file(GENERATE OUTPUT ...) [1] to produce InstallStuff.cmake with
generator expressions evaluated and then use install(SCRIPT
InstallStuff.cmake). But that's much too complicated IMHO, and I would
avoid it.

I made a minimal example that links against zlib and also the Boost
library you mentioned:

cmake_minimum_required(VERSION 2.8)

project(bundletest)

find_package(ZLIB REQUIRED)
find_package(Boost REQUIRED COMPONENTS filesystem)

add_executable(bundletest main.cpp)

target_include_directories(bundletest PRIVATE ${ZLIB_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS})

target_link_libraries(bundletest ${ZLIB_LIBRARIES} ${Boost_LIBRARIES})

install(TARGETS bundletest
    RUNTIME DESTINATION "bin"
)

install(CODE "
    function(gp_resolved_file_type_override resolved_file type_var)
       set(\${type_var} local PARENT_SCOPE)
    endfunction()
    include(BundleUtilities)
    fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/bin/bundletest\" \"\" \"\")
" COMPONENT Runtime)

main.cpp:

#include <iostream>
#include <zlib.h>
#include <boost/filesystem.hpp>

using namespace boost::filesystem;

int main (int argc, char *argv[]) {
    // Pretend we're using zlib and Boost
    deflateInit(0, 0);
    std::cout << file_size(argv[1]) << std::endl;
    return 0;
}

The overriding of the gp_resolved_file_type_override was necessary, to
make it treat all libraries as local (otherwise it skips "system"
libraries). See the docs for GetPrerequisites.

Building/installing this with

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=~/bundletest_install ..
make install

produces:

/home/estan/bundletest_install
/home/estan/bundletest_install/bin
/home/estan/bundletest_install/bin/bundletest
/home/estan/bundletest_install/bin/libm.so.6
/home/estan/bundletest_install/bin/libstdc++.so.6
/home/estan/bundletest_install/bin/libc.so.6
/home/estan/bundletest_install/bin/libz.so.1
/home/estan/bundletest_install/bin/libpthread.so.0
/home/estan/bundletest_install/bin/libboost_system.so.1.58.0
/home/estan/bundletest_install/bin/libgcc_s.so.1
/home/estan/bundletest_install/bin/libboost_filesystem.so.1.58.0

I did the build on Ubuntu, and tested that it also runs in a clean
Fedora 24 Docker container.

Hope that helps some.

Elvis

[1] https://cmake.org/cmake/help/v3.9/command/file.html

>
> Please, could you give me a hint?
>
> Regards
> Roman
>
>> Am 19.07.2017 um 12:40 schrieb Elvis Stansvik <elvis.stansvik at orexplore.com>:
>>
>> 2017-07-19 10:24 GMT+02:00 Roman Wüger <roman.wueger at gmx.at>:
>>> Hello,
>>>
>>> I have a project which depends on a self compiled 3rd party project (boost)
>>> Boost is here only an example, there are other 3rd party libraries too.
>>>
>>> If I call the "install" command on the target, then it would be packaged.
>>> But how could I add the shared libraries and especially the links for the shared libraries?
>>>
>>> E.g.:
>>> libboost_filesystem.so -> libboost_filesystem.so.1.48.0
>>> libboost_filesystem.so.1.48.0
>>>
>>> Thanks in advance
>>
>> I think fixup_bundle() from BundleUtilities is what you want [1].
>>
>> We're using it to make our Windows and macOS installs standalone, but
>> (I think) it should work on Linux as well.
>>
>> [1] https://cmake.org/cmake/help/v3.8/module/BundleUtilities.html
>>
>>>
>>> Best Regards
>>> Roman
>>> --
>>>
>>> Powered by www.kitware.com
>>>
>>> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>>>
>>> Kitware offers various services to support the CMake community. For more information on each offering, please visit:
>>>
>>> CMake Support: http://cmake.org/cmake/help/support.html
>>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>>
>>> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://public.kitware.com/mailman/listinfo/cmake
>


More information about the CMake mailing list