Index: driver/cfa.cc
===================================================================
--- driver/cfa.cc	(revision 4f5a8a2441acf4d1cea809cdd5b210abd06f4f3f)
+++ driver/cfa.cc	(revision ef46abb957c5ec205f92086a02aa05485f684865)
@@ -76,4 +76,8 @@
         return false;
 } //dirExists
+
+static inline string dir(const string & path) {
+	return path.substr(0, path.find_last_of('/'));
+}
 
 
@@ -112,4 +116,5 @@
 	bool m64 = false;									// -m64 flag
 	bool intree = false;
+	bool disttree = false;
 
 	const char *args[argc + 100];						// cfa command line values, plus some space for additional flags
@@ -128,4 +133,9 @@
 
 	// process command-line arguments
+
+	args[nargs] = "-x";									// turn off language
+	nargs += 1;
+	args[nargs] = "c";
+	nargs += 1;
 
 	for ( int i = 1; i < argc; i += 1 ) {
@@ -171,4 +181,6 @@
 			} else if ( arg == "-in-tree" ) {
 				intree = true;
+			} else if ( arg == "-dist-tree" ) {
+				disttree = true;
 			} else if ( arg == "-compiler" ) {
 				// use the user specified compiler
@@ -380,17 +392,29 @@
 	string libdir = libbase + arch + "-" + config;
 
-	if ( ! nolib && ! dirExists( libdir ) ) {
-		cerr << argv[0] << " internal error, configuration " << config << " not installed." << endl;
-		cerr << "Was looking for " << libdir << endl;
-		libdir = libbase + arch + "-" + "nolib";
-	} // if
-
-	if ( ! dirExists( libdir ) ) {
-		cerr << argv[0] << " internal error, cannot find prelude directory." << endl;
-		cerr << "Was looking for " << libdir << endl;
-		exit( EXIT_FAILURE );
-	} // if
-
-	args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + libdir + (intree ? "/prelude" : "")) ).c_str();
+	if (!disttree) {
+		if ( ! nolib && ! dirExists( libdir ) ) {
+			cerr << argv[0] << " internal error, configuration " << config << " not installed." << endl;
+			cerr << "Was looking for " << libdir << endl;
+			for(int i = 1; i < argc; i++) {
+				cerr << argv[i] << " ";
+			}
+			cerr << endl;
+			libdir = libbase + arch + "-" + "nolib";
+		} // if
+
+		if ( ! dirExists( libdir ) ) {
+			cerr << argv[0] << " internal error, cannot find prelude directory." << endl;
+			cerr << "Was looking for " << libdir << endl;
+			exit( EXIT_FAILURE );
+		} // if
+	} // if
+
+	if(disttree) {
+		args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + dir(argv[0])) ).c_str();
+	} else if(intree) {
+		args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + libdir + "/prelude") ).c_str();
+	} else {
+		args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + libdir) ).c_str();
+	}
 	nargs += 1;
 
@@ -481,5 +505,12 @@
 
 	if ( Bprefix.length() == 0 ) {
-		Bprefix = ! intree ? installlibdir : srcdriverdir;
+		if(disttree) {
+			Bprefix = dir(argv[0]);
+		} else if(intree) {
+			Bprefix = srcdriverdir;
+		} else {
+			Bprefix = installlibdir;
+		}
+
 		if ( Bprefix[Bprefix.length() - 1] != '/' ) Bprefix += '/';
 		args[nargs] = ( *new string( string("-D__GCC_BPREFIX__=") + Bprefix ) ).c_str();
@@ -539,5 +570,4 @@
 	if ( ! quiet ) {
 		cerr << "CFA " << "Version " << Version << heading << endl;
-
 		if ( help ) {
 			cerr <<
