diff options
Diffstat (limited to 'nixpkgs/pkgs/games/steam/update-runtime.py')
-rwxr-xr-x | nixpkgs/pkgs/games/steam/update-runtime.py | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/games/steam/update-runtime.py b/nixpkgs/pkgs/games/steam/update-runtime.py new file mode 100755 index 000000000000..d33165b309da --- /dev/null +++ b/nixpkgs/pkgs/games/steam/update-runtime.py @@ -0,0 +1,141 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i python2 -p "with python2Packages; [python debian]" + +# Script to build a Nix script to actually build a Steam runtime. +# Patched version of https://github.com/ValveSoftware/steam-runtime/blob/master/build-runtime.py + +import os +import re +import sys +import urllib +import gzip +import cStringIO +import subprocess +from debian import deb822 +import argparse + +destdir="newpkg" +arches=["amd64", "i386"] + +REPO="http://repo.steampowered.com/steamrt" +DIST="scout" +COMPONENT="main" + +out = open("runtime-generated.nix", "w") +out.write("# This file is autogenerated! Do not edit it yourself, use update-runtime.py for regeneration.\n") +out.write("{ fetchurl }:\n") +out.write("\n") +out.write("{\n") + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("-b", "--beta", help="build beta runtime", action="store_true") + parser.add_argument("-d", "--debug", help="build debug runtime", action="store_true") + parser.add_argument("--symbols", help="include debugging symbols", action="store_true") + parser.add_argument("--repo", help="source repository", default=REPO) + return parser.parse_args() + +def download_file(file_base, file_name, file_url, sha256): + file_shortname = file_base + ".deb" + out.write(" rec {\n") + out.write(" name = \"%s\";\n" % file_name) + out.write(" sha256 = \"%s\";\n" % sha256) + out.write(" url = \"%s\";\n" % file_url.replace(REPO, "mirror://steamrt", 1)) + out.write(" source = fetchurl {\n") + out.write(" inherit url sha256;\n") + out.write(" name = \"%s\";\n" % file_shortname) + out.write(" };\n") + out.write(" }\n") + + +def parse_dependencies (arch, binarylist): + packages_url = "%s/dists/%s/%s/binary-%s/Packages" % (REPO, DIST, COMPONENT, arch) + for stanza in deb822.Packages.iter_paragraphs(urllib.urlopen(packages_url)): + p = stanza['Package'] + if p in binarylist: + for deps in stanza.relations['depends']: + for dep in deps: + binarylist.add(dep['name']) + return binarylist + +def install_binaries (arch, binarylist): + installset = parse_dependencies(arch, binarylist.copy()) + # Steam doesn't start if we include their libc + installset.remove("libc6") + + # + # Load the Packages file so we can find the location of each binary package + # + packages_url = "%s/dists/%s/%s/binary-%s/Packages" % (REPO, DIST, COMPONENT, arch) + print("Downloading %s binaries from %s" % (arch, packages_url)) + for stanza in deb822.Packages.iter_paragraphs(urllib.urlopen(packages_url)): + p = stanza['Package'] + if p in installset: + print("DOWNLOADING BINARY: %s" % p) + + # + # Download the package and install it + # + file_url="%s/%s" % (REPO,stanza['Filename']) + download_file(p, os.path.splitext(os.path.basename(stanza['Filename']))[0], file_url, stanza["SHA256"]) + installset.remove(p) + + for p in installset: + # + # There was a binary package in the list to be installed that is not in the repo + # + e = "ERROR: Package %s not found in Packages file %s\n" % (p, packages_url) + sys.stderr.write(e) + + + +def install_symbols (arch, binarylist): + # + # Load the Packages file to find the location of each symbol package + # + packages_url = "%s/dists/%s/%s/debug/binary-%s/Packages" % (REPO, DIST, COMPONENT, arch) + print("Downloading %s symbols from %s" % (arch, packages_url)) + for stanza in deb822.Packages.iter_paragraphs(urllib.urlopen(packages_url)): + p = stanza['Package'] + m = re.match('([\w\-\.]+)\-dbgsym', p) + if m and m.group(1) in binarylist: + print("DOWNLOADING SYMBOLS: %s" % p) + # + # Download the package and install it + # + file_url="%s/%s" % (REPO,stanza['Filename']) + download_file(p, os.path.splitext(os.path.basename(stanza['Filename']))[0], file_url) + + + +args = parse_args() + +REPO=args.repo + +if args.beta: + DIST="steam_beta" + +if args.debug: + COMPONENT = "debug" + +# Process packages.txt to get the list of source and binary packages +binary_pkgs = set() + +print ("Creating runtime-generated.nix") + +# https://github.com/ValveSoftware/steam-runtime/blob/173ef028fb6b84e804f4e1b0ef11c12ffd4f3a8e/build-runtime.py#L264 +binary_pkgs.add("steamrt-libs") +binary_pkgs.add("steamrt-legacy") + +for arch in arches: + out.write(" %s = [\n" % arch) + install_binaries(arch, binary_pkgs) + + if args.symbols: + install_symbols(arch, binary_pkgs) + + out.write(" ];\n"); + +out.write("}\n") + +# vi: set noexpandtab: |