public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: Alexander Smirnov <asmirnov@ilbers.de>
To: isar-users@googlegroups.com
Cc: Alexander Smirnov <asmirnov@ilbers.de>
Subject: [RFC][PATCH 2/3] classes/dsc: Basic Debian .dsc backend implementation
Date: Mon, 23 Apr 2018 16:21:45 +0300	[thread overview]
Message-ID: <20180423132146.14743-3-asmirnov@ilbers.de> (raw)
In-Reply-To: <20180423132146.14743-1-asmirnov@ilbers.de>

This patch introduces class to work with Debian .dsc files. The
main goal is to simplify re-building and customization of original
Debian packages.

To rebuild package from the upstream the following recipe template
could be used:

  DSC_URI = "http://ftp.de.debian.org/...dsc;md5sum=..."
  inherit debian-dsc

All the remaining information bitbake will derive automatically.
This is only first implementation, so there are still several open
issues like:
 - Chose correct upstream package version depending on Debian distro
 - quilt-3.0 source format support
 - Cross-recipe dependencies recognition

Signed-off-by: Alexander Smirnov <asmirnov@ilbers.de>
---
 meta/classes/debian-dsc.bbclass | 112 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 112 insertions(+)
 create mode 100644 meta/classes/debian-dsc.bbclass

diff --git a/meta/classes/debian-dsc.bbclass b/meta/classes/debian-dsc.bbclass
new file mode 100644
index 0000000..4159e3a
--- /dev/null
+++ b/meta/classes/debian-dsc.bbclass
@@ -0,0 +1,112 @@
+# Debian .dsc backend
+#
+# This software is a part of ISAR.
+# Copyright (c) ilbers GmbH, 2018
+#
+# SPDX-License-Identifier: MIT
+
+# List of non-standard variables added to package workspace
+#
+# Set by user:
+#  * DSC_URI - uri link to .dsc file in upstream apt
+#
+# Generated automatically:
+#  * DEBIAN_URI - uri link to Debian patch in upstream apt
+
+python __anonymous() {
+    # Fetch .dsc package file
+    dsc_uri = (d.getVar("DSC_URI", True) or "").split()
+    if len(dsc_uri) == 0:
+        return
+
+    try:
+        fetcher = bb.fetch2.Fetch(dsc_uri, d)
+        fetcher.download()
+    except bb.fetch2.BBFetchException as e:
+        raise bb.build.FuncFailed(e)
+
+    # Open .dsc file from downloads
+    dl_dir = d.getVar("DL_DIR", True)
+    dsc_file = (dsc_uri[0].split(";")[0]).split("/")[-1]
+    filepath = dl_dir + "/" + dsc_file
+
+    pv = ""
+    src_uri = ""
+
+    # Parse .dsc file to get package details
+    with open(filepath, "r") as file:
+        line = file.readline()
+
+        while line:
+            # Get package version and export PV
+            if line.startswith("Version:") and not pv:
+                pv = line.split(": ")[-1].rstrip()
+                d.setVar("PV", pv)
+
+            # Get package and Debian patch arcives names
+            if line.startswith("Files:") and not src_uri:
+                line = file.readline()
+                src = line.split(" ")[-1].rstrip()
+                src_uri = (dsc_uri[0].rsplit("/", 1))[0] + "/" + src
+                src_uri = src_uri + ";md5sum=" + line.split(" ")[1].rstrip()
+                d.setVar("SRC_URI", src_uri)
+
+                line = file.readline()
+                debian = line.split(" ")[-1].rstrip()
+                debian_uri = (dsc_uri[0].rsplit("/", 1))[0] + "/" + debian
+                debian_uri = debian_uri + ";md5sum=" + line.split(" ")[1].rstrip()
+                d.setVar("DEBIAN_URI", debian_uri)
+
+            line = file.readline()
+
+        file.close()
+
+    # Set correct path to unpacked sources
+    pv_orig = (src.split("_")[-1]).split(".orig")[0]
+    pn = d.getVar("PN", True)
+    d.setVar("S", pn + "-" + pv_orig)
+}
+
+python do_fetch_append() {
+    debian_uri = (d.getVar("DEBIAN_URI", True) or "").split()
+    if len(debian_uri) == 0:
+        return
+
+    try:
+        fetcher = bb.fetch2.Fetch(debian_uri, d)
+        fetcher.download()
+    except bb.fetch2.BBFetchException as e:
+        raise bb.build.FuncFailed(e)
+}
+
+python do_unpack_append() {
+    import subprocess
+
+    s = d.getVar("S", True)
+    workdir = d.getVar("WORKDIR", True)
+    debian_uri = (d.getVar("DEBIAN_URI", True) or "").split()
+
+    try:
+        fetcher = bb.fetch2.Fetch(debian_uri, d)
+        fetcher.unpack(workdir + "/" + s)
+    except bb.fetch2.BBFetchException as e:
+        raise bb.build.FuncFailed(e)
+}
+
+# NOTE: this is workaround to serve quilt-3.0 package format support.
+#       To build such package, the original tarball should be placed
+#       in "../" folder. In general, this should be handled by Isar
+#       core build classes, but for now this class in the only one user
+#       for quilt-3.0, so for the first implementation let"s keep it here.
+# Open issues:
+#  - How to identify if package has quilt-3.0 source format?
+#  - How to avoid copying of tarballs from downloads to working dir?
+do_build_prepend() {
+    dl_dir="${@ d.getVar('DL_DIR', True)}"
+    workdir="${@ d.getVar('WORKDIR', True)}"
+    file="${@ ((d.getVar('SRC_URI', True)).split(";")[0]).split("/")[-1]}"
+
+    install -m 644 $dl_dir/$file $workdir
+}
+
+inherit dpkg
-- 
2.9.5


  parent reply	other threads:[~2018-04-23 13:22 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-23 13:21 [RFC][PATCH 0/3] Experiments with .dsc backend Alexander Smirnov
2018-04-23 13:21 ` [RFC][PATCH 1/3] buildchroot: Include texinfo to base system Alexander Smirnov
2018-04-23 13:21 ` Alexander Smirnov [this message]
2018-04-23 15:04   ` [RFC][PATCH 2/3] classes/dsc: Basic Debian .dsc backend implementation Henning Schild
2018-04-23 16:11     ` Alexander Smirnov
2018-04-23 17:27       ` Henning Schild
2018-04-25 10:11         ` Jan Kiszka
2018-05-08 17:40   ` Henning Schild
2018-04-23 13:21 ` [RFC][PATCH 3/3] recipes-debian: Add example recipe to test Debian .dsc support Alexander Smirnov
2018-04-23 14:36 ` [RFC][PATCH 0/3] Experiments with .dsc backend Henning Schild
2018-04-23 15:26   ` Alexander Smirnov
2018-04-23 16:03     ` Henning Schild
2018-04-27 15:46       ` Alexander Smirnov
2018-05-02  8:19         ` Henning Schild
2018-05-08 17:37 ` Henning Schild
2018-05-08 18:31   ` Alexander Smirnov
2018-05-09  7:37     ` Henning Schild

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180423132146.14743-3-asmirnov@ilbers.de \
    --to=asmirnov@ilbers.de \
    --cc=isar-users@googlegroups.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox