@ -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" ,
Binary Name: "abigen" ,
Description : "Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages." ,
} ,
{
Name : "bootnode" ,
Binary Name: "bootnode" ,
Description : "Ethereum bootnode." ,
} ,
{
Name : "evm" ,
Binary Name: "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" ,
Binary Name: "geth" ,
Description : "Ethereum CLI client." ,
} ,
{
Name : "puppeth" ,
Binary Name: "puppeth" ,
Description : "Ethereum private network manager." ,
} ,
{
Name : "rlpdump" ,
Binary Name: "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" )
@ -372,9 +401,13 @@ func doArchive(cmdline []string) {
var (
env = build . Env ( )
base = archiveBasename ( * arch , env )
geth = "geth-" + base + ext
alltools = "geth-alltools-" + base + ext
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,9 +510,10 @@ func doDebianSource(cmdline []string) {
build . MustRun ( gpg )
}
// Create the packages.
// Create Debian packages and upload them
for _ , pkg := range debPackages {
for _ , distro := range debDistros {
meta := newDebMetadata ( distro , * signer , env , now )
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
@ -503,6 +528,7 @@ func doDebianSource(cmdline []string) {
build . MustRunCommand ( "dput" , * upload , changes )
}
}
}
}
func makeWorkdir ( wdflag string ) string {
@ -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 : d ebE xecutabl es,
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
}