|
|
@@ -59,6 +59,8 @@ import (
|
|
|
"time"
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/internal/build"
|
|
|
+ "github.com/ethereum/go-ethereum/params"
|
|
|
+ sv "github.com/ethereum/go-ethereum/swarm/version"
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
@@ -77,46 +79,74 @@ var (
|
|
|
executablePath("geth"),
|
|
|
executablePath("puppeth"),
|
|
|
executablePath("rlpdump"),
|
|
|
- executablePath("swarm"),
|
|
|
executablePath("wnode"),
|
|
|
}
|
|
|
|
|
|
+ // Files that end up in the swarm*.zip archive.
|
|
|
+ swarmArchiveFiles = []string{
|
|
|
+ "COPYING",
|
|
|
+ executablePath("swarm"),
|
|
|
+ }
|
|
|
+
|
|
|
// A debian package is created for all executables listed here.
|
|
|
debExecutables = []debExecutable{
|
|
|
{
|
|
|
- Name: "abigen",
|
|
|
+ BinaryName: "abigen",
|
|
|
Description: "Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages.",
|
|
|
},
|
|
|
{
|
|
|
- Name: "bootnode",
|
|
|
+ BinaryName: "bootnode",
|
|
|
Description: "Ethereum bootnode.",
|
|
|
},
|
|
|
{
|
|
|
- Name: "evm",
|
|
|
+ BinaryName: "evm",
|
|
|
Description: "Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode.",
|
|
|
},
|
|
|
{
|
|
|
- Name: "geth",
|
|
|
+ BinaryName: "geth",
|
|
|
Description: "Ethereum CLI client.",
|
|
|
},
|
|
|
{
|
|
|
- Name: "puppeth",
|
|
|
+ BinaryName: "puppeth",
|
|
|
Description: "Ethereum private network manager.",
|
|
|
},
|
|
|
{
|
|
|
- Name: "rlpdump",
|
|
|
+ BinaryName: "rlpdump",
|
|
|
Description: "Developer utility tool that prints RLP structures.",
|
|
|
},
|
|
|
{
|
|
|
- Name: "swarm",
|
|
|
- Description: "Ethereum Swarm daemon and tools",
|
|
|
+ BinaryName: "wnode",
|
|
|
+ Description: "Ethereum Whisper diagnostic tool",
|
|
|
},
|
|
|
+ }
|
|
|
+
|
|
|
+ // A debian package is created for all executables listed here.
|
|
|
+ debSwarmExecutables = []debExecutable{
|
|
|
{
|
|
|
- Name: "wnode",
|
|
|
- Description: "Ethereum Whisper diagnostic tool",
|
|
|
+ BinaryName: "swarm",
|
|
|
+ PackageName: "ethereum-swarm",
|
|
|
+ Description: "Ethereum Swarm daemon and tools",
|
|
|
},
|
|
|
}
|
|
|
|
|
|
+ debEthereum = debPackage{
|
|
|
+ Name: "ethereum",
|
|
|
+ Version: params.Version,
|
|
|
+ Executables: debExecutables,
|
|
|
+ }
|
|
|
+
|
|
|
+ debSwarm = debPackage{
|
|
|
+ Name: "ethereum-swarm",
|
|
|
+ Version: sv.Version,
|
|
|
+ Executables: debSwarmExecutables,
|
|
|
+ }
|
|
|
+
|
|
|
+ // Debian meta packages to build and push to Ubuntu PPA
|
|
|
+ debPackages = []debPackage{
|
|
|
+ debSwarm,
|
|
|
+ debEthereum,
|
|
|
+ }
|
|
|
+
|
|
|
// Distros for which packages are created.
|
|
|
// Note: vivid is unsupported because there is no golang-1.6 package for it.
|
|
|
// Note: wily is unsupported because it was officially deprecated on lanchpad.
|
|
|
@@ -351,7 +381,6 @@ func doLint(cmdline []string) {
|
|
|
}
|
|
|
|
|
|
// Release Packaging
|
|
|
-
|
|
|
func doArchive(cmdline []string) {
|
|
|
var (
|
|
|
arch = flag.String("arch", runtime.GOARCH, "Architecture cross packaging")
|
|
|
@@ -371,10 +400,14 @@ func doArchive(cmdline []string) {
|
|
|
}
|
|
|
|
|
|
var (
|
|
|
- env = build.Env()
|
|
|
- base = archiveBasename(*arch, env)
|
|
|
- geth = "geth-" + base + ext
|
|
|
- alltools = "geth-alltools-" + base + ext
|
|
|
+ env = build.Env()
|
|
|
+
|
|
|
+ basegeth = archiveBasename(*arch, params.ArchiveVersion(env.Commit))
|
|
|
+ geth = "geth-" + basegeth + ext
|
|
|
+ alltools = "geth-alltools-" + basegeth + ext
|
|
|
+
|
|
|
+ baseswarm = archiveBasename(*arch, sv.ArchiveVersion(env.Commit))
|
|
|
+ swarm = "swarm-" + baseswarm + ext
|
|
|
)
|
|
|
maybeSkipArchive(env)
|
|
|
if err := build.WriteArchive(geth, gethArchiveFiles); err != nil {
|
|
|
@@ -383,14 +416,17 @@ func doArchive(cmdline []string) {
|
|
|
if err := build.WriteArchive(alltools, allToolsArchiveFiles); err != nil {
|
|
|
log.Fatal(err)
|
|
|
}
|
|
|
- for _, archive := range []string{geth, alltools} {
|
|
|
+ if err := build.WriteArchive(swarm, swarmArchiveFiles); err != nil {
|
|
|
+ log.Fatal(err)
|
|
|
+ }
|
|
|
+ for _, archive := range []string{geth, alltools, swarm} {
|
|
|
if err := archiveUpload(archive, *upload, *signer); err != nil {
|
|
|
log.Fatal(err)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func archiveBasename(arch string, env build.Environment) string {
|
|
|
+func archiveBasename(arch string, archiveVersion string) string {
|
|
|
platform := runtime.GOOS + "-" + arch
|
|
|
if arch == "arm" {
|
|
|
platform += os.Getenv("GOARM")
|
|
|
@@ -401,18 +437,7 @@ func archiveBasename(arch string, env build.Environment) string {
|
|
|
if arch == "ios" {
|
|
|
platform = "ios-all"
|
|
|
}
|
|
|
- return platform + "-" + archiveVersion(env)
|
|
|
-}
|
|
|
-
|
|
|
-func archiveVersion(env build.Environment) string {
|
|
|
- version := build.VERSION()
|
|
|
- if isUnstableBuild(env) {
|
|
|
- version += "-unstable"
|
|
|
- }
|
|
|
- if env.Commit != "" {
|
|
|
- version += "-" + env.Commit[:8]
|
|
|
- }
|
|
|
- return version
|
|
|
+ return platform + "-" + archiveVersion
|
|
|
}
|
|
|
|
|
|
func archiveUpload(archive string, blobstore string, signer string) error {
|
|
|
@@ -462,7 +487,6 @@ func maybeSkipArchive(env build.Environment) {
|
|
|
}
|
|
|
|
|
|
// Debian Packaging
|
|
|
-
|
|
|
func doDebianSource(cmdline []string) {
|
|
|
var (
|
|
|
signer = flag.String("signer", "", `Signing key name, also used as package author`)
|
|
|
@@ -486,21 +510,23 @@ func doDebianSource(cmdline []string) {
|
|
|
build.MustRun(gpg)
|
|
|
}
|
|
|
|
|
|
- // Create the packages.
|
|
|
- for _, distro := range debDistros {
|
|
|
- meta := newDebMetadata(distro, *signer, env, now)
|
|
|
- pkgdir := stageDebianSource(*workdir, meta)
|
|
|
- debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc")
|
|
|
- debuild.Dir = pkgdir
|
|
|
- build.MustRun(debuild)
|
|
|
+ // Create Debian packages and upload them
|
|
|
+ for _, pkg := range debPackages {
|
|
|
+ for _, distro := range debDistros {
|
|
|
+ meta := newDebMetadata(distro, *signer, env, now, pkg.Name, pkg.Version, pkg.Executables)
|
|
|
+ pkgdir := stageDebianSource(*workdir, meta)
|
|
|
+ debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc")
|
|
|
+ debuild.Dir = pkgdir
|
|
|
+ build.MustRun(debuild)
|
|
|
|
|
|
- changes := fmt.Sprintf("%s_%s_source.changes", meta.Name(), meta.VersionString())
|
|
|
- changes = filepath.Join(*workdir, changes)
|
|
|
- if *signer != "" {
|
|
|
- build.MustRunCommand("debsign", changes)
|
|
|
- }
|
|
|
- if *upload != "" {
|
|
|
- build.MustRunCommand("dput", *upload, changes)
|
|
|
+ changes := fmt.Sprintf("%s_%s_source.changes", meta.Name(), meta.VersionString())
|
|
|
+ changes = filepath.Join(*workdir, changes)
|
|
|
+ if *signer != "" {
|
|
|
+ build.MustRunCommand("debsign", changes)
|
|
|
+ }
|
|
|
+ if *upload != "" {
|
|
|
+ build.MustRunCommand("dput", *upload, changes)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -525,9 +551,17 @@ func isUnstableBuild(env build.Environment) bool {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
+type debPackage struct {
|
|
|
+ Name string // the name of the Debian package to produce, e.g. "ethereum", or "ethereum-swarm"
|
|
|
+ Version string // the clean version of the debPackage, e.g. 1.8.12 or 0.3.0, without any metadata
|
|
|
+ Executables []debExecutable // executables to be included in the package
|
|
|
+}
|
|
|
+
|
|
|
type debMetadata struct {
|
|
|
Env build.Environment
|
|
|
|
|
|
+ PackageName string
|
|
|
+
|
|
|
// go-ethereum version being built. Note that this
|
|
|
// is not the debian package version. The package version
|
|
|
// is constructed by VersionString.
|
|
|
@@ -539,21 +573,33 @@ type debMetadata struct {
|
|
|
}
|
|
|
|
|
|
type debExecutable struct {
|
|
|
- Name, Description string
|
|
|
+ PackageName string
|
|
|
+ BinaryName string
|
|
|
+ Description string
|
|
|
+}
|
|
|
+
|
|
|
+// Package returns the name of the package if present, or
|
|
|
+// fallbacks to BinaryName
|
|
|
+func (d debExecutable) Package() string {
|
|
|
+ if d.PackageName != "" {
|
|
|
+ return d.PackageName
|
|
|
+ }
|
|
|
+ return d.BinaryName
|
|
|
}
|
|
|
|
|
|
-func newDebMetadata(distro, author string, env build.Environment, t time.Time) debMetadata {
|
|
|
+func newDebMetadata(distro, author string, env build.Environment, t time.Time, name string, version string, exes []debExecutable) debMetadata {
|
|
|
if author == "" {
|
|
|
// No signing key, use default author.
|
|
|
author = "Ethereum Builds <fjl@ethereum.org>"
|
|
|
}
|
|
|
return debMetadata{
|
|
|
+ PackageName: name,
|
|
|
Env: env,
|
|
|
Author: author,
|
|
|
Distro: distro,
|
|
|
- Version: build.VERSION(),
|
|
|
+ Version: version,
|
|
|
Time: t.Format(time.RFC1123Z),
|
|
|
- Executables: debExecutables,
|
|
|
+ Executables: exes,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -561,9 +607,9 @@ func newDebMetadata(distro, author string, env build.Environment, t time.Time) d
|
|
|
// on all executable packages.
|
|
|
func (meta debMetadata) Name() string {
|
|
|
if isUnstableBuild(meta.Env) {
|
|
|
- return "ethereum-unstable"
|
|
|
+ return meta.PackageName + "-unstable"
|
|
|
}
|
|
|
- return "ethereum"
|
|
|
+ return meta.PackageName
|
|
|
}
|
|
|
|
|
|
// VersionString returns the debian version of the packages.
|
|
|
@@ -590,9 +636,20 @@ func (meta debMetadata) ExeList() string {
|
|
|
// ExeName returns the package name of an executable package.
|
|
|
func (meta debMetadata) ExeName(exe debExecutable) string {
|
|
|
if isUnstableBuild(meta.Env) {
|
|
|
- return exe.Name + "-unstable"
|
|
|
+ return exe.Package() + "-unstable"
|
|
|
}
|
|
|
- return exe.Name
|
|
|
+ return exe.Package()
|
|
|
+}
|
|
|
+
|
|
|
+// EthereumSwarmPackageName returns the name of the swarm package based on
|
|
|
+// environment, e.g. "ethereum-swarm-unstable", or "ethereum-swarm".
|
|
|
+// This is needed so that we make sure that "ethereum" package,
|
|
|
+// depends on and installs "ethereum-swarm"
|
|
|
+func (meta debMetadata) EthereumSwarmPackageName() string {
|
|
|
+ if isUnstableBuild(meta.Env) {
|
|
|
+ return debSwarm.Name + "-unstable"
|
|
|
+ }
|
|
|
+ return debSwarm.Name
|
|
|
}
|
|
|
|
|
|
// ExeConflicts returns the content of the Conflicts field
|
|
|
@@ -607,7 +664,7 @@ func (meta debMetadata) ExeConflicts(exe debExecutable) string {
|
|
|
// be preferred and the conflicting files should be handled via
|
|
|
// alternates. We might do this eventually but using a conflict is
|
|
|
// easier now.
|
|
|
- return "ethereum, " + exe.Name
|
|
|
+ return "ethereum, " + exe.Package()
|
|
|
}
|
|
|
return ""
|
|
|
}
|
|
|
@@ -624,24 +681,23 @@ func stageDebianSource(tmpdir string, meta debMetadata) (pkgdir string) {
|
|
|
|
|
|
// Put the debian build files in place.
|
|
|
debian := filepath.Join(pkgdir, "debian")
|
|
|
- build.Render("build/deb.rules", filepath.Join(debian, "rules"), 0755, meta)
|
|
|
- build.Render("build/deb.changelog", filepath.Join(debian, "changelog"), 0644, meta)
|
|
|
- build.Render("build/deb.control", filepath.Join(debian, "control"), 0644, meta)
|
|
|
- build.Render("build/deb.copyright", filepath.Join(debian, "copyright"), 0644, meta)
|
|
|
+ build.Render("build/deb/"+meta.PackageName+"/deb.rules", filepath.Join(debian, "rules"), 0755, meta)
|
|
|
+ build.Render("build/deb/"+meta.PackageName+"/deb.changelog", filepath.Join(debian, "changelog"), 0644, meta)
|
|
|
+ build.Render("build/deb/"+meta.PackageName+"/deb.control", filepath.Join(debian, "control"), 0644, meta)
|
|
|
+ build.Render("build/deb/"+meta.PackageName+"/deb.copyright", filepath.Join(debian, "copyright"), 0644, meta)
|
|
|
build.RenderString("8\n", filepath.Join(debian, "compat"), 0644, meta)
|
|
|
build.RenderString("3.0 (native)\n", filepath.Join(debian, "source/format"), 0644, meta)
|
|
|
for _, exe := range meta.Executables {
|
|
|
install := filepath.Join(debian, meta.ExeName(exe)+".install")
|
|
|
docs := filepath.Join(debian, meta.ExeName(exe)+".docs")
|
|
|
- build.Render("build/deb.install", install, 0644, exe)
|
|
|
- build.Render("build/deb.docs", docs, 0644, exe)
|
|
|
+ build.Render("build/deb/"+meta.PackageName+"/deb.install", install, 0644, exe)
|
|
|
+ build.Render("build/deb/"+meta.PackageName+"/deb.docs", docs, 0644, exe)
|
|
|
}
|
|
|
|
|
|
return pkgdir
|
|
|
}
|
|
|
|
|
|
// Windows installer
|
|
|
-
|
|
|
func doWindowsInstaller(cmdline []string) {
|
|
|
// Parse the flags and make skip installer generation on PRs
|
|
|
var (
|
|
|
@@ -691,11 +747,11 @@ func doWindowsInstaller(cmdline []string) {
|
|
|
// Build the installer. This assumes that all the needed files have been previously
|
|
|
// built (don't mix building and packaging to keep cross compilation complexity to a
|
|
|
// minimum).
|
|
|
- version := strings.Split(build.VERSION(), ".")
|
|
|
+ version := strings.Split(params.Version, ".")
|
|
|
if env.Commit != "" {
|
|
|
version[2] += "-" + env.Commit[:8]
|
|
|
}
|
|
|
- installer, _ := filepath.Abs("geth-" + archiveBasename(*arch, env) + ".exe")
|
|
|
+ installer, _ := filepath.Abs("geth-" + archiveBasename(*arch, params.ArchiveVersion(env.Commit)) + ".exe")
|
|
|
build.MustRunCommand("makensis.exe",
|
|
|
"/DOUTPUTFILE="+installer,
|
|
|
"/DMAJORVERSION="+version[0],
|
|
|
@@ -747,7 +803,7 @@ func doAndroidArchive(cmdline []string) {
|
|
|
maybeSkipArchive(env)
|
|
|
|
|
|
// Sign and upload the archive to Azure
|
|
|
- archive := "geth-" + archiveBasename("android", env) + ".aar"
|
|
|
+ archive := "geth-" + archiveBasename("android", params.ArchiveVersion(env.Commit)) + ".aar"
|
|
|
os.Rename("geth.aar", archive)
|
|
|
|
|
|
if err := archiveUpload(archive, *upload, *signer); err != nil {
|
|
|
@@ -832,7 +888,7 @@ func newMavenMetadata(env build.Environment) mavenMetadata {
|
|
|
}
|
|
|
}
|
|
|
// Render the version and package strings
|
|
|
- version := build.VERSION()
|
|
|
+ version := params.Version
|
|
|
if isUnstableBuild(env) {
|
|
|
version += "-SNAPSHOT"
|
|
|
}
|
|
|
@@ -867,7 +923,7 @@ func doXCodeFramework(cmdline []string) {
|
|
|
build.MustRun(bind)
|
|
|
return
|
|
|
}
|
|
|
- archive := "geth-" + archiveBasename("ios", env)
|
|
|
+ archive := "geth-" + archiveBasename("ios", params.ArchiveVersion(env.Commit))
|
|
|
if err := os.Mkdir(archive, os.ModePerm); err != nil {
|
|
|
log.Fatal(err)
|
|
|
}
|
|
|
@@ -923,7 +979,7 @@ func newPodMetadata(env build.Environment, archive string) podMetadata {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- version := build.VERSION()
|
|
|
+ version := params.Version
|
|
|
if isUnstableBuild(env) {
|
|
|
version += "-unstable." + env.Buildnum
|
|
|
}
|