changeset 17163:30dda118ef3d

mx: added support for extending distributions; require list literals for list attributes in projects.py
author Doug Simon <doug.simon@oracle.com>
date Fri, 19 Sep 2014 17:46:35 +0200
parents 4a955509b98a
children 65c75f0bfc7b
files mx/projects.py mxtool/mx.py
diffstat 2 files changed, 231 insertions(+), 278 deletions(-) [+]
line wrap: on
line diff
--- a/mx/projects.py	Fri Sep 19 14:29:28 2014 +0200
+++ b/mx/projects.py	Fri Sep 19 17:46:35 2014 +0200
@@ -16,9 +16,7 @@
         "http://repo1.maven.org/maven2/junit/junit/4.11/junit-4.11-sources.jar",
       ],
       "sourceSha1" : "28e0ad201304e4a4abf999ca0570b7cffc352c3c",
-      "dependencies" : [
-        "HAMCREST",
-      ],
+      "dependencies" : ["HAMCREST"],
     },
 
     "HAMCREST" : {
@@ -38,9 +36,7 @@
 
     "HCFDIS" : {
       "path" : "lib/hcfdis-2.jar",
-      "urls" : [
-        "http://lafo.ssw.uni-linz.ac.at/hcfdis-2.jar",
-      ],
+      "urls" : ["http://lafo.ssw.uni-linz.ac.at/hcfdis-2.jar"],
       "sha1" : "bc8b2253436485e9dbaf81771c259ccfa1a24c80",
     },
 
@@ -55,17 +51,13 @@
 
     "C1VISUALIZER_DIST" : {
       "path" : "lib/c1visualizer_2014-04-22.zip",
-      "urls" : [
-        "https://java.net/downloads/c1visualizer/c1visualizer_2014-04-22.zip",
-      ],
+      "urls" : ["https://java.net/downloads/c1visualizer/c1visualizer_2014-04-22.zip"],
       "sha1" : "220488d87affb569b893c7201f8ce5d2b0e03141",
     },
 
     "JOL_INTERNALS" : {
       "path" : "lib/jol-internals.jar",
-      "urls" : [
-        "http://lafo.ssw.uni-linz.ac.at/truffle/jol/jol-internals.jar",
-      ],
+      "urls" : ["http://lafo.ssw.uni-linz.ac.at/truffle/jol/jol-internals.jar"],
       "sha1" : "508bcd26a4d7c4c44048990c6ea789a3b11a62dc",
     },
 
@@ -89,17 +81,13 @@
 
     "JACOCOAGENT" : {
       "path" : "lib/jacocoagent.jar",
-      "urls" : [
-        "http://lafo.ssw.uni-linz.ac.at/jacoco/jacocoagent-0.7.1-1.jar",
-      ],
+      "urls" : ["http://lafo.ssw.uni-linz.ac.at/jacoco/jacocoagent-0.7.1-1.jar"],
       "sha1" : "2f73a645b02e39290e577ce555f00b02004650b0",
     },
 
     "JACOCOREPORT" : {
       "path" : "lib/jacocoreport.jar",
-      "urls" : [
-        "http://lafo.ssw.uni-linz.ac.at/jacoco/jacocoreport-0.7.1-2.jar",
-      ],
+      "urls" : ["http://lafo.ssw.uni-linz.ac.at/jacoco/jacocoreport-0.7.1-2.jar"],
       "sha1" : "a630436391832d697a12c8f7daef8655d7a1efd2",
     },
 
@@ -160,9 +148,7 @@
     "JAVA_ALLOCATION_INSTRUMENTER" : {
       "path" : "lib/java-allocation-instrumenter.jar",
       "sourcePath" : "lib/java-allocation-instrumenter.jar",
-      "urls" : [
-        "http://lafo.ssw.uni-linz.ac.at/java-allocation-instrumenter/java-allocation-instrumenter-8f0db117e64e.jar",
-      ],
+      "urls" : ["http://lafo.ssw.uni-linz.ac.at/java-allocation-instrumenter/java-allocation-instrumenter-8f0db117e64e.jar"],
       "sha1" : "476d9a44cd19d6b55f81571077dfa972a4f8a083",
       "bootClassPathAgent" : "true",
     },
@@ -186,7 +172,7 @@
   "projects" : {
     "com.oracle.nfi" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.7",
@@ -194,7 +180,7 @@
 
     "com.oracle.nfi.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "test",
+      "sourceDirs" : ["test"],
       "dependencies" : [
         "com.oracle.nfi",
         "com.oracle.graal.compiler.common",
@@ -206,7 +192,7 @@
 
     "com.oracle.graal.api.collections" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "API,Graal",
@@ -214,7 +200,7 @@
 
     "com.oracle.graal.api.runtime" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "API,Graal",
@@ -222,7 +208,7 @@
 
     "com.oracle.graal.api.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "JUNIT",
         "com.oracle.graal.api.runtime",
@@ -234,7 +220,7 @@
 
     "com.oracle.graal.api.meta" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "API,Graal",
@@ -242,7 +228,7 @@
 
     "com.oracle.graal.api.meta.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "JUNIT",
         "com.oracle.graal.runtime",
@@ -255,10 +241,8 @@
 
     "com.oracle.graal.api.code" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.api.meta",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.api.meta"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "API,Graal",
@@ -266,10 +250,8 @@
 
     "com.oracle.graal.api.replacements" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.api.meta",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.api.meta"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "API,Graal,Replacements",
@@ -277,10 +259,8 @@
 
     "com.oracle.graal.service.processor" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.api.runtime",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.api.runtime"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Codegen,HotSpot",
@@ -288,10 +268,8 @@
 
     "com.oracle.graal.amd64" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.api.code",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.api.code"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,AMD64",
@@ -299,10 +277,8 @@
 
     "com.oracle.graal.ptx" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.api.code",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.api.code"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,PTX",
@@ -310,10 +286,8 @@
 
     "com.oracle.graal.sparc" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.api.code",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.api.code"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,SPARC",
@@ -321,19 +295,17 @@
 
     "com.oracle.graal.hotspotvmconfig" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.compiler.common",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.compiler.common"],
       "checkstyle" : "com.oracle.graal.graph",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,HotSpot",
     },
 
     "com.oracle.graal.hotspot" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.replacements",
         "com.oracle.graal.runtime",
@@ -343,14 +315,17 @@
         "com.oracle.nfi",
       ],
       "checkstyle" : "com.oracle.graal.graph",
-      "annotationProcessors" : "com.oracle.graal.replacements.verifier,com.oracle.graal.service.processor",
+      "annotationProcessors" : [
+        "com.oracle.graal.replacements.verifier",
+        "com.oracle.graal.service.processor",
+      ],
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,HotSpot",
     },
 
     "com.oracle.graal.hotspot.loader" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
@@ -359,10 +334,8 @@
 
     "com.oracle.graal.hotspot.sourcegen" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.hotspot",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.hotspot"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,HotSpot",
@@ -370,13 +343,13 @@
 
     "com.oracle.graal.hotspot.jfr" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.hotspot",
         "JFR",
       ],
       "checkstyle" : "com.oracle.graal.graph",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "javaCompliance" : "1.8",
       "profile" : "",
       "workingSets" : "Graal,HotSpot",
@@ -384,33 +357,31 @@
 
     "com.oracle.graal.hotspot.amd64" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.compiler.amd64",
         "com.oracle.graal.hotspot",
         "com.oracle.graal.replacements.amd64",
       ],
       "checkstyle" : "com.oracle.graal.graph",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,HotSpot,AMD64",
     },
 
     "com.oracle.graal.hotspot.sparc" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.compiler.sparc",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.compiler.sparc"],
       "checkstyle" : "com.oracle.graal.graph",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,HotSpot,SPARC",
     },
 
     "com.oracle.graal.hotspot.ptx" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.ptx",
         "com.oracle.graal.compiler.ptx",
@@ -418,31 +389,29 @@
         "com.oracle.graal.gpu",
       ],
       "checkstyle" : "com.oracle.graal.graph",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,HotSpot,PTX",
     },
 
     "com.oracle.graal.hotspot.hsail" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.replacements.hsail",
         "com.oracle.graal.hotspot",
         "com.oracle.graal.gpu",
       ],
       "checkstyle" : "com.oracle.graal.graph",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,HotSpot,PTX",
     },
 
     "com.oracle.graal.hotspot.server" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.hotspot",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.hotspot"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,HotSpot",
@@ -450,7 +419,7 @@
 
     "com.oracle.graal.hotspot.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.replacements.test",
         "com.oracle.graal.hotspot",
@@ -462,7 +431,7 @@
 
     "com.oracle.graal.hotspot.amd64.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.asm.amd64",
         "com.oracle.graal.compiler.test",
@@ -475,7 +444,7 @@
 
     "com.oracle.graal.options" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Codegen",
@@ -483,7 +452,7 @@
 
     "com.oracle.graal.options.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.options",
         "JUNIT",
@@ -495,7 +464,7 @@
 
     "com.oracle.graal.nodeinfo" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Graph",
@@ -503,7 +472,7 @@
 
     "com.oracle.graal.nodeinfo.processor" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.graal.graph",
       "dependencies" : [
         "com.oracle.graal.nodeinfo",
@@ -515,7 +484,7 @@
 
     "com.oracle.graal.graph" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.nodeinfo",
         "com.oracle.graal.debug",
@@ -525,13 +494,13 @@
         "FINDBUGS",
       ],
       "javaCompliance" : "1.8",
-      "annotationProcessors" : "com.oracle.graal.nodeinfo.processor",
+      "annotationProcessors" : ["com.oracle.graal.nodeinfo.processor"],
       "workingSets" : "Graal,Graph",
     },
 
     "com.oracle.graal.graph.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.graal.graph",
       "dependencies" : [
         "JUNIT",
@@ -543,7 +512,7 @@
 
     "com.oracle.graal.debug" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Debug",
@@ -551,7 +520,7 @@
 
     "com.oracle.graal.debug.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "JUNIT",
         "com.oracle.graal.debug",
@@ -563,7 +532,7 @@
 
     "com.oracle.graal.lir" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.compiler.common",
         "com.oracle.graal.asm",
@@ -576,7 +545,7 @@
 
     "com.oracle.graal.lir.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "JUNIT",
         "com.oracle.graal.lir",
@@ -588,7 +557,7 @@
 
     "com.oracle.graal.lir.amd64" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.lir",
         "com.oracle.graal.asm.amd64",
@@ -600,10 +569,8 @@
 
     "com.oracle.graal.lir.ptx" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.asm.ptx",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.asm.ptx"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,LIR,PTX",
@@ -611,10 +578,8 @@
 
     "com.oracle.graal.lir.sparc" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.asm.sparc",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.asm.sparc"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,LIR,SPARC",
@@ -622,10 +587,8 @@
 
     "com.oracle.graal.alloc" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.compiler.common",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.compiler.common"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal",
@@ -633,10 +596,8 @@
 
     "com.oracle.graal.word" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.phases",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.phases"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "API,Graal",
@@ -644,7 +605,7 @@
 
     "com.oracle.graal.replacements" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.compiler",
         "com.oracle.graal.java",
@@ -652,28 +613,27 @@
       ],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
-      "annotationProcessors" : "com.oracle.graal.replacements.verifier,com.oracle.graal.service.processor",
+      "annotationProcessors" : [
+        "com.oracle.graal.replacements.verifier",
+        "com.oracle.graal.service.processor",
+      ],
       "workingSets" : "Graal,Replacements",
     },
 
     "com.oracle.graal.replacements.amd64" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.replacements",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.replacements"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "workingSets" : "Graal,Replacements,AMD64",
     },
 
     "com.oracle.graal.replacements.hsail" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.compiler.hsail",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.compiler.hsail"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Replacements,HSAIL",
@@ -681,7 +641,7 @@
 
     "com.oracle.graal.replacements.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.compiler.test",
         "com.oracle.graal.replacements",
@@ -693,7 +653,7 @@
 
     "com.oracle.graal.replacements.verifier" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.api.replacements",
         "com.oracle.graal.graph",
@@ -705,7 +665,7 @@
 
     "com.oracle.graal.nodes" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.graph",
         "com.oracle.graal.api.replacements",
@@ -713,16 +673,14 @@
       ],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
-      "annotationProcessors" : "com.oracle.graal.replacements.verifier",
+      "annotationProcessors" : ["com.oracle.graal.replacements.verifier"],
       "workingSets" : "Graal,Graph",
     },
 
     "com.oracle.graal.nodes.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.compiler.test",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.compiler.test"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Graph",
@@ -730,10 +688,8 @@
 
     "com.oracle.graal.phases" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.nodes",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.nodes"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Phases",
@@ -741,10 +697,8 @@
 
     "com.oracle.graal.phases.common" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.phases",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.phases"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Phases",
@@ -752,10 +706,8 @@
 
     "com.oracle.graal.virtual" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.phases.common",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.phases.common"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Phases",
@@ -763,10 +715,8 @@
 
     "com.oracle.graal.loop" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.phases.common",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.phases.common"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Phases",
@@ -774,7 +724,7 @@
 
     "com.oracle.graal.compiler" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.virtual",
         "com.oracle.graal.loop",
@@ -782,13 +732,13 @@
       ],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "workingSets" : "Graal",
     },
 
     "com.oracle.graal.compiler.amd64" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.compiler",
         "com.oracle.graal.lir.amd64",
@@ -800,10 +750,8 @@
 
     "com.oracle.graal.compiler.amd64.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.compiler.test",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.compiler.test"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,AMD64,Test",
@@ -811,7 +759,7 @@
 
     "com.oracle.graal.compiler.ptx" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.lir.ptx",
         "com.oracle.graal.compiler",
@@ -823,7 +771,7 @@
 
     "com.oracle.graal.compiler.ptx.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.hotspot.ptx",
         "com.oracle.graal.compiler.test",
@@ -835,10 +783,8 @@
 
     "com.oracle.graal.compiler.sparc" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.lir.sparc",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.lir.sparc"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,SPARC",
@@ -846,10 +792,8 @@
 
     "com.oracle.graal.compiler.sparc.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.compiler.test",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.compiler.test"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,SPARC,Test",
@@ -857,10 +801,8 @@
 
     "com.oracle.graal.runtime" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.compiler",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.compiler"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal",
@@ -868,7 +810,7 @@
 
     "com.oracle.graal.bytecode" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Java",
@@ -876,7 +818,7 @@
 
     "com.oracle.graal.java" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.phases",
         "com.oracle.graal.bytecode",
@@ -888,7 +830,7 @@
 
     "com.oracle.graal.compiler.common" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.api.code",
         "com.oracle.graal.options",
@@ -900,7 +842,7 @@
 
     "com.oracle.graal.baseline" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.compiler",
         "com.oracle.graal.java",
@@ -912,10 +854,8 @@
 
     "com.oracle.graal.java.decompiler" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.java",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.java"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal",
@@ -923,7 +863,7 @@
 
     "com.oracle.graal.java.decompiler.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "JUNIT",
         "com.oracle.graal.printer",
@@ -936,7 +876,7 @@
 
     "com.oracle.graal.printer" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.java.decompiler",
         "com.oracle.graal.compiler",
@@ -948,7 +888,7 @@
 
     "com.oracle.graal.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "JUNIT",
         "com.oracle.graal.debug",
@@ -960,7 +900,7 @@
 
     "com.oracle.graal.compiler.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.test",
         "com.oracle.graal.printer",
@@ -975,7 +915,7 @@
 
     "com.oracle.graal.jtt" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.compiler.test",
         "ASM",
@@ -987,10 +927,8 @@
 
     "com.oracle.graal.asm" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.api.code",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.api.code"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Assembler",
@@ -998,7 +936,7 @@
 
     "com.oracle.graal.asm.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.test",
         "com.oracle.graal.runtime",
@@ -1010,7 +948,7 @@
 
     "com.oracle.graal.asm.amd64" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.asm",
         "com.oracle.graal.amd64",
@@ -1022,7 +960,7 @@
 
     "com.oracle.graal.asm.amd64.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.asm.test",
         "com.oracle.graal.asm.amd64",
@@ -1034,27 +972,23 @@
 
     "com.oracle.graal.gpu" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.nodes",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.nodes"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
     },
 
     "com.oracle.graal.hsail" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.api.code",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.api.code"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
     },
 
     "com.oracle.graal.lir.hsail" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.lir",
         "com.oracle.graal.asm.hsail",
@@ -1065,7 +999,7 @@
 
     "com.oracle.graal.compiler.hsail" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.compiler",
         "com.oracle.graal.lir.hsail",
@@ -1076,7 +1010,7 @@
 
     "com.oracle.graal.compiler.hsail.test.infra" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.test",
         "com.oracle.graal.hotspot.hsail",
@@ -1088,7 +1022,7 @@
 
     "com.oracle.graal.compiler.hsail.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.compiler.hsail.test.infra",
         "com.oracle.graal.compiler.test",
@@ -1100,7 +1034,7 @@
 
     "com.oracle.graal.asm.hsail" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.hsail",
         "OKRA",
@@ -1113,10 +1047,8 @@
 
     "com.oracle.graal.asm.ptx" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.graal.lir",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.graal.lir"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
       "workingSets" : "Graal,Assembler,PTX",
@@ -1124,7 +1056,7 @@
 
     "com.oracle.graal.asm.sparc" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.hotspot",
         "com.oracle.graal.sparc",
@@ -1136,7 +1068,7 @@
 
     "com.oracle.truffle.api" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [],
       "javaCompliance" : "1.7",
       "workingSets" : "API,Truffle",
@@ -1144,7 +1076,7 @@
 
     "com.oracle.truffle.api.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.truffle.api",
         "JUNIT",
@@ -1156,10 +1088,8 @@
 
     "com.oracle.truffle.api.dsl" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.truffle.api",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.truffle.api"],
       "checkstyle" : "com.oracle.truffle.api",
       "javaCompliance" : "1.7",
       "workingSets" : "API,Truffle,Codegen",
@@ -1167,23 +1097,21 @@
 
     "com.oracle.truffle.api.dsl.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.truffle.api.dsl",
         "JUNIT",
       ],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.7",
-      "annotationProcessors" : "com.oracle.truffle.dsl.processor",
+      "annotationProcessors" : ["com.oracle.truffle.dsl.processor"],
       "workingSets" : "API,Truffle,Codegen,Test",
     },
 
     "com.oracle.truffle.dsl.processor" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.truffle.api.dsl",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.truffle.api.dsl"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.7",
       "workingSets" : "Truffle,Codegen",
@@ -1191,19 +1119,17 @@
 
     "com.oracle.truffle.sl" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
-      "dependencies" : [
-        "com.oracle.truffle.api.dsl",
-      ],
+      "sourceDirs" : ["src"],
+      "dependencies" : ["com.oracle.truffle.api.dsl"],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
-      "annotationProcessors" : "com.oracle.truffle.dsl.processor",
+      "annotationProcessors" : ["com.oracle.truffle.dsl.processor"],
       "workingSets" : "Truffle,SimpleLanguage",
     },
 
     "com.oracle.truffle.sl.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.truffle.sl",
         "JUNIT",
@@ -1215,7 +1141,7 @@
 
     "com.oracle.graal.truffle" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.truffle.api",
         "com.oracle.graal.replacements",
@@ -1229,7 +1155,7 @@
 
     "com.oracle.graal.truffle.test" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.truffle",
         "com.oracle.graal.compiler.test",
@@ -1242,27 +1168,27 @@
 
     "com.oracle.graal.truffle.hotspot" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.truffle",
         "com.oracle.graal.hotspot",
       ],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "workingSets" : "Graal,Truffle",
     },
 
     "com.oracle.graal.truffle.hotspot.amd64" : {
       "subDir" : "graal",
-      "sourceDirs" : "src",
+      "sourceDirs" : ["src"],
       "dependencies" : [
         "com.oracle.graal.truffle.hotspot",
         "com.oracle.graal.asm.amd64",
       ],
       "checkstyle" : "com.oracle.graal.graph",
       "javaCompliance" : "1.8",
-      "annotationProcessors" : "com.oracle.graal.service.processor",
+      "annotationProcessors" : ["com.oracle.graal.service.processor"],
       "workingSets" : "Graal,Truffle",
     }
   },
@@ -1280,16 +1206,14 @@
         "com.oracle.graal.hotspot.jfr",
         "com.oracle.graal.hotspot.hsail",
       ],
-      "exclude" : "FINDBUGS",
+      "exclude" : ["FINDBUGS"],
     },
 
     "GRAAL_LOADER" : {
       "path" : "build/graal-loader.jar",
       "subDir" : "graal",
       "sourcesPath" : "build/graal-loader.src.zip",
-      "dependencies" : [
-        "com.oracle.graal.hotspot.loader",
-      ],
+      "dependencies" : ["com.oracle.graal.hotspot.loader"],
     },
 
     "TRUFFLE" : {
@@ -1311,8 +1235,11 @@
         "com.oracle.graal.truffle",
         "com.oracle.graal.truffle.hotspot.amd64",
       ],
-      "exclude" : "FINDBUGS",
-      "distDependencies" : "GRAAL,TRUFFLE",
+      "exclude" : ["FINDBUGS"],
+      "distDependencies" : [
+        "GRAAL",
+        "TRUFFLE",
+      ],
     },
 
     "TRUFFLE-DSL-PROCESSOR" : {
@@ -1320,10 +1247,9 @@
       "subDir" : "graal",
       "sourcesPath" : "build/truffle-dsl-processor.src.zip",
       "javaCompliance" : "1.7",
-      "dependencies" : [
-        "com.oracle.truffle.dsl.processor",
-      ],
-      "distDependencies" : "TRUFFLE",
+      "dependencies" : ["com.oracle.truffle.dsl.processor"],
+      "distDependencies" : ["TRUFFLE"],
     }
-  }
+  },
+
 }
--- a/mxtool/mx.py	Fri Sep 19 14:29:28 2014 +0200
+++ b/mxtool/mx.py	Fri Sep 19 17:46:35 2014 +0200
@@ -871,22 +871,28 @@
         def dec(self):
             self.prefix = ''.rjust(len(self.prefix) - self.indent)
 
+    list_attrs = ['urls', 'dependencies', 'sourceUrls', 'sourceDirs', 'annotationProcessors', 'exclude', 'distDependencies']
+
     for projectsFile in args:
         suite = _read_projects_file(projectsFile)
-        def print_attrs(p, name, attrs, listKeys, is_last=False):
+        def print_attrs(p, name, attrs, is_last=False):
             p.println('"' + name + '" : {')
             p.inc()
             for n, v in attrs.iteritems():
-                if n in listKeys:
+                if n in list_attrs:
                     if len(v) == 0:
                         p.println('"{}" : [],'.format(n))
                     else:
-                        p.println('"{}" : ['.format(n))
-                        p.inc()
-                        for e in v.split(','):
-                            p.println('"' + e.strip() + '",')
-                        p.dec()
-                        p.println('],')
+                        v = [e.strip() for e in v.split(',')]
+                        if len(v) == 1:
+                            p.println('"{}" : ["{}"],'.format(n, v[0]))
+                        else:
+                            p.println('"{}" : ['.format(n))
+                            p.inc()
+                            for e in v:
+                                p.println('"' + e + '",')
+                            p.dec()
+                            p.println('],')
                 else:
                     p.println('"{}" : "{}",'.format(n, v))
             p.dec()
@@ -904,7 +910,7 @@
                 i = 0
                 for name, attrs in section.iteritems():
                     i = i + 1
-                    print_attrs(p, name, attrs, ['urls', 'dependencies', 'sourceUrls'], i == len(section))
+                    print_attrs(p, name, attrs, i == len(section))
 
                 p.dec()
                 if is_last:
@@ -918,9 +924,16 @@
             assert existing['name'] == suite.pop('name')
             assert existing['mxversion'] == suite.pop('mxversion')
             for s in ['projects', 'libraries', 'jrelibraries', 'distributions']:
+                section = suite[s]
                 for k in existing[s].iterkeys():
-                    suite[s].pop(k)
-                if len(suite[s]) == 0:
+                    duplicate = section.pop(k)
+                    if duplicate and s == 'distributions':
+                        original = existing[s][k]
+                        extensions = [d for d in duplicate['dependencies'].split(',') if d not in original['dependencies']]
+                        if len(extensions):
+                            extensions = ','.join(extensions)
+                            suite.setdefault('distribution_extensions', {})[k] = {'dependencies' : extensions}
+                if len(section) == 0:
                     suite.pop(s)
 
         if len(suite):
@@ -934,7 +947,10 @@
             print_section(p, 'libraries', suite)
             print_section(p, 'jrelibraries', suite)
             print_section(p, 'projects', suite)
-            print_section(p, 'distributions', suite, is_last=True)
+            print_section(p, 'distributions', suite)
+            if existing and suite.has_key('distribution_extensions'):
+                print_section(p, 'distribution_extensions', suite, is_last=True)
+
             p.dec()
             p.println('}')
 
@@ -981,7 +997,7 @@
         if not hasattr(module, dictName):
             abort(modulePath + ' must define a variable named "' + dictName + '"')
         d = getattr(module, dictName)
-        sections = ['projects', 'libraries', 'jrelibraries', 'distributions'] + ([] if suite else ['name', 'mxversion'])
+        sections = ['projects', 'libraries', 'jrelibraries', 'distributions'] + (['distribution_extensions'] if suite else ['name', 'mxversion'])
         unknown = d.viewkeys() - sections
         if unknown:
             abort(modulePath + ' defines unsupported suite sections: ' + ', '.join(unknown))
@@ -1000,6 +1016,19 @@
                         if conflicting:
                             abort(modulePath + ' redefines: ' + ', '.join(conflicting))
                         existing.update(additional)
+            distExtensions = d.get('distribution_extensions')
+            if distExtensions:
+                existing = suite['distributions']
+                for n, attrs in distExtensions.iteritems():
+                    original = existing.get(n)
+                    if not original:
+                        abort('cannot extend non-existing distribution ' + n)
+                    for k, v in attrs.iteritems():
+                        if k != 'dependencies':
+                            abort('Only the dependencies of distribution ' + n + ' can be extended')
+                        if not isinstance(v, types.ListType):
+                            abort('distribution_extensions.' + n + '.dependencies must be a list')
+                        original['dependencies'] += v
 
         dictName = 'extra'
         moduleName = 'projects' + str(suffix)
@@ -1056,18 +1085,19 @@
         projsMap = suiteDict['projects']
         distsMap = suiteDict['distributions']
 
-        def pop_list(attrs, name):
+        def pop_list(attrs, name, context):
             v = attrs.pop(name, None)
-            if isinstance(v, list):
-                return v
-            if v is None or len(v.strip()) == 0:
+            if not v:
                 return []
-            return [n.strip() for n in v.split(',')]
+            if not isinstance(v, list):
+                abort('Attribute "' + name + '" for ' + context + ' must be a list')
+            return v
 
         for name, attrs in projsMap.iteritems():
-            srcDirs = pop_list(attrs, 'sourceDirs')
-            deps = pop_list(attrs, 'dependencies')
-            ap = pop_list(attrs, 'annotationProcessors')
+            context = 'project ' + name
+            srcDirs = pop_list(attrs, 'sourceDirs', context)
+            deps = pop_list(attrs, 'dependencies', context)
+            ap = pop_list(attrs, 'annotationProcessors', context)
             javaCompliance = attrs.pop('javaCompliance', None)
             subDir = attrs.pop('subDir', None)
             if subDir is None:
@@ -1093,6 +1123,7 @@
             self.jreLibs.append(l)
 
         for name, attrs in libsMap.iteritems():
+            context = 'library ' + name
             if "|" in name:
                 if name.count('|') != 2:
                     abort("Format error in library name: " + name + "\nsyntax: libname|os-platform|architecture")
@@ -1100,12 +1131,12 @@
                 if platform != get_os() or architecture != get_arch():
                     continue
             path = attrs.pop('path')
-            urls = pop_list(attrs, 'urls')
+            urls = pop_list(attrs, 'urls', context)
             sha1 = attrs.pop('sha1', None)
             sourcePath = attrs.pop('sourcePath', None)
-            sourceUrls = pop_list(attrs, 'sourceUrls')
+            sourceUrls = pop_list(attrs, 'sourceUrls', context)
             sourceSha1 = attrs.pop('sourceSha1', None)
-            deps = pop_list(attrs, 'dependencies')
+            deps = pop_list(attrs, 'dependencies', context)
             # Add support optional libraries once we have a good use case
             optional = False
             l = Library(self, name, path, optional, urls, sha1, sourcePath, sourceUrls, sourceSha1, deps)
@@ -1113,12 +1144,13 @@
             self.libs.append(l)
 
         for name, attrs in distsMap.iteritems():
+            context = 'distribution ' + name
             path = attrs.pop('path')
             sourcesPath = attrs.pop('sourcesPath', None)
-            deps = pop_list(attrs, 'dependencies')
+            deps = pop_list(attrs, 'dependencies', context)
             mainClass = attrs.pop('mainClass', None)
-            exclDeps = pop_list(attrs, 'exclude')
-            distDeps = pop_list(attrs, 'distDependencies')
+            exclDeps = pop_list(attrs, 'exclude', context)
+            distDeps = pop_list(attrs, 'distDependencies', context)
             javaCompliance = attrs.pop('javaCompliance', None)
             d = Distribution(self, name, path, sourcesPath, deps, mainClass, exclDeps, distDeps, javaCompliance)
             d.__dict__.update(attrs)
@@ -1172,7 +1204,7 @@
                 self.dists.append(d)
 
         if self.name is None:
-            abort('Missing "suite=<name>" in ' + projectsFile)
+            abort('Missing "suite=<name>" in ' + projectsPyFile)
 
     def _commands_name(self):
         return 'mx_' + self.name.replace('-', '_')
@@ -3056,10 +3088,6 @@
 
     nonCanonical = []
     for s in suites(True):
-        projectsPyFile = join(s.mxDir, 'projects')
-        if not exists(projectsPyFile):
-            continue
-
         for p in s.projects:
             for pkg in p.defined_java_packages():
                 if not pkg.startswith(p.name):
@@ -3543,8 +3571,8 @@
 
 def _check_ide_timestamp(suite, configZip, ide):
     """return True if and only if the projects file, eclipse-settings files, and mx itself are all older than configZip"""
-    projectsFile = join(suite.mxDir, 'projects')
-    if configZip.isOlderThan(projectsFile):
+    projectsPyFiles = [join(suite.mxDir, e) for e in os.listdir(suite.mxDir) if e.startswith('projects') and e.endswith('.py')]
+    if configZip.isOlderThan(projectsPyFiles):
         return False
     # Assume that any mx change might imply changes to the generated IDE files
     if configZip.isOlderThan(__file__):
@@ -5087,9 +5115,8 @@
 def show_projects(args):
     """show all loaded projects"""
     for s in suites():
-        projectsFile = join(s.mxDir, 'projects')
-        if exists(projectsFile):
-            log(projectsFile)
+        if len(s.projects) != 0:
+            log(join(s.mxDir, 'projects*.py'))
             for p in s.projects:
                 log('\t' + p.name)
 
@@ -5177,7 +5204,7 @@
         for f in os.listdir(d):
             if (mxDirName == None and (f == 'mx' or fnmatch.fnmatch(f, 'mx.*'))) or f == mxDirName:
                 mxDir = join(d, f)
-                if exists(mxDir) and isdir(mxDir) and exists(join(mxDir, 'projects')):
+                if exists(mxDir) and isdir(mxDir) and (exists(join(mxDir, 'projects.py')) or exists(join(mxDir, 'projects'))):
                     return mxDir
 
 def _check_primary_suite():