#!/usr/bin/env python # ********************************************************************** # # Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. # # This copy of Ice is licensed to you under the terms described in the # ICE_LICENSE file included in this distribution. # # ********************************************************************** import os, sys, shutil, fnmatch, re, glob # # Program usage. # def usage(): print "Usage: " + sys.argv[0] + " [options] [tag]" print print "Options:" print "-h Show this message." print "-v Be verbose." print print "If no tag is specified, HEAD is used." # # Find files matching a pattern. # def find(path, patt): result = [ ] files = os.listdir(path) for x in files: fullpath = os.path.join(path, x); if os.path.isdir(fullpath) and not os.path.islink(fullpath): result.extend(find(fullpath, patt)) elif fnmatch.fnmatch(x, patt): result.append(fullpath) return result # # Comment out rules in a Makefile. # def fixMakefile(file, target): origfile = file + ".orig" os.rename(file, origfile) oldMakefile = open(origfile, "r") newMakefile = open(file, "w") origLines = oldMakefile.readlines() doComment = 0 doCheck = 0 newLines = [] for x in origLines: # # If the rule contains the target string, then # comment out this rule. # if not x.startswith("\t") and x.find(target) != -1 and x.find(target + ".o") == -1: doComment = 1 # # If the line starts with "clean::", then check # the following lines and comment out any that # contain the target string. # elif x.startswith("clean::"): doCheck = 1 # # Stop when we encounter an empty line. # elif len(x.strip()) == 0: doComment = 0 doCheck = 0 if doComment or (doCheck and x.find(target) != -1): x = "#" + x newLines.append(x) newMakefile.writelines(newLines) newMakefile.close() oldMakefile.close() os.remove(origfile) # # Remove lines containing a keyword from a file. # def editFile(file, target): origfile = file + ".orig" os.rename(file, origfile) oldFile = open(origfile, "r") newFile = open(file, "w") origLines = oldFile.readlines() newLines = [] for x in origLines: if x.find(target) == -1: newLines.append(x) newFile.writelines(newLines) newFile.close() oldFile.close() os.remove(origfile) # # Comment out rules in VC project. # def fixProject(file, target): origfile = file + ".orig" os.rename(file, origfile) oldProject = open(origfile, "r") newProject = open(file, "w") origLines = oldProject.readlines() # # Find a Source File declaration containing SOURCE= # and comment out the entire declaration. # expr = re.compile("SOURCE=.*" + target.replace(".", "\\.") + ".*") inSource = 0 doComment = 0 newLines = [] source = [] for x in origLines: if x.startswith("# Begin Source File"): inSource = 1 if inSource: if not doComment and expr.match(x) != None: doComment = 1 source.append(x) else: newLines.append(x) if x.startswith("# End Source File"): inSource = 0 for s in source: if doComment: newLines.append('#xxx#' + s) else: newLines.append(s) doComment = 0 source = [] newProject.writelines(newLines) newProject.close() oldProject.close() os.remove(origfile) # # Comment out implicit parser/scanner rules in config/Make.rules. # def fixMakeRules(file): origfile = file + ".orig" os.rename(file, origfile) oldFile = open(origfile, "r") newFile = open(file, "w") origLines = oldFile.readlines() doComment = 0 newLines = [] for x in origLines: if x.find("%.y") != -1 or x.find("%.l") != -1: doComment = 1 # # Stop when we encounter an empty line. # elif len(x.strip()) == 0: doComment = 0 if doComment: x = "#" + x newLines.append(x) newFile.writelines(newLines) newFile.close() oldFile.close() os.remove(origfile) # # Fix version in README, INSTALL files # def fixVersion(files, version, mmversion): for file in files: origfile = file + ".orig" os.rename(file, origfile) oldFile = open(origfile, "r") newFile = open(file, "w") line = oldFile.read(); line = re.sub("@ver@", version, line) line = re.sub("@mmver@", mmversion, line) newFile.write(line) newFile.close() oldFile.close() os.remove(origfile) # # Check arguments # tag = "HEAD" verbose = 0 for x in sys.argv[1:]: if x == "-h": usage() sys.exit(0) elif x == "-v": verbose = 1 elif x.startswith("-"): print sys.argv[0] + ": unknown option `" + x + "'" print usage() sys.exit(1) else: tag = x # # Remove any existing "dist" directory and create a new one. # distdir = "dist" if os.path.exists(distdir): shutil.rmtree(distdir) os.mkdir(distdir) os.mkdir(os.path.join(distdir, "ice")) # # Export sources from git. # print "Checking out " + tag + "..." if verbose: quiet = "-v" else: quiet = "" os.system("git archive " + quiet + " " + tag + " . | (cd dist/ice && tar xf -)") os.chdir(distdir) # # Get Ice version. # config = open(os.path.join("ice", "include", "IceUtil", "Config.h"), "r") version = re.search("ICE_STRING_VERSION \"([0-9\.b]*)\"", config.read()).group(1) mmversion = re.search("([0-9]+\.[0-9b]+)[\.0-9]*", version).group(1) print "Fixing version in various files..." fixVersion(find("ice", "README*"), version, mmversion) fixVersion(find("ice", "INSTALL*"), version, mmversion) fixVersion(find("ice/config", "glacier2router.cfg"), version, mmversion) fixVersion(find("ice/config", "icegridregistry.cfg"), version, mmversion) fixVersion(find("ice/install/rpm", "*.conf"), version, mmversion) print "Creating Ice-rpmbuild..." rpmbuildver = "Ice-rpmbuild-" + version if verbose: quiet = "v" else: quiet = "" os.system("tar c" + quiet + "f " + rpmbuildver + ".tar " + "-C ice/install -C rpm {icegridregistry,icegridnode,glacier2router}.{conf,suse,redhat} README.RPM " + "-C ../unix THIRD_PARTY_LICENSE.Linux README.Linux-RPM SOURCES.Linux " + "-C ../thirdparty/php ice.ini") os.system("gzip -9 " + rpmbuildver + ".tar") # # Remove files. # print "Removing unnecessary files..." filesToRemove = [ \ os.path.join("ice", "makedist.py"), \ os.path.join("ice", "makebindist.py"), \ os.path.join("ice", "iceemakedist.py"), \ os.path.join("ice", "RPMTools.py"), \ os.path.join("ice", "fixCopyright.py"), \ os.path.join("ice", "fixVersion.py"), \ os.path.join("ice", "icee.dsw"), \ os.path.join("ice", "icee.dsp"), \ os.path.join("ice", "src", "icecpp", "icecppe.dsp"), \ os.path.join("ice", "src", "IceUtil", "iceutile.dsp"), \ os.path.join("ice", "src", "Slice", "slicee.dsp"), \ ] filesToRemove.extend(find("ice", ".dummy")) for x in filesToRemove: if os.path.exists(x): os.remove(x) shutil.rmtree(os.path.join("ice", "install")) shutil.rmtree(os.path.join("ice", "src", "slice2cppe")) shutil.rmtree(os.path.join("ice", "src", "slice2javae")) # # Generate bison files. # print "Generating bison files..." cwd = os.getcwd() grammars = find("ice", "*.y") for x in grammars: # # Change to the directory containing the file. # (dir,file) = os.path.split(x) os.chdir(dir) (base,ext) = os.path.splitext(file) # # Run gmake to create the output files. # if verbose: quiet = "" else: quiet = "-s" if file == "cexp.y": os.system("gmake " + quiet + " cexp.c") else: os.system("gmake " + quiet + " " + base + ".cpp") # # Edit the Makefile to comment out the grammar rules. # fixMakefile("Makefile", base) fixMakefile("Makefile.mak", base) # # Edit the project file(s) to comment out the grammar rules. # for p in glob.glob("*.dsp"): fixProject(p, file) os.chdir(cwd) # # Generate flex files. # print "Generating flex files..." scanners = find("ice", "*.l") for x in scanners: # # Change to the directory containing the file. # (dir,file) = os.path.split(x) os.chdir(dir) (base,ext) = os.path.splitext(file) # # Run gmake to create the output files. # if verbose: quiet = "" else: quiet = "-s" os.system("gmake " + quiet + " " + base + ".cpp") # # Edit the Makefile to comment out the flex rules. # fixMakefile("Makefile", base) fixMakefile("Makefile.mak", base) # # Edit the project file(s) to comment out the flex rules. # for p in glob.glob("*.dsp"): fixProject(p, file) os.chdir(cwd) # # Comment out the implicit parser and scanner rules in # config/Make.rules. # print "Fixing makefiles..." fixMakeRules(os.path.join("ice", "config", "Make.rules")) # # Create archives. # print "Creating distribution..." icever = "Ice-" + version os.rename("ice", icever) if verbose: quiet = "v" else: quiet = "" os.system("chmod -R u+rw,go+r-w . " + icever) os.system("find " + icever + " \\( -name \"*.h\" -or -name \"*.cpp\" -or -name \"*.ice\" \\) -exec chmod a-x {} \\;") os.system("find " + icever + " \\( -name \"README*\" -or -name \"INSTALL*\" \\) -exec chmod a-x {} \\;") os.system("find " + icever + " \\( -name \"*.xml\" -or -name \"*.mc\" \\) -exec chmod a-x {} \\;") os.system("find " + icever + " \\( -name \"Makefile\" -or -name \"*.dsp\" \\) -exec chmod a-x {} \\;") os.system("find " + icever + " -type d -exec chmod a+x {} \\;") os.system("find " + icever + " -perm +111 -exec chmod a+x {} \\;") os.system("tar c" + quiet + "f " + icever + ".tar " + icever) os.system("gzip -9 " + icever + ".tar") if verbose: quiet = "" else: quiet = "q" os.system("zip -9r" + quiet + " " + icever + ".zip " + icever) # # Copy CHANGES # shutil.copyfile(os.path.join(icever, "CHANGES"), "Ice-" + version + "-CHANGES") # # Done. # print "Cleaning up..." shutil.rmtree(icever) print "Done."