Please consider this patch, which adds FreeBSD support to dpkg.  It is based
on a fresh checkout from CVS, so it should apply easily.

I added support for wildcards in the archtable to configure, because
config.guess returns i386-unknown-freebsd4.5, and will change regularly. This
seemed like it require excessive maintenance. The NetBSD and OpenBSD ports
will likely benefit from this as well.
diff -urN dpkg/archtable dpkg-1.10-freebsd/archtable
--- dpkg/archtable      Tue Jan  1 13:16:37 2002
+++ dpkg-1.10-freebsd/archtable Fri Feb  8 01:17:11 2002
@@ -43,6 +43,8 @@
 hppa1.1-linux-gnu      hppa            hppa
 hppa2.0-linux-gnu      hppa            hppa
 hppa64-linux-gnu       hppa            hppa
+i386-freebsd.+         freebsd-i386    freebsd-i386
+i386-freebsd4          freebsd-i386    freebsd-i386
 i386-freebsd           freebsd-i386    freebsd-i386
 s390-linux-gnu         s390            s390
 s390-ibm-linux-gnu     s390            s390
diff -urN dpkg/configure.in dpkg-1.10-freebsd/configure.in
--- dpkg/configure.in   Sat Feb  2 17:58:58 2002
+++ dpkg-1.10-freebsd/configure.in      Fri Feb  8 23:35:45 2002
@@ -93,7 +93,7 @@
 
 dpkg_archset=''
 AC_MSG_CHECKING(Debian architecture)
-dpkg_archset="`awk '$1 == "'$target_cpu-$target_os'" { print $2 }' 
$srcdir/archtable`"
+dpkg_archset="`perl -ane 'if("'i386-freebsd4.5'"=~m#^$F[0]$#) {print $F[1]; 
exit(0)}' archtable`"
 # Finish off
 if test "x$dpkg_archset" = "x"; then
  AC_MSG_RESULT([$target_cpu-$target_os, but not found in archtable])
@@ -173,11 +173,20 @@
 } inline int foo (int x) {], AC_DEFINE(HAVE_INLINE))
 
 AC_MSG_CHECKING([for __va_copy])
-AC_TRY_COMPILE([
-#include <stdarg.h>
-],[
-va_list v1,v2;
-__va_copy(v1, v2);
+AC_TRY_RUN([
+        #include <stdarg.h>
+        void f (int i, ...) {
+        va_list args1, args2;
+        va_start (args1, i);
+        __va_copy (args2, args1);
+        if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
+          exit (1);
+        va_end (args1); va_end (args2);
+        }
+        int main() {
+          f (0, 42);
+          return 0;
+        }
 ], [AC_MSG_RESULT(yes)
 AC_DEFINE(HAVE_VA_COPY)],[AC_MSG_RESULT(no)
 AC_MSG_CHECKING([for va_list assignment copy])
diff -urN dpkg/scripts/dpkg-architecture.pl 
dpkg-1.10-freebsd/scripts/dpkg-architecture.pl
--- dpkg/scripts/dpkg-architecture.pl   Tue Jan  1 14:07:49 2002
+++ dpkg-1.10-freebsd/scripts/dpkg-architecture.pl      Fri Feb  8 04:45:52 2002
@@ -65,7 +65,7 @@
            's390',             's390-linux',
            'ia64',             'ia64-linux',
            'openbsd-i386',     'i386-openbsd',
-           'freebsd-i386',     'i386-freebsd',
+           'freebsd-i386',     'i386-freebsd4',
            'darwin-powerpc',   'powerpc-darwin',
            'darwin-i386',      'i386-darwin');
 
diff -urN dpkg/scripts/dpkg-shlibdeps.pl 
dpkg-1.10-freebsd/scripts/dpkg-shlibdeps.pl
--- dpkg/scripts/dpkg-shlibdeps.pl      Wed Jun 20 16:30:15 2001
+++ dpkg-1.10-freebsd/scripts/dpkg-shlibdeps.pl Fri Feb  8 23:57:06 2002
@@ -91,12 +91,29 @@
     }
 }
 
+$deb_build_arch = `dpkg --print-installation-architecture`;
+if ($?>>8) {
+       &syserr("dpkg --print-installation-architecture failed");
+}
+chomp $deb_build_arch;
+
 for ($i=0;$i<=$#exec;$i++) {
     if (!isbin ($exec[$i])) { next; }
     
     # First we get an ldd output to see what libs + paths we have at out
     # disposal.
     my %so2path = ();
+
+if($deb_build_arch eq "freebsd-i386") {
+    defined($c= open(P,"-|")) || syserr("cannot fork for ldconfig");
+    if (!$c) { exec("ldconfig","-r"); syserr("cannot exec ldconfig"); }
+    while (<P>) {
+       if (m,^\s+\d+:-l(\w+)(\.\d+)\s+=>\s+(\S+)$,) {
+           $so2path{"lib$1.so$2"} = $3;
+       }
+    }
+    close(P); $? && subprocerr("ldconfig");
+} else {
     defined($c= open(P,"-|")) || syserr("cannot fork for ldd");
     if (!$c) { exec("ldd","--",$exec[$i]); syserr("cannot exec ldd"); }
     while (<P>) {
@@ -105,6 +122,7 @@
        }
     }
     close(P); $? && subprocerr("ldd on \`$exec[$i]'");
+}
 
     # Now we get the direct deps of the program. We then check back with
     # the ldd output from above to see what our path is.
diff -urN dpkg/utils/start-stop-daemon.c 
dpkg-1.10-freebsd/utils/start-stop-daemon.c
--- dpkg/utils/start-stop-daemon.c      Fri Feb  1 23:28:13 2002
+++ dpkg-1.10-freebsd/utils/start-stop-daemon.c Fri Feb  8 04:36:55 2002
@@ -32,6 +32,8 @@
 #  define OSOpenBSD
 #elif defined(hpux)
 #  define OShpux
+#elif defined(__FreeBSD__)
+#  define OSFreeBSD
 #else
 #  error Unknown architecture - cannot build start-stop-daemon
 #endif
@@ -43,7 +45,7 @@
 #  include <ps.h>
 #endif
 
-#if defined(OSOpenBSD)
+#if defined(OSOpenBSD) || defined(OSFreeBSD)
 #include <sys/param.h>
 #include <sys/user.h>
 #include <sys/proc.h>
@@ -675,7 +677,7 @@
 {
 #if defined(OSLinux) || defined(OShpux)
        if (execname && !pid_is_exec(pid, &exec_stat))
-#elif defined(OSHURD)
+#elif defined(OSHURD) || defined(OSFreeBSD)
     /* I will try this to see if it works */
        if (execname && !pid_is_cmd(pid, execname))
 #endif
@@ -707,7 +709,9 @@
 
 /* WTA: this  needs to be an autoconf check for /proc/pid existance.
  */
-#if defined(OSLinux) || defined (OSsunos)
+
+/* WART: FreeBSD also has /proc support */
+#if defined(OSLinux) || defined (OSsunos) || defined(OSfreebsd)
 static void
 do_procinit(void)
 {
@@ -768,8 +772,8 @@
 #endif /* OSHURD */
 
 
-#if defined(OSOpenBSD)
-int
+#if defined(OSOpenBSD) || defined(OSFreeBSD)
+static int
 pid_is_cmd(pid_t pid, const char *name)
 {
         kvm_t *kd;
@@ -810,8 +814,8 @@
         return (strcmp(name, start_argv_0_p) == 0) ? 1 : 0;
 }
  
-int
-pid_is_user(pid_t pid, int uid)
+static int
+pid_is_user(pid_t pid, uid_t uid)
 {
        kvm_t *kd;
        int nentries;   /* Value not used */
@@ -833,7 +837,7 @@
        return (proc_uid == (uid_t)uid);
 }
 
-int
+static int
 pid_is_exec(pid_t pid, const char *name)
 {
        kvm_t *kd;

Attachment: pgpjreHtn6PCk.pgp
Description: PGP signature

Reply via email to