/**
   * Generates an empty manifest for a rule that does not directly specify resources.
   *
   * <p><strong>Note:</strong> This generated manifest can then be used as the primary manifest when
   * merging with dependencies.
   *
   * @return the generated ApplicationManifest
   */
  public static ApplicationManifest generatedManifest(RuleContext ruleContext) {
    Artifact generatedManifest =
        ruleContext.getUniqueDirectoryArtifact(
            ruleContext.getRule().getName() + "_generated",
            new PathFragment("AndroidManifest.xml"),
            ruleContext.getBinOrGenfilesDirectory());

    String manifestPackage;
    if (ruleContext.attributes().isAttributeValueExplicitlySpecified("custom_package")) {
      manifestPackage = ruleContext.attributes().get("custom_package", Type.STRING);
    } else {
      manifestPackage =
          JavaUtil.getJavaFullClassname(ruleContext.getRule().getPackage().getNameFragment());
    }
    String contents =
        Joiner.on("\n")
            .join(
                "<?xml version=\"1.0\" encoding=\"utf-8\"?>",
                "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"",
                "          package=\"" + manifestPackage + "\">",
                "   <application>",
                "   </application>",
                "</manifest>");
    ruleContext
        .getAnalysisEnvironment()
        .registerAction(
            new FileWriteAction(
                ruleContext.getActionOwner(),
                generatedManifest,
                contents,
                false /* makeExecutable */));
    return new ApplicationManifest(generatedManifest);
  }
Beispiel #2
0
  private ImmutableList<Artifact> generatedOutputArtifacts(FileType newFileType) {
    ImmutableList.Builder<Artifact> builder = new ImmutableList.Builder<>();
    for (Artifact protoFile : getFilteredProtoSources()) {
      String protoFileName = FileSystemUtils.removeExtension(protoFile.getFilename());
      String generatedOutputName;
      if (attributes.outputsCpp()) {
        generatedOutputName = protoFileName;
      } else if (usesProtobufLibrary()) {
        // The protobuf library generates filenames with some slight modifications.
        generatedOutputName = generateProtobufFilename(protoFileName);
      } else {
        String lowerUnderscoreBaseName = protoFileName.replace('-', '_').toLowerCase();
        generatedOutputName = LOWER_UNDERSCORE.to(UPPER_CAMEL, lowerUnderscoreBaseName);
      }

      PathFragment generatedFilePath =
          new PathFragment(
              protoFile.getRootRelativePath().getParentDirectory(),
              new PathFragment(generatedOutputName));

      PathFragment outputFile =
          FileSystemUtils.appendExtension(generatedFilePath, newFileType.getExtensions().get(0));

      if (outputFile != null) {
        builder.add(
            ruleContext.getUniqueDirectoryArtifact(
                UNIQUE_DIRECTORY_NAME, outputFile, ruleContext.getBinOrGenfilesDirectory()));
      }
    }
    return builder.build();
  }
 /**
  * The artifact for the .o file that should be generated when compiling the {@code source}
  * artifact.
  */
 public Artifact objFile(Artifact source) {
   if (source.isTreeArtifact()) {
     PathFragment rootRelativePath = source.getRootRelativePath().replaceName("obj_files");
     return ruleContext.getTreeArtifact(rootRelativePath, ruleContext.getBinOrGenfilesDirectory());
   } else {
     return inUniqueObjsDir(source, ".o");
   }
 }
Beispiel #4
0
  private PathFragment getWorkspaceRelativeOutputDir() {
    // Generate sources in a package-and-rule-scoped directory; adds both the
    // package-and-rule-scoped directory and the header-containing-directory to the include path
    // of dependers.
    PathFragment rootRelativeOutputDir = ruleContext.getUniqueDirectory(UNIQUE_DIRECTORY_NAME);

    return new PathFragment(
        ruleContext.getBinOrGenfilesDirectory().getExecPath(), rootRelativeOutputDir);
  }
Beispiel #5
0
  private static Artifact createResourceJarArtifact(
      RuleContext ruleContext, ResourceContainer container, String fileNameSuffix) {

    String artifactName = container.getLabel().getName() + fileNameSuffix;

    // Since the Java sources are generated by combining all resources with the
    // ones included in the binary, the path of the artifact has to be unique
    // per binary and per library (not only per library).
    Artifact artifact =
        ruleContext.getUniqueDirectoryArtifact(
            "resource_jars",
            container.getLabel().getPackageIdentifier().getPathFragment().getRelative(artifactName),
            ruleContext.getBinOrGenfilesDirectory());
    return artifact;
  }
 public ApplicationManifest mergeWith(
     RuleContext ruleContext, Iterable<ResourceContainer> resourceContainers) {
   if (!Iterables.isEmpty(getMergeeManifests(resourceContainers))) {
     Iterable<Artifact> exportedManifests = getMergeeManifests(resourceContainers);
     Artifact outputManifest =
         ruleContext.getUniqueDirectoryArtifact(
             ruleContext.getRule().getName() + "_merged",
             "AndroidManifest.xml",
             ruleContext.getBinOrGenfilesDirectory());
     AndroidManifestMergeHelper.createMergeManifestAction(
         ruleContext, getManifest(), exportedManifests, ImmutableList.of("all"), outputManifest);
     return new ApplicationManifest(outputManifest);
   }
   return this;
 }
 /**
  * Returns a static library archive with dead code/objects removed by J2ObjC dead code removal,
  * given the original unpruned static library containing J2ObjC-translated code.
  */
 public Artifact j2objcPrunedArchive(Artifact unprunedArchive) {
   PathFragment prunedSourceArtifactPath =
       FileSystemUtils.appendWithoutExtension(unprunedArchive.getRootRelativePath(), "_pruned");
   return ruleContext.getUniqueDirectoryArtifact(
       "_j2objc_pruned", prunedSourceArtifactPath, ruleContext.getBinOrGenfilesDirectory());
 }