示例#1
0
  def packageRule(self, rule):
    (mainName, ruleType) = self.splitRuleName(rule)
    dest_dir = "${redist-outdir}/" + self.getBuildDirectory()
    copyTarget = dest_dir + os.sep + self.package_name + self.getVerWithDash()

    text = "<target name=\"" + rule + "\" " \
        + self.getAntDependencies("build", ["python-prereqs"]) + ">\n"
    text = text + "  <mkdir dir=\"" + copyTarget + "\" />\n"

    # TODO(aaron): make recursive copy-in process a step/action.
    # figure out everyone we transitively depend on
    dependTargets = self.getRecursiveDependencyTargetObjs()
    allowedLanguages = [ "python", "thrift", "none" ]
    for target in dependTargets:
      try:
        allowedLanguages.index(target.language())
      except ValueError:
        raise TargetError(self, "Cannot build PythonRedist " + self.getCanonicalName() \
            + " which transitively depends on target " + target.getCanonicalName() \
            + " in language: " + str(target.language()))

      try:
        sources = target.get_sources()
        for src in sources:
          text = text + self.copySource(target.normalize_user_path(src), copyTarget)
      except AttributeError:
        # Doesn't have get_sources(); maybe it generates intermediates
        try:
          sources = target.intermediatePathsForLang(self.language())
          for src in sources:
            text = text + self.copySource(src, copyTarget)
        except AttributeError:
          # Doesn't have that either. Just ignore.
          pass

      text = text + target.copyDataPaths(copyTarget)

    text = text + self.copyDataPaths(copyTarget)

    # Bring in steps with primary actions
    for step in self.steps:
      text = text + step.emitPackageOps(self)

    # TODO(aaron): Make distutils setup.py production a step/action.
    if self.use_dist_utils:
      source_root = "."
      if self.output_source_root != None:
        output_src_root = self.force(self.output_source_root)
        if len(output_src_root) > 0:
          source_root = self.normalize_user_path(output_src_root)

      # Generate a setup.py file and wrap the tarball using distutils

      text = text + """
  <delete file="%(datafiles)s" quiet="true" failonerror="false" />
%(datafiles_echo)s
  <exec executable="${make-setup-exec}" failonerror="true" dir="%(targetdir)s">
    <arg value="--name" />
    <arg value="%(packagename)s" />
    <arg value="--verstring" />
    <arg value="%(verstring)s" />
    <arg value="--srcdir" />
    <arg value="%(source_root)s" />
    <arg value="--basedir" />
    <arg value="%(targetdir)s" />
    <arg value="--datafiles" />
    <arg value="%(datafiles)s" />
  </exec>
  <exec executable="${python-exec}" failonerror="true" dir="%(targetdir)s">
    <arg value="setup.py" />
    <arg value="sdist" />
  </exec>
  <move todir="%(basedir)s" file="%(targetdir)s/dist/%(packagename)s-%(verstring)s.tar.gz" />
  <delete dir="%(targetdir)s/dist" />
  <delete dir="%(targetdir)s/MANIFEST" />
""" % { "targetdir"      : copyTarget,
        "packagename"    : self.get_package_name(),
        "verstring"      : self.getVerString(),
        "source_root"    : source_root,
        "basedir"        : self.get_assembly_top_dir(),
        "datafiles"      : self.get_dist_utils_data_files_ant_path(),
        "datafiles_echo" : self.write_dist_utils_data_files_echos(
                               self.get_dist_utils_data_files_ant_path()),
      }
    else:
      # Create the release tarball ourselves
      tarFilename = self.getPackageZip()
      text = text + "  <exec executable=\"tar\">\n"
      text = text + "    <arg value=\"czf\" />\n"
      text = text + "    <arg value=\"" + tarFilename + "\" />\n"
      text = text + "    <arg value=\"-C\" />\n"
      text = text + "    <arg value=\"" + dest_dir + "\" />\n"
      text = text + "    <arg value=\"" + self.get_package_name() \
          + self.getVerWithDash() + "\" />\n"
      text = text + "  </exec>\n"

    text = text + "</target>\n"
    return text
示例#2
0
  def packageRule(self, rule):
    """ emit the ant rule to create the package """

    (mainName, ruleType) = self.splitRuleName(rule)

    depAntRules = self.getAntDependencies(ruleType, [ "release-version" ])

    # input/output resolution
    for step in self.steps:
      step.resolve(self)

    text = ""

    if not self.force_build:
      # Figure out everything that we depend on. If it hasn't changed, then
      # don't build this. We measure the timestamps of all direct inputs vs.
      # our tarball output.
      # We exclude any inputs that are actually other files within our own build dir.
      uptodate_prop = self.getSafeName() + "-is-uptodate"
      text = text + "<target name=\"" + rule + "-uptodate\"\n"
      text = text + depAntRules + ">\n"

      # Ant's uptodate task is somewhat stupid and can't deal with absolute paths
      # inside the srcfiles elements. Therefore we have to split up the input
      # paths by their leading directory component
      include_paths = (self.force(self.resolved_input_files) +
                       [os.path.join(name, "**") for name in self.force(self.resolved_input_dirs)])

      # We dont want to include anything inside the package path directory
      package_path = os.path.realpath(self.get_assembly_dir())

      grouped_paths = defaultdict(lambda: [])
      for path in include_paths:
        real_path = os.path.realpath(path)

        # Don't include things inside the package path
        if os.path.commonprefix([package_path, real_path]) == package_path:
          continue
        (dir, filename) = os.path.split(path)
        grouped_paths[dir].append(filename)

      # Only emit an <uptodate> check if we actually have source files to check.
      # If we don't, we just never set the property, meaning it's always dirty
      # (like a Makefile PHONY target).
      do_uptodate = len(grouped_paths.items()) > 0
      if do_uptodate:
        text = text + "  <uptodate property=\"" + uptodate_prop + "\">\n"

        for dir, filenames in grouped_paths.iteritems():
          text += "    <srcfiles dir=\"%s\">\n" % dir
          for filename in filenames:
            text += "        <include name=\"%s\" />\n" % filename
          text += "    </srcfiles>\n"

        if self.create_tarball:
          text = text + "    <mapper type=\"merge\" to=\"" + self.getPackageZip() + "\" />\n"
        else:
          text = text + "    <mapper type=\"merge\" to=\"" + self.getStampPath() + "\" />\n"

        text = text + "  </uptodate>\n"
        text = text + "  <echo message=\"" + self.getCanonicalName() + " uptodate: ${" \
            + uptodate_prop + "}\"/>\n"
      text = text + "</target>\n"

      text = text + "<target name=\"" + rule + "\" depends=\"" \
        + self.getSafeName() + "-build-uptodate\" unless=\"" + uptodate_prop + "\">\n"
    else:
      # build is forced.
      text = text + "<target name=\"" + rule + "\" "
      text = text + depAntRules + ">\n"

    if self.clean_first:
      text += "  <deletermf dir=\"" + self.get_assembly_dir() + "\"/>\n"

    # The actual package target work
    text = text + "  <mkdir dir=\"" + self.get_assembly_dir() + "\"/>\n"

    # Bring in all the steps
    for step in self.steps:
      text = text + step.emitPackageOps(self)

    if self.manifest_file != None:
      # check that our file list here equals the one we expect.
      # Give checkmanifest the --release flag if we're in release mode
      text = text + """
  <exec executable="${checkmanifest-exec}" failonerror="true">
    <arg value="%(manifest)s" />
    <arg value="%(pkgpath)s" />
    <arg value="--${version-subdir}" />
  </exec>
""" % {
      "manifest" : os.path.join("${basedir}", self.getInputDirectory(), \
          self.force(self.manifest_file)),
      "pkgpath"  : self.get_assembly_dir()
    }

    if self.registered_zip_step == None and self.create_tarball:
      text = text + self.emit_tarball_text()
    elif not self.create_tarball:
      text = text + """
    <touch file="%s" />
    """ % self.getStampPath()

    text = text + "</target>\n"
    return text