Path: blob/main/sys/contrib/libsodium/packaging/dotnet-core/prepare.py
48375 views
#!/usr/bin/env python312import os.path3import re4import sys56WINDOWS = [7# --------------------- ----------------- #8# Runtime ID Platform #9# --------------------- ----------------- #10( 'win-x64', 'x64' ),11( 'win-x86', 'Win32' ),12# --------------------- ----------------- #13]1415MACOS = [16# --------------------- ----------------- #17# Runtime ID Codename #18# --------------------- ----------------- #19( 'osx-x64', 'sierra' ),20# --------------------- ----------------- #21]2223LINUX = [24# --------------------- ----------------- #25# Runtime ID Docker Image #26# --------------------- ----------------- #27( 'linux-x64', 'debian:stretch' ),28# --------------------- ----------------- #29]3031EXTRAS = [ 'LICENSE', 'AUTHORS', 'ChangeLog' ]3233PROPSFILE = 'libsodium.props'34MAKEFILE = 'Makefile'35BUILDDIR = 'build'36CACHEDIR = 'cache'37TEMPDIR = 'temp'3839PACKAGE = 'libsodium'40LIBRARY = 'libsodium'4142DOCKER = 'sudo docker'4344class Version:4546def __init__(self, libsodium_version, package_version):47self.libsodium_version = libsodium_version48self.package_version = package_version4950self.builddir = os.path.join(BUILDDIR, libsodium_version)51self.tempdir = os.path.join(TEMPDIR, libsodium_version)52self.projfile = os.path.join(self.builddir, '{0}.{1}.pkgproj'.format(PACKAGE, package_version))53self.propsfile = os.path.join(self.builddir, '{0}.props'.format(PACKAGE))54self.pkgfile = os.path.join(BUILDDIR, '{0}.{1}.nupkg'.format(PACKAGE, package_version))5556class WindowsItem:5758def __init__(self, version, rid, platform):59self.url = 'https://download.libsodium.org/libsodium/releases/libsodium-{0}-msvc.zip'.format(version.libsodium_version)60self.cachefile = os.path.join(CACHEDIR, re.sub(r'[^A-Za-z0-9.]', '-', self.url))61self.packfile = os.path.join(version.builddir, 'runtimes', rid, 'native', LIBRARY + '.dll')62self.itemfile = '{0}/Release/v140/dynamic/libsodium.dll'.format(platform)63self.tempdir = os.path.join(version.tempdir, rid)64self.tempfile = os.path.join(self.tempdir, os.path.normpath(self.itemfile))6566def make(self, f):67f.write('\n')68f.write('{0}: {1}\n'.format(self.packfile, self.tempfile))69f.write('\t@mkdir -p $(dir $@)\n')70f.write('\tcp -f $< $@\n')71f.write('\n')72f.write('{0}: {1}\n'.format(self.tempfile, self.cachefile))73f.write('\t@mkdir -p $(dir $@)\n')74f.write('\tcd {0} && unzip -q -DD -o {1} \'{2}\'\n'.format(75self.tempdir,76os.path.relpath(self.cachefile, self.tempdir),77self.itemfile78))7980class MacOSItem:8182def __init__(self, version, rid, codename):83self.url = 'https://bintray.com/homebrew/bottles/download_file?file_path=libsodium-{0}.{1}.bottle.tar.gz'.format(version.libsodium_version, codename)84self.cachefile = os.path.join(CACHEDIR, re.sub(r'[^A-Za-z0-9.]', '-', self.url))85self.packfile = os.path.join(version.builddir, 'runtimes', rid, 'native', LIBRARY + '.dylib')86self.itemfile = 'libsodium/{0}/lib/libsodium.dylib'.format(version.libsodium_version)87self.tempdir = os.path.join(version.tempdir, rid)88self.tempfile = os.path.join(self.tempdir, os.path.normpath(self.itemfile))8990def make(self, f):91f.write('\n')92f.write('{0}: {1}\n'.format(self.packfile, self.tempfile))93f.write('\t@mkdir -p $(dir $@)\n')94f.write('\tcp -f $< $@\n')95f.write('\n')96f.write('{0}: {1}\n'.format(self.tempfile, self.cachefile))97f.write('\t@mkdir -p $(dir $@)\n')98f.write('\tcd {0} && tar xzmf {1} \'{2}\'\n'.format(99self.tempdir,100os.path.relpath(self.cachefile, self.tempdir),101os.path.dirname(self.itemfile)102))103104class LinuxItem:105106def __init__(self, version, rid, docker_image):107self.url = 'https://download.libsodium.org/libsodium/releases/libsodium-{0}.tar.gz'.format(version.libsodium_version)108self.cachefile = os.path.join(CACHEDIR, re.sub(r'[^A-Za-z0-9.]', '-', self.url))109self.packfile = os.path.join(version.builddir, 'runtimes', rid, 'native', LIBRARY + '.so')110self.tempdir = os.path.join(version.tempdir, rid)111self.tempfile = os.path.join(self.tempdir, 'libsodium.so')112self.docker_image = docker_image113self.recipe = rid114115def make(self, f):116recipe = self.recipe117while not os.path.exists(os.path.join('recipes', recipe)):118m = re.fullmatch(r'([^.-]+)((([.][^.-]+)*)[.][^.-]+)?([-].*)?', recipe)119if m.group(5) is None:120recipe = 'build'121break122elif m.group(2) is None:123recipe = m.group(1)124else:125recipe = m.group(1) + m.group(3) + m.group(5)126127f.write('\n')128f.write('{0}: {1}\n'.format(self.packfile, self.tempfile))129f.write('\t@mkdir -p $(dir $@)\n')130f.write('\tcp -f $< $@\n')131f.write('\n')132f.write('{0}: {1}\n'.format(self.tempfile, self.cachefile))133f.write('\t@mkdir -p $(dir $@)\n')134f.write('\t{0} run --rm '.format(DOCKER) +135'-v $(abspath recipes):/io/recipes ' +136'-v $(abspath $<):/io/libsodium.tar.gz ' +137'-v $(abspath $(dir $@)):/io/output ' +138'{0} sh -x -e /io/recipes/{1}\n'.format(self.docker_image, recipe))139140class ExtraItem:141142def __init__(self, version, filename):143self.url = 'https://download.libsodium.org/libsodium/releases/libsodium-{0}.tar.gz'.format(version.libsodium_version)144self.cachefile = os.path.join(CACHEDIR, re.sub(r'[^A-Za-z0-9.]', '-', self.url))145self.packfile = os.path.join(version.builddir, filename)146self.itemfile = 'libsodium-{0}/{1}'.format(version.libsodium_version, filename)147self.tempdir = os.path.join(version.tempdir, 'extras')148self.tempfile = os.path.join(self.tempdir, os.path.normpath(self.itemfile))149150def make(self, f):151f.write('\n')152f.write('{0}: {1}\n'.format(self.packfile, self.tempfile))153f.write('\t@mkdir -p $(dir $@)\n')154f.write('\tcp -f $< $@\n')155f.write('\n')156f.write('{0}: {1}\n'.format(self.tempfile, self.cachefile))157f.write('\t@mkdir -p $(dir $@)\n')158f.write('\tcd {0} && tar xzmf {1} \'{2}\'\n'.format(159self.tempdir,160os.path.relpath(self.cachefile, self.tempdir),161self.itemfile162))163164def main(args):165m = re.fullmatch(r'((\d+\.\d+\.\d+)(\.\d+)?)(?:-(\w+(?:[_.-]\w+)*))?', args[1]) if len(args) == 2 else None166167if m is None:168print('Usage:')169print(' python3 prepare.py <version>')170print()171print('Examples:')172print(' python3 prepare.py 1.0.16-preview-01')173print(' python3 prepare.py 1.0.16-preview-02')174print(' python3 prepare.py 1.0.16-preview-03')175print(' python3 prepare.py 1.0.16')176print(' python3 prepare.py 1.0.16.1-preview-01')177print(' python3 prepare.py 1.0.16.1')178print(' python3 prepare.py 1.0.16.2')179return 1180181version = Version(m.group(2), m.group(0))182183items = [ WindowsItem(version, rid, platform) for (rid, platform) in WINDOWS ] + \184[ MacOSItem(version, rid, codename) for (rid, codename) in MACOS ] + \185[ LinuxItem(version, rid, docker_image) for (rid, docker_image) in LINUX ] + \186[ ExtraItem(version, filename) for filename in EXTRAS ]187188downloads = {item.cachefile: item.url for item in items}189190with open(MAKEFILE, 'w') as f:191f.write('all: {0}\n'.format(version.pkgfile))192193for download in sorted(downloads):194f.write('\n')195f.write('{0}:\n'.format(download))196f.write('\t@mkdir -p $(dir $@)\n')197f.write('\tcurl -f#Lo $@ \'{0}\'\n'.format(downloads[download]))198199for item in items:200item.make(f)201202f.write('\n')203f.write('{0}: {1}\n'.format(version.propsfile, PROPSFILE))204f.write('\t@mkdir -p $(dir $@)\n')205f.write('\tcp -f $< $@\n')206207f.write('\n')208f.write('{0}: {1}\n'.format(version.projfile, version.propsfile))209f.write('\t@mkdir -p $(dir $@)\n')210f.write('\techo \'' +211'<Project Sdk="Microsoft.NET.Sdk">' +212'<Import Project="{0}" />'.format(os.path.relpath(version.propsfile, os.path.dirname(version.projfile))) +213'<PropertyGroup>' +214'<Version>{0}</Version>'.format(version.package_version) +215'</PropertyGroup>' +216'</Project>\' > $@\n')217218f.write('\n')219f.write('{0}:'.format(version.pkgfile))220f.write(' \\\n\t\t{0}'.format(version.projfile))221f.write(' \\\n\t\t{0}'.format(version.propsfile))222for item in items:223f.write(' \\\n\t\t{0}'.format(item.packfile))224f.write('\n')225f.write('\t@mkdir -p $(dir $@)\n')226f.write('\t{0} run --rm '.format(DOCKER) +227'-v $(abspath recipes):/io/recipes ' +228'-v $(abspath $(dir $<)):/io/input ' +229'-v $(abspath $(dir $@)):/io/output ' +230'{0} sh -x -e /io/recipes/{1} {2}\n'.format('microsoft/dotnet:2.0-sdk', 'pack', os.path.relpath(version.projfile, version.builddir)))231232f.write('\n')233f.write('test: {0}\n'.format(version.pkgfile))234f.write('\t{0} run --rm '.format(DOCKER) +235'-v $(abspath recipes):/io/recipes ' +236'-v $(abspath $(dir $<)):/io/packages ' +237'{0} sh -x -e /io/recipes/{1} "{2}"\n'.format('microsoft/dotnet:2.0-sdk', 'test', version.package_version))238239print('prepared', MAKEFILE, 'to make', version.pkgfile, 'for libsodium', version.libsodium_version)240return 0241242if __name__ == '__main__':243sys.exit(main(sys.argv))244245246