summaryrefslogtreecommitdiff
path: root/cpp/newmakebindist.py
diff options
context:
space:
mode:
authorBrent Eagles <brent@zeroc.com>2005-02-08 04:42:19 +0000
committerBrent Eagles <brent@zeroc.com>2005-02-08 04:42:19 +0000
commitae210fa5548168d144f024dd405f95c32ee6133b (patch)
treee621be8656c7aa4d9f4e324ce59b1e0463db54ac /cpp/newmakebindist.py
parentfixed synchronization issues (diff)
downloadice-ae210fa5548168d144f024dd405f95c32ee6133b.tar.bz2
ice-ae210fa5548168d144f024dd405f95c32ee6133b.tar.xz
ice-ae210fa5548168d144f024dd405f95c32ee6133b.zip
Temporarily adding newmakebindist.py. This will either replace
makebindist.py or simply be an alternative.
Diffstat (limited to 'cpp/newmakebindist.py')
-rwxr-xr-xcpp/newmakebindist.py504
1 files changed, 504 insertions, 0 deletions
diff --git a/cpp/newmakebindist.py b/cpp/newmakebindist.py
new file mode 100755
index 00000000000..b0ee0b9fd6a
--- /dev/null
+++ b/cpp/newmakebindist.py
@@ -0,0 +1,504 @@
+#!/usr/bin/env python
+# **********************************************************************
+#
+# Copyright (c) 2003-2004 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, string, getopt, glob
+
+#
+# defaults.
+#
+verbose = False
+
+#
+# fileLists is a mapping of all of the files that will go into a binary distribution.
+#
+fileLists = dict()
+
+class Subpackage:
+ """Encapsulates RPM spec file information to be used to generate a spec file on Linux
+ and create RPMs for Ice"""
+ def __init__(self, name, summary, group, description, filelist):
+ self.name = name
+ self.summary = summary
+ self.group = group
+ self.description = description
+ self.filelist = filelist
+
+ def writeHdr(self, ofile):
+ ofile.write("%package " + self.name + "\n")
+ ofile.write("Summary: " + self.summary + "\n")
+ ofile.write("Group: " + self.group + "\n")
+ ofile.write("%description " + self.name + "\n")
+ ofile.write(self.description)
+
+ def writeFiles(self, ofile, version, intVersion):
+ ofile.write("%files " + self.name + "\n")
+ ofile.write("%defattr(-, root, root, -)\n\n")
+ for f in self.filelist:
+ if f.endswith(".so"):
+ ofile.write("/usr/" + f + "." + version + "\n")
+ ofile.write("/usr/" + f + "." + str(intVersion) + "\n")
+ ofile.write("/usr/" + f + "\n")
+ ofile.write("\n")
+
+fileLists['core'] = Subpackage("core",
+ "The core Ice libraries and tools.",
+ "Development/Libraries Development/Tools System Environment/Libraries",
+ "",
+ ["ICE_LICENSE",
+ "LICENSE",
+ "bin/dumpdb",
+ "bin/transformdb",
+ "bin/glacier2router",
+ "bin/icebox",
+ "bin/iceboxadmin",
+ "bin/icepackadmin",
+ "bin/icecpp",
+ "bin/icepacknode",
+ "bin/icepackregistry",
+ "bin/icepatch2calc",
+ "bin/icepatch2client",
+ "bin/icepatch2server",
+ "bin/icestormadmin",
+ "bin/slice2docbook",
+ "lib/libFreeze.so",
+ "lib/libGlacier2.so",
+ "lib/libIceBox.so",
+ "lib/libIcePack.so",
+ "lib/libIcePatch2.so",
+ "lib/libIce.so",
+ "lib/libIceSSL.so",
+ "lib/libIceStormService.so",
+ "lib/libIceStorm.so",
+ "lib/libIceUtil.so",
+ "lib/libIceXML.so",
+ "lib/libSlice.so",
+ "lib/glacier2cs.dll",
+ "lib/icecs.dll",
+ "lib/icepackcs.dll",
+ "lib/Ice.jar",
+ "lib/IcePy.so",
+ "slice"])
+
+fileLists['c++'] = Subpackage("c++",
+ "Ice tools, files and libraries for developing Ice applications in C++",
+ "Development/Libraries Development/Tools",
+ "",
+ ["ICE_LICENSE",
+ "LICENSE",
+ "bin/slice2cpp",
+ "bin/slice2freeze",
+ "include"])
+
+fileLists['cs'] = Subpackage("cs",
+ "Ice tools, files and libraries for developing Ice applications in C\#",
+ "Development/Libraries Development/Tools",
+ "",
+ ["ICE_LICENSE",
+ "LICENSE",
+ "bin/slice2cs"])
+
+fileLists['java'] = Subpackage("java",
+ "Ice tools, files and libraries for developing Ice applications in Java",
+ "Development/Libraries Development/Tools",
+ "",
+ ["ICE_LICENSE",
+ "LICENSE",
+ "bin/slice2java",
+ "bin/slice2freezej"])
+
+fileLists['py'] = Subpackage("py",
+ "Ice tools, files and libraries for developing Ice applications in Python",
+ "Development/Libraries Development/Tools",
+ "",
+ ["ICE_LICENSE",
+ "LICENSE",
+ "bin/slice2py",
+ "python"])
+
+fileLists['vb'] = Subpackage("vb",
+ "Ice tools, files and libraries for developing Ice client applications using vb.",
+ "Development/Libraries Development/Tools",
+ "",
+ ["ICE_LICENSE",
+ "LICENSE",
+ "bin/slice2vb"])
+
+fileLists['docs'] = Subpackage("docs",
+ "Browsable documentation for Ice",
+ "Development/Libraries Development/Tools",
+ "",
+ ["ICE_LICENSE",
+ "LICENSE",
+ "doc"])
+
+def usage():
+ """Print usage/help information"""
+ print "Usage: " + sys.argv[0] + " [options] [tag]"
+ print
+ print "Options:"
+ print "-h Show this message."
+ print "--build-dir Specify the directory where the distributions will be unpacked and built."
+ print "--install-dir Specify the directory where the distribution contents will be installed to."
+ print "--install-root Specify the root directory that will appear in the tarball."
+ print "--sources Specify the location of the sources directory. If this is omitted makebindist"
+ print " will traverse ../icej ../icepy ../icecs, etc and make the distributions for you."
+ print
+ print "If no tag is specified, HEAD is used."
+
+def getIceVersion(file):
+ """Extract the ICE version string from a file."""
+ config = open(file, "r")
+ return re.search("ICE_STRING_VERSION \"([0-9\.]*)\"", config.read()).group(1)
+
+def getIceSoVersion(file):
+ """Extract the ICE version ordinal from a file."""
+ config = open(file, "r")
+ intVersion = int(re.search("ICE_INT_VERSION ([0-9]*)", config.read()).group(1))
+ majorVersion = intVersion / 10000
+ minorVersion = intVersion / 100 - 100 * majorVersion
+ return '%d' % (majorVersion * 10 + minorVersion)
+
+def getPlatform():
+ """Determine the platform we are building and targetting for"""
+ if sys.platform.startswith("win") or sys.platform.startswith("cygwin"):
+ return "win32"
+ elif sys.platform.startswith("linux"):
+ return "linux"
+ elif sys.platform.startswith("sunos"):
+ return "solaris"
+ elif sys.platform.startswith("hp"):
+ return "hpux"
+ elif sys.platform.startswith("darwin"):
+ return "macosx"
+ elif sys.platform.startswith("aix"):
+ return "aix"
+ else:
+ return None
+
+def trace(s):
+ if verbose:
+ print s
+
+def initDirectory(d):
+ """Check for the existance of the directory. If it isn't there make it."""
+
+ if os.path.exists(d):
+ #
+ # Make sure its a directory and has correct permissions.
+ #
+ if not os.path.isdir(d):
+ print "Path " + d + " exists but is not a directory."
+ sys.exit(1)
+
+ if os.access(d, os.X_OK | os.R_OK | os.W_OK):
+ trace("Path " + d + " exists and is ok, continuing")
+ else:
+ print "Directory " + d + " exists, but has incorrect permissions"
+ sys.exit(1)
+ else:
+ #
+ # This could fail due to lack of permissions.
+ #
+ os.makedirs(d, 0770)
+
+def getVersion(cvsTag, buildDir):
+ """Extracts a source file from the repository and gets the version number from it"""
+ cwd = os.getcwd()
+ os.chdir(buildDir)
+ if getPlatform() == "aix":
+ os.environ["LIBPATH"] = ""
+ os.system("cvs -d cvsint.mutablerealms.com:/home/cvsroot export -r " + cvsTag + " ice/include/IceUtil/Config.h")
+ else:
+ os.system("cvs -d cvs.mutablerealms.com:/home/cvsroot export -r " + cvsTag + " ice/include/IceUtil/Config.h")
+
+ result = [ getIceVersion("ice/include/IceUtil/Config.h"), getIceSoVersion("ice/include/IceUtil/Config.h")]
+ os.remove("ice/include/IceUtil/Config.h")
+ os.removedirs("ice/include/IceUtil")
+ os.chdir(cwd)
+ return result
+
+def collectSourceDistributions(tag, sourceDir, cvsdir, distro):
+ """The location for the source distributions was not supplied so
+ we are going to assume we are being called from a CVS tree and we
+ are going to go get them ourselves"""
+ cwd = os.getcwd()
+ os.chdir(cwd + "/../" + cvsdir)
+ if cvsdir == "icepy":
+ os.system("./makedist.py " + tag)
+ else:
+ os.system("./makedist.py -d " + tag)
+ shutil.copy("dist/" + distro + ".tar.gz", sourceDir)
+ os.chdir(cwd)
+
+def extractDemos(buildDir, version, distro, demoDir):
+ """Pulls the demo directory out of a distribution and massages its
+ build system so it can be built against an installed version of
+ Ice"""
+ cwd = os.getcwd()
+ os.chdir(buildDir + "/demotree")
+ os.system("tar xvfz ../sources/" + distro + ".tar.gz " + distro + "/demo " + distro + "/config")
+ shutil.move(distro + "/demo", buildDir + "/Ice-" + version + "-demos/" + demoDir)
+ os.system("cp " + distro + "/config/*.* " + buildDir + "/Ice-" + version + "-demos/config")
+ shutil.rmtree(buildDir + "/demotree/" + distro, True)
+ os.chdir(cwd)
+
+def archiveDemoTree(buildDir, version):
+ cwd = os.getcwd()
+ os.chdir(buildDir)
+ os.system("tar cvfz Ice-" + version + "-demos.tar.gz Ice-" + version + "-demos")
+ os.chdir(cwd)
+
+def makeInstall(buildDir, installDir, distro, clean):
+ """Make the distro in buildDir sources and install it to installDir."""
+ cwd = os.getcwd()
+ os.chdir(buildDir)
+ if clean:
+ shutil.rmtree(distro, True)
+
+ if not os.path.exists(distro):
+ os.system("tar xfvz sources/" + distro + ".tar.gz")
+
+ os.chdir(distro)
+
+ if distro.startswith("IceJ"):
+ shutil.copy( buildDir + "/" + distro + "/lib/Ice.jar", installDir + "/lib")
+ os.chdir(cwd)
+ return
+
+ os.system("perl -pi -e 's/^prefix.*$/prefix = \$\(RPM_BUILD_ROOT\)/' config/Make.rules")
+
+ if distro.startswith("IcePy"):
+ try:
+ pyHome = os.environ["PYTHON_HOME"]
+ except KeyError:
+ pyHome = None
+
+ if pyHome == None or pyHome == "":
+ trace("PYTHON_HOME is not set, figuring it out and trying that")
+ pyHome = sys.exec_prefix
+
+ os.system("perl -pi -e 's/^PYTHON.HOME.*$/PYTHON\_HOME \?= "+ pyHome.replace("/", "\/") + "/' config/Make.rules")
+ os.system("gmake RPM_BUILD_ROOT=" + installDir + " install")
+ os.chdir(cwd)
+
+def shlibExtensions(versionString, versionInt):
+ """Returns a tuple containing the extensions for the shared library, and the 2 symbolic links (respectively)"""
+ platform = getPlatform()
+ if platform == "hpux":
+ return [".sl." + versionString, ".sl." + versionInt, ".sl"]
+ elif platform == "macosx":
+ return ["." + versionString + ".dylib", "." + versionInt + ".dylib", ".dylib"]
+ else:
+ return [".so." + versionString, ".so." + versionInt, ".so"]
+
+def strip(files):
+ stripCmd = "strip "
+ if getPlatform() == "macosx":
+ stripCmd = stripCmd + "-x "
+ for f in files:
+ print "Stripping " + f
+ os.system(stripCmd + f)
+
+def printRPMHeader(ofile, version, release, installDir):
+ """Used on Linux only. Prints out the header portion of an RPM spec file for building the RPM"""
+ ofile.write("%define _unpackaged_files_terminate_build 0\n")
+ ofile.write("Summary: The Internet Communications Engine (ICE) is a modern alternative to object middleware such ")
+ ofile.write("as CORBA\n")
+ ofile.write("Name: Ice\n")
+ ofile.write("Version: " + version + "\n")
+ ofile.write("Release: " + release + "\n")
+ ofile.write("License: GPL\n")
+ ofile.write("""Group: Development/Libraries
+Vendor: ZeroC Inc
+URL: http://www.zeroc.com/index.html
+Source0: http://www.zeroc.com/downloads/%{name}-%{version}.tar.gz
+Source1: http://www.zeroc.com/downloads/%{name}J-%{version}.tar.gz
+Source2: http://www.zeroc.com/downloads/%{name}Py-%{version}.tar.gz
+Source3: http://www.zeroc.com/downloads/%{name}CS-%{version}.tar.gz
+""")
+ ofile.write("BuildRoot: " + installDir + "\n")
+ ofile.write("Prefix: /usr\n")
+ ofile.write("""
+%description
+
+%prep
+
+%build
+
+%install
+
+%clean
+
+
+""")
+
+def main():
+ try:
+ buildDir = None
+ installDir = None
+ sources = None
+ installRoot = None
+ verbose = False
+ cvsTag = "HEAD"
+ clean = True
+ build = True
+ version = None
+ soVersion = 0
+ buildDemos = True
+ printSpecFile = False
+
+ optionList, args = getopt.getopt(sys.argv[1:], "hvt:",
+ [ "build-dir=", "install-dir=", "install-root=", "sources=",
+ "verbose", "tag=", "noclean", "nobuild", "nodemos", "specfile"])
+
+ except getopt.GetoptError:
+ usage()
+ sys.exit(2)
+
+ for o, a in optionList:
+ if o == "--build-dir":
+ buildDir = a
+ elif o == "--install-dir":
+ installDir = a
+ elif o == "--install-root":
+ installRoot = a
+ elif o == "--sources":
+ sources = a
+ elif o in ("-h", "--help"):
+ usage()
+ sys.exit()
+ elif o in ("-v", "--verbose"):
+ verbose = True
+ elif o in ("-t", "--tag"):
+ cvsTag = a
+ elif o == "--noclean":
+ clean = False
+ elif o == "--nobuild":
+ build = False
+ elif o == "--nodemos":
+ buildDemos = False
+ elif o == "--specfile":
+ printSpecFile = True
+
+ if buildDir == None:
+ trace("No build directory specified, defaulting to $HOME/tmp/icebuild")
+ buildDir = os.environ.get('HOME') + "/tmp/icebuild"
+
+ if installDir == None:
+ trace("No install directory specified, default to $HOME/tmp/iceinstall")
+ installDir = os.environ.get('HOME') + "/tmp/iceinstall"
+
+ if build:
+ #
+ # We need to clean the directory out to keep obsolete files from being installed.
+ #
+ if os.path.exists(installDir):
+ shutil.rmtree(installDir, True)
+
+ directories = [buildDir, buildDir + "/sources", buildDir + "/demotree", installDir]
+ for d in directories:
+ initDirectory(d)
+
+ version, soVersion = getVersion(cvsTag, buildDir)
+
+ #
+ # Primarily for debugging spec file creation.
+ #
+ if printSpecFile:
+ ofile = sys.stdout
+ printRPMHeader(ofile, version, "1", installDir)
+ for k, v in fileLists.iteritems():
+ v.writeHdr(ofile)
+ ofile.write("\n\n\n")
+ for k, v in fileLists.iteritems():
+ v.writeFiles(ofile, version, soVersion)
+ ofile.write("\n")
+ sys.exit(0)
+
+
+ #
+ # This last directory we have to wait until we've got the version number for the distribution.
+ #
+ shutil.rmtree(buildDir + "/Ice-" + version + "-demos", True)
+ initDirectory(buildDir + "/Ice-" + version + "-demos/config")
+
+ if build:
+ collectSources = False
+ if sources == None:
+ sources = buildDir + "/sources"
+ collectSources = True
+
+ #
+ # Ice must be first or building the other source distributions will fail.
+ #
+ sourceTarBalls = [ ("ice", "Ice-" + version, "demo_cpp"),
+ ("icej","IceJ-" + version, "demo_java"),
+ ("icecs","IceCS-" + version, "demo_cs"),
+ ("icepy","IcePy-" + version, "demo_py") ]
+
+ os.environ['ICE_HOME'] = installDir + "/Ice-" + version
+ currentLibraryPath = None
+ try:
+ currentLibraryPath = os.environ['LD_LIBRARY_PATH']
+ except KeyError:
+ currentLibraryPath = ""
+
+ os.environ['LD_LIBRARY_PATH'] = installDir + "/Ice-" + version + "/lib:" + currentLibraryPath
+ os.environ['PATH'] = installDir + "/Ice-" + version + "/bin:" + os.environ['PATH']
+
+ for cvs, tarball, demoDir in sourceTarBalls:
+ if collectSources:
+ collectSourceDistributions(cvsTag, sources, cvs, tarball)
+ extractDemos(buildDir, version, tarball, demoDir)
+ makeInstall(buildDir, installDir + "/Ice-" + version, tarball, clean)
+
+ archiveDemoTree(buildDir, version)
+
+ #
+ # Sources should have already been built and installed. We
+ # can pick the binaries up from the iceinstall directory.
+ #
+ binaries = glob.glob(installDir + "/Ice-" + version + "/bin/*")
+ binaries.extend(glob.glob(installDir + "/Ice-" + version + "/lib/*" + shlibExtensions(version, soVersion)[0]))
+ strip(binaries)
+ cwd = os.getcwd()
+ os.chdir(installDir)
+ os.system("tar cvf Ice-" + version + "-bin-" + getPlatform() + ".tar Ice-" + version)
+ os.system("gzip -9 Ice-" + version + "-bin-" + getPlatform() + ".tar")
+ os.system("zip -9ry Ice-" + version + "-bin-" + getPlatform() + ".zip Ice-" + version)
+ os.chdir(cwd)
+
+ #
+ # If we are running on Linux, we need to create RPMs. This will probably blow up unless the user
+ # that is running the script has massaged the permissions on /usr/src/redhat/.
+ #
+ if getPlatform() == "linux":
+ ofile = open(buildDir + "/Ice-" + version + ".spec", "w")
+ printRPMHeader(ofile, version, "1", installDir)
+ for k, v in fileLists.iteritems():
+ v.writeHdr(ofile)
+ ofile.write("\n\n\n")
+ for k, v in fileLists.iteritems():
+ v.writeFiles(ofile, version, soVersion)
+ ofile.write("\n")
+ shutil.move(installDir + "/Ice-" + version, installDir + "/usr")
+ cwd = os.getcwd()
+ os.chdir(buildDir)
+ ofile.flush()
+ ofile.close()
+ os.system("rpmbuild -bb Ice-" + version + ".spec")
+
+ #
+ # TODO: Cleanups? I've left everything in place so that the process can be easily debugged.
+ #
+
+
+if __name__ == "__main__":
+ main()