use spec2make.py (very first draft) when the C code does not compile (f15)
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 7 Jun 2011 22:25:39 +0000 (00:25 +0200)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 7 Jun 2011 22:25:39 +0000 (00:25 +0200)
Makefile
spec2make.py [new file with mode: 0755]

index 8eb9440..88ed7f3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -424,7 +424,7 @@ endif
 ### this utility allows to extract various info from a spec file
 ### and to define them in makefiles
 spec2make: spec2make.c
-       $(CC) -g -Wall $< -o $@ -lrpm -lrpmbuild -lrpmio -lpopt
+       $(CC) -g -Wall $< -o $@ -lrpm -lrpmbuild -lrpmio -lpopt || ln -s spec2make.py spec2make
 
 ### run spec2make on the spec file and include the result
 # usage: spec2make package
diff --git a/spec2make.py b/spec2make.py
new file mode 100755 (executable)
index 0000000..8a8966a
--- /dev/null
@@ -0,0 +1,82 @@
+#!/usr/bin/python
+
+import sys
+import os.path
+import rpm
+
+from optparse import OptionParser
+
+def main ():
+    usage="%prog [rpmbuild-options] specfile pkg-name"
+    parser=OptionParser(usage=usage)
+    parser.add_option('-t','--target',action='store',dest='target',default=None,
+                      help='specify target arch')
+    parser.add_option('-w','--whitelist-rpms',action='store',dest='whitelist',default='',
+                      help='comma separated list of rpms to expose in makefile')
+    (options,args) = parser.parse_args()
+
+    try:
+        [specfile,package_name]=args
+    except:
+        parser.print_help()
+        sys.exit(1)
+
+    ts=rpm.TransactionSet()
+    specobj = ts.parseSpec(specfile)
+    for (fullsource,_,__) in specobj.sources:
+        #print '###fullsource=',fullsource
+        print "%s.tarballs += SOURCES/%s" %(package_name,os.path.basename(fullsource))
+        for suffix in [".tar.gz", ".tgz", ".tar.bz2", ] : 
+            #print "# trying %s"%suffix
+            if fullsource.endswith(suffix):
+                sourcename=fullsource.replace(suffix,"")
+                print "%s.source := SOURCES/%s" %(package_name,os.path.basename(sourcename))
+                break
+
+    # Get SRPM name from name of first package
+    package=specobj.packages[0]
+    header0=package.header
+    name=header0.format('%{name}')
+    version=header0.format('%{version}')
+    release=header0.format('%{release}')
+    print "%s.srpm := SRPMS/%s-%s-%s.src.rpm"%(package_name, name, version, release)
+
+    target = options.target
+    whitelist=options.whitelist.split(',')
+    # Print non-empty packages
+    for package in specobj.packages:
+        header=package.header
+        name=header.format('%{name}')
+        version=header.format('%{version}')
+        release=header.format('%{release}')
+        arch=target or header.format('%{arch}')
+        
+        # skip dummy entries
+        if not (name and version and release and arch) : continue
+
+        whitelisted = name in whitelist
+
+        if header.fullFilelist or whitelisted:
+            # attach (add) rpm path to package
+            print "%s.rpms += RPMS/%s/%s-%s-%s.%s.rpm"%\
+                (package_name, arch, name, version, release, arch)
+            # convenience
+            print "%s.rpmnames += %s"%\
+                (package_name, name);
+            # attach path to rpm name
+            print "%s.rpm-path := RPMS/%s/%s-%s-%s.%s.rpm"%\
+                (name,arch, name, version, release, arch)
+            # attach package to rpm name for backward resolution - should be unique
+            print "%s.package := %s"%\
+                (name,package_name)
+            
+    for macro in ["release" , "name" , "version" , "taglevel" , ] :
+        format="%%{%s}"%macro
+        try:     print "%s.rpm-%s := %s"%(package_name,macro,header0.format(format))
+        except : print "# %s.rpm-%s undefined"%(package_name,macro)
+
+    # export arch
+    print "%s.rpm-arch := %s"%(package_name,target)
+
+if __name__ == '__main__':
+    main()