]> git.saurik.com Git - android/aapt.git/blobdiff - Command.cpp
Add dependency generation to Aapt for R.java
[android/aapt.git] / Command.cpp
index 739763edca34ed831a4d7815f1f25979a4b9a951..89f45df1b853f817986e7c23c2d98a64412711b2 100644 (file)
@@ -1353,6 +1353,8 @@ int doPackage(Bundle* bundle)
     status_t err;
     sp<AaptAssets> assets;
     int N;
     status_t err;
     sp<AaptAssets> assets;
     int N;
+    FILE* fp;
+    String8 dependencyFile;
 
     // -c zz_ZZ means do pseudolocalization
     ResourceFilter filter;
 
     // -c zz_ZZ means do pseudolocalization
     ResourceFilter filter;
@@ -1387,6 +1389,13 @@ int doPackage(Bundle* bundle)
 
     // Load the assets.
     assets = new AaptAssets();
 
     // Load the assets.
     assets = new AaptAssets();
+
+    // Set up the resource gathering in assets if we're trying to make R.java
+    if (bundle->getGenDependencies()) {
+        sp<FilePathStore> pathStore = new FilePathStore;
+        assets->setFullResPaths(pathStore);
+    }
+
     err = assets->slurpFromArgs(bundle);
     if (err < 0) {
         goto bail;
     err = assets->slurpFromArgs(bundle);
     if (err < 0) {
         goto bail;
@@ -1396,7 +1405,7 @@ int doPackage(Bundle* bundle)
         assets->print();
     }
 
         assets->print();
     }
 
-    // If they asked for any files that need to be compiled, do so.
+    // If they asked for any fileAs that need to be compiled, do so.
     if (bundle->getResourceSourceDirs().size() || bundle->getAndroidManifestFile()) {
         err = buildResources(bundle, assets);
         if (err != 0) {
     if (bundle->getResourceSourceDirs().size() || bundle->getAndroidManifestFile()) {
         err = buildResources(bundle, assets);
         if (err != 0) {
@@ -1410,10 +1419,29 @@ int doPackage(Bundle* bundle)
         goto bail;
     }
 
         goto bail;
     }
 
+    if (bundle->getGenDependencies()) {
+        dependencyFile = String8(bundle->getRClassDir());
+        // Make sure we have a clean dependency file to start with
+        dependencyFile.appendPath("R.d");
+        fp = fopen(dependencyFile, "w");
+        fclose(fp);
+    }
+
     // Write out R.java constants
     if (assets->getPackage() == assets->getSymbolsPrivatePackage()) {
         if (bundle->getCustomPackage() == NULL) {
             err = writeResourceSymbols(bundle, assets, assets->getPackage(), true);
     // Write out R.java constants
     if (assets->getPackage() == assets->getSymbolsPrivatePackage()) {
         if (bundle->getCustomPackage() == NULL) {
             err = writeResourceSymbols(bundle, assets, assets->getPackage(), true);
+            // Copy R.java for libraries
+            if (bundle->getExtraPackages() != NULL) {
+                // Split on colon
+                String8 libs(bundle->getExtraPackages());
+                char* packageString = strtok(libs.lockBuffer(libs.length()), ":");
+                while (packageString != NULL) {
+                    err = writeResourceSymbols(bundle, assets, String8(packageString), true);
+                    packageString = strtok(NULL, ":");
+                }
+                libs.unlockBuffer();
+            }
         } else {
             const String8 customPkg(bundle->getCustomPackage());
             err = writeResourceSymbols(bundle, assets, customPkg, true);
         } else {
             const String8 customPkg(bundle->getCustomPackage());
             err = writeResourceSymbols(bundle, assets, customPkg, true);
@@ -1432,6 +1460,19 @@ int doPackage(Bundle* bundle)
         }
     }
 
         }
     }
 
+    if (bundle->getGenDependencies()) {
+        // Now that writeResourceSymbols has taken care of writing the
+        // dependency targets to the dependencyFile, we'll write the
+        // pre-requisites.
+        fp = fopen(dependencyFile, "a+");
+        fprintf(fp, " : ");
+        err = writeDependencyPreReqs(bundle, assets, fp);
+
+        // Also manually add the AndroidManifeset since it's a non-asset
+        fprintf(fp, "%s \\\n", bundle->getAndroidManifestFile());
+        fclose(fp);
+    }
+
     // Write out the ProGuard file
     err = writeProguardFile(bundle, assets);
     if (err < 0) {
     // Write out the ProGuard file
     err = writeProguardFile(bundle, assets);
     if (err < 0) {