]>
git.proxmox.com Git - mirror_linux-firmware.git/blob - build_packages.py
10 from jinja2
import Environment
, FileSystemLoader
13 def version_str() -> str:
15 return subprocess
.check_output(["git", "describe"]).strip().decode("utf-8")
16 except subprocess
.CalledProcessError
:
20 def prep_tree(package
) -> tuple:
21 tmpdir
= tempfile
.mkdtemp()
22 builddir
= os
.path
.join(tmpdir
, package
)
23 fwdir
= os
.path
.join(builddir
, "updates")
26 os
.makedirs(targetdir
, exist_ok
=True)
27 os
.makedirs(builddir
, exist_ok
=False)
28 os
.makedirs(fwdir
, exist_ok
=False)
30 subprocess
.check_output(["./copy-firmware.sh", fwdir
])
31 shutil
.copy("WHENCE", os
.path
.join(builddir
, "WHENCE"))
33 return (tmpdir
, builddir
, fwdir
, targetdir
)
36 def build_deb_package(package
, builddir
) -> None:
37 env
= Environment(loader
=FileSystemLoader(os
.path
.join("contrib", "templates")))
41 "date": datetime
.datetime
.now()
43 .strftime("%a, %d %b %Y %H:%M:%S %z"),
44 "version": version_str(),
48 "debian.control": "control",
49 "debian.changelog": "changelog",
50 "debian.copyright": "copyright",
53 os
.makedirs(os
.path
.join(builddir
, "debian"))
55 template
= env
.get_template(f
)
56 with
open(os
.path
.join(builddir
, "debian", templates
[f
]), "w") as w
:
57 w
.write(template
.render(d
))
59 with
open(os
.path
.join(builddir
, "debian", "install"), "w") as w
:
60 w
.write("updates lib/firmware\n")
62 with
open(os
.path
.join(builddir
, "debian", "docs"), "w") as w
:
65 with
open(os
.path
.join(builddir
, "debian", "rules"), "w") as w
:
66 w
.write("#!/usr/bin/make -f\n")
69 os
.chmod(os
.path
.join(builddir
, "debian", "rules"), 0o755)
71 os
.mkdir(os
.path
.join(builddir
, "debian", "source"))
72 with
open(os
.path
.join(builddir
, "debian", "source", "format"), "w") as w
:
73 w
.write("3.0 (native)\n")
76 os
.environ
["DEB_BUILD_OPTIONS"] = "nostrip"
77 subprocess
.check_output(["dpkg-buildpackage", "-us", "-uc", "-b"], cwd
=builddir
)
79 # result is in tmpdir (not builddir!)
82 "{package}_{version}_all.deb".format(package
=package
, version
=version_str()),
86 def build_rpm_package(package
, builddir
) -> None:
88 v
= version_str().replace("-", "_")
89 env
= Environment(loader
=FileSystemLoader(os
.path
.join("contrib", "templates")))
97 template
= env
.get_template("rpm.spec")
98 with
open(os
.path
.join(builddir
, "package.spec"), "wt") as w
:
99 w
.write(template
.render(d
))
100 cmd
= ["rpmbuild", "-bb", "--build-in-place", "package.spec"]
101 subprocess
.check_call(cmd
, cwd
=builddir
, stderr
=subprocess
.STDOUT
)
103 # result is in ~/rpmbuild/RPMS/noarch/
104 for root
, dirs
, files
in os
.walk(
105 os
.path
.join(os
.getenv("HOME"), "rpmbuild", "RPMS", "noarch")
108 if f
.startswith(package
) and f
.endswith(".rpm") and v
in f
:
109 return os
.path
.join(root
, f
)
110 raise FileNotFoundError("RPM package not found")
114 parser
= argparse
.ArgumentParser("Build upstream packages using Jinja2 templates")
115 parser
.add_argument("--deb", help="Build DEB package", action
="store_true")
116 parser
.add_argument("--rpm", help="Build RPM package", action
="store_true")
117 parser
.add_argument("--debug", help="Enable debug output", action
="store_true")
118 args
= parser
.parse_args()
120 if not (args
.rpm
or args
.deb
) or (args
.rpm
and args
.deb
):
127 if __name__
== "__main__":
130 package
= "linux-firmware-upstream"
131 tmpdir
, builddir
, fwdir
, targetdir
= prep_tree(package
)
135 result
= build_deb_package(package
, builddir
)
137 result
= build_rpm_package(package
, builddir
)
138 shutil
.copy(os
.path
.join(builddir
, result
), targetdir
)
140 "Built package: {}".format(
141 os
.path
.join(targetdir
, os
.path
.basename(result
))
146 shutil
.rmtree(tmpdir
)