Search code examples
debhelperdebian-packaging

How to use variables in debhelper dh_gencontrol?


I'm trying to append data to a Debian package's description during the build process. The required data is stored in constants declared within debian/rules file.

I've override dh_gencontrol and added @printf calls which formats the data.

The issues I'm encountering are related to whitespace-containing-strings:

  1. printf splits the given string, matching each word to an %s instance. I'd like it to use the whole string instead.
  2. How can I manipulate said string, replacing spaces with _ and add it to the same line?

Relevant sections from debian/rules:

TEXT_STRING = "string with data"
VERSION_NUM = "v11.4"
...
...
override_dh_gencontrol:
    dh_gencontrol
    @echo "Adding versions to debian/control file"   # This one writes to console
    @printf " %-30s %-20s %s\n" "${TEXT_STRING// /_}" "${VERSION_NUM}" "${TEXT_STRING}" >> "$(CURDIR)/debian/my-package/DEBIAN/control"

Expected output:

<Package description generated by dh_gencontrol>
 string_with_data            v11.4               string with data

Actual output:

                             v11.4               string
 with                        data

Solution

  • There are 2 main issues here:

    1. Bash substitution (i.e. "${TEXT_STRING// /_}") does not work inside the make file.

      Solution is to perform string manipulation within a (on-the-fly) shell session, like so:
      $(shell echo ${TEXT_STRING} | sed 's/ /_/g')

    2. String with spaces breaks up into list of words. printf sees them as multiple variables, were each one "consumes" a single %s

      This results in printf adding additional lines until printing all variables.

      This is solved by removing the quote marks wrapping the string, turning this "${TEXT_STRING}" to that ${TEXT_STRING}.


    The final solution would be:

    @printf " %-30s %-20s %s\n" $(shell echo ${TEXT_STRING} | sed 's/ /_/g') ${VERSION_NUM} ${TEXT_STRING} >> "$(CURDIR)/debian/my-package/DEBIAN/control"