diff --git a/packaging/dotnet-core/.gitignore b/packaging/dotnet-core/.gitignore
index bf99e1ea..a60017e7 100644
--- a/packaging/dotnet-core/.gitignore
+++ b/packaging/dotnet-core/.gitignore
@@ -1,5 +1,4 @@
build
cache
-libsodium.*.nupkg
-libsodium.*.nuspec
+temp
Makefile
diff --git a/packaging/dotnet-core/README.md b/packaging/dotnet-core/README.md
index 370afdc4..d4d22074 100644
--- a/packaging/dotnet-core/README.md
+++ b/packaging/dotnet-core/README.md
@@ -2,47 +2,40 @@ This directory contains scripts and files to package libsodium for .NET Core.
In .NET Core, it is customary to provide pre-compiled binaries for all platforms
as NuGet packages. The purpose of the `prepare.py` script in this directory is
-to generate a `Makefile` that downloads pre-compiled libsodium binaries from a
-list of sources and creates a NuGet package that can be uploaded to
-[nuget.org](https://nuget.org/).
+to generate a `Makefile` that downloads and builds libsodium binaries for a
+number of platforms and assembles them in a NuGet package that can be uploaded
+to [nuget.org](https://nuget.org/).
-
-#### Sources
-
-The list of sources is located in `prepare.py` and needs to be updated on each
-libsodium release. Currently, libsodium binaries are obtained in the following
-ways:
-
-* For Windows, the binaries are taken from
+* For Windows, binaries are obtained from
[download.libsodium.org](https://download.libsodium.org/libsodium/releases/).
-* For macOS, the binaries are extracted from the
+* For macOS, binaries are extracted from the
[Homebrew libsodium bottle](https://bintray.com/homebrew/bottles/libsodium).
-* For Linux, libsodium is compiled on and downloaded from the
- [openSUSE Build Service](https://build.opensuse.org/package/show/home:nsec/libsodium).
+* For Linux, libsodium is compiled in Docker containers.
+
+See `prepare.py` for the complete list of supported platforms.
+
+The metadata for the NuGet package is located in `libsodium.props`.
-#### Metadata
+**Making a pre-release**
-The metadata for the NuGet package is located in `libsodium.nuspec`. On each
-invocation, the `prepare.py` script generates a new version number and creates a
-`.nuspec` file that contains the metadata from `libsodium.nuspec`, the generated
-version number and the list of binaries.
-
-
-#### Making a release
-
-1. Update `_service` to reflect the current libsodium version.
-2. Download `libsodium.spec` and `libsodium.changes` from
- [here](https://build.opensuse.org/package/show?project=devel%3Alibraries%3Ac_c%2B%2B&package=libsodium).
-3. Upload `_service`, `libsodium.spec`, `libsodium.changes` and the current
- `libsodium-{version}.tar.gz` to openSUSE Build Service.
-4. Update the libsodium version, file names and download URLs in `prepare.py`.
-5. Run `./prepare.py` to generate the `Makefile` and
- `libsodium.{version}.nuspec`.
-6. Run `make` to download the binaries and create `libsodium.{version}.nupkg`.
- You may need to install `unzip`, `rpm2cpio` and `dotnet-dev` first.
-7. Verify that everything in the `.nupkg` file is in place.
-8. Publish the release by uploading the `.nupkg` file to
+1. Run `python3 prepare.py 1.0.11-preview-01` to generate the `Makefile`.
+ `1.0.11` is the libsodium version number; `01` is the pre-release
+ number and needs to be incremented for each pre-release.
+2. Take a look at the generated `Makefile`. It uses `sudo` a few times.
+3. Run `make` to download and build the binaries and create the NuGet
+ package. You may need to install `docker`, `make`, `curl`, `tar` and
+ `unzip` first. The NuGet package is output as a `.nupkg` file in the
+ `build` directory.
+4. Grab a cup of coffee. Downloading the Docker images and compiling the
+ Linux binaries takes a while.
+5. Verify that everything in the `.nupkg` file is in place.
+6. Publish the release by uploading the `.nupkg` file to
[nuget.org](https://nuget.org/).
-9. Commit the updated `prepare.py` and `version.json` to the libsodium
- repository.
+
+
+**Making a release**
+
+1. Run `python3 prepare.py 1.0.11` to generate the `Makefile`.
+
+The remaining steps are the same.
diff --git a/packaging/dotnet-core/_service b/packaging/dotnet-core/_service
deleted file mode 100644
index c6895234..00000000
--- a/packaging/dotnet-core/_service
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- ftp
- ftp.us.debian.org
- /debian/pool/main/libs/libsodium/libsodium_1.0.11-1.dsc
-
-
- ftp
- ftp.us.debian.org
- /debian/pool/main/libs/libsodium/libsodium_1.0.11.orig.tar.gz
-
-
- ftp
- ftp.us.debian.org
- /debian/pool/main/libs/libsodium/libsodium_1.0.11-1.debian.tar.xz
-
-
diff --git a/packaging/dotnet-core/libsodium.nuspec b/packaging/dotnet-core/libsodium.nuspec
deleted file mode 100644
index 12a254a9..00000000
--- a/packaging/dotnet-core/libsodium.nuspec
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- libsodium
-
- Frank Denis
- Frank Denis
- true
- https://raw.githubusercontent.com/jedisct1/libsodium/master/LICENSE
- https://libsodium.org/
-
- A modern and easy-to-use crypto library, packaged for use with .NET Core
- © 2013-2017 Frank Denis
-
-
-
-
-
-
diff --git a/packaging/dotnet-core/libsodium.props b/packaging/dotnet-core/libsodium.props
new file mode 100644
index 00000000..7fc4c00a
--- /dev/null
+++ b/packaging/dotnet-core/libsodium.props
@@ -0,0 +1,27 @@
+
+
+
+ netstandard1.1
+ true
+ true
+ false
+ $(MSBuildProjectDirectory)
+ $(MSBuildProjectFullPath)
+
+
+ libsodium
+
+ Frank Denis
+ Internal implementation package not meant for direct consumption. Please do not reference directly.
+ © 2013-2017 Frank Denis
+ true
+ https://raw.githubusercontent.com/jedisct1/libsodium/master/LICENSE
+ https://libsodium.org/
+
+
+
+
+
+
+
+
diff --git a/packaging/dotnet-core/prepare.py b/packaging/dotnet-core/prepare.py
index 660304cc..00882546 100644
--- a/packaging/dotnet-core/prepare.py
+++ b/packaging/dotnet-core/prepare.py
@@ -1,268 +1,239 @@
#!/usr/bin/python3
-import datetime
-import json
import os.path
+import re
import sys
-import xml.etree.ElementTree as ET
-
-#
-# OUTPUT CONFIGURATION
-#
-
-# Package metadata
-NUPKG_ID = 'libsodium'
-NUPKG_VERSION = '1.0.11'
-
-# The names of the libsodium binaries in the package
-LIBSODIUM_DLL = 'libsodium.dll'
-LIBSODIUM_DYLIB = 'libsodium.dylib'
-LIBSODIUM_SO = 'libsodium.so'
-
-#
-# INPUT CONFIGURATION
-#
-
-# The archives to download
-WIN_FILE = 'libsodium-1.0.11-msvc.zip'
-DEB_FILE = 'libsodium18_1.0.11-1_amd64.deb'
-RPM_FILE = 'libsodium18-1.0.11-14.1.x86_64.rpm'
-OSX_FILE = 'libsodium-1.0.11.{0}.bottle.tar.gz'
-
-# The URLs of the archives
-OFFICIAL_URL = 'https://download.libsodium.org/libsodium/releases/{0}'
-OPENSUSE_URL = 'http://download.opensuse.org/repositories/home:/nsec/{0}/{1}/{2}'
-HOMEBREW_URL = 'https://bintray.com/homebrew/bottles/download_file?file_path={0}'
-
-# The files within the archives to extract
-WIN_LIB = '{0}/Release/v140/dynamic/libsodium.dll'
-DEB_LIB = './usr/lib/x86_64-linux-gnu/libsodium.so.18.1.1'
-RPM_LIB = './usr/lib64/libsodium.so.18.1.1'
-OSX_LIB = 'libsodium/1.0.11/lib/libsodium.18.dylib'
-
-# Commands to extract a file from an archive
-DEB_EXTRACT = 'ar -p {0} data.tar.xz | tar xJ "{1}"'
-RPM_EXTRACT = 'rpm2cpio {0} | cpio -i "{1}"'
-TAR_EXTRACT = 'tar xzf {0} "{1}"'
-ZIP_EXTRACT = 'unzip {0} "{1}"'
-
-# The inputs
-INPUTS = [
-
- ( 'win10-x64',
- WIN_FILE,
- OFFICIAL_URL.format(WIN_FILE),
- WIN_LIB.format('x64'),
- ZIP_EXTRACT,
- LIBSODIUM_DLL),
-
- ( 'win10-x86',
- WIN_FILE,
- OFFICIAL_URL.format(WIN_FILE),
- WIN_LIB.format('Win32'),
- ZIP_EXTRACT,
- LIBSODIUM_DLL),
-
- ( 'debian.8-x64',
- DEB_FILE,
- OPENSUSE_URL.format('Debian_8.0', 'amd64', DEB_FILE),
- DEB_LIB,
- DEB_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'ubuntu.14.04-x64',
- DEB_FILE,
- OPENSUSE_URL.format('xUbuntu_14.04', 'amd64', DEB_FILE),
- DEB_LIB,
- DEB_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'ubuntu.16.04-x64',
- DEB_FILE,
- OPENSUSE_URL.format('xUbuntu_16.04', 'amd64', DEB_FILE),
- DEB_LIB,
- DEB_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'ubuntu.16.10-x64',
- DEB_FILE,
- OPENSUSE_URL.format('xUbuntu_16.10', 'amd64', DEB_FILE),
- DEB_LIB,
- DEB_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'centos.7-x64',
- RPM_FILE,
- OPENSUSE_URL.format('CentOS_7', 'x86_64', RPM_FILE),
- RPM_LIB,
- RPM_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'fedora.23-x64',
- RPM_FILE,
- OPENSUSE_URL.format('Fedora_23', 'x86_64', RPM_FILE),
- RPM_LIB,
- RPM_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'fedora.24-x64',
- RPM_FILE,
- OPENSUSE_URL.format('Fedora_24', 'x86_64', RPM_FILE),
- RPM_LIB,
- RPM_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'fedora.25-x64',
- RPM_FILE,
- OPENSUSE_URL.format('Fedora_25', 'x86_64', RPM_FILE),
- RPM_LIB,
- RPM_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'opensuse.42.1-x64',
- RPM_FILE,
- OPENSUSE_URL.format('openSUSE_Leap_42.1', 'x86_64', RPM_FILE),
- RPM_LIB,
- RPM_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'opensuse.42.2-x64',
- RPM_FILE,
- OPENSUSE_URL.format('openSUSE_Leap_42.2', 'x86_64', RPM_FILE),
- RPM_LIB,
- RPM_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'rhel.7-x64',
- RPM_FILE,
- OPENSUSE_URL.format('RHEL_7', 'x86_64', RPM_FILE),
- RPM_LIB,
- RPM_EXTRACT,
- LIBSODIUM_SO),
-
- ( 'osx.10.10-x64',
- OSX_FILE.format('yosemite'),
- HOMEBREW_URL.format(OSX_FILE.format('yosemite')),
- OSX_LIB,
- TAR_EXTRACT,
- LIBSODIUM_DYLIB),
-
- ( 'osx.10.11-x64',
- OSX_FILE.format('el_capitan'),
- HOMEBREW_URL.format(OSX_FILE.format('el_capitan')),
- OSX_LIB,
- TAR_EXTRACT,
- LIBSODIUM_DYLIB),
-
- ( 'osx.10.12-x64',
- OSX_FILE.format('sierra'),
- HOMEBREW_URL.format(OSX_FILE.format('sierra')),
- OSX_LIB,
- TAR_EXTRACT,
- LIBSODIUM_DYLIB),
+WINDOWS = [
+ # --------------------- ----------------- #
+ # Runtime ID Platform #
+ # --------------------- ----------------- #
+ ( 'win10-x64', 'x64' ),
+ ( 'win10-x86', 'Win32' ),
+ # --------------------- ----------------- #
]
-# The version cookie
-COOKIE_FILE = 'version.json'
+MACOS = [
+ # --------------------- ----------------- #
+ # Runtime ID Codename #
+ # --------------------- ----------------- #
+ ( 'osx.10.10-x64', 'yosemite' ),
+ ( 'osx.10.11-x64', 'el_capitan' ),
+ ( 'osx.10.12-x64', 'sierra' ),
+ # --------------------- ----------------- #
+]
-#
-# INTERMEDIATE FILES
-#
+LINUX = [
+ # --------------------- ------------------
+ # Runtime ID Docker Image
+ # --------------------- ------------------
+ ( 'alpine.3-x64', 'alpine:3.4' ),
+ ( 'centos.7-x64', 'centos:7.1.1503' ),
+ ( 'debian.8-x64', 'debian:8.2' ),
+ ( 'fedora.24-x64', 'fedora:24' ),
+ ( 'fedora.25-x64', 'fedora:25' ),
+ ( 'opensuse.42.1-x64', 'opensuse:42.1' ),
+ ( 'ubuntu.14.04-x64', 'ubuntu:trusty' ),
+ ( 'ubuntu.16.04-x64', 'ubuntu:xenial' ),
+ ( 'ubuntu.16.10-x64', 'ubuntu:yakkety' ),
+ # --------------------- ------------------
+]
+EXTRAS = [ 'LICENSE', 'AUTHORS', 'ChangeLog' ]
+
+PROPSFILE = 'libsodium.props'
+MAKEFILE = 'Makefile'
+BUILDDIR = 'build'
CACHEDIR = 'cache'
-TEMPDIR = 'build'
+TEMPDIR = 'temp'
-#
-# DO NOT EDIT BELOW THIS LINE
-#
+PACKAGE = 'libsodium'
+LIBRARY = 'libsodium'
-class Item:
- def __init__(self, input, cachedir, tempdir):
- rid, archive, url, file, extract, lib = input
+DOCKER = 'sudo docker'
- self.rid = rid
- self.archive = archive
- self.url = url
- self.file = file
- self.extract = extract
- self.lib = lib
+class Version:
- self.cachefile = os.path.join(cachedir, rid, archive)
- self.sourcedir = os.path.join(tempdir, rid)
- self.sourcefile = os.path.join(tempdir, rid, os.path.normpath(file))
- self.targetfile = os.path.join('runtimes', rid, 'native', lib)
+ def __init__(self, prefix, suffix):
+ self.prefix = prefix
+ self.suffix = suffix
+ self.version = prefix + '-' + suffix if suffix is not None else prefix
-def create_nuspec(template, nuspec, version, items):
- tree = ET.parse(template)
- package = tree.getroot()
- metadata = package.find('metadata')
- metadata.find('version').text = version
- files = package.find('files')
- for item in items:
- ET.SubElement(files, 'file', src=item.sourcefile, target=item.targetfile).tail = '\n'
- tree.write(nuspec, 'ascii', '')
+ self.builddir = os.path.join(BUILDDIR, prefix)
+ self.tempdir = os.path.join(TEMPDIR, prefix)
+ self.projfile = os.path.join(self.builddir, '{0}.pkgproj'.format(PACKAGE))
+ self.propsfile = os.path.join(self.builddir, '{0}.props'.format(PACKAGE))
+ self.pkgfile = os.path.join(BUILDDIR, '{0}.{1}.nupkg'.format(PACKAGE, self.version))
-def create_makefile(makefile, nupkg, nuspec, items):
- with open(makefile, 'w') as f:
- for item in items:
- f.write('FILES += {0}\n'.format(item.sourcefile))
+class WindowsItem:
+
+ def __init__(self, version, rid, platform):
+ self.url = 'https://download.libsodium.org/libsodium/releases/libsodium-{0}-msvc.zip'.format(version.prefix)
+ self.cachefile = os.path.join(CACHEDIR, re.sub(r'[^A-Za-z0-9.]', '-', self.url))
+ self.packfile = os.path.join(version.builddir, 'runtimes', rid, 'native', LIBRARY + '.dll')
+ self.itemfile = '{0}/Release/v140/dynamic/libsodium.dll'.format(platform)
+ self.tempdir = os.path.join(version.tempdir, rid)
+ self.tempfile = os.path.join(self.tempdir, os.path.normpath(self.itemfile))
+
+ def make(self, f):
f.write('\n')
- f.write('{0}: {1} $(FILES)\n\tdotnet nuget pack $<\n'.format(nupkg, nuspec))
- for item in items:
- f.write('\n')
- f.write('{0}:\n\t@mkdir -p $(dir $@)\n\tcurl -f#Lo $@ "{1}"\n'.format(item.cachefile, item.url))
- for item in items:
- f.write('\n')
- f.write('{0}: {1}\n\t@mkdir -p $(dir $@)\n\tcd {2} && {3}\n'.format(
- item.sourcefile,
- item.cachefile,
- item.sourcedir,
- item.extract.format(os.path.relpath(item.cachefile, item.sourcedir), item.file)))
+ f.write('{0}: {1}\n'.format(self.packfile, self.tempfile))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\tcp -f $< $@\n')
+ f.write('\n')
+ f.write('{0}: {1}\n'.format(self.tempfile, self.cachefile))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\tcd {0} && unzip -q -DD -o {1} \'{2}\'\n'.format(
+ self.tempdir,
+ os.path.relpath(self.cachefile, self.tempdir),
+ self.itemfile
+ ))
-def make_prerelease_version(version, suffix, cookie_file):
- cookies = dict()
- if os.path.isfile(cookie_file):
- with open(cookie_file, 'r') as f:
- cookies = json.load(f)
- cookie = cookies.get(suffix, '---').split('-')
- year, month, day, *rest = datetime.datetime.utcnow().timetuple()
- major = '{0:03}{1:02}'.format(year * 12 + month - 23956, day)
- minor = int(cookie[3]) + 1 if cookie[:3] == [version, suffix, major] else 1
- result = '{0}-{1}-{2}-{3:02}'.format(version, suffix, major, minor)
- cookies[suffix] = result
- with open(cookie_file, 'w') as f:
- json.dump(cookies, f, indent=4, sort_keys=True)
- return result
+class MacOSItem:
+
+ def __init__(self, version, rid, codename):
+ self.url = 'https://bintray.com/homebrew/bottles/download_file?file_path=libsodium-{0}.{1}.bottle.tar.gz'.format(version.prefix, codename)
+ self.cachefile = os.path.join(CACHEDIR, re.sub(r'[^A-Za-z0-9.]', '-', self.url))
+ self.packfile = os.path.join(version.builddir, 'runtimes', rid, 'native', LIBRARY + '.dylib')
+ self.itemfile = 'libsodium/{0}/lib/libsodium.dylib'.format(version.prefix)
+ self.tempdir = os.path.join(version.tempdir, rid)
+ self.tempfile = os.path.join(self.tempdir, os.path.normpath(self.itemfile))
+
+ def make(self, f):
+ f.write('\n')
+ f.write('{0}: {1}\n'.format(self.packfile, self.tempfile))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\tcp -f $< $@\n')
+ f.write('\n')
+ f.write('{0}: {1}\n'.format(self.tempfile, self.cachefile))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\tcd {0} && tar xzmf {1} \'{2}\'\n'.format(
+ self.tempdir,
+ os.path.relpath(self.cachefile, self.tempdir),
+ os.path.dirname(self.itemfile)
+ ))
+
+class LinuxItem:
+
+ def __init__(self, version, rid, docker_image):
+ self.url = 'https://download.libsodium.org/libsodium/releases/libsodium-{0}.tar.gz'.format(version.prefix)
+ self.cachefile = os.path.join(CACHEDIR, re.sub(r'[^A-Za-z0-9.]', '-', self.url))
+ self.packfile = os.path.join(version.builddir, 'runtimes', rid, 'native', LIBRARY + '.so')
+ self.docker_image = docker_image
+ self.recipe = rid
+
+ def make(self, f):
+ recipe = self.recipe
+ while not os.path.exists(os.path.join('recipes', recipe)):
+ m = re.fullmatch(r'([^.-]+)((([.][^.-]+)*)[.][^.-]+)?([-].*)?', recipe)
+ if m.group(5) is None:
+ recipe = 'build'
+ break
+ elif m.group(2) is None:
+ recipe = m.group(1)
+ else:
+ recipe = m.group(1) + m.group(3) + m.group(5)
+
+ f.write('\n')
+ f.write('{0}: {1}\n'.format(self.packfile, self.cachefile))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\t{0} run --rm '.format(DOCKER) +
+ '-v $(abspath recipes):/io/recipes ' +
+ '-v $(abspath $<):/io/libsodium.tar.gz ' +
+ '-v $(abspath $(dir $@)):/io/output ' +
+ '{0} sh -x -e /io/recipes/{1}\n'.format(self.docker_image, recipe))
+
+class ExtraItem:
+
+ def __init__(self, version, filename):
+ self.url = 'https://download.libsodium.org/libsodium/releases/libsodium-{0}.tar.gz'.format(version.prefix)
+ self.cachefile = os.path.join(CACHEDIR, re.sub(r'[^A-Za-z0-9.]', '-', self.url))
+ self.packfile = os.path.join(version.builddir, filename)
+ self.itemfile = 'libsodium-{0}/{1}'.format(version.prefix, filename)
+ self.tempdir = version.tempdir
+ self.tempfile = os.path.join(self.tempdir, os.path.normpath(self.itemfile))
+
+ def make(self, f):
+ f.write('\n')
+ f.write('{0}: {1}\n'.format(self.packfile, self.tempfile))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\tcp -f $< $@\n')
+ f.write('\n')
+ f.write('{0}: {1}\n'.format(self.tempfile, self.cachefile))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\tcd {0} && tar xzmf {1} \'{2}\'\n'.format(
+ self.tempdir,
+ os.path.relpath(self.cachefile, self.tempdir),
+ self.itemfile
+ ))
def main(args):
- if len(args) > 2 or len(args) > 1 and not args[1].isalpha:
- print('usage: {0} [label]'.format(os.path.basename(args[0])))
- sys.exit(1)
+ m = re.fullmatch(r'(\d+(?:\.\d+){1,3})(?:-(\w+(?:[_.-]\w+)*))?', args[1]) if len(args) == 2 else None
- version = NUPKG_VERSION
+ if m is None:
+ print('Usage:')
+ print(' python3 prepare.py [-preview-##]')
+ print()
+ print('Examples:')
+ print(' python3 prepare.py 1.0.11-preview-01')
+ print(' python3 prepare.py 1.0.11-preview-02')
+ print(' python3 prepare.py 1.0.11-preview-03')
+ print(' python3 prepare.py 1.0.11')
+ return 1
- if len(args) > 1:
- suffix = args[1].lower()
- else:
- suffix = 'preview'
+ version = Version(m.group(1), m.group(2))
- if suffix != 'release':
- version = make_prerelease_version(version, suffix, COOKIE_FILE)
- print('updated', COOKIE_FILE)
+ items = [ WindowsItem(version, rid, platform) for (rid, platform) in WINDOWS ] + \
+ [ MacOSItem(version, rid, codename) for (rid, codename) in MACOS ] + \
+ [ LinuxItem(version, rid, docker_image) for (rid, docker_image) in LINUX ] + \
+ [ ExtraItem(version, filename) for filename in EXTRAS ]
- template = NUPKG_ID + '.nuspec'
- nuspec = NUPKG_ID + '.' + version + '.nuspec'
- nupkg = NUPKG_ID + '.' + version + '.nupkg'
+ downloads = {item.cachefile: item.url for item in items}
- tempdir = os.path.join(TEMPDIR, version)
- items = [Item(input, CACHEDIR, tempdir) for input in INPUTS]
+ with open(MAKEFILE, 'w') as f:
+ f.write('all: {0}\n'.format(version.pkgfile))
- create_nuspec(template, nuspec, version, items)
- print('created', nuspec)
+ for download in sorted(downloads):
+ f.write('\n')
+ f.write('{0}:\n'.format(download))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\tcurl -f#Lo $@ \'{0}\'\n'.format(downloads[download]))
- create_makefile('Makefile', nupkg, nuspec, items)
- print('created', 'Makefile', 'to make', nupkg)
+ for item in items:
+ item.make(f)
+
+ f.write('\n')
+ f.write('{0}: {1}\n'.format(version.propsfile, PROPSFILE))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\tcp -f $< $@\n')
+
+ f.write('\n')
+ f.write('{0}: {1}\n'.format(version.projfile, version.propsfile))
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\techo \'' +
+ '' +
+ ''.format(os.path.relpath(version.propsfile, os.path.dirname(version.projfile))) +
+ '' +
+ '{0}'.format(version.prefix) +
+ '' +
+ '\' > $@\n')
+
+ f.write('\n')
+ f.write('{0}:'.format(version.pkgfile))
+ f.write(' \\\n\t\t{0}'.format(version.projfile))
+ f.write(' \\\n\t\t{0}'.format(version.propsfile))
+ for item in items:
+ f.write(' \\\n\t\t{0}'.format(item.packfile))
+ f.write('\n')
+ f.write('\t@mkdir -p $(dir $@)\n')
+ f.write('\t{0} run --rm '.format(DOCKER) +
+ '-v $(abspath recipes):/io/recipes ' +
+ '-v $(abspath $(dir $<)):/io/input ' +
+ '-v $(abspath $(dir $@)):/io/output ' +
+ '{0} sh -x -e /io/recipes/{1} "{2}"\n'.format('microsoft/dotnet:latest', 'pack', version.suffix))
+
+ print('prepared', MAKEFILE, 'to make', version.pkgfile)
+ return 0
if __name__ == '__main__':
- main(sys.argv)
+ sys.exit(main(sys.argv))
diff --git a/packaging/dotnet-core/recipes/alpine-x64 b/packaging/dotnet-core/recipes/alpine-x64
new file mode 100644
index 00000000..c0eb4186
--- /dev/null
+++ b/packaging/dotnet-core/recipes/alpine-x64
@@ -0,0 +1,3 @@
+apk add --update alpine-sdk
+
+. $(dirname $0)/build
diff --git a/packaging/dotnet-core/recipes/centos-x64 b/packaging/dotnet-core/recipes/centos-x64
new file mode 100644
index 00000000..04db18b2
--- /dev/null
+++ b/packaging/dotnet-core/recipes/centos-x64
@@ -0,0 +1,3 @@
+yum install -y binutils gcc make tar
+
+. $(dirname $0)/build
diff --git a/packaging/dotnet-core/recipes/debian-x64 b/packaging/dotnet-core/recipes/debian-x64
new file mode 100644
index 00000000..e22c9efc
--- /dev/null
+++ b/packaging/dotnet-core/recipes/debian-x64
@@ -0,0 +1,4 @@
+apt-get update
+apt-get install -y --no-install-recommends build-essential
+
+. $(dirname $0)/build
diff --git a/packaging/dotnet-core/recipes/fedora-x64 b/packaging/dotnet-core/recipes/fedora-x64
new file mode 100644
index 00000000..aebdb40a
--- /dev/null
+++ b/packaging/dotnet-core/recipes/fedora-x64
@@ -0,0 +1,3 @@
+dnf install -y binutils gcc make tar
+
+. $(dirname $0)/build
diff --git a/packaging/dotnet-core/recipes/opensuse-x64 b/packaging/dotnet-core/recipes/opensuse-x64
new file mode 100644
index 00000000..13cfee47
--- /dev/null
+++ b/packaging/dotnet-core/recipes/opensuse-x64
@@ -0,0 +1,3 @@
+zypper install -y --no-recommends -n binutils gcc make tar
+
+. $(dirname $0)/build
diff --git a/packaging/dotnet-core/recipes/pack b/packaging/dotnet-core/recipes/pack
new file mode 100644
index 00000000..dc74eda4
--- /dev/null
+++ b/packaging/dotnet-core/recipes/pack
@@ -0,0 +1,5 @@
+cp -r /io/input ~/build
+cd ~/build
+dotnet restore
+dotnet pack --version-suffix "$1"
+cp *.nupkg /io/output
diff --git a/packaging/dotnet-core/recipes/ubuntu-x64 b/packaging/dotnet-core/recipes/ubuntu-x64
new file mode 100644
index 00000000..e22c9efc
--- /dev/null
+++ b/packaging/dotnet-core/recipes/ubuntu-x64
@@ -0,0 +1,4 @@
+apt-get update
+apt-get install -y --no-install-recommends build-essential
+
+. $(dirname $0)/build
diff --git a/packaging/dotnet-core/version.json b/packaging/dotnet-core/version.json
deleted file mode 100644
index 26166e89..00000000
--- a/packaging/dotnet-core/version.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "preview": "1.0.11-preview-24920-01"
-}
\ No newline at end of file