commandline option to specify output base directory.
diff --git a/generateCpp.cpp b/generateCpp.cpp
index f9b1189..4d80b06 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -66,19 +66,19 @@
     return out;
 }
 
-status_t AST::generateCpp() const {
-    status_t err = generateInterfaceHeader();
+status_t AST::generateCpp(const std::string &outputPath) const {
+    status_t err = generateInterfaceHeader(outputPath);
 
     if (err == OK) {
-        err = generateStubHeader();
+        err = generateStubHeader(outputPath);
     }
 
     if (err == OK) {
-        err = generateProxyHeader();
+        err = generateProxyHeader(outputPath);
     }
 
     if (err == OK) {
-        err = generateAllSource();
+        err = generateAllSource(outputPath);
     }
 
     return err;
@@ -148,11 +148,12 @@
     }
 }
 
-status_t AST::generateInterfaceHeader() const {
+status_t AST::generateInterfaceHeader(const std::string &outputPath) const {
     const std::string packagePath =
         mCoordinator->getPackagePath(mPackage, true /* relative */);
 
-    std::string path = "/tmp/android/hardware/";
+    std::string path = outputPath;
+    path.append("android/hardware/");
     path.append(packagePath);
 
     std::string ifaceName;
@@ -287,7 +288,7 @@
     return mRootScope->emitTypeDeclarations(out);
 }
 
-status_t AST::generateStubHeader() const {
+status_t AST::generateStubHeader(const std::string &outputPath) const {
     std::string ifaceName;
     if (!AST::isInterface(&ifaceName)) {
         // types.hal does not get a stub header.
@@ -300,7 +301,8 @@
     // cut off the leading 'I'.
     const std::string baseName = ifaceName.substr(1);
 
-    std::string path = "/tmp/android/hardware/";
+    std::string path = outputPath;
+    path.append("android/hardware/");
     path.append(packagePath);
     path.append("Bn");
     path.append(baseName);
@@ -364,7 +366,7 @@
     return OK;
 }
 
-status_t AST::generateProxyHeader() const {
+status_t AST::generateProxyHeader(const std::string &outputPath) const {
     std::string ifaceName;
     if (!AST::isInterface(&ifaceName)) {
         // types.hal does not get a proxy header.
@@ -377,7 +379,8 @@
     // cut off the leading 'I'.
     const std::string baseName = ifaceName.substr(1);
 
-    std::string path = "/tmp/android/hardware/";
+    std::string path = outputPath;
+    path.append("android/hardware/");
     path.append(packagePath);
     path.append("Bp");
     path.append(baseName);
@@ -456,11 +459,12 @@
     return OK;
 }
 
-status_t AST::generateAllSource() const {
+status_t AST::generateAllSource(const std::string &outputPath) const {
     const std::string packagePath =
         mCoordinator->getPackagePath(mPackage, true /* relative */);
 
-    std::string path = "/tmp/android/hardware/";
+    std::string path = outputPath;
+    path.append("android/hardware/");
     path.append(packagePath);
 
     std::string ifaceName;