{"id":4135,"date":"2019-11-21T10:26:39","date_gmt":"2019-11-21T10:26:39","guid":{"rendered":"https:\/\/grodansparadis.com\/wordpress\/?p=4135"},"modified":"2020-09-15T15:30:00","modified_gmt":"2020-09-15T13:30:00","slug":"building-arm-raspbian-packages-on-your-intel-pc","status":"publish","type":"post","link":"https:\/\/grodansparadis.com\/wordpress\/?p=4135","title":{"rendered":"Building #ARM #Raspbian packages on your #Intel PC"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">If you are a maintainer of a software project as I am, you probably spend a lot of time testing and deploying code. The more platforms you add the harder this gets and at some point you need to think carefully what you can do to minimize manual work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I build things for Ubuntu\/Debian\/Raspian and Windows. In the beginning a lot of the deployment here was done on each platform. Hours spent on this for each release. Frustrating.  I decided to  do some scripts that would make it possible to do the first tree automatically.  Saving time if I could get it to work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I found <strong>Stein Magnus Jodal<\/strong>&#8216;s excellent article <a href=\"https:\/\/jodal.no\/2015\/03\/08\/building-arm-debs-with-pbuilder\/\">Building ARM Debian packages with pbuilder<\/a> and he is the only one that should take credit for the things I describe here. I am just a copy cat in this case, well more or less, just adding some vital things.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I had no major problem to get buildings for Ubuntu and Debian to work with pbuilder following Stein Magnis Jodal&#8217;s document.  The ARM builds was another thing. What I got was this<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n...\n qemu:handle_cpu_signal received signal outside vCPU context @ pc=0x60184bcc\n qemu:handle_cpu_signal received signal outside vCPU context @ pc=0x600019f9\n...\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">qemu (or rather <em>pbuilder-satisfydepends<\/em>)  fails when checking dependencies.  After a long struggle I found that replacing <em>pbuilder-satisfydepends<\/em> with <em>pbuilder-satisfydepends-apt<\/em> was a solution to this problem. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I repeat the steps from Stein Magnis Jodal&#8217;s document here with my changes and updates and comments to get things working. Again credit is to Stein Magnis Jodal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Setup pbuilder environment<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Add a file .<strong>pbuilderrc<\/strong> to your root acount with the following content<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n!\/bin\/sh\n set -e\n if &#x5B; &quot;$OS&quot; == &quot;debian&quot; ]; then\n     MIRRORSITE=&quot;http:\/\/ftp.se.debian.org\/debian\/&quot;\n     COMPONENTS=&quot;main contrib non-free&quot;\n     DEBOOTSTRAPOPTS=(&quot;${DEBOOTSTRAPOPTS&#x5B;@]}&quot;\n         &quot;--keyring=\/usr\/share\/keyrings\/debian-archive-keyring.gpg&quot;)\n     : ${DIST:=&quot;stretch&quot;}\n     : ${ARCH:=&quot;amd64&quot;}\n     if &#x5B; &quot;$DIST&quot; == &quot;jessie&quot; ]; then\n         #EXTRAPACKAGES=&quot;$EXTRAPACKAGES debian-backports-keyring&quot;\n         OTHERMIRROR=&quot;$OTHERMIRROR | deb $MIRRORSITE jessie-backports $COMPONENTS&quot;\n     fi\n elif &#x5B; &quot;$OS&quot; == &quot;raspbian&quot; ]; then\n     MIRRORSITE=&quot;http:\/\/ftp.acc.umu.se\/mirror\/raspbian\/raspbian\/&quot;\n     COMPONENTS=&quot;main contrib non-free&quot;\n     PBUILDERSATISFYDEPENDSCMD=&quot;\/usr\/lib\/pbuilder\/pbuilder-satisfydepends-apt&quot;\n     DEBOOTSTRAPOPTS=(&quot;${DEBOOTSTRAPOPTS&#x5B;@]}&quot;\n         &quot;--keyring=\/usr\/share\/keyrings\/raspbian-archive-keyring.gpg&quot;)\n     : ${DIST:=&quot;stretch&quot;}\n     : ${ARCH:=&quot;armhf&quot;}\n elif &#x5B; &quot;$OS&quot; == &quot;ubuntu&quot; ]; then\n     MIRRORSITE=&quot;http:\/\/se.archive.ubuntu.com\/ubuntu\/&quot;\n     COMPONENTS=&quot;main restricted universe multiverse&quot;\n     DEBOOTSTRAPOPTS=(&quot;${DEBOOTSTRAPOPTS&#x5B;@]}&quot;\n         &quot;--keyring=\/usr\/share\/keyrings\/ubuntu-archive-keyring.gpg&quot;)\n else\n     echo &quot;Unknown OS: $OS&quot;\n     exit 1\n fi\n if &#x5B; &quot;$DIST&quot; == &quot;&quot; ]; then\n     echo &quot;DIST is not set&quot;\n     exit 1\n fi\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Note the PBUILDERSATISFYDEPENDSCMD under the Raspbian section.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now pbuilder will require three environment variables (in upper case) for it&#8217;s use<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">OS<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The os you build for.It can be set to <strong>ubuntu<\/strong>, <strong>debian<\/strong> or <strong>raspbian<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">ARCH<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The arcitecture you are builing for. It can be any of <strong>amd64<\/strong>, <strong>i386<\/strong>, <strong>armel<\/strong>, or <strong>armhf<\/strong>. Yes som eother supported arcitecure also of course.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">DIST<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Distribution of the os. For Debian\/Raspbian <strong>buster<\/strong>, <strong>stretch<\/strong>, <strong>jessie<\/strong>. For Ubuntu <strong>eoan<\/strong>, <strong>disco<\/strong>, <strong>bionic<\/strong>, <strong>xenial<\/strong>, <strong>trusty<\/strong>. Well others shoudl work to.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> If you are on a PC <a href=\"http:\/\/logan.tw\/posts\/2017\/01\/21\/introduction-to-qemu-debootstrap\/\">qemu-debootstrap<\/a> is used for the ARM builds. So you have to install it with<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt install pbuilder qemu-user-static\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We also need the keyrings. For Ubuntu and Debian install them with<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt install ubuntu-keyring debian-archive-keyring\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If that for some reason does not work you can fetch the keyring fro Debian at <a href=\"https:\/\/packages.debian.org\/sid\/all\/ubuntu-keyring\/download\">https:\/\/packages.debian.org\/sid\/all\/ubuntu-keyring\/download<\/a> and for Ubuntu keyring can be fetched here <a href=\"https:\/\/launchpad.net\/ubuntu\/+source\/ubuntu-keyring\">https:\/\/launchpad.net\/ubuntu\/+source\/ubuntu-keyring<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The keyring for Raspbian you can get here<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n wget http:\/\/archive.raspbian.org\/raspbian\/pool\/main\/r\/raspbian-archive-keyring\/raspbian-archive-keyring_20120528.2_all.deb  \nsudo dpkg -i raspbian-archive-keyring_20120528.2_all.deb\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now you need to build the chroots. You do this with steps like<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo mkdir -p \/var\/cache\/pbuilder\/debian-stretch-amd64\/aptcache\/  \nsudo OS=debian DIST=stretch ARCH=amd64 pbuilder --create\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace OS\/DIST\/ARCH for your needs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All you need now is the Debian source package for the code you want to work with. Go to the folder where it is and issue<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo OS=debian DIST=stretch ARCH=armhf pbuilder build *.dsc\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace OS\/DIST\/ARCH for your needs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If all goes well you find the resulting package  in <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n\/var\/cache\/pbuilder\/\/var\/cache\/pbuilder\/debian-stretch-amd64\/result\/\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">replace &#8216;stretch&#8217;, &#8216;amd64&#8217; and &#8216;debian&#8217; as to you settings for DIST, ARCH and OS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you rather want you can go into an unpacked source folder and issu<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ntar xvf ..\/src-pkg.debian.tar.xz\ntar xvf ..\/src-pkg.orig.tar.gz\nsudo OS=debian DIST=stretch ARCH=amd64 pdebuild\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Again replace OS\/DIST\/ARCH for your needs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Thats it really.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I experienced situation when dh-<em>autoreconf<\/em> was not available in the chroot and when it did not get installed. This was for Ubuntu. If this happens you can instll it manually with<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo OS=ubuntu DIST=xenial ARCH=amd64 pbuilder --login --save-after-exec \napt install dh-autoreconf \nexit\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hope this can save some time for someone. And again thanks to Stein Magnis Jodal for his work.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lazy section<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Below is some code you can use if you think typing on  a keyboard is tiresome&#8230;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ubuntu<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo mkdir -p \/var\/cache\/pbuilder\/ubuntu-trusty-amd64\/aptcache\/\nsudo OS=ubuntu DIST=trusty ARCH=amd64 pbuilder --create\nsudo OS=ubuntu DIST=trusty ARCH=amd64 pbuilder build vscpl2drv-automation1_1.1.0-1.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/ubuntu-xenial-amd64\/aptcache\/\nsudo OS=ubuntu DIST=xenial ARCH=amd64 pbuilder --create\nsudo OS=ubuntu DIST=xenial ARCH=amd64 pbuilder build vscpl2drv-automation1_1.1.0-1.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/ubuntu-bionic-amd64\/aptcache\/\nsudo OS=ubuntu DIST=bionic ARCH=amd64 pbuilder --create\nsudo OS=ubuntu DIST=bionic ARCH=amd64 pbuilder build vscpl2drv-automation1_1.1.0-1.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/ubuntu-disco-amd64\/aptcache\/\nsudo OS=ubuntu DIST=disco ARCH=amd64 pbuilder --create\nsudo OS=ubuntu DIST=disco ARCH=amd64 pbuilder build vscpl2drv-automation1_1.1.0-1.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/ubuntu-eoan-amd64\/aptcache\/\nsudo OS=ubuntu DIST=eoan ARCH=amd64 pbuilder --create\nsudo OS=ubuntu DIST=eoan ARCH=amd64 pbuilder build vscpl2drv-automation1_1.1.0-1.dsc\n<\/pre><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Debian<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">For the arm builds you may need to add the line<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nPBUILDERSATISFYDEPENDSCMD=&quot;\/usr\/lib\/pbuilder\/pbuilder-satisfydepends-apt&quot;\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">to your pbuilder configuration (.pbuilderrc) file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-jessie-amd64\/aptcache\/\nsudo OS=raspbian DIST=jessie ARCH=amd64 pbuilder --create\nsudo OS=raspbian DIST=jessie ARCH=amd64 pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-stretch-amd64\/aptcache\/\nsudo OS=raspbian DIST=stretch ARCH=amd64 pbuilder --create\nsudo OS=raspbian DIST=stretch ARCH=amd64 pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-buster-amd64\/aptcache\/\nsudo OS=raspbian DIST=buster ARCH=amd64 pbuilder --create\nsudo OS=raspbian DIST=buster ARCH=amd64 pbuilder build *.dsc\n\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-jessie-i385\/aptcache\/\nsudo OS=raspbian DIST=jessie ARCH=i385 pbuilder --create\nsudo OS=raspbian DIST=jessie ARCH=i385 pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-stretch-i385\/aptcache\/\nsudo OS=raspbian DIST=stretch ARCH=i385 pbuilder --create\nsudo OS=raspbian DIST=stretch ARCH=i385 pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-buster-i385\/aptcache\/\nsudo OS=raspbian DIST=buster ARCH=i385 pbuilder --create\nsudo OS=raspbian DIST=buster ARCH=i385 pbuilder build *.dsc\n\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-jessie-armle\/aptcache\/\nsudo OS=raspbian DIST=jessie ARCH=armle pbuilder --create\nsudo OS=raspbian DIST=jessie ARCH=armle pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-stretch-armle\/aptcache\/\nsudo OS=raspbian DIST=stretch ARCH=armle pbuilder --create\nsudo OS=raspbian DIST=stretch ARCH=armle pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-buster-armle\/aptcache\/\nsudo OS=raspbian DIST=buster ARCH=armle pbuilder --create\nsudo OS=raspbian DIST=buster ARCH=armle pbuilder build *.dsc\n\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-jessie-armhf\/aptcache\/\nsudo OS=raspbian DIST=jessie ARCH=armhf pbuilder --create\nsudo OS=raspbian DIST=jessie ARCH=armhf pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-stretch-armhf\/aptcache\/\nsudo OS=raspbian DIST=stretch ARCH=armhf pbuilder --create\nsudo OS=raspbian DIST=stretch ARCH=armhf pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-buster-armhf\/aptcache\/\nsudo OS=raspbian DIST=buster ARCH=armhf pbuilder --create\nsudo OS=raspbian DIST=buster ARCH=armhf pbuilder build *.dsc\n<\/pre><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Raspbian<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Use <strong>armle<\/strong> for Raspberry Pi 1<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-jessie-armhf\/aptcache\/\nsudo OS=raspbian DIST=jessie ARCH=armhf pbuilder --create\nsudo OS=raspbian DIST=jessie ARCH=armhf pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-stretch-armhf\/aptcache\/\nsudo OS=raspbian DIST=stretch ARCH=armhf pbuilder --create\nsudo OS=raspbian DIST=stretch ARCH=armhf pbuilder build *.dsc\n\nsudo mkdir -p \/var\/cache\/pbuilder\/raspbian-buster-armhf\/aptcache\/\nsudo OS=raspbian DIST=buster ARCH=armhf pbuilder --create\nsudo OS=raspbian DIST=buster ARCH=armhf pbuilder build *.dsc\n<\/pre><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This info is current when this is written but may not be when you read it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you are a maintainer of a software project as I am, you probably spend a lot of time testing and deploying code. The more platforms you add the harder this gets and at some point you need to think carefully what you can do to minimize manual work. I build things for Ubuntu\/Debian\/Raspian and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[24,50],"tags":[],"class_list":["post-4135","post","type-post","status-publish","format-standard","hentry","category-programming","category-raspberry-pi"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p4raCZ-14H","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/4135","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4135"}],"version-history":[{"count":19,"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/4135\/revisions"}],"predecessor-version":[{"id":5149,"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/4135\/revisions\/5149"}],"wp:attachment":[{"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4135"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4135"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/grodansparadis.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}