The following commit has been merged in the master branch:
commit dc6ae081c29468538516c394548c6e1edbbe02df
Author: RaphaĆ«l Hertzog <[email protected]>
Date:   Thu Aug 27 12:42:35 2009 -0700

    dpkg: Add --foreign-architecture and --print-foreign-architectures options
    
    Two new options to dpkg, needed for multiarch:
    
    * --foreign-architecture lets you specify that packages for the
      named architecture should be installable without the use of
      --force-architecture.
    
    * --print-foreign-architectures prints out a space-separated list of all
      architectures so configured, so that front-ends can query the list.
    
    Sponsored-by: Linaro Limited
    
    [[email protected]:
     - Move dpkg option to the correct section in the man page.
     - Add --help output for both options.
     - Handle arch_foreign and arch_unknown separately in set_foreign_arch().
     - Be consistent with naming of arch plural with the rest of the code.
     - Rename act_foreignarches to act_printforeignarches. ]
    
    Based-on-patch-by: Steve Langasek <[email protected]>
    Signed-off-by: Guillem Jover <[email protected]>

diff --git a/man/dpkg.1 b/man/dpkg.1
index 94f3c1c..9f11a6e 100644
--- a/man/dpkg.1
+++ b/man/dpkg.1
@@ -235,6 +235,10 @@ reason still haven't been installed.
 .B \-\-print\-architecture
 Print architecture of packages \fBdpkg\fP installs (for example, "i386").
 .TP
+.B \-\-print\-foreign\-architectures
+Print a space-separated list of the extra architectures \fBdpkg\fP is
+configured to allow packages to be installed for.
+.TP
 .B \-\-compare\-versions \fIver1 op ver2\fP
 Compare version numbers, where \fIop\fP is a binary operator. \fBdpkg\fP
 returns success (zero result) if the specified condition is satisfied,
@@ -568,6 +572,12 @@ each other. Both are processed in the given order, with 
the last rule that
 matches a file name making the decision.
 .RE
 .TP
+.B \-\-foreign\-architecture \fIarchitecture\fP
+Add \fIarchitecture\fP to the list of architectures for which packages can
+be installed without using \fB\-\-force\-architecture\fP, in addition to
+the architecture \fBdpkg\fP is built for (i.e.: the output of
+\fB\-\-print\-architecture\fP).
+.TP
 \fB\-\-status\-fd \fR\fIn\fR
 Send machine-readable package status and progress information to file
 descriptor \fIn\fP. This option can be specified multiple times. The
diff --git a/src/enquiry.c b/src/enquiry.c
index 5a8efbf..2e15912 100644
--- a/src/enquiry.c
+++ b/src/enquiry.c
@@ -39,6 +39,7 @@
 #include <dpkg/i18n.h>
 #include <dpkg/dpkg.h>
 #include <dpkg/dpkg-db.h>
+#include <dpkg/arch.h>
 #include <dpkg/pkg-show.h>
 #include <dpkg/options.h>
 
@@ -475,6 +476,28 @@ printinstarch(const char *const *argv)
 }
 
 int
+print_foreign_arches(const char *const *argv)
+{
+  struct dpkg_arch *arch;
+  const char *sep = "";
+
+  if (*argv)
+    badusage(_("--%s takes no arguments"), cipaction->olong);
+
+  for (arch = dpkg_arch_get_list(); arch; arch = arch->next) {
+    if (arch->type != arch_foreign)
+      continue;
+    printf("%s%s", sep, arch->name);
+    sep = " ";
+  }
+  printf("\n");
+
+  m_output(stdout, _("<standard output>"));
+
+  return 0;
+}
+
+int
 cmpversions(const char *const *argv)
 {
   struct relationinfo {
diff --git a/src/main.c b/src/main.c
index e81d7ef..bbfcc94 100644
--- a/src/main.c
+++ b/src/main.c
@@ -46,6 +46,7 @@
 #include <dpkg/i18n.h>
 #include <dpkg/dpkg.h>
 #include <dpkg/dpkg-db.h>
+#include <dpkg/arch.h>
 #include <dpkg/subproc.h>
 #include <dpkg/command.h>
 #include <dpkg/options.h>
@@ -104,6 +105,7 @@ usage(const struct cmdinfo *ci, const char *value)
 "  -S|--search <pattern> ...        Find package(s) owning file(s).\n"
 "  -C|--audit                       Check for broken package(s).\n"
 "  --print-architecture             Print dpkg architecture.\n"
+"  --print-foreign-architectures    Print allowed foreign architectures.\n"
 "  --compare-versions <a> <op> <b>  Compare version numbers - see below.\n"
 "  --force-help                     Show help on forcing.\n"
 "  -Dh|--debug=help                 Show help on debugging.\n"
@@ -131,6 +133,8 @@ usage(const struct cmdinfo *ci, const char *value)
 "  --instdir=<directory>      Change installation dir without changing admin 
dir.\n"
 "  --path-exclude=<pattern>   Do not install paths which match a shell 
pattern.\n"
 "  --path-include=<pattern>   Re-include a pattern after a previous 
exclusion.\n"
+"  --foreign-architecture=<arch>\n"
+"                             Add <arch> to the list of foreign 
architectures.\n"
 "  -O|--selected-only         Skip packages not selected for 
install/upgrade.\n"
 "  -E|--skip-same-version     Skip packages whose same version is installed.\n"
 "  -G|--refuse-downgrade      Skip packages with earlier version than 
installed.\n"
@@ -469,6 +473,24 @@ run_status_loggers(struct invoke_hook *hook_head)
   }
 }
 
+static void
+set_foreign_arch(const struct cmdinfo *cip, const char *value)
+{
+  struct dpkg_arch *arch;
+
+  arch = dpkg_arch_find(value);
+  if (arch->type == arch_foreign)
+    return;
+  else if (arch->type == arch_unknown)
+    arch->type = arch_foreign;
+  else if (arch->type == arch_illegal)
+    warning(_("ignoring option --%s=%s: %s"), cip->olong, value,
+            dpkg_arch_name_is_illegal(value));
+  else
+    warning(_("ignoring option --%s=%s: %s"), cip->olong, value,
+            _("this architecture cannot be foreign"));
+}
+
 static void setforce(const struct cmdinfo *cip, const char *value) {
   const char *comma;
   size_t l;
@@ -554,6 +576,7 @@ static const struct cmdinfo cmdinfos[]= {
   ACTION( "assert-multi-conrep",             0,  act_assertmulticonrep,    
assertmulticonrep ),
   ACTION( "print-architecture",              0,  act_printarch,            
printarch   ),
   ACTION( "print-installation-architecture", 0,  act_printinstarch,        
printinstarch  ),
+  ACTION( "print-foreign-architectures",     0,  act_printforeignarches,   
print_foreign_arches ),
   ACTION( "predep-package",                  0,  act_predeppackage,        
predeppackage   ),
   ACTION( "compare-versions",                0,  act_cmpversions,          
cmpversions     ),
 /*
@@ -564,6 +587,7 @@ static const struct cmdinfo cmdinfos[]= {
   { "post-invoke",       0,   1, NULL,          NULL,      set_invoke_hook, 0, 
&post_invoke_hooks_tail },
   { "path-exclude",      0,   1, NULL,          NULL,      setfilter,     0 },
   { "path-include",      0,   1, NULL,          NULL,      setfilter,     1 },
+  { "foreign-architecture", 0, 1, NULL,         NULL,      set_foreign_arch, 0 
},
   { "status-logger",     0,   1, NULL,          NULL,      set_invoke_hook, 0, 
&status_loggers_tail },
   { "status-fd",         0,   1, NULL,          NULL,      setpipe, 0 },
   { "log",               0,   1, NULL,          &log_file, NULL,    0 },
diff --git a/src/main.h b/src/main.h
index 917c2a1..c6807be 100644
--- a/src/main.h
+++ b/src/main.h
@@ -80,6 +80,7 @@ enum action {
 
        act_printarch,
        act_printinstarch,
+       act_printforeignarches,
 
        act_assertpredep,
        act_assertepoch,
@@ -169,6 +170,7 @@ int assertmulticonrep(const char *const *argv);
 int predeppackage(const char *const *argv);
 int printarch(const char *const *argv);
 int printinstarch(const char *const *argv);
+int print_foreign_arches(const char *const *argv);
 int cmpversions(const char *const *argv);
 
 /* from select.c */

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to