     }
 
     self.testTarget = testTarget
-  }
-
-  func parseCompilerOptions(yaml: Yaml) {
+    return nil
+  }
+
+  func parseCompilerOptions(yaml: Yaml) -> ParsingError? {
     let options = yaml.string
 
     if options == nil {
-      printAndExit("Invalid (non-string) compiler options")
+      return ParsingError(message: "Invalid (non-string) compiler options")
     }
 
     self.compilerOptions = options!
+    return nil
   }
 
 

    dependencies.append(dep)
  }

  func parseTestTarget(yaml: Yaml) {
    var testTarget = TestTarget()

    if let hasSources = yaml["sources"].array {

  var testTarget: TestTarget?
  var testCompilerOptions: String = ""

  struct ParsingError {
    let message: String
  }

  func parseFromString(string: String) -> ParsingError? {
    let yaml = Yaml.load(string)

    if let error = yaml.error {
      return ParsingError(message: error)
    }

    // Map names to processors
    let unfailableActionMap = [
      "name":                   self.parseName,
      "version":                self.parseVersion,
      "sources":                self.parseSources,
