blob: 412de5631ced066ad4a25b4f56cc9f4d68ef531c [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.
*/
import org.ajoberstar.grgit.*
import groovy.json.JsonOutput
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.ajoberstar:grgit:0.4.1'
// To handle symbolic links when cloning git repos, the jgit.java7 jar
// must be added to the classpath.
classpath 'org.eclipse.jgit:org.eclipse.jgit.java7:3.6.2.201501210735-r'
}
}
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'download-task'
def PACKAGES_GROUP = 'package'
final String VERBOSE = "verbose"
final String BOM = "$rootDir/bigtop.mk"
//HashMap <String, String>
def BOM_map = [
APACHE_MIRROR: "http://apache.osuosl.org",
APACHE_ARCHIVE: "http://archive.apache.org/dist",
BASE_DIR: projectDir.absolutePath,
BUILD_DIR: projectDir.absolutePath + "/build",
OUTPUT_DIR: projectDir.absolutePath + "/output",
DIST_DIR: projectDir.absolutePath + "/dist",
DL_DIR: projectDir.absolutePath + "/dl",
BIGTOP_BOM: '',
BIGTOP_BUILD_STAMP: 1
]
def final BIGTOP_BOM = 'BIGTOP_BOM'
def final BASE_DIR = BOM_map['BASE_DIR']
def final REPO_DIR = "${BOM_map['BASE_DIR']}/bigtop-repos"
def final BUILD_DIR = BOM_map['BUILD_DIR']
def final OUTPUT_DIR = BOM_map['OUTPUT_DIR']
def final DIST_DIR = BOM_map['DIST_DIR']
def final DL_DIR = BOM_map['DL_DIR']
def final BIGTOP_BUILD_STAMP = System.getenv('BIGTOP_BUILD_STAMP') ?: BOM_map['BIGTOP_BUILD_STAMP']
def targets = []
def components = []
// Package building and logic around it
def touchTargetFile = { fileName ->
// to comply with make build
GFileUtils.touch new File(fileName)
}
def ifExists = { url ->
if (url == null) return
URLConnection uCon = new URL(url).openConnection()
return (uCon as HttpURLConnection).responseCode == 200
}
def getDate() {
new Date().format('E, dd MMM yyyy HH:mm:ss Z')
}
def nativePackaging = {
def devNull = new org.apache.bigtop.NullOutputStream()
def result = exec {
commandLine "/bin/bash", "-c",
"""dpkg-query -S /bin/sh && exit 1
rpm -qf /bin/sh && exit 2
exit 0
"""
ignoreExitValue true
errorOutput devNull
standardOutput devNull
}
[false, "deb", "rpm"][result.getExitValue()]
}.call()
task "packages-help" (description: "All package build related tasks information", group: PACKAGES_GROUP) << {
targets.each { target ->
println (target + "\n\t[" + tasks.findAll { alltask -> alltask.name.startsWith(target)}*.name.join(", ") + "]")
}
}
task "bom-json" (description: "List the components of the stack in json format") << {
def componentObjects = components.sort().collect {
[
name: [
project: BOM_map[it + '_NAME'],
pkg: BOM_map[it + '_PKG_NAME'],
relNotes: BOM_map[it + '_RELNOTES_NAME'],
],
tarball: [
destination: BOM_map[it + '_TARBALL_DST'],
source: BOM_map[it + '_TARBALL_SRC'],
],
url: [
site: BOM_map[it + '_SITE'],
archive: BOM_map[it + '_ARCHIVE'],
],
version: [
base: BOM_map[it + '_BASE_VERSION'],
pkg: BOM_map[it + '_PKG_VERSION'],
release: BOM_map[it + '_RELEASE_VERSION'],
],
git: [
repo: BOM_map[it + '_GIT_REPO'],
ref: BOM_map[it + '_GIT_REF'],
dir: BOM_map[it + '_GIT_DIR'],
]
]
}
def fullDefinition = [
version: BOM_map['BIGTOP_VERSION'],
components: componentObjects
]
def json = JsonOutput.toJson(fullDefinition)
println JsonOutput.prettyPrint(json)
}
task "all-components" (description: "List the components of the stack") << {
println "${project.name} ${BOM_map['BIGTOP_VERSION']} stack includes the following components"
components.sort().each { comp ->
println sprintf ('\t%1$s %2$s', comp.toLowerCase().padRight(20), BOM_map[comp + "_BASE_VERSION"].padLeft(10))
}
}
def genTasks = { target, variable ->
Task t = task "${target}-download" (dependsOn: "${target}_vardefines",
description: "Download $target artifacts",
group: PACKAGES_GROUP) << {
def final TARBALL_SRC = BOM_map[variable + '_TARBALL_SRC']
def final DOWNLOAD_DST = BOM_map[variable + '_DOWNLOAD_DST']
def final DOWNLOAD_URL = BOM_map[variable + '_DOWNLOAD_URL']
def final GIT_REPO = BOM_map[variable + '_GIT_REPO']
def final GIT_REF = BOM_map[variable + '_GIT_REF']
def final GIT_DIR = BOM_map[variable + '_GIT_DIR']
if (!DOWNLOAD_DST)
return
mkdir(DL_DIR)
if (TARBALL_SRC?.isEmpty() || new File(DOWNLOAD_DST)?.exists() || new File(BOM_map[variable + '_TARGET_DL'])?.exists()) {
println "\tFile $DOWNLOAD_DST appears to be already downloaded. Exiting..."
return
}
if (GIT_REPO && GIT_REF) {
def dir = GIT_DIR
if (dir == null || dir.isEmpty()) {
dir = TARBALL_SRC.substring(0, TARBALL_SRC.lastIndexOf(".t"))
}
delete("${DL_DIR}/${dir}")
Grgit.clone(
uri: GIT_REPO,
refToCheckout: GIT_REF,
dir: new File("${DL_DIR}/${dir}")
)
delete("${DL_DIR}/${dir}/.git")
exec {
workingDir DL_DIR
commandLine "tar -czf ${TARBALL_SRC} ${dir}".split()
}
delete("${DL_DIR}/${dir}")
}
else {
download {
src DOWNLOAD_URL
dest DOWNLOAD_DST
}
}
touchTargetFile(BOM_map[variable + '_TARGET_DL'])
}
task "${target}-tar" (dependsOn: ["${target}_vardefines", "${target}-download"],
description: "Preparing a tarball for $target artifacts",
group: PACKAGES_GROUP) << {
if (new File(BOM_map[variable + '_TARGET_TAR'])?.exists()) {
println "\tNothing to do. Exiting..."
return
}
def final TAR_DIR = BOM_map[variable + '_TAR_DIR']
def final TARBALL_SRC = BOM_map[variable + '_TARBALL_SRC'] ?: ""
def final DOWNLOAD_DST = BOM_map[variable + '_DOWNLOAD_DST'] ?: ""
def final SEED_TAR = BOM_map[variable + '_SEED_TAR']
delete(TAR_DIR); mkdir(TAR_DIR)
if (TARBALL_SRC.empty || TARBALL_SRC.endsWith('.zip')) {
if (TARBALL_SRC.empty) {
// if no tar file needed (i.e. bigtop-utils)
// create some contents to pack later
copy {
from 'LICENSE'
into TAR_DIR
}
} else {
// i.e. a ZIP file
exec {
workingDir TAR_DIR
commandLine "unzip $DOWNLOAD_DST".split(' ')
}
def unpacked = new File(TAR_DIR)
// check wether we have to move contents one level up
if (unpacked.list().size() == 1) {
def TOP_LEVEL_DIR = unpacked.list()[0]
new File("$TAR_DIR/$TOP_LEVEL_DIR").list({ d, f ->
(f != "." && f != "..")}).each { f ->
new File("$TAR_DIR/$TOP_LEVEL_DIR/$f").renameTo("$TAR_DIR/$f")
}
delete(TOP_LEVEL_DIR)
}
}
// create SEED_TAR
exec {
workingDir "$TAR_DIR/.."
commandLine "tar -czf $SEED_TAR ${new File("$TAR_DIR/..").list().join(' ')}".split(' ')
}
} else {
println "Copy $DOWNLOAD_DST to $SEED_TAR"
copy {
from DOWNLOAD_DST
into BOM_map['BUILD_DIR'] + "/$target/tar/"
rename TARBALL_SRC, SEED_TAR
}
}
touchTargetFile(BOM_map[variable + '_TARGET_TAR'])
}
// Keeping the reference to deb task to be used later for correct sequencing
Task tdeb = task "$target-deb"(dependsOn: "${target}-sdeb",
description: "Building DEB for $target artifacts",
group: PACKAGES_GROUP) << {
if (new File(BOM_map[variable + '_TARGET_DEB'])?.exists()) {
println "\tNothing to do. Exiting..."
return
}
def final PKG_NAME = BOM_map[variable + '_PKG_NAME']
def final PKG_RELEASE = BOM_map[variable + '_PKG_RELEASE']
def final PKG_VERSION = BOM_map[variable + '_PKG_VERSION']
def final PKG_OUTPUT_DIR = BOM_map[variable + '_OUTPUT_DIR']
def final BASE_VERSION = BOM_map[variable + '_BASE_VERSION']
def final SRCDEB = "${PKG_NAME}_$PKG_VERSION-${BIGTOP_BUILD_STAMP}.dsc"
exec {
workingDir PKG_OUTPUT_DIR
commandLine "dpkg-source -x $SRCDEB".split(' ')
}
// Order of debuild parameters is important; hence specifying explicitely rather
// than in an array of args
def command = """debuild \
--preserve-envvar PATH \
--preserve-envvar JAVA32_HOME \
--preserve-envvar JAVA64_HOME \
--preserve-envvar FORREST_HOME \
--preserve-envvar MAVEN3_HOME \
--preserve-envvar MAVEN_OPTS \
--preserve-envvar JAVA_HOME \
--preserve-envvar SCALA_HOME \
--set-envvar=${variable}_BASE_VERSION=$BASE_VERSION \
--set-envvar=${variable}_VERSION=$PKG_VERSION \
--set-envvar=${variable}_RELEASE=$BIGTOP_BUILD_STAMP \
-uc -us -b
"""
exec {
workingDir "$PKG_OUTPUT_DIR/$PKG_NAME-$PKG_VERSION"
commandLine command.split(' ')
}
exec {
workingDir "$PKG_OUTPUT_DIR"
commandLine 'rm','-rf',"$PKG_NAME-$PKG_VERSION"
}
touchTargetFile(BOM_map[variable + '_TARGET_DEB'])
}
// Guarantee that tasks are ran in the order set by BOM file
if (targets.size() > 0)
tdeb.mustRunAfter "${targets.get(targets.size() - 1)}-deb"
task "$target-sdeb" (dependsOn: ["${target}_vardefines", "${target}-tar"],
description: "Building SDEB for $target artifacts",
group: PACKAGES_GROUP
) << {
if (new File(BOM_map[variable + '_TARGET_SDEB'])?.exists()) {
println "\tNothing to do. Exiting..."
return
}
def final PKG_BUILD_DIR = BOM_map[variable + '_BUILD_DIR']
def final NAME = BOM_map[variable + '_NAME']
def final PKG_NAME = BOM_map[variable + '_PKG_NAME']
def final SEED_TAR = BOM_map[variable + '_SEED_TAR']
def final PKG_VERSION = BOM_map[variable + '_PKG_VERSION']
def final PKG_OUTPUT_DIR = BOM_map[variable + '_OUTPUT_DIR']
delete ("$PKG_BUILD_DIR/deb")
def final DEB_BLD_DIR = "$PKG_BUILD_DIR/deb/$NAME-${PKG_VERSION}"
def final DEB_PKG_DIR = "$PKG_BUILD_DIR/deb/$PKG_NAME-${PKG_VERSION}-${BIGTOP_BUILD_STAMP}"
mkdir (DEB_BLD_DIR)
copy {
from SEED_TAR
into "$PKG_BUILD_DIR/deb/"
rename BOM_map[variable + '_TARBALL_DST'], "${PKG_NAME}_${PKG_VERSION}.orig.tar.gz"
}
exec {
workingDir DEB_BLD_DIR
commandLine "tar --strip-components 1 -xf $DEB_BLD_DIR/../${PKG_NAME}_${PKG_VERSION}.orig.tar.gz".split(' ')
}
fileTree ("${BASE_DIR}/bigtop-packages/src/deb/$NAME") {
include '**/*'
}.copy { into "$DEB_BLD_DIR/debian" }
copy {
from "${BASE_DIR}/bigtop-packages/src/templates/init.d.tmpl"
into "$DEB_BLD_DIR/debian"
}
fileTree ("$BASE_DIR/bigtop-packages/src/common/$NAME") {
include '**/*'
}.copy { into "$DEB_BLD_DIR/debian" }
// Prepeare bom file with all the versions
def bomWriter = new File("$DEB_BLD_DIR/debian/bigtop.bom").newWriter()
BOM_map[BIGTOP_BOM].split(" ").each { bomWriter << "$it\n"}
bomWriter.close()
// Create changelog
def changelog = new File("$DEB_BLD_DIR/debian/changelog").newWriter()
changelog << "$PKG_NAME ($PKG_VERSION-$BIGTOP_BUILD_STAMP) stable; urgency=low\n"
changelog << " Clean build\n"
changelog << " -- Bigtop <dev@bigtop.apache.org> ${getDate()}\n"
changelog.close()
// Move patches and create "series"
def patches = new File( "$DEB_BLD_DIR/debian").list({ d, f -> f ==~ /patch.*diff/}).sort()
if (patches.size() > 0) {
mkdir("$DEB_BLD_DIR/debian/patches")
def seriesWriter = new File("$DEB_BLD_DIR/debian/patches/series").newWriter()
patches.each { f ->
def res = new File("$DEB_BLD_DIR/debian/$f").renameTo( "$DEB_BLD_DIR/debian/patches/$f")
seriesWriter << "$f\n"
}
seriesWriter.close()
}
// Deleting obsolete files
delete fileTree (dir: "$DEB_BLD_DIR/debian", includes: ['*.ex', '*.EX', '*.~'])
// Creating source package
exec {
workingDir DEB_BLD_DIR
commandLine "dpkg-buildpackage -uc -us -sa -S".split(' ')
}
mkdir(PKG_OUTPUT_DIR)
fileTree (dir: "$DEB_PKG_DIR/..", includes: ['*.dsc', '*.diff.gz', '*.debian.tar.gz', '*.debian.tar.xz', "*_source.changes", "*.orig.tar.gz" ]).copy {
into PKG_OUTPUT_DIR
}
touchTargetFile(BOM_map[variable + '_TARGET_SDEB'])
}
task "$target-apt" (dependsOn: "$target-deb",
description: "Creating APT repository for $target packages",
group: PACKAGES_GROUP) << {
if (new File(BOM_map[variable + '_TARGET_APT'])?.exists()) {
println "\tNothing to do. Exiting..."
return
}
def final PKG_NAME = BOM_map[variable + '_NAME']
def final PKG_RELEASE = BOM_map[variable + '_PKG_RELEASE']
def final PKG_VERSION = BOM_map[variable + '_PKG_VERSION']
def final PKG_OUTPUT_DIR = BOM_map[variable + '_OUTPUT_DIR']
mkdir("$OUTPUT_DIR/apt/conf")
copy {
from "$REPO_DIR/apt/distributions"
into "$OUTPUT_DIR/apt/conf"
}
fileTree (PKG_OUTPUT_DIR) {
include "*.changes"
}.each { changeFile ->
exec {
workingDir BUILD_DIR
commandLine "reprepro -Vb $OUTPUT_DIR/apt include bigtop $changeFile".split(' ')
}
}
touchTargetFile(BOM_map["${variable}_TARGET_APT"])
}
// Keeping the reference to task to be used later for correct sequencing
Task trpm = task "$target-rpm" (dependsOn: ["${target}-srpm"],
description: "Building RPM for $target artifacts",
group: PACKAGES_GROUP) << {
if (new File(BOM_map[variable + '_TARGET_RPM'])?.exists()) {
println "\tNothing to do. Exiting..."
return
}
def final PKG_BUILD_DIR = BOM_map[variable + '_BUILD_DIR']
def final NAME = BOM_map[variable + '_NAME']
def final PKG_NAME = BOM_map[variable + '_PKG_NAME']
def final PKG_OUTPUT_DIR = BOM_map[variable + '_OUTPUT_DIR']
def final PKG_VERSION = BOM_map[variable + '_PKG_VERSION']
def final BASE_VERSION = BOM_map[variable + '_BASE_VERSION']
def RELEASE_DIST = "rpmbuild --eval '%{?dist}' 2>/dev/null".execute().text.trim().replaceAll("'",'')
def SRCRPM="$PKG_OUTPUT_DIR/$PKG_NAME-${PKG_VERSION}-$BIGTOP_BUILD_STAMP${RELEASE_DIST}.src.rpm"
def command = [
'--define', "_topdir $PKG_BUILD_DIR/rpm/",
'--define', "${NAME}_base_version $BASE_VERSION",
'--define', "${NAME}_version ${PKG_VERSION}",
'--define', "${NAME}_release ${BIGTOP_BUILD_STAMP}%{?dist}",
'--rebuild', SRCRPM,
]
exec {
workingDir BASE_DIR
executable 'rpmbuild'
args command
}
fileTree ("$PKG_BUILD_DIR/rpm/RPMS") {
include '**/*'
}.copy { into PKG_OUTPUT_DIR }
touchTargetFile(BOM_map[variable + '_TARGET_RPM'])
}
// Guarantee that tasks are ran in the order set by BOM file
if (targets.size() > 0)
trpm.mustRunAfter "${targets.get(targets.size() - 1)}-rpm"
task "$target-srpm" (dependsOn: ["${target}_vardefines" , "${target}-tar"],
description: "Building SRPM for $target artifacts",
group: PACKAGES_GROUP) << {
if (new File(BOM_map[variable + '_TARGET_SRPM'])?.exists()) {
println "\tNothing to do. Exiting..."
return
}
def final NAME = BOM_map[variable + '_NAME']
def final PKG_NAME = BOM_map[variable + '_PKG_NAME']
def final PKG_NAME_FOR_PKG = BOM_map[variable + '_NAME'].replaceAll("-", "_")
def final PKG_BUILD_DIR = BOM_map[variable + '_BUILD_DIR']
def final SEED_TAR = BOM_map[variable + '_SEED_TAR']
def final PKG_VERSION = BOM_map[variable + '_PKG_VERSION']
def final BASE_VERSION = BOM_map[variable + '_BASE_VERSION']
def final PKG_OUTPUT_DIR = BOM_map[variable + '_OUTPUT_DIR']
delete ("$PKG_BUILD_DIR/rpm")
['INSTALL','SOURCES','BUILD','SRPMS','RPMS'].each { rpmdir ->
mkdir("$PKG_BUILD_DIR/rpm/$rpmdir")
}
fileTree ("${BASE_DIR}/bigtop-packages/src/rpm/$NAME") {
include '**/*'
}.copy { into "$PKG_BUILD_DIR/rpm" }
copy {
from SEED_TAR
into "$PKG_BUILD_DIR/rpm/SOURCES"
}
copy {
from "${BASE_DIR}/bigtop-packages/src/templates/init.d.tmpl"
into "$PKG_BUILD_DIR/rpm/SOURCES"
}
fileTree ("$BASE_DIR/bigtop-packages/src/common/$NAME") {
include '**/*'
}.copy { into "$PKG_BUILD_DIR/rpm/SOURCES" }
// Writing bigtop.bom files with all the versions
def bomWriter = new File("$PKG_BUILD_DIR/rpm/SOURCES/bigtop.bom").newWriter()
BOM_map[BIGTOP_BOM].split(" ").each { bomWriter << "$it\n"}
bomWriter.close()
def specFileName = "${PKG_BUILD_DIR}/rpm/SPECS/${NAME}.spec"
def specTmpFileName = "${PKG_BUILD_DIR}/rpm/SPECS/tmp_${NAME}.spec"
def specFile = new File(specFileName)
def specWriter = new File(specTmpFileName).newWriter()
def patches = new File("${PKG_BUILD_DIR}/rpm/SOURCES").list({ d, f -> f ==~ /patch.*diff/}).sort()
specFile.eachLine { line ->
if (line.startsWith("#BIGTOP_PATCH_FILES")) {
def patchNum = 0
patches.each { p ->
specWriter << "Patch$patchNum: $p\n"
patchNum++
}
} else {
if (line.startsWith("#BIGTOP_PATCH_COMMANDS")) {
def patchNum = 0
patches.each { p ->
specWriter << "%patch$patchNum -p1\n"
patchNum++
}
} else {
specWriter << "$line\n"
}
}
}
specWriter.close()
specFile.delete()
new File(specTmpFileName).renameTo(specFileName)
def command = [
'--define', "_topdir $PKG_BUILD_DIR/rpm/",
'--define', "${PKG_NAME_FOR_PKG}_base_version $BASE_VERSION",
'--define', "${PKG_NAME_FOR_PKG}_version ${PKG_VERSION}",
'--define', "${PKG_NAME_FOR_PKG}_release ${BIGTOP_BUILD_STAMP}%{?dist}",
'-bs', '--nodeps', "--buildroot=${PKG_BUILD_DIR}/rpm/INSTALL",
specFileName,
]
exec {
workingDir BASE_DIR
executable 'rpmbuild'
args command
}
mkdir(PKG_OUTPUT_DIR)
def RELEASE_DIST = "rpmbuild --eval '%{?dist}' 2>/dev/null".execute().text.trim().replaceAll("'",'')
copy {
from "$PKG_BUILD_DIR/rpm/SRPMS/${PKG_NAME}-${PKG_VERSION}-${BIGTOP_BUILD_STAMP}${RELEASE_DIST}.src.rpm"
into PKG_OUTPUT_DIR
}
touchTargetFile(BOM_map[variable + '_TARGET_SRPM'])
}
if (nativePackaging) {
task "$target-pkg" (dependsOn: "$target-$nativePackaging",
description: "Invoking a native binary packaging target $nativePackaging",
group: PACKAGES_GROUP) << {
}
task "$target-spkg" (dependsOn: "$target-s$nativePackaging",
description: "Invoking a native binary packaging target s$nativePackaging",
group: PACKAGES_GROUP) << {
}
}
task "$target-yum" (dependsOn: "$target-rpm",
description: "Creating YUM repository for $target packages",
group: PACKAGES_GROUP) << {
if (new File(BOM_map[variable + '_TARGET_YUM'])?.exists()) {
println "\tNothing to do. Exiting..."
return
}
exec {
workingDir BUILD_DIR
commandLine "createrepo -o $OUTPUT_DIR $OUTPUT_DIR".split(' ')
}
touchTargetFile(BOM_map["${variable}_TARGET_YUM"])
}
task "$target-version" (description: "Show version of $target component", group: PACKAGES_GROUP) << {
println "Base: ${BOM_map[variable + '_BASE_VERSION']}"
}
task "${target}_vardefines" << {
BOM_map[variable + '_NAME'] = target
if (!BOM_map[variable + '_PKG_NAME']) {
BOM_map[variable + '_PKG_NAME'] = BOM_map[variable + '_NAME']
}
BOM_map[variable + '_PKG_RELEASE'] = '1'
BOM_map[variable + '_BUILD_DIR'] = BOM_map['BUILD_DIR'] + "/$target"
BOM_map[variable + '_OUTPUT_DIR'] = BOM_map['OUTPUT_DIR'] + "/$target"
BOM_map[variable + '_SOURCE_DIR'] = BOM_map['BUILD_DIR'] + "/source"
BOM_map[variable + '_TAR_DIR'] = BOM_map['BUILD_DIR'] + "/$target/tar/${target}-${BOM_map[variable + '_BASE_VERSION']}"
BOM_map[variable + '_SEED_TAR'] = BOM_map['BUILD_DIR'] + "/$target/tar/" + BOM_map[variable + '_TARBALL_DST']
BOM_map[variable + '_DOWNLOAD_URL'] =
(BOM_map[variable + '_SITE'] != null && BOM_map[variable + '_TARBALL_SRC'] != null) ?
BOM_map[variable + '_SITE'] + '/' + BOM_map[variable + '_TARBALL_SRC'] : null
BOM_map[variable + '_DOWNLOAD_DST'] = (BOM_map[variable + '_TARBALL_SRC'] != null) ?
DL_DIR + '/' + BOM_map[variable + '_TARBALL_SRC'] : null
// test that the download url will return http 200. If it does not, use the ARCHIVE url instead of the MIRROR SITE url
if (!ifExists(BOM_map[variable + '_DOWNLOAD_URL'])) {
BOM_map[variable + '_DOWNLOAD_URL'] = BOM_map[variable + '_ARCHIVE'] + '/' + BOM_map[variable + '_TARBALL_SRC']
}
BOM_map[variable + '_TARGET_DL'] = BOM_map[variable + '_BUILD_DIR'] + '/.download'
BOM_map[variable + '_TARGET_TAR'] = BOM_map[variable + '_BUILD_DIR'] + '/.tar'
BOM_map[variable + '_TARGET_SRPM'] = BOM_map[variable + '_BUILD_DIR'] + '/.srpm'
BOM_map[variable + '_TARGET_RPM'] = BOM_map[variable + '_BUILD_DIR'] + '/.rpm'
BOM_map[variable + '_TARGET_YUM'] = BOM_map[variable + '_BUILD_DIR'] + '/.yum'
BOM_map[variable + '_TARGET_SDEB'] = BOM_map[variable + '_BUILD_DIR'] + '/.sdeb'
BOM_map[variable + '_TARGET_DEB'] = BOM_map[variable + '_BUILD_DIR'] + '/.deb'
BOM_map[variable + '_TARGET_APT'] = BOM_map[variable + '_BUILD_DIR'] + '/.apt'
BOM_map[variable + '_TARGET_RELNOTES'] = BOM_map[variable + '_BUILD_DIR'] + '/.relnotes'
if (System.getProperty(VERBOSE)) {
BOM_map.keySet().findAll{ it.startsWith (variable) }. each { k ->
println "$k ${BOM_map.get(k)}"
}
}
}
task "$target-info" (dependsOn: "${target}_vardefines",
description: "Info about $target component build",
group: PACKAGES_GROUP) << {
println "Info for package $target"
println " Will download from URL: ${BOM_map[variable + '_DOWNLOAD_URL']}"
println " To destination file: ${BOM_map[variable + '_DOWNLOAD_DST']}"
println " Then unpack into ${BOM_map[variable + '_SOURCE_DIR']}"
println " And create a seed tarball ${BOM_map[variable + '_SEED_TAR']}"
println "Version: " + BOM_map[variable + '_BASE_VERSION']
//TODO more about stamping
}
task "$target-relnotes" (description: "Preparing release notes for $target. No yet implemented!!!", group: PACKAGES_GROUP)<< {
}
task "$target-clean" (dependsOn: "${target}_vardefines",
description: "Removing $target component ${BOM_map[variable + '_BUILD_DIR']} and ${BOM_map[variable + '_OUTPUT_DIR']}",
group: PACKAGES_GROUP) << {
delete(BOM_map[variable + '_BUILD_DIR'])
delete(BOM_map[variable + '_OUTPUT_DIR'])
}
task "$target-help" (description: "List of available tasks for $target", group: PACKAGES_GROUP) << {
println (target + "\n\t[" + tasks.findAll { alltask -> alltask.name.startsWith(target)}*.name.join(", ") + "]")
}
}
def readBOM = {
def buildUtils = new org.apache.bigtop.BuildUtils()
def bomfile = new File(BOM)
def envs = []
bomfile.eachLine {
if (!it.startsWith("#") && !it.isEmpty()) {
if (it.startsWith("\$(eval")) {
def pattern = ~/.*call PACKAGE,(\w+[-\w+]*),(\w+)/
def m = it =~ pattern
assert m.size() == 1
def target = m[0][1]
def variable = m[0][2]
genTasks(target, variable)
targets.add(target)
// Store the component name in the list
// TODO - we might not need them components anymore: version are calculated differently now
components.add(variable)
return
}
envs = it?.split("=")
def value = buildUtils.evaluateBOM(BOM_map, envs[1])
value = System.getProperty(envs[0]) ?: value
BOM_map.put(envs[0], value)
}
}
}
// We need to make sure that all dynamic tasks are available for invocation
project.afterEvaluate {
readBOM()
def bomVersions = ""
// Versions need to be preserved for more than just component:
// - there are JDK version requirement
// - possibly more in the future
BOM_map.keySet().findAll { it ==~ /.*_BASE_VERSION/ }.each { base_version ->
bomVersions += "${base_version.replaceAll('_BASE', '')}=${BOM_map[base_version]} "
}
BOM_map[BIGTOP_BOM] = bomVersions
if (System.getProperty(VERBOSE))println "BIGTOP_BOM:\n${BOM_map[BIGTOP_BOM]}"
// Putting all targets of different types into one common target
task "srpm" (dependsOn: tasks.findAll { alltask -> alltask.name.endsWith("-srpm")}*.name,
description: "Build all SRPM packages for the stack components",
group: PACKAGES_GROUP
) << { }
task "rpm" (dependsOn: tasks.findAll { alltask -> alltask.name.endsWith("-rpm")}*.name,
description: "Build all RPM packages for the stack",
group: PACKAGES_GROUP
) << { }
task "yum" (dependsOn: tasks.findAll { alltask -> alltask.name.endsWith("-yum")}*.name,
description: "Create YUM repository for all pre-built RPM packages",
group: PACKAGES_GROUP
) << { }
task "sdeb" (dependsOn: tasks.findAll { alltask -> alltask.name.endsWith("-sdeb")}*.name,
description: "Build all SDEB packages for the stack components",
group: PACKAGES_GROUP
) << { }
task "deb" (dependsOn: tasks.findAll { alltask -> alltask.name.endsWith("-deb")}*.name,
description: "Build all DEB packages for the stack components",
group: PACKAGES_GROUP
) << { }
task "apt" (dependsOn: tasks.findAll { alltask -> alltask.name.endsWith("-apt")}*.name,
description: "Create APT repository for all pre-built DEB packages",
group: PACKAGES_GROUP
) << { }
task allclean (dependsOn: [clean, tasks.findAll { alltask -> alltask.name.endsWith("-clean")}*.name],
description: "Removing $BUILD_DIR, $OUTPUT_DIR, and $DIST_DIR.\n\t\t" +
"Cleaning all components' build and output directories.",
group: PACKAGES_GROUP) << {
delete (BUILD_DIR)
delete (OUTPUT_DIR)
delete (DIST_DIR)
}
task realclean (dependsOn: allclean,
description: "Removing $BUILD_DIR, $OUTPUT_DIR, $DIST_DIR, and $DL_DIR",
group: PACKAGES_GROUP) << {
delete (DL_DIR)
}
}