3

基本问题/目标:

我希望能够使用一些共享库,这些共享库应该在 cmake step(plugin) 之前从自定义 PPA 中获取。

snapcraft.yaml:

name: mraa-blink-example
version: 'Latest' 
summary: mraa for snapcraft
description: |
  Blink Example from MRAA lib

grade: stable #devel # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots

apps:
  blinkapp:
    command: bin/blink    

parts:
  blink:
    plugin: cmake
    build-packages:
      - libmraa1 
      - libmraa-dev 
      - mraa-tools 
      - python-mraa 
      - python3-mraa

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.9)
project (MRAA)

file(GLOB SOURCES "src/*.cpp")

#For the shared library:
set ( PROJECT_LINK_LIBS libmraa.so )
add_executable(blink ${SOURCES})
target_link_libraries(blink ${PROJECT_LINK_LIBS} )
install(TARGETS blink DESTINATION /bin)

因为构建包来自自定义 PPA,所以我收到错误消息:

在 'build-packages' 中找不到所需的包:“缓存没有名为 'libmraa-dev' 的包”

有没有办法解决这个问题?

4

2 回答 2

2

背景:

有人努力将 Gnome 库抽象为一个单独的“平台”快照,该快照使用 Ubuntu 桌面团队的 Gnome-3-26 PPA 在 Launchpad 上构建。PPA 包含编译为适合 Ubuntu Xenial (16.04) 的运行时环境的 gnome 平台,这将允许针对比构建环境通常包含的更新的 Gnome 构建快照。但这需要构建环境中的自定义 PPA,和你一样,我在努力解决如何做到这一点。

启用 gnome 平台 PPA 后,您仍然需要将 snap 链接到运行时 snap。这是通过添加一个连接到 的插头gnome-3-26-1604并使用desktop-gnome-platform助手来处理的

我的解决方案:

我决定使用多部分构建,其中主应用程序“部分”依赖于声明为使用“nil”插件的部分,这意味着它实际上并没有做任何事情。然后,我在 nil 部分添加了一个“准备”脚本,该脚本执行添加 PPA、PGP 密钥和强制更新/升级周期所必需的操作。

我相信这需要是一个单独的部分,而不是作为主应用程序上的准备脚本,因为构建包是在准备脚本运行之前获取的,这意味着它将无法找到依赖项的包并以一个不错的方式死掉错误信息。通过执行多部分方法可以解决此问题。我用它来构建gnome-twitch快照,这是几天前宣布的,代表 Snapcrafters 的努力。

例子:

下面是 gnome-twitch snapcraft.yaml 的不完整粘贴,用于解释我是如何做到的:

parts:
  prepare:
    plugin: nil
    prepare: |
      echo "deb http://ppa.launchpad.net/ubuntu-desktop/gnome-3-26/ubuntu xenial main" | tee /etc/apt/sources.list.d/gnome-3-24.list
      apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 399B698EEA9EF163B6F9A0F62CC98497A1231595
      apt update
      apt upgrade -yy
    prime: [-*]
  ...
  gnome-twitch:
    after: [prepare, desktop-gnome-platform]
    ...

plugs:
  gnome-3-26-1604:
    interface: content
    content: gnome-3-26-1604
    target: gnome-platform
    default-provider: gnome-3-26-1604

apps:
  gnome-twitch:
    command: desktop-launch $SNAP/usr/bin/gnome-twitch
    plugs:
      - ... # all the plugs required
      - gnome-3-26-1604
于 2017-08-17T18:22:41.917 回答
1

不幸的是,上面的答案不再适用于 snapcraft 最近的更改。根据丹尼尔上面的回答,当前有效的设置如下所示:

首先,在根范围内,我们需要设置架构以匹配 PPA 中构建的包:

architectures:
  - build-on: amd64
    run-on: amd64

我们需要software-properties-commonanddirmngr可以访问aptand apt-key

build-packages:
  [... other packages ...]
  - software-properties-common
  - dirmngr

pull通过覆盖阶段,包安装作为单独的部分处理 :

parts:
  add-ppa:
    plugin: nil
    override-pull: |
      echo "deb http://ppa.launchpad.net/[... your ppa ...]/ubuntu bionic main" | tee /etc/apt/sources.list.d/custom.list
      apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [... your key ...]
      apt update
      apt upgrade -yy

最后,我们添加add-ppapart 作为“main”部分的依赖项:

parts:
  [... other parts ...]

  core:
    after: [add-ppa]
于 2019-08-10T15:26:25.140 回答