Подтвердить что ты не робот

CMake: Как создать псевдоним для установки разных целей?

Предположим, что у меня есть следующие библиотеки:

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

# installing header files
install(FILES ${H_FILES} DESTINATION ${INSTDIRHEADER})

# installing binaries
install(TARGETS myLib_static
         DESTINATION ${INSTDIRBIN})

install(TARGETS myLib
         DESTINATION ${INSTDIRBIN})

Если я выполнил следующую команду, будут установлены как общие, так и статические библиотеки:

make install

Как я могу иметь отдельные команды установки для каждого из них? Что-то вроде этого:

make install-static
make install-shared

Обновление

Файлы заголовков также должны быть установлены при необходимости:

install(FILES ${H_FILES} DESTINATION ${INSTDIRHEADER})
4b9b3361

Ответ 1

Поместите их каждый в другой компонент и настройте настраиваемые цели для установок.

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)

Затем вызовите пользовательские цели.

[email protected]:~/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
[email protected]:~/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'
[email protected]:~/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'

Обратите внимание, что компоненты используются cpack, чтобы пользователь мог установить пакет, чтобы решить, какие компоненты необходимо установить. Таким образом, для библиотеки заголовки могут быть частью компонента Development. В этом случае мы устанавливаем заголовок как с общим, так и с статическим компонентом. Возможно, имеет смысл дополнительно установить его с помощью компонента Development, если cpack должен использоваться таким образом.