Put subproject options in their own submenus.
diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py
index 76efdac..25e05b2 100644
--- a/mesonbuild/mintro.py
+++ b/mesonbuild/mintro.py
@@ -85,36 +85,73 @@
     sources = [os.path.join(i.subdir, i.fname) for i in sources]
     print(json.dumps(sources))
 
+def split_options(user_options, suboptions):
+    main_options = {}
+    main_suboptions = {}
+    subproject_options = {}
+    subproject_suboptions = {} 
+    for k in user_options.keys():
+        if ':' in k:
+            subproject_options[k] = user_options[k]
+        else:
+            main_options[k] = user_options[k]
+    for k in suboptions.keys():
+        if ':' in k:
+            subproject_suboptions[k] = suboptions[k]
+        else:
+            main_suboptions[k] = suboptions[k]
+    return (main_options, main_suboptions, subproject_options, subproject_suboptions)
+
 def list_buildoptions(coredata, builddata):
+    (main_options, main_suboptions, subproject_options, subproject_suboptions) = split_options(coredata.user_options, coredata.suboptions)
     all_opt = [{'name' : 'builtin',
                 'description': 'Meson builtin options',
                 'type': 'suboption',
                 'value': get_keys(coredata.builtins),
                 }]
-    all_opt.append({'name': 'user',
-                    'description' : 'User defined options',
+    all_opt.append({'name': 'base',
+                    'description' : 'Base options',
                     'type' : 'suboption',
-                    'value' : build_usertree(coredata.suboptions, coredata.user_options),
+                    'value' : get_keys(coredata.base_options),
                     })
     all_opt.append({'name' : 'compilers',
                     'description' : 'Options for compilers',
                     'type' : 'suboption',
                     'value' : get_keys(coredata.compiler_options),
                     })
-    all_opt.append({'name': 'base',
-                    'description' : 'Base options',
+    all_opt.append({'name': 'user',
+                    'description' : 'User options',
                     'type' : 'suboption',
-                    'value' : get_keys(coredata.base_options),
+                    'value' : build_usertree(main_options, main_suboptions),
                     })
+    all_opt += build_subprojecttree(subproject_options, subproject_suboptions)
     print(json.dumps(all_opt, indent=2))
 
-def build_usertree(suboptions, user_options, subbranch=None):
+def build_subprojecttree(options, suboptions):
+    result = []
+    sp_names = {}
+    for n in options.keys():
+        sp_names[n.split(':')[0]] = True
+    for n in suboptions.keys():
+        sp_names[n.split(':')[0]] = True
+    for subproject in sorted(sp_names.keys()):
+        prefix = subproject + ':'
+        cur_opt = {x.name : x for x in options.values() if x.name.startswith(prefix)}
+        cur_subopt = {x.name : x for x in suboptions.values() if x.name.startswith(prefix)}
+        result.append({'name' : subproject,
+                      'description' : 'Options of subproject: %s' % subproject,
+                      'type' : 'suboption',
+                      'value' :  build_usertree(cur_opt, cur_subopt)
+                      })
+    return result
+
+def build_usertree(user_options, suboptions, subbranch=None):
     current = []
     current_suboptions = [x for x in suboptions.values() if x.parent == subbranch]
     current_options = [x for x in user_options.values() if x.parent == subbranch]
     for so in current_suboptions:
         subentry = {'type' : 'subobject',
-                    'value' : build_usertree(suboptions, user_options, so.name),
+                    'value' : build_usertree(user_options, suboptions, so.name),
                     'description' : so.description,
                     'name' : so.name
                     }