CMake: How to create alias for installing different targets?

后端 未结 1 927
暖寄归人
暖寄归人 2020-12-13 20:29

Suppose that I\'ve got the following libraries:

add_library(myLib_static STATIC ${SRC_FILES})
add_library(myLib SHARED ${SRC_FILES})

# installing header fil         


        
1条回答
  •  时光说笑
    2020-12-13 21:13

    Put them each in a different component and set up custom targets for the installations.

    add_library(foo_static STATIC foo.cpp)
    add_library(foo SHARED foo.cpp)
    
    install(TARGETS foo_static
            DESTINATION bin
            COMPONENT static)
    
    install(TARGETS foo
            DESTINATION bin
            COMPONENT shared)
    
    add_custom_target(foo-install
      DEPENDS foo
      COMMAND 
          "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=shared
          -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
    )
    
    add_custom_target(foo_static-install
      DEPENDS foo_static
      COMMAND
         "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=static 
         -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
    )
    
    install(FILES foo.h DESTINATION include COMPONENT static)
    install(FILES foo.h DESTINATION include COMPONENT shared)
    

    Then invoke the custom targets.

    stephen@hal:~/dev/src/playground/cmake/build{master}$ cmake .. -DCMAKE_INSTALL_PREFIX=prefix
    -- The C compiler identification is GNU 4.8.1
    -- The CXX compiler identification is GNU 4.8.1
    -- Check for working C compiler: /usr/lib/icecc/bin/cc
    -- Check for working C compiler: /usr/lib/icecc/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working CXX compiler: /usr/lib/icecc/bin/c++
    -- Check for working CXX compiler: /usr/lib/icecc/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/stephen/dev/src/playground/cmake/build
    stephen@hal:~/dev/src/playground/cmake/build{master}$ make foo_static-install
    makeobj[0]: Entering directory `/home/stephen/dev/src/playground/cmake/build'
    Scanning dependencies of target foo_static
    [100%] Building CXX object CMakeFiles/foo_static.dir/foo.cpp.o
    Linking CXX static library libfoo_static.a
    [100%] Built target foo_static
    Scanning dependencies of target foo_static-install
    -- Install configuration: ""
    -- Installing: /home/stephen/dev/src/playground/cmake/build/prefix/bin/libfoo_static.a
    -- Installing: /home/stephen/dev/src/playground/cmake/build/prefix/include/foo.h
    
    [100%] Built target foo_static-install
    makeobj[0]: Leaving directory `/home/stephen/dev/src/playground/cmake/build'
    stephen@hal:~/dev/src/playground/cmake/build{master}$ make foo-install
    makeobj[0]: Entering directory `/home/stephen/dev/src/playground/cmake/build'
    Scanning dependencies of target foo
    [100%] Building CXX object CMakeFiles/foo.dir/foo.cpp.o
    Linking CXX shared library libfoo.so
    [100%] Built target foo
    Scanning dependencies of target foo-install
    -- Install configuration: ""
    -- Installing: /home/stephen/dev/src/playground/cmake/build/prefix/bin/libfoo.so
    -- Up-to-date: /home/stephen/dev/src/playground/cmake/build/prefix/include/foo_p.h
    [100%] Built target foo-install
    makeobj[0]: Leaving directory `/home/stephen/dev/src/playground/cmake/build'
    

    Note that components are used by cpack to allow the user installing a package to decide which components to install. So, for a library, the headers might be part of the Development component. In this case we install the header with both the shared and static component. It might make sense to additionally install it with a Development component if cpack is to be used in that way.

    0 讨论(0)
提交回复
热议问题