Как ссылаться на файлы "part", создающие библиотеку, на "part", создающие двоичные файлы в snapcraft?

У меня есть оснастка, которая создаст библиотеку, совместно используемую несколькими двоичными файлами (в пределах одной и той же оснастки). Каков наилучший способ структурировать защелкивающиеся детали для поддержки этого?

Ниже моя отправная точка.

parts:
  libwhatever:
    plugin: cmake
    source: ...
    configflags: [
      ...
    ]
    build-packages:
      - liblog4cxx-dev
      - libboost-system-dev
      - libboost-filesystem-dev
      - libboost-thread-dev

  binwhatever:
    plugin: cmake
    source: binwhatever
    configflags: [
    ]
    build-packages:
      - liblog4cxx-dev
      - libboost-system-dev
      - libboost-filesystem-dev
      - libboost-test-dev
      - libboost-thread-dev
      - libgstreamer1.0-dev
      - #how can I reference libwhatever here?

1 ответ

Решение

Хорошо, это возможно, но учитывая текущее состояние инструментов, оно не так гладко, как могло бы быть. Несколько вещей, чтобы рассмотреть на дату этого поста:

1) Плагин Snap cmake не позволяет вам определять переменные среды перед сборкой (snapcraftctl сбрасывает среду перед запуском)- если вы не переопределите ее полностью. Таким образом, приведенное ниже решение использует подход работы без изменения среды для каждого двоичного файла cmake.

2) Насколько я могу судить, на самом деле нет способа snapcraft.yaml иметь возможность узнать о "libwh независимо", потому что он не будет существовать в момент начала сборки. Так что все ссылки на libwh независимо от каждого двоичного файла в snapcraft.yaml удалены.

3) Чтобы нижеприведенное решение работало, "libwhothing" должно позволять указывать префикс установки. Это позволяет нам скомпилировать его в / usr вместо / usr / local или / opt или где-либо еще, и когда будут собраны двоичные файлы, будет найдено "libwhothing".

snapcraft.yaml:

name: project-whatever
version: "6.0.0" 
summary: ""
description: |
  show how to use a common libwhatever among one or more binaries 
  in a snap
grade: devel
confinement: devmode

parts:
  libwhatever:
    plugin: cmake
    source: libwhatever
    configflags: [
      -DCMAKE_BUILD_TYPE=Debug,
      -DCMAKE_INSTALL_PREFIX=/usr
    ]
    build-packages:
      - liblog4cxx-dev
      - libboost-system-dev
      - libboost-filesystem-dev
      - libboost-test-dev
      - libboost-thread-dev
      - libgstreamer1.0-dev
      - libpthread-stubs0-dev
      - libglib2.0-dev
    stage-packages:
      - libc6
      - libgstreamer1.0-0
      - gstreamer1.0-plugins-base-apps
      - liblog4cxx10v5
      - libglib2.0-0

  binwhatever:
    after:
      - libwhatever
    plugin: cmake
    source: binwhatever
    configflags: [
      -DCMAKE_BUILD_TYPE=Debug,
      -DCMAKE_INSTALL_PREFIX=/opt/whatever
      ]
    build-packages:
      - liblog4cxx-dev
      - libboost-system-dev
      - libboost-filesystem-dev
      - libboost-test-dev
      - libboost-thread-dev
      - libboost-program-options-dev
      - libgstreamer1.0-dev
      - libgstreamer-plugins-base1.0-dev
    stage-packages:
      - libc6
      - libgstreamer1.0-0
      - gstreamer1.0-plugins-base-apps
      - liblog4cxx10v5
      - libboost-system1.65.1
      - libboost-filesystem1.65.1
      - libboost-thread1.65.1
      - libboost-program-options1.65.1

CMakeLists.txt для libwhothing (как вы можете видеть, уважает то, что дано -DCMAKE_INSTALL_PREFIX):

cmake_minimum_required(VERSION 3.10)

set(VERSION_MAJOR 1)
set(VERSION_MINOR 2)
set(VERSION_PATCH 0)

project(whatever VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" DESCRIPTION "whatever")

set(CMAKE_CXX_FLAGS "-std=gnu++11")

include(FindPkgConfig)
include(GNUInstallDirs)

set(REQUIRED_LIBS gstreamer-1.0 liblog4cxx pthread-stubs glib-2.0)
pkg_check_modules(ALL REQUIRED ${REQUIRED_LIBS})
find_package(Boost REQUIRED COMPONENTS system filesystem regex thread)

add_library(whatever-shared SHARED whatever.cpp)

set_target_properties(whatever-shared PROPERTIES VERSION ${PROJECT_VERSION})
set_target_properties(whatever-shared PROPERTIES SOVERSION ${VERSION_MAJOR})
set_target_properties(whatever-shared PROPERTIES PUBLIC_HEADER whatever.h)

target_include_directories(whatever-shared PUBLIC ${ALL_INCLUDE_DIRS} PUBLIC ${Boost_INCLUDE_DIRS})
link_directories(whatever-shared PUBLIC ${ALL_LIBRARY_DIRS} PUBLIC ${Boost_LIBRARY_DIRS})
target_link_libraries(whatever-shared ${ALL_LIBRARIES} ${Boost_LIBRARIES})

function(JOIN OUTPUT GLUE)
  set(_TMP_RESULT "")
  set(_GLUE "") # effective glue is empty at the beginning
  foreach(arg ${ARGN})
    set(_TMP_RESULT "${_TMP_RESULT}${_GLUE}${arg}")
    set(_GLUE "${GLUE}")
  endforeach()
  set(${OUTPUT} "${_TMP_RESULT}" PARENT_SCOPE)
endfunction()

join(PKG_CONFIG_REQUIRED_LIBS_STR " " ${REQUIRED_LIBS})
set(PKG_CONFIG_LDFLAGS)
set(PKG_CONFIG_LDFLAGS_STR "-lboost_system -lboost_thread -lboost_regex -lboost_filesystem")
configure_file(libwhatever.pc.in libwhatever.pc @ONLY)

install(TARGETS whatever-shared
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

install(FILES ${CMAKE_BINARY_DIR}/libwhatever.pc
  DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)

libwhatever.pc.in:

prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@CMAKE_INSTALL_PREFIX@
libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@

Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@

Requires: @PKG_CONFIG_REQUIRED_LIBS_STR@
Libs: -L${libdir} -lwhatever @PKG_CONFIG_LDFLAGS_STR@
Cflags: -I${includedir} @PKG_CONFIG_CFLAGS_STR@

Теперь каждый CMakeLists.txt для каждого двоичного файла сможет успешно найти libwh независимо от того, что:

pkg_check_modules(ALL REQUIRED libwhatever gstreamer-video-1.0 gstreamer-app-1.0)
Другие вопросы по тегам