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
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