diff options
author | Brent Eagles <brent@zeroc.com> | 2005-02-25 18:14:57 +0000 |
---|---|---|
committer | Brent Eagles <brent@zeroc.com> | 2005-02-25 18:14:57 +0000 |
commit | 606ba855dffa2f80c51e194cb5bb9babf1acd076 (patch) | |
tree | 2a0110a4cbd6eb87fad475a4cab026d9f8e7063a /cpp/RPMTools.py | |
parent | obsolete (diff) | |
download | ice-606ba855dffa2f80c51e194cb5bb9babf1acd076.tar.bz2 ice-606ba855dffa2f80c51e194cb5bb9babf1acd076.tar.xz ice-606ba855dffa2f80c51e194cb5bb9babf1acd076.zip |
moved RPM logic into a module
Diffstat (limited to 'cpp/RPMTools.py')
-rw-r--r-- | cpp/RPMTools.py | 520 |
1 files changed, 520 insertions, 0 deletions
diff --git a/cpp/RPMTools.py b/cpp/RPMTools.py new file mode 100644 index 00000000000..32baa6ebb94 --- /dev/null +++ b/cpp/RPMTools.py @@ -0,0 +1,520 @@ +# ********************************************************************** +# +# Copyright (c) 2003-2005 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, string, logging + +# +# Represents the 'main' package of an RPM spec file. +# TODO: The package should really write the RPM header has well. +# +class Package: + """Encapsulates RPM spec file information to be used to generate a spec file on Linux + and create RPMs for Ice""" + def __init__(self, name, requires, summary, group, description, other, filelist): + self.name = name + self.requires = requires + self.summary = summary + self.group = group + self.description = description + self.filelist = filelist + self.other = other + self.prepTextGen = None + self.buildTextGen = None + self.installTextGen = None + + def writeHdr(self, ofile, version, release, installDir): + ofile.write("%define _unpackaged_files_terminate_build 0\n") + ofile.write("Summary: " + self.summary + "\n") + ofile.write("Name: " + self.name + "\n") + ofile.write("Version: " + version + "\n") + ofile.write("Release: " + release + "\n") + if self.requires <> "": + if self.requires.find("%version%"): + self.requires = self.requires.replace("%version%", version) + ofile.write("Requires: " + self.requires + "\n") + ofile.write("License: GPL\n") + ofile.write("Group: Development/Libraries\n") + ofile.write("Vendor: ZeroC Inc\n") + ofile.write("URL: http://www.zeroc.com/index.html\n") + ofile.write("Source0: http://www.zeroc.com/downloads/Ice-%{version}.tar.gz\n") + ofile.write("Source1: http://www.zeroc.com/downloads/IceJ-%{version}.tar.gz\n") + ofile.write("Source2: http://www.zeroc.com/downloads/IcePy-%{version}.tar.gz\n") + ofile.write("Source3: http://www.zeroc.com/downloads/IceCS-%{version}.tar.gz\n") + ofile.write("Source4: http://www.zeroc.com/downloads/Ice-%{version}-demos.tar.gz\n") + ofile.write("\n") + if installDir <> "": + ofile.write("BuildRoot: " + installDir + "\n") + ofile.write("\n") + ofile.write("%description\n") + ofile.write("\n") + ofile.write("%prep\n") + if self.prepTextGen <> None: + for g in self.prepTextGen: + g(ofile, version) + ofile.write("\n") + ofile.write("%build\n") + if self.buildTextGen <> None: + for g in self.buildTextGen: + g(ofile, version) + ofile.write("\n") + ofile.write("%install\n") + if self.installTextGen <> None: + for g in self.installTextGen: + g(ofile, version) + ofile.write("\n") + ofile.write("%clean\n") + ofile.write("\n") + ofile.write("\n") + + def writeFileList(self, ofile, version, intVersion): + ofile.write("%defattr(644, root, root, 755)\n\n") + for perm, f in self.filelist: + prefix = "" + + # + # Select an RPM spec file attribute depending on the type of + # file or directory we've specified. + # + if perm == "exe" or perm == "lib": + prefix = "%attr(755, root, root) " + elif perm == "xdir": + prefix = "%dir " + + if f.find("%version%"): + f = f.replace("%version%", version) + + if perm == "lib" and f.endswith(".VERSION"): + fname = os.path.splitext(f)[0] + ofile.write(prefix + "/usr/" + fname + "." + version + "\n") + ofile.write(prefix + "/usr/" + fname + "." + str(intVersion) + "\n") + else: + ofile.write(prefix + "/usr/" + f + "\n") + + ofile.write("\n") + + def writeFiles(self, ofile, version, intVersion): + ofile.write("%files\n") + self.writeFileList(ofile, version, intVersion) + + def addPrepGenerator(self, gen): + if self.prepTextGen == None: + self.prepTextGen = [] + self.prepTextGen.append(gen) + + def addBuildGenerator(self, gen): + if self.buildTextGen == None: + self.buildTextGen = [] + self.buildTextGen.append(gen) + + def addInstallGenerator(self, gen): + if self.installTextGen == None: + self.installTextGen = [] + self.installTextGen.append(gen) + +# +# Represents subpackages in an RPM spec file. +# +class Subpackage(Package): + def writeHdr(self, ofile, version, release, installDir): + ofile.write("%package " + self.name + "\n") + ofile.write("Summary: " + self.summary + "\n") + ofile.write("Group: " + self.group + "\n") + if self.requires <> "": + if self.requires.find("%version%"): + self.requires = self.requires.replace("%version%", version) + ofile.write("Requires: " + self.requires + "\n") + if not self.other == "": + ofile.write(self.other + "\n") + ofile.write("%description " + self.name + "\n") + ofile.write(self.description) + + def writeFiles(self, ofile, version, intVersion): + ofile.write("%files " + self.name + "\n") + self.writeFileList(ofile, version, intVersion) + +# +# NOTE: File transforms should be listed before directory transforms. +# +transforms = [ ("file", "lib/Ice.jar", "lib/Ice-%version%/Ice.jar" ), + ("dir", "slice", "share/slice"), + ("dir", "ant", "lib/Ice-%version%/ant"), + ("dir", "python", "lib/Ice-%version%/python"), + ("dir", "doc", "share/doc/Ice-%version%"), + ("file", "ICE_LICENSE", "share/doc/Ice-%version%/ICE_LICENSE"), + ("file", "LICENSE", "share/doc/Ice-%version%/LICENSE") + ] + +# +# fileLists is an in-memory representation of the package contents of +# the Ice spec file. +# +fileLists = [ + Package("ice", + "", + "The Internet Communications Engine (ICE) is a modern alternative to object middleware such as CORBA or DCOM.", + "Development/Libraries Development/Tools System Environment/Libraries", + "", + "", + [("doc", "share/doc/Ice-%version%/ICE_LICENSE"), + ("doc", "share/doc/Ice-%version%/LICENSE"), + ("exe", "bin/dumpdb"), + ("exe", "bin/transformdb"), + ("exe", "bin/glacier2router"), + ("exe", "bin/icebox"), + ("exe", "bin/iceboxadmin"), + ("exe", "bin/icepackadmin"), + ("exe", "bin/icecpp"), + ("exe", "bin/icepacknode"), + ("exe", "bin/icepackregistry"), + ("exe", "bin/icepatch2calc"), + ("exe", "bin/icepatch2client"), + ("exe", "bin/icepatch2server"), + ("exe", "bin/icestormadmin"), + ("exe", "bin/slice2docbook"), + ("lib", "lib/libFreeze.so.VERSION"), + ("lib", "lib/libGlacier2.so.VERSION"), + ("lib", "lib/libIceBox.so.VERSION"), + ("lib", "lib/libIcePack.so.VERSION"), + ("lib", "lib/libIcePatch2.so.VERSION"), + ("lib", "lib/libIce.so.VERSION"), + ("lib", "lib/libIceSSL.so.VERSION"), + ("lib", "lib/libIceStormService.so.VERSION"), + ("lib", "lib/libIceStorm.so.VERSION"), + ("lib", "lib/libIceUtil.so.VERSION"), + ("lib", "lib/libIceXML.so.VERSION"), + ("lib", "lib/libSlice.so.VERSION"), + ("dir", "share/slice"), + ("dir", "share/doc/Ice-%version%/images"), + ("dir", "share/doc/Ice-%version%/manual"), + ("xdir", "share/doc/Ice-%version%/config"), + ("xdir", "share/doc/Ice-%version%/certs")]), + Subpackage("c++-devel", + "", + "Ice tools, files and libraries for developing Ice applications in C++", + "Development/Libraries Development/Tools", + "", + "", + [("exe", "bin/slice2cpp"), + ("exe", "bin/slice2freeze"), + ("dir", "include"), + ("lib", "lib/libFreeze.so"), + ("lib", "lib/libGlacier2.so"), + ("lib", "lib/libIceBox.so"), + ("lib", "lib/libIcePack.so"), + ("lib", "lib/libIcePatch2.so"), + ("lib", "lib/libIce.so"), + ("lib", "lib/libIceSSL.so"), + ("lib", "lib/libIceStormService.so"), + ("lib", "lib/libIceStorm.so"), + ("lib", "lib/libIceUtil.so"), + ("lib", "lib/libIceXML.so"), + ("lib", "lib/libSlice.so"), + ("dir", "share/doc/Ice-%version%/demo"), + ("file", "share/doc/Ice-%version%/config/Make.rules"), + ("file", "share/doc/Ice-%version%/config/makedepend.py"), + ("file", "share/doc/Ice-%version%/config/makecerts"), + ("file", "share/doc/Ice-%version%/config/makeprops.py"), + ("file", "share/doc/Ice-%version%/config/Make.rules.Linux"), + ("file", "share/doc/Ice-%version%/config/server.cnf"), + ("file", "share/doc/Ice-%version%/config/client.cnf"), + ("file", "share/doc/Ice-%version%/config/generic.cnf"), + ("file", "share/doc/Ice-%version%/config/ice_ca.cnf"), + ("file", "share/doc/Ice-%version%/certs/cacert.pem"), + ("file", "share/doc/Ice-%version%/certs/c_dh1024.pem"), + ("file", "share/doc/Ice-%version%/certs/client_sslconfig.xml"), + ("file", "share/doc/Ice-%version%/certs/server_sslconfig.xml"), + ("file", "share/doc/Ice-%version%/certs/c_rsa1024_priv.pem"), + ("file", "share/doc/Ice-%version%/certs/c_rsa1024_pub.pem"), + ("file", "share/doc/Ice-%version%/certs/s_dh1024.pem"), + ("file", "share/doc/Ice-%version%/certs/s_rsa1024_priv.pem"), + ("file", "share/doc/Ice-%version%/certs/s_rsa1024_pub.pem"), + ("file", "share/doc/Ice-%version%/certs/sslconfig.dtd"), + ("file", "share/doc/Ice-%version%/certs/sslconfig.xml") + ]), + Subpackage("csharp", + "ice = %version%, mono-core >= 1.0.6", + "Ice runtime for C\# applications", + "Development/Libraries Development/Tools", + "", + "", + [("lib", "lib/glacier2cs.dll"), ("lib", "lib/icecs.dll"), ("lib", "lib/icepackcs.dll"), + ("lib", "lib/icepatch2cs.dll"), ("lib", "lib/icestormcs.dll")]), + Subpackage("csharp-devel", + "ice-csharp = %version%, mono-devel >= 1.0.6", + "Ice tools for developing Ice applications in C\#", + "Development/Libraries Development/Tools", + "", + "", + [("exe", "bin/slice2cs"), + ("file", "share/doc/Ice-%version%/config/Make.rules.cs"), + ("dir", "share/doc/Ice-%version%/democs")]), + Subpackage("java-devel", + "ice-java = %version%", + "Ice tools developing Ice applications in Java", + "Development/Libraries Development/Tools", + "", + "", + [("exe", "bin/slice2java"), + ("exe", "bin/slice2freezej"), + ("dir", "lib/Ice-%version%/ant"), + ("file", "share/doc/Ice-%version%/certs/certs.jks"), + ("file", "share/doc/Ice-%version%/certs/client.jks"), + ("file", "share/doc/Ice-%version%/certs/server.jks"), + ("file", "share/doc/Ice-%version%/certs/makecerts"), + ("dir", "share/doc/Ice-%version%/certs/openssl"), + ("dir", "share/doc/Ice-%version%/certs/cpp"), + ("file", "share/doc/Ice-%version%/config/build.properties"), + ("file", "share/doc/Ice-%version%/config/common.xml"), + ("dir", "share/doc/Ice-%version%/demoj")]), + Subpackage("python", + "ice = %version%, python >= 2.3.4", + "Ice runtime for Python applications", + "Development/Libraries", + "", + "", + [("lib", "lib/IcePy.so"), ("dir", "lib/Ice-%version%/python")]), + Subpackage("python-devel", + "ice-python = %version%", + "Ice tools for developing Ice applications in Python", + "Development/Libraries Development/Tools", + "", + "", + [("exe", "bin/slice2py"), + ("dir", "share/doc/Ice-%version%/demopy")]) + ] + +noarchFileList = [ + Package("ice-java", + "ice = %version%, db4-java >= 4.2.52", + "The Internet Communications Engine (ICE) is a modern alternative to object middleware", + "Development/Libraries", + "", + "BuildArch: noarch", + [("dir", "lib/Ice-%version%/Ice.jar") + ]) + ] + +# +# XXX - not used anywhere? +# +def _missingPathParts(source, dest): + print "Calculating : " + source + " and " + dest + + startPath = dest.find(source) + + result = dest[0:startPath] + # + # There is no common element, we'll need to create the whole destination tree. + # + if startPath == -1: + result = dest + # + # The common element is at the head, but we already know the path doesn't exists + # so we need to remaining path elements + # + elif startPath == 0: + result = dest + # + # If the common element is not at the tail of destination, then we probably + # need to create the whole path + # + elif startPath + len(source) + 1 < len(dest): + result = dest + + print "Making " + result + return result + +def _transformDirectories(transforms, version, installDir): + """Transforms a directory tree that was created with 'make installs' to an RPM friendly + directory tree. NOTE, this will not work on all transforms, there are certain + types of transforms in certain orders that will break it.""" + cwd = os.getcwd() + os.chdir(installDir + "/Ice-" + version) + for type, source, dest in transforms: + if dest.find("%version%"): + dest = dest.replace("%version%", version) + + sourcedir = source + destdir = dest + + if os.path.exists("./tmp"): + shutil.rmtree("./tmp") + try: + if not os.path.isdir(sourcedir): + os.renames(source, dest) + else: + # + # This is a special problem. What this implies is that + # we are trying to move the contents of a directory into + # a subdirectory of itself. The regular shutil.move() + # won't cut it. + # + if os.path.isdir(sourcedir) and sourcedir.split("/")[0] == destdir.split("/")[0]: + os.renames(sourcedir, "./tmp/" + sourcedir) + os.renames("./tmp/" + sourcedir, destdir) + else: + os.renames(source, dest) + + except OSError: + print "Exception occurred while trying to transform " + source + " to " + dest + raise + + os.chdir(cwd) + +def createArchSpecFile(ofile, installDir, version, soVersion): + for v in fileLists: + v.writeHdr(ofile, version, "1", installDir) + ofile.write("\n\n\n") + for v in fileLists: + v.writeFiles(ofile, version, soVersion) + ofile.write("\n") + +def createNoArchSpecFile(ofile, installDir, version, soVersion): + for v in noarchFileList: + v.writeHdr(ofile, version, "1", installDir) + ofile.write("\n\n\n") + for v in noarchFileList: + v.writeFiles(ofile, version, soVersion) + ofile.write("\n") + +def createFullSpecFile(ofile, installDir, version, soVersion): + fullFileList = [] + fullFileList.extend(fileLists) + fullFileList.append( + Subpackage("java", + "ice = %version%, db4-java >= 4.2.52", + "Ice runtime for Ice Java applciations", + "Development/Libraries", + "", + "", + [("dir", "lib/Ice-%version%/Ice.jar") + ])) + fullFileList[0].addPrepGenerator(writeUnpackingCommands) + fullFileList[0].addBuildGenerator(writeBuildCommands) + fullFileList[0].addInstallGenerator(writeInstallCommands) + fullFileList[0].addInstallGenerator(writeTransformCommands) + fullFileList[0].addInstallGenerator(writeDemoPkgCommands) + + for v in fullFileList: + v.writeHdr(ofile, version, "1", installDir) + ofile.write("\n\n\n") + for v in fullFileList: + v.writeFiles(ofile, version, soVersion) + ofile.write("\n") + +def createRPMSFromBinaries(buildDir, installDir, version, soVersion): + _transformDirectories(transforms, version, installDir) + + ofile = open(buildDir + "/Ice-" + version + ".spec", "w") + createSpecFile(ofile, installDir, version, soVersion) + ofile.flush() + ofile.close() + + os.system("tar xvfz " + installDir + "/Ice-" + version + "-demos.tar.gz -C " + installDir) + shutil.move(installDir + "/Ice-" + version, installDir + "/usr") + # + # Copy demo files so the RPM spec file can pick them up. + # + os.system("cp -pR " + installDir + "/Ice-" + version + "-demos/* " + installDir + "/usr/share/doc/Ice-" + version) + if os.path.exists(installDir + "/Ice-" + version + "-demos"): + shutil.rmtree(installDir + "/Ice-" + version + "-demos") + cwd = os.getcwd() + os.chdir(buildDir) + os.system("rpmbuild -bb Ice-" + version + ".spec") + + # + # Build noarch RPMs + # + ofile = open(buildDir + "/IceJ-" + version + ".spec", "w") + createNoArchSpecFile(ofile, installDir, version, soVersion) + ofile.flush() + ofile.close() + os.system("rpmbuild --target noarch -bb IceJ-" + version + ".spec") + +def writeUnpackingCommands(ofile, version): + ofile.write('%setup -n Ice-%{version} -q -T -D -b 0\n') + ofile.write("""# +# The Ice make system does not allow the prefix directory to be specified +# through an environment variable or a command line option. So we edit some +# files in place with sed. +# +sed -i -e 's/^prefix.*$/prefix = $\(RPM_BUILD_ROOT\)/' $RPM_BUILD_DIR/Ice-%{version}/config/Make.rules +%setup -q -n IceJ-%{version} -T -D -b 1 +%setup -q -n IcePy-%{version} -T -D -b 2 +sed -i -e 's/^prefix.*$/prefix = $\(RPM_BUILD_ROOT\)/' $RPM_BUILD_DIR/IcePy-%{version}/config/Make.rules +%setup -q -n IceCS-%{version} -T -D -b 3 +sed -i -e 's/^prefix.*$/prefix = $\(RPM_BUILD_ROOT\)/' $RPM_BUILD_DIR/IceCS-%{version}/config/Make.rules.cs +""") + +def writeBuildCommands(ofile, version): + ofile.write(""" +cd $RPM_BUILD_DIR/Ice-%{version} +gmake RPM_BUILD_ROOT=$RPM_BUILD_ROOT/usr +cd $RPM_BUILD_DIR/IcePy-%{version} +gmake ICE_HOME=$RPM_BUILD_DIR/Ice-%{version} RPM_BUILD_ROOT=$RPM_BUILD_ROOT/usr +cd $RPM_BUILD_DIR/IceCS-%{version} +export PATH=$RPM_BUILD_DIR/Ice-%{version}/bin:$PATH +export LD_LIBRARY_PATH=$RPM_BUILD_DIR/Ice-%{version}/lib:$LD_LIBRARY_PATH +gmake ICE_HOME=$RPM_BUILD_DIR/Ice-%{version} RPM_BUILD_ROOT=$RPM_BUILD_ROOT/usr +""") + +def writeInstallCommands(ofile, version): + ofile.write(""" +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/usr +mkdir -p $RPM_BUILD_ROOT/usr/bin +mkdir -p $RPM_BUILD_ROOT/usr/lib +mkdir -p $RPM_BUILD_ROOT/usr/include +mkdir -p $RPM_BUILD_ROOT/usr/doc +cd $RPM_BUILD_DIR/Ice-%{version} +gmake RPM_BUILD_ROOT=$RPM_BUILD_ROOT/usr install +cp -p $RPM_BUILD_DIR/IceJ-%{version}/lib/Ice.jar $RPM_BUILD_ROOT/usr/lib/Ice.jar +cp -pR $RPM_BUILD_DIR/IceJ-%{version}/ant $RPM_BUILD_ROOT +cd $RPM_BUILD_DIR/IcePy-%{version} +gmake ICE_HOME=$RPM_BUILD_DIR/Ice-%{version} RPM_BUILD_ROOT=$RPM_BUILD_ROOT/usr install +cd $RPM_BUILD_DIR/IceCS-%{version} +export PATH=$RPM_BUILD_DIR/Ice-%{version}/bin:$PATH +export LD_LIBRARY_PATH=$RPM_BUILD_DIR/Ice-%{version}/lib:$LD_LIBRARY_PATH +gmake ICE_HOME=$RPM_BUILD_DIR/Ice-%{version} RPM_BUILD_ROOT=$RPM_BUILD_ROOT/usr install +""") + +def writeTransformCommands(ofile, version): + ofile.write('#\n') + ofile.write('# The following commands transform a standard Ice installation directory\n') + ofile.write('# structure to a directory structure more suited to integrating into a\n') + ofile.write('# Linux system.\n') + ofile.write('#\n\n') + for type, source, dest in transforms: + dest = dest.replace('%version%', version) + if type == 'file': + ofile.write('mkdir -p $RPM_BUILD_ROOT/' + os.path.dirname(dest) + '\n') + ofile.write('mv $RPM_BUILD_ROOT/' + source + ' $RPM_BUILD_ROOT/' + dest + '\n') + elif type == 'dir': + if os.path.dirname(dest) <> '' and source.split('/')[0] == dest.split('/')[0]: + ofile.write('mkdir -p $RPM_BUILD_ROOT/arraftmp\n') + ofile.write('mv $RPM_BUILD_ROOT/' + source + ' $RPM_BUILD_ROOT/arraftmp/' + source + '\n') + ofile.write('mkdir -p $RPM_BUILD_ROOT/' + os.path.dirname(dest) + '\n') + ofile.write('mv $RPM_BUILD_ROOT/arraftmp/' + source + ' $RPM_BUILD_ROOT/' + dest + '\n') + ofile.write('rm -rf $RPM_BUILD_ROOT/arraftmp\n') + elif os.path.dirname(dest) <> '': + ofile.write('mkdir -p $RPM_BUILD_ROOT/' + os.path.dirname(dest) + '\n') + ofile.write('mv $RPM_BUILD_ROOT/' + source + ' $RPM_BUILD_ROOT/' + dest + '\n') + else: + ofile.write('mv $RPM_BUILD_ROOT/' + source + ' $RPM_BUILD_ROOT/' + dest + '\n') + +def writeDemoPkgCommands(ofile, version): + ofile.write('#\n') + ofile.write('# Extract the contents of the demo packaged into the installed location.\n') + ofile.write('#\n') + ofile.write('mkdir -p $RPM_BUILD_ROOT/share/doc/Ice-%{version}\n') + ofile.write('tar xvfz $RPM_SOURCE_DIR/Ice-%{version}-demos.tar.gz -C $RPM_BUILD_ROOT/share/doc\n') + ofile.write('cp -pR $RPM_BUILD_ROOT/share/doc/Ice-%{version}-demos/* $RPM_BUILD_ROOT/share/doc/Ice-%{version}\n') + ofile.write('rm -rf $RPM_BUILD_ROOT/share/doc/Ice-%{version}-demos\n') + +if __name__ == "main": + print 'Ice RPM Tools module' |