]> git.pld-linux.org Git - projects/pld-builder.new.git/blame - client/rebuild-kernel-packages.py
- remove kernel 4.14 from the mix, does not build with gcc 11+
[projects/pld-builder.new.git] / client / rebuild-kernel-packages.py
CommitLineData
082f68f1 1#!/usr/bin/python3
17e4ceb7 2
fe8cf8f9
JR
3from __future__ import print_function
4
17e4ceb7
JR
5import argparse
6import collections
74a34bba 7import functools
17e4ceb7
JR
8import os
9import rpm
10import shlex
11import subprocess
12import sys
13
bae3572e 14supported_kernels = ['head', '5.10', '5.4', '4.19', '4.9']
9c1e8c84 15
17e4ceb7 16packages = collections.OrderedDict([
bae3572e
JR
17 ('dahdi-linux', ['head', '5.10', '5.4', '4.19', '4.9']),
18 ('ipset', ['head', '5.10', '5.4', '4.19', '4.9']),
19 ('lin_tape', ['head', '5.10', '5.4', '4.19', '4.9']),
20 ('linux-gpib', ['head', '5.10', '5.4', '4.19', '4.9']),
21 ('lttng-modules', ['head', '5.10', '5.4', '4.19', '4.9']),
22 ('r8168', ['head', '5.10', '5.4', '4.19', '4.9']),
23 ('rtl8812au', ['head', '5.10', '5.4', '4.19', '4.9']),
24 ('VirtualBox', ['head', '5.10', '5.4', '4.19', '4.9']),
25 ('vpb-driver', ['head', '5.10', '5.4', '4.19', '4.9']),
26 ('wl', ['head', '5.10', '5.4', '4.19', '4.9']),
27 ('xorg-driver-video-nvidia', ['head', '5.10', '5.4', '4.19', '4.9']),
28 ('xorg-driver-video-nvidia-legacy-390xx', ['head', '5.10', '5.4', '4.19', '4.9']),
29 ('zfs', ['head', '5.10', '5.4', '4.19', '4.9']),
3677825f 30 ('xtables-addons', ['head', '5.10', '5.4', '4.19']),
bae3572e
JR
31 ('xtables-addons:XTADDONS_2', ['4.9']),
32 ('crash', ['5.4', '4.19', '4.9']),
33 ('WireGuard', ['5.4', '4.19', '4.9']),
17e4ceb7
JR
34])
35
36def get_rpmdir():
37 return rpm.expandMacro("%_topdir")
38
39def clean_pkgname(package):
40 pkg = package.split(":")
41 if not pkg:
42 raise NameError
43 spec = pkg[0]
44 # ensure package ends with .spec
45 if not spec.endswith(".spec"):
46 spec += ".spec"
47 name = spec[:-5]
48 # and pkg without subdir
49 name = name[name.rfind("/")+1:]
50 try:
51 branch = pkg[1]
52 except IndexError:
53 branch = "master"
54 return [name, spec, branch]
55
56def run_command(command, verbose=False, quiet=True):
74a34bba 57 gitproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=-1, text=True)
17e4ceb7
JR
58 gitproc.wait()
59 out = gitproc.stdout.read().strip("\n'")
60 if verbose:
fe8cf8f9 61 print(' '.join(command))
17e4ceb7 62 if not quiet:
fe8cf8f9 63 print(out)
17e4ceb7
JR
64 if gitproc.returncode != 0:
65 if quiet:
fe8cf8f9
JR
66 print(out)
67 print('\nError running command: \n')
68 print(' '.join(command))
17e4ceb7
JR
69 return (False, None)
70 return (True, out)
71
8a2c0d44 72def get_last_tag(name, spec, branch, dist="th", kernel=None, verbose=False):
17e4ceb7
JR
73 fetch_package(name, spec, branch, verbose=verbose)
74 if os.path.exists("%s/%s/%s" % (get_rpmdir(), name, spec)):
75 tag = get_autotag(name, spec, branch, dist=dist, kernel=kernel, verbose=verbose)
76 return tag
77
78def get_autotag(name, spec, branch, dist="th", kernel=None, verbose=False):
79 if not kernel or kernel == "head" or kernel == "master":
80 ref = "auto/%s/%s-[0-9]*" % (dist, name)
81 else:
82 ref = "auto/%s/%s-%s-[0-9]*" % (dist, name, kernel)
83 gitdir = "%s/%s" % (get_rpmdir(), name)
84 tag = run_command(["/usr/bin/git", "-C", gitdir, "describe", "--tags", "--match", ref, "--abbrev=0", branch], verbose=verbose)
85 return tag[1]
86
87def fetch_package(name, spec, branch, verbose=False):
88 gitdir = "%s/%s" % (get_rpmdir(), name)
89 if os.path.exists("%s/.git" % gitdir):
90 run_command(["/usr/bin/git", "-C", gitdir, "fetch", "origin"], verbose=verbose)
91 else:
92 run_command(["/usr/bin/git", "clone", "-o", "origin", "git://git.pld-linux.org/packages/" + name + ".git", gitdir], verbose=verbose)
620e0c77 93 if not os.path.exists("%s/%s" % (gitdir, spec)):
17e4ceb7
JR
94 return None
95 run_command(["/usr/bin/git", "-C", gitdir, "config", "--local", "--add", "remote.origin.fetch", "refs/notes/*:refs/notes/*"], verbose=verbose)
96 run_command(["/usr/bin/git", "-C", gitdir, "remote", "set-url", "--push", "origin", "ssh://git@git.pld-linux.org/packages/" + name], verbose=verbose)
97 run_command(["/usr/bin/git", "-C", gitdir, "fetch", "origin", "refs/notes/*:refs/notes/*"], verbose=verbose)
98 if branch:
99 if run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "--verify", "-q", branch], verbose=verbose):
100 run_command(["/usr/bin/git", "-C", gitdir, "checkout", branch, "--"], verbose=verbose)
101 elif run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "--verify", "-q", "refs/remotes/origin/" + branch], verbose=verbose):
102 run_command(["/usr/bin/git", "-C", gitdir, "checkout", "-t", "refs/remotes/origin/" + branch], verbose=verbose)
103 rev_branch = run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", branch], verbose=verbose)
104 rev_head = run_command(["/usr/bin/git", "-C", gitdir, "rev-parse", "HEAD"], verbose=verbose)
105 if rev_branch[1] != rev_head[1]:
fe8cf8f9 106 print("Error: cannot checkout " + name)
17e4ceb7
JR
107 return None
108 run_command(["/usr/bin/git", "-C", gitdir, "merge", "--ff-only", "@{upstream}"], verbose=verbose)
109
110def csv_list(string):
111 return string.split(',')
112
74a34bba
JR
113# TDOD: convert this to key function
114# https://docs.python.org/3/library/stdtypes.html#list.sort
17e4ceb7
JR
115def kernel_cmp(x, y):
116 x = x.split('.')
117 y = y.split('.')
118 try:
119 int(x[0])
120 except ValueError:
121 return 1
122 try:
123 int(y[0])
124 except ValueError:
125 return -1
126 majdiff = int(x[0]) - int(y[0])
127 if majdiff:
128 return majdiff
129 mindiff = int(x[1]) - int(y[1])
130 return mindiff
131
132def main():
133 parser = argparse.ArgumentParser(description='Rebuild kernel modules.')
134 parser.add_argument('-d', '--dist',
135 default='th',
136 help='Dist name for getting auto-tags (default: %(default)s)')
137 parser.add_argument('-m', '--make-request',
138 default="make-request",
139 metavar='SCRIPT',
140 help='Name / path of the make-request script (default: %(default)s)')
fc433b8b
JR
141 parser.add_argument('-ni', '--noinstall',
142 action='store_true',
143 help='skip installing new kernel packages on src builder (default: %(default)s)')
17e4ceb7
JR
144 parser.add_argument('-p', '--packages',
145 type=csv_list,
146 default=packages.keys(),
147 metavar='PKG1[,PKG2...]',
148 help='Package names to build (default: all)')
149 parser.add_argument('-s', '--skip',
150 type=csv_list,
151 metavar='VER1[,VER2...]',
152 help='Don\'t build modules specific to these kernels (default: %(default)s)')
9236d6a6
JR
153 parser.add_argument('-k', '--kernel',
154 default=supported_kernels,
155 type=csv_list,
156 metavar='VER1[,VER2...]',
157 help='Only build modules for these kernels (default: %(default)s)')
17e4ceb7
JR
158 parser.add_argument('-t', '--test-build',
159 action='store_true',
160 help='Perform a test-builds')
1e798ef6
JR
161 parser.add_argument('-bh', '--head',
162 action='store_true',
163 help='Perform build from head instead of last auto-tag')
17e4ceb7
JR
164 parser.add_argument('-v', '--verbose',
165 action='store_true',
166 help='Be verbose when running commands (default: %(default)s)')
167 args = parser.parse_args()
168
169 build_mode = '-r'
170 if args.test_build:
8a2c0d44 171 build_mode = '-t'
17e4ceb7
JR
172
173 if not args.skip:
174 args.skip = []
175
176 if not args.make_request.startswith('/'):
177 for path in os.defpath.split(os.pathsep):
178 if os.path.isfile('/'.join([path, args.make_request])):
179 args.make_request = '/'.join([path, args.make_request])
180 break
181
9236d6a6
JR
182 build_kernels = supported_kernels
183 if args.kernel:
184 build_kernels = args.kernel
185
fc433b8b
JR
186 if not args.noinstall:
187 source_packages = []
9c1e8c84
JR
188 for kernel in supported_kernels:
189 if kernel == 'head':
190 ver = '-'
191 else:
192 ver = '-%s-' % kernel
fc433b8b 193 source_packages.extend(['kernel%sheaders' % ver, 'kernel%smodule-build' % ver])
16e6ea5c 194 command = (('%(make_request)s -b %(dist)s-src -t -c '
fc433b8b 195 '"poldek -n %(dist)s -n %(dist)s-ready -n %(dist)s-test --up ; '
0127a8c9 196 'poldek -uvg %(source_packages)s"') %
fc433b8b
JR
197 {'make_request': args.make_request,
198 'dist': args.dist,
199 'source_packages': ' '.join(source_packages)})
200 run_command(shlex.split(command), verbose=args.verbose, quiet=False)
74a34bba 201 input('\nPress Enter after src builder updates kernel packages...')
17e4ceb7 202
fe8cf8f9 203 print('\nCurrent kernels versions:')
17e4ceb7
JR
204 all_kernels = set()
205 for kernel_list in packages.values():
206 all_kernels.update(kernel_list)
207 all_kernels = list(all_kernels)
74a34bba
JR
208 # TDOD: convert this to key function
209 # https://docs.python.org/3/library/stdtypes.html#list.sort
210 all_kernels.sort(key=functools.cmp_to_key(kernel_cmp), reverse=True)
17e4ceb7
JR
211 for kernel in all_kernels:
212 branch = 'master'
213 if kernel != 'head':
214 branch = 'LINUX_%s' % kernel.replace('.','_')
fe8cf8f9 215 print('%s: %s' % (kernel, get_last_tag('kernel', 'kernel.spec', branch, dist=args.dist, kernel=kernel, verbose=args.verbose)))
17e4ceb7 216
0adcdbc2 217 for pkg, kernels in packages.items():
8a2c0d44
JR
218 try:
219 name, spec, branch = clean_pkgname(pkg)
220 except NameError:
221 continue
17e4ceb7
JR
222 if not pkg in args.packages:
223 continue
224 if not set(kernels).symmetric_difference(args.skip):
225 continue
9236d6a6 226 selected_kernels = set(kernels).intersection(build_kernels)
10c258a1
JR
227 if not selected_kernels:
228 continue
fc433b8b 229 if args.test_build:
7ae71f9a
JR
230 if branch:
231 spec = '%s:%s' % (spec, branch)
16e6ea5c 232 command = ("%s -nd %s -d %s --define 'build_kernels %s' --without userspace %s" %
9236d6a6 233 (args.make_request, build_mode, args.dist, ','.join(selected_kernels), spec))
fc433b8b 234 else:
1e798ef6
JR
235 if not args.head:
236 tag = get_last_tag(name, spec, branch, dist=args.dist, verbose=args.verbose)
237 if not tag:
fe8cf8f9 238 print("Failed getching last autotag for %s!" % pkg)
1e798ef6
JR
239 continue
240 spec = '%s:%s' % (spec, tag)
241 command = ("%s -nd %s -d %s --define 'build_kernels %s' --without userspace %s" %
9236d6a6 242 (args.make_request, build_mode, args.dist, ','.join(selected_kernels), spec))
17e4ceb7
JR
243 run_command(shlex.split(command), verbose=args.verbose, quiet=False)
244
17e4ceb7
JR
245if __name__ == "__main__":
246 main()
247
248# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
This page took 7.160717 seconds and 4 git commands to generate.