diff --git a/commands/make/make.drush.inc b/commands/make/make.drush.inc
index dce83fe..6207cb5 100644
--- a/commands/make/make.drush.inc
+++ b/commands/make/make.drush.inc
@@ -53,6 +53,22 @@ function make_drush_command() {
       'translations' => 'Retrieve translations for the specified comma-separated list of language(s) if available for all projects.',
       'working-copy' => 'Preserves VCS directories, like .git, for projects downloaded using such methods.',
       'download-mechanism' => 'How to download files. Should be autodetected, but this is an override if it doesn\'t work. Options are "curl" and "make" (a native download method).',
+      'projects' => array(
+        'description' => 'Restrict the make to this comma-separated list of projects. To specify all projects, pass *.',
+        'example' => 'views,ctools',
+      ),
+      'libraries' => array(
+        'description' => 'Restrict the make to this comma-separated list of libraries. To specify all libraries, pass *.',
+        'example' => 'tinymce',
+      ),
+      'projects-exclude' => array(
+        'description' => 'Exclude this comma-separated list of projects from the make.',
+        'example' => 'date,wysiwyg,link',
+      ),
+      'libraries-exclude' => array(
+        'description' => 'Exclude this comma-separated list of libraries from the make.',
+        'example' => 'tinymce,SolrPhpClient',
+      ),
     ),
     'engines' => array('release_info'),
     'topics' => array('docs-make', 'docs-make-example'),
@@ -153,6 +169,18 @@ function drush_make($makefile = NULL, $build_path = NULL) {
   }
 
   $info = make_parse_info_file($makefile);
+
+  // Support making just a portion of a make file.
+  $include_only = array(
+    'projects' => array_filter(drush_get_option_list('projects')),
+    'libraries' => array_filter(drush_get_option_list('libraries')),
+  );
+  $exclude = array(
+    'projects' => array_filter(drush_get_option_list('projects-exclude')),
+    'libraries' => array_filter(drush_get_option_list('libraries-exclude')),
+  );
+  $info = make_prune_info_file($info, $include_only, $exclude);
+
   if ($info === FALSE || ($info = make_validate_info_file($info)) === FALSE) {
     return FALSE;
   }
diff --git a/commands/make/make.utilities.inc b/commands/make/make.utilities.inc
index 274b27f..8e24fd0 100644
--- a/commands/make/make.utilities.inc
+++ b/commands/make/make.utilities.inc
@@ -106,6 +106,95 @@ function _make_parse_info_file($data) {
   return FALSE;
 }
 
+/**
+ * Remove entries in the info file in accordance with the options passed in.
+ * Entries are either explicitly 'allowed' (with the $include_only parameter) in
+ * which case all *other* entries will be excluded, and/or they are explicitly
+ * 'disallowed' (with the $exclude parameter).
+ *
+ * @param $info
+ *  A parsed info file.
+ *
+ * @param $include_only
+ *  (Optional) Array keyed by entry type (e.g. 'libraries') against an array
+ *  of allowed keys for that type. The special value '*' means 'all entries of
+ *  this type'. If this parameter is omitted, no entries will be excluded.
+ *
+ * @param $exclude
+ *  (Optional) Array keyed by entry type (e.g. 'libraries') against an array
+ *  of disallowed keys for that type. The special value '*' means 'none of the
+ *  entries of this type'. If this parameter is omitted, no entries will be
+ *  excluded.
+ *
+ * @return The $info array, pruned if necessary.
+ */
+function make_prune_info_file($info, $include_only = array(), $exclude = array()) {
+
+  // We may get passed FALSE in some cases.
+  // Also we cannot prune an empty array, so no point in this code running!
+  if (empty($info)) {
+    return $info;
+  }
+
+  // We will accrue an explanation of our activities here.
+  $msg = array();
+  $msg['scope'] = dt("Drush make restricted to the following entries:");
+
+  $pruned = FALSE;
+
+  foreach (array('inc' => $include_only, 'exc' => $exclude) as $r => $types) {
+    if (count(array_filter($types))) {
+      $pruned = TRUE;
+      foreach ($types as $type => $keys) {
+
+        // For translating
+        // dt("Projects");
+        // dt("Libraries");
+        $type_title = dt(ucfirst($type));
+
+        // Handle the special '*' value
+        if (in_array('*', $keys)) {
+          if ($r === 'inc') {
+            $msg[$type] = dt("!entry_type: <All>", array('!entry_type' => $type_title));
+          }
+          elseif ($r === 'exc') {
+            $info[$type] = array();
+            unset($msg[$type]);
+          }
+        }
+
+        // Handle a (possibly empty) array of keys to include/exclude.
+        else {
+          if ($r === 'inc') {
+            $info[$type] = array_intersect_key($info[$type], array_fill_keys($keys, 1));
+          }
+          elseif ($r === 'exc') {
+            $info[$type] = array_diff_key($info[$type], array_fill_keys($keys, 1));
+          }
+          unset($msg[$type]);
+          if (!empty($info[$type])) {
+            $msg[$type] = dt("!entry_type: %make_entries", array('!entry_type' => $type_title, '%make_entries' => implode(', ', array_keys($info[$type]))));
+          }
+        }
+      }
+    }
+  }
+
+  if ($pruned) {
+    // Make it clear to the user what's going on.
+    drush_log(implode("\n", $msg), 'ok');
+
+    // Throw an error if these restrictions reduced the make to nothing.
+    if (empty($info['projects']) && empty($info['libraries'])) {
+      // This error mentions the options explicitly to make it as clear as
+      // possible to the user why this error has occurred.
+      make_error('BUILD_ERROR', dt("All projects and libraries have been excluded. Review the 'projects' and 'libraries' options."));
+    }
+  }
+
+  return $info;
+}
+
 function make_validate_info_file($info) {
   // Assume no errors to start.
   $errors = FALSE;
