blob: dde0a2fcf4d94b936dfd16c935b61dc69611b79a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* - Scalafmt Toolage -*/
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "cz.alenkacz:gradle-scalafmt:${gradle.scalafmt.version}"
}
}
plugins {
id 'com.github.blindpirate.gogradle' version '0.10'
}
subprojects {
apply plugin: 'scalafmt'
scalafmt.configFilePath = gradle.scalafmt.config
}
golang {
packagePath = 'github.com/apache/openwhisk-cli' as String
buildTags = (rootProject.findProperty('goTags')?:'').split(',')
}
// The `gogradle` plugin was designed to work with `govendor` and `godeps` tools
// We must disable its tasks that attempt to "fetch" dependencies
// into a "/vendor" directory and use them to build the project (which will fail)
installDependencies.enabled = false
resolveBuildDependencies.enabled = false
resolveTestDependencies.enabled = false
// Disable "go vet" and "gofmt" as gogradle uses deprecated syntax
goVet.enabled = false
gofmt.enabled = false
/*
The OpenWhiskPlatform class is a utility class to make the rest of what
happens with platforms a bit more understandable. A "Platform" is a tuple
of an operating system and a processor. Currently, the OpenWhisk CLI
supports three OS's: Linux, Mac/Darwin, and Windows. It supports x86
(32-bit or 64-bit) on all OS's. On Linux, it also support System Z (s390x),
PowerPC (ppc64le), and ARM (32-bit and 64-bit) architectures.
Different contexts use different codings to refer to these architectures --
the class attempts to provide and interpret all needed codings. Internal
storage is in "GO" format:
OS: linux, darwin, windows
Arch: 386, amd64, s390x, ppc64le, arm
TODO - It may be appropriate to refactor into a general purpose Platform
class for all builds, then to extend with specifics needed for
the OpenWhisk CLI build.
*/
class OpenWhiskPlatform {
String goOs
String goArch
/*
The 'zipFileName' property is the root file name to use for archives.
*/
static String zipFileName
/*
Create a platform for the local platform
*/
OpenWhiskPlatform() {
this(System.properties['os.name'], System.properties['os.arch'])
}
OpenWhiskPlatform(String platformSpec) {
this(*platformSpec.split('-'))
}
OpenWhiskPlatform(String inOs, String inArch) {
goOs=inOs.toLowerCase()
.replaceAll(~/^mac.*$/,'darwin')
.replaceAll(~/^.*n[ui]x.*$/,'linux')
goArch=inArch.toLowerCase()
.replaceAll('x86_64','amd64')
.replaceAll('i386','386')
.replaceAll('x86_32','386')
}
/**
* Return the Openwhisk OS for this Platform
*/
String getOwOs() {
((goOs == 'darwin') ? 'mac' : goOs)
}
String getGoPlatform() {
"${goOs}-${goArch}"
}
/*
Everything below here is specific to the CLI build and could be
factored out into a subclass.
*/
String getArchiveDirName() {
"${this.owOs}/${goArch}"
}
String getArchiveFileName() {
String suffix
switch (goArch) {
case "386": suffix = '-32bit'; break;
case "amd64": suffix = ''; break;
default: suffix = "-${goArch}"; break;
}
String archivetype = (goOs == 'linux') ? 'tgz' : 'zip'
"${zipFileName}-${this.owOs}${suffix}.${archivetype}"
}
}
/*
Configuration of OpenWhisk Platform behavior based on environment and defaults
*/
OpenWhiskPlatform.zipFileName =
System.env['zip_file_name'] ?:
(rootProject.findProperty('zipFileName') ?: 'OpenWhisk_CLI')
project.ext.packageVersion =
rootProject.findProperty('packageVersion') ?: 'latest'
project.ext.cliBuildLocation =
rootProject.findProperty('cliBuildLocation') ?: './build'
project.ext.cliReleaseLocation =
rootProject.findProperty('cliReleaseLocation') ?: './release'
String buildFileName = System.env['build_file_name'] ?:
(rootProject.findProperty('buildFileName') ?: 'wsk')
/*
'platforms' property will be null for a local compile, or a list (comma or
space-separated) of hyphenated Goos-Goarch pairs. Some transformation is
done when parsing to handle misconceptions.
TODO: More syntax/validity checking and feedback, perhaps as part of a
Platform object as proposed above...
*/
rootProject.ext.localPlatform = new OpenWhiskPlatform()
if (rootProject.hasProperty('buildPlatforms')) {
rootProject.ext.platforms = buildPlatforms.tokenize(' ,').collect {
new OpenWhiskPlatform(it)
}
} else {
if (!rootProject.hasProperty('nativeCompile')) {
rootProject.ext.platforms = [
'linux-386', 'linux-amd64',
'linux-s390x', 'linux-ppc64le', 'linux-arm', 'linux-arm64',
'darwin-amd64',
'windows-386', 'windows-amd64'
].collect { new OpenWhiskPlatform(it) }
} else {
rootProject.ext.platforms = [ rootProject.localPlatform ]
}
}
/*
I18n support
*/
// task getGoPath(type: Exec) {
// executable = 'echo'
// args = ["$System.env.GOPATH"]
// doLast{
// println commandLine
// }
// }
task getGoBinData(type: Exec) {
executable = 'go'
args = ['get', '-u', 'github.com/jteeuwen/go-bindata/...']
doLast{
println commandLine
}
}
task goI18n(type: Exec) {
dependsOn 'getGoBinData'
executable = "$System.env.GOPATH" + '/bin/go-bindata'
// run '${GOPATH}/bin/go-bindata -pkg wski18n -o wski18n/i18n_resources.go wski18n/resources'
args = ['-pkg', 'wski18n', '-o', 'wski18n/i18n_resources.go', 'wski18n/resources']
doLast{
println commandLine
}
}
/*
Checks -- add golint to the checks run prior to build.
The get step is needed to be sure a golint binary is available to run.
*/
task getGoLint(type: Exec) {
executable = 'go'
args = ['get', '-u', 'golang.org/x/lint/golint']
doLast{
println commandLine
}
}
task goLint(type: Exec) {
dependsOn 'getGoLint'
executable = 'golint'
//args = ['./', './commands/']
args = ['./']
doLast{
println commandLine
}
}
goCheck.dependsOn(goLint)
goPrepare.dependsOn(goI18n)
goBuild {
targetPlatform = rootProject.platforms*.goPlatform
def now = new Date().format("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
// WARNING: The single quotes are intentional! The gogradle plugin will
// parse the command with the GString engine at execution time.
go(['build',
'-ldflags', "-X main.CLI_BUILD_TIME=${now}" as String,
'-o', cliBuildLocation+'/${GOOS}-${GOARCH}/'+buildFileName+'${GOEXE}',
golang.packagePath ] as List<String>)
}
gofmt {
gofmt "-s -w ."
}
task compile(type: Copy, dependsOn: goBuild) {
destinationDir = file(cliBuildLocation)
from("${cliBuildLocation}/${rootProject.localPlatform.goOs}-${rootProject.localPlatform.goArch}")
}
task build(type: DefaultTask, dependsOn: compile)
/*
For each platform, create an individual archive in a platform appropriate
format (tarball for Linux, zipfile for Mac & Windows).
*/
task individualArchives(
dependsOn: rootProject.platforms.collect() { p ->
task("release${p.goOs.capitalize()}${p.goArch.capitalize()}",
type: (p.goOs == 'linux') ? Tar : Zip, dependsOn: compile) {
if (p.goOs == 'linux') { compression = Compression.GZIP }
destinationDir = file(cliReleaseLocation)
baseName = "${p.zipFileName}-${packageVersion}-${p.owOs}-${p.goArch}"
from("${cliBuildLocation}/${p.goOs}-${p.goArch}/") {
include "${buildFileName}*"
}
from("./") {
include "LICENSE.txt", "NOTICE.txt", "README.md"
exclude "wski18n"
}
}
})
/*
Create a 'content.json' file representing all that was
compiled and its appropriate directory in the Tarball that will be created
for deployment to local Nginx instances.
*/
task index() {
def content = [:]
for (p in platforms) {
def pathObject = [ "path" : "${p.archiveDirName}/${p.archiveFileName}" ]
content.get(p.owOs,[:])[p.goArch] = pathObject
// TODO: Default architecture should be configurable as a property
if (p.goArch == 'amd64') {
content.get(p.owOs,[:])['default'] = pathObject
}
}
doLast {
mkdir(cliBuildLocation)
file("${cliBuildLocation}/content.json").text = groovy.json.JsonOutput.toJson(["cli": content])
}
}
task releaseBinaries(type: Tar, dependsOn: [individualArchives, index]) {
compression = Compression.GZIP
destinationDir = file(cliReleaseLocation)
baseName = "${OpenWhiskPlatform.zipFileName}-${packageVersion}-all"
from("${cliBuildLocation}/content.json") { into('.') }
rootProject.platforms.each() { p ->
from(cliReleaseLocation) {
include("${p.zipFileName}-${packageVersion}-${p.owOs}-${p.goArch}.*")
into p.archiveDirName
rename { p.archiveFileName }
}
}
}
task clean(type: Delete, dependsOn: goClean) {
delete cliBuildLocation, cliReleaseLocation
}