[PATCH] Hackish IPC to query build architecture

Loïc Minier lool at dooz.org
Wed Dec 30 16:19:42 UTC 2009


---
 pbuilder-buildpackage       |   26 ++++++++++++++++++++++++--
 pbuilder-buildpackage-funcs |   27 +++++++++++++++++++++++++++
 pdebuild                    |   34 ++++++++++++++++++++++++++++++++--
 3 files changed, 83 insertions(+), 4 deletions(-)

diff --git a/pbuilder-buildpackage b/pbuilder-buildpackage
index 293eecf..062620e 100755
--- a/pbuilder-buildpackage
+++ b/pbuilder-buildpackage
@@ -24,6 +24,7 @@ set -e
 . /usr/lib/pbuilder/pbuilder-checkparams
 . /usr/lib/pbuilder/pbuilder-runhooks
 . /usr/lib/pbuilder/pbuilder-buildpackage-funcs
+flip_ipc
 
 PACKAGENAME="$1"
 if [ ! -f "$PACKAGENAME" ]; then
@@ -111,13 +112,34 @@ else
     exit 1;
 fi
 
+flip_ipc
+while read command; do
+    case "$command" in
+      get_host_arch)
+        $CHROOTEXEC dpkg-architecture -qDEB_HOST_ARCH
+      ;;
+      build)
+        # XXX should call a function instead
+        break
+      ;;
+      *)
+        echo "Invalid command $command"
+      ;;
+    esac
+done
+flip_ipc
+
 log "I: Building the package"
 
 executehooks "A"
 
-DPKG_COMMANDLINE="dpkg-buildpackage -us -uc ${DEBEMAIL:+\"-e$DEBEMAIL\"} $DEBBUILDOPTS"
-
 (
+    # close IPC channels in subshell only
+    flip_ipc
+    close_ipc
+
+    DPKG_COMMANDLINE="dpkg-buildpackage -us -uc ${DEBEMAIL:+\"-e$DEBEMAIL\"} $DEBBUILDOPTS"
+
     : Build process
     if [ -n "$TWICE" ]; then
         DPKG_COMMANDLINE="$DPKG_COMMANDLINE && $DPKG_COMMANDLINE"
diff --git a/pbuilder-buildpackage-funcs b/pbuilder-buildpackage-funcs
index 023dbca..f21eee2 100644
--- a/pbuilder-buildpackage-funcs
+++ b/pbuilder-buildpackage-funcs
@@ -104,3 +104,30 @@ function createbuilduser () {
 	unset LOGNAME || true
     fi
 }
+
+# use stdout and stdin for IPC and backup the original ones as fd 3 and 4
+open_ipc() {
+    if [ -n "$PBUILDER_IPC" ]; then
+        return
+    fi
+    exec 3>&1 4<&0
+    export PBUILDER_IPC=1
+}
+
+# exchange IPC fds 3 and 4 with stdin and stdout
+flip_ipc() {
+    if [ -z "$PBUILDER_IPC" ]; then
+        return
+    fi
+    exec 5>&3- 3>&1- 1>&5- 5<&4- 4<&0- 0<&5-
+}
+
+# connect original stdin and stdout and close IPC channels
+function close_ipc() {
+    if [ -z "$PBUILDER_IPC" ]; then
+        return
+    fi
+    exec 1>&3- 0<&4-
+    unset PBUILDER_IPC
+}
+
diff --git a/pdebuild b/pdebuild
index f9e79b5..da12efc 100644
--- a/pdebuild
+++ b/pdebuild
@@ -31,7 +31,6 @@ fi;
 
 PKG_SOURCENAME=$(dpkg-parsechangelog|sed -n 's/^Source: //p')
 PKG_VERSION=$(dpkg-parsechangelog|sed -n 's/^Version: \(.*:\|\)//p')
-ARCHITECTURE=$(dpkg-architecture -qDEB_HOST_ARCH)
 CHANGES="${PKG_SOURCENAME}_${PKG_VERSION}_${ARCHITECTURE}.changes"
 
 if [ -z "${PBUILDER_BUILD_LOGFILE}" ]; then
@@ -43,6 +42,24 @@ fi
 export BUILDRESULTUID=$(id -u)
 export BUILDRESULTGID=$(id -g)
 
+# use fd 3 and 4 for IPC
+function open_ipc() {
+    if [ -n "$PBUILDER_IPC" ]; then
+        return
+    fi
+    exec 3>&1 4<&0
+    export PBUILDER_IPC=1
+}
+
+# connect original stdin and stdout and close IPC channels
+function close_ipc() {
+    if [ -z "$PBUILDER_IPC" ]; then
+        return
+    fi
+    exec 1>&3- 0<&4-
+    unset PBUILDER_IPC
+}
+
 if [ "${USE_PDEBUILD_INTERNAL}" = 'yes' ]; then
     ${PBUILDERROOTCMD} ${PDEBUILD_PBUILDER} --execute ${EXTRA_CONFIGFILE[@]/#/--configfile } --bindmounts $(readlink -f ..) "$@" -- /usr/lib/pbuilder/pdebuild-internal ${PWD} --debbuildopts "" --debbuildopts "${DEBBUILDOPTS}" --uid "${BUILDRESULTUID}" --gid "${BUILDRESULTGID}" --pbuildersatisfydepends "$PBUILDERSATISFYDEPENDSCMD"
     if [ -d "${BUILDRESULT}" ]; then
@@ -59,7 +76,20 @@ else
 	log "W: Unmet build-dependency in source"
     fi
     echo "dpkg-buildpackage -S -us -uc -r${BUILDSOURCEROOTCMD} $DEBBUILDOPTS" | perl -pe 's/(^|\s)-[bB](\s|$)/$1$2/g' | /bin/bash
-    ${PBUILDERROOTCMD} ${PDEBUILD_PBUILDER} --build ${EXTRA_CONFIGFILE[@]/#/--configfile } --buildresult "${BUILDRESULT}" --debbuildopts "" --debbuildopts "${DEBBUILDOPTS}" "$@"  ../"${PKG_SOURCENAME}_${PKG_VERSION}".dsc
+
+    open_ipc
+    helper() {
+        echo get_host_arch
+        read ARCHITECTURE
+        echo build
+    }
+    d="`mktemp -dt`"
+    fifo="$d/fifo"
+    mkfifo "$fifo"
+    helper <"$fifo" | ${PBUILDERROOTCMD} -C 5 ${PDEBUILD_PBUILDER} --build ${EXTRA_CONFIGFILE[@]/#/--configfile } --buildresult "${BUILDRESULT}" --debbuildopts "" --debbuildopts "${DEBBUILDOPTS}" "$@"  ../"${PKG_SOURCENAME}_${PKG_VERSION}".dsc >"$fifo"
+log "W: Got architecture $ARCHITECTURE"
+    rm -rf "$d"
+    close_ipc
 fi
 
 # do signing with optional key specifier
-- 
1.6.3.3


--vtzGhvizbBRQ85DL--





More information about the Pbuilder-maint mailing list