3 # Make whichever packages the system supports
5 # Copyright (c) 2012-2016 Red Hat.
6 # Copyright (c) 2004 Silicon Graphics, Inc. All Rights Reserved.
8 # This program is free software; you can redistribute it and/or modify it
9 # under the terms of the GNU General Public License as published by the
10 # Free Software Foundation; either version 2 of the License, or (at your
11 # option) any later version.
13 # This program is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
32 echo "Error: can only be run from within the PCP git repository"
36 if [ ! -f VERSION.pcp
]
38 echo "Error: can only be run from within the PCP source tree"
42 # Find where a GNU tool is hiding, look for this line in the
43 # $gnutool --help output ...
44 # "Report bugs to <bug-$gnutool@gnu.org>"
51 # *This* tar defaults to:
63 # Not in the environment, go search for it in the known locations.
67 for command in $oldcmd $@
69 exec=`which $command 2>/dev/null`
72 $command --help >$tmp.
help 2>&1
73 if egrep "(bug-$oldcmd@gnu.org)|(FreeBSD $command)|(NetBSD $command)|(OpenBSD $command)|(Apple $command)" $tmp.
help >/dev
/null
78 awk <$tmp.
help >$tmp.check
'
80 /This\** tar defaults to:/ { want=1; next }
81 want == 1 { print; exit }'
82 if grep '[-][-]format=gnu' <$tmp.check
>/dev
/null
89 if [ "$target" = openbsd
-a $command = gzip ]
96 echo >&2 "$prefix: can't find GNU $oldcmd in the commands $oldcmd or $@"
97 [ $prefix = Error
] && exit 1
101 # Use the environment request and ensure it is a full path (do not
102 # change this behaviour, it is required for backward-compatibility
103 # - QA failures will result if you choose to ignore this warning).
105 command=`which $envvar 2>/dev/null`
108 echo >&2 "$prefix: $oldcmd (from the environment) does not exist!"
109 [ $prefix = Error
] && exit 1
116 target
=`uname -s | tr 'A-Z' 'a-z'`
118 export MAKE
=`gnu_tool Error "$MAKE" make gmake`
119 export TAR
=`gnu_tool Warning "$TAR" tar gtar gnutar`
120 export ZIP
=`gnu_tool Error "$ZIP" gzip gnuzip`
122 # check if tar supports --transform else we must use git-archive later on (e.g. RHEL5)
123 [ -n "$TAR" ] && $TAR --help |
2>&1 grep -q transform || USE_GIT_ARCHIVE
=1
124 #debug# echo TAR=$TAR USE_GIT_ARCHIVE=$USE_GIT_ARCHIVE
126 tmp
=`mktemp -d /tmp/pcp.XXXXXXXXX` ||
exit 1
127 trap "rm -rf $tmp $tmp.help" 0 1 2 3 15
129 configure
=.
/configure
130 cmdline_configopts
=''
136 # we always clean nowadays, so silently ignore
165 cmdline_configopts
="$cmdline_configopts $opt"
170 cmdline_configopts
="$cmdline_configopts $opt"
175 cmdline_configopts
="$cmdline_configopts $opt"
196 # Add remaining options to the ./configure command line
197 cmdline_configopts
="$cmdline_configopts $opt"
203 if [ $dorpm = unknown
]
206 [ -x /usr
/bin
/rpmbuild
] && dorpm
=true
208 if [ $dodeb = unknown
]
211 [ -x /usr
/bin
/dpkg-buildpackage
] && dodeb
=true
218 echo >&2 "Do not know how to build RPM and Debian packages at the same time!"
219 echo >&2 "Suggest --nonrpm or --nondeb on the command line."
225 # On Debian-based platforms, the debian/rules file already captures
226 # most of the required configure settings in $(configure_paths)
231 # On RPM-based platforms, rpm macros provide an excellent set of defaults.
232 # This set is based on Fedora 22 %configure macro from /usr/lib/rpm/macros,
233 # and is known to work as far back as RHEL5.
234 configopts
="`rpmbuild --eval '--prefix=%{_prefix} --exec-prefix=%{_exec_prefix} --bindir=%{_bindir} --sbindir=%{_sbindir} --sysconfdir=%{_sysconfdir} --datadir=%{_datadir} --includedir=%{_includedir} --libdir=%{_libdir} --libexecdir=%{_libexecdir} --localstatedir=%{_localstatedir} --sharedstatedir=%{_sharedstatedir} --mandir=%{_mandir}' 2>/dev/null`"
235 # rpmbuild clears the environment, so force these settings into the
236 # rpm build configure
238 configopts
="$configopts --with-make=$MAKE --with-tar=$TAR --with-zip=$ZIP"
239 elif [ $target = darwin
]
241 # On Mac OS X platforms, we install away from /usr/bin, /usr/lib
242 # and so on because of security requirements in recent versions.
244 configopts
="--prefix=/usr/local --sysconfdir=/etc --localstatedir=/var"
245 elif [ $target = netbsd
]
247 # Try to mimic where pkgsrc/pkgin place things
249 configopts
="--prefix=/usr/pkg --exec-prefix=/usr/pkg --mandir=/usr/pkg/man --with-rcdir=/etc/rc.d --localstatedir=/usr/pkg --with-rundir=/var/run --with-tmpdir=/var/tmp --with-logdir=/var/log/pcp"
251 # Bog-standard options suitable for a package on any platform.
252 # Command line can be used to extend this set, and any unusual
253 # platform-specific requirements are also appended later on.
254 configopts
="--prefix=/usr --sysconfdir=/etc --localstatedir=/var"
257 # Platform-specific variants ...
261 mingw|mingw64|windows
)
264 configopts
="$configopts --disable-ssp"
265 export configure
="/usr/bin/mingw64-configure"
266 export MAKE
="/usr/bin/mingw64-make"
267 export QMAKE
="/usr/bin/mingw64-qmake-qt4"
268 export PKG_CONFIG
="/usr/bin/mingw64-pkg-config"
272 [ -f /etc
/slackware-version
-a "$ARCH" = x86_64
] && configopts
="$configopts --libdir=/usr/lib64"
276 [ "$ARCH" = amd64
-o "$ARCH" = sparcv9
] && configopts
="$configopts --libdir=/usr/lib/64"
282 # now some specific QA/development hosts with special needs ...
286 vm04|vm04.localdomain|vm11|vm11.localdomain
)
287 # gcc -O2 is broken here (for the linux PMDA)
289 configopts
="$configopts --with-optimization=no"
290 # over-ride the settings from dpkg-buildflags
292 export DEB_CFLAGS_SET
=''
293 export DEB_CXXFLAGS_SET
=''
297 # and finally add in any from the command line
299 [ -n "$cmdline_configopts" ] && configopts
="$configopts $cmdline_configopts"
302 VERSION
=${PACKAGE_MAJOR}.${PACKAGE_MINOR}.${PACKAGE_REVISION}
308 source=pcp-
${VERSION}
309 SRCDIR
="$topdir/$source"
310 SRCTREE
="$topdir/$source"
311 SRCTAR
=$topdir/build
/tar
/$source.src.
tar.gz
312 SRCWEBJS
=$topdir/build
/tar
/webjs.
tar.gz
313 SRCVECTOR
=$topdir/build
/tar
/vector.
tar.gz
314 SRCPARFAIT
=$topdir/build
/tar
/parfait.
tar.gz
318 # only print in non-verbose mode, otherwise we see double
320 echo $@ failed
, see log
in $LOGDIR/pcp
329 echo "== Cleaning build tree for packaging build"
330 rm -rf "$SRCDIR" "$SRCTAR" .gitcensus
335 if [ -f "$1" -a -f "$2" ]
337 # as expected, both present
338 if diff "$1" "$2" >/dev
/null
2>&1
342 # must be using git-archive(1) and VERSION.pcp has been
343 # modified, e.g. by pcp-daily script ... use the modified
344 # one to bump the build number in the packages
349 echo "Arrgh ... expect both these to exist ..."
355 # Download sources from external repositories that we might want
356 # to include with the PCP packages.
362 if [ ! -f "$SRCPARFAIT" ]
364 echo "== Downloading Parfait package"
365 url
=https
://github.com
/performancecopilot
/parfait
/archive
/master.
zip
366 wget
-H -q -O $tmp/java.
zip "$url"
367 [ $?
-eq 0 ] && .
/scripts
/zip2tar
$tmp/java.
zip "$SRCPARFAIT"
369 if [ -f "$SRCPARFAIT" ]
371 DESTPARFAIT
="$SRCTREE/build/tar/"`basename "$SRCPARFAIT"`
372 cp "$SRCPARFAIT" "$DESTPARFAIT"
378 DESTVECTOR
="$SRCTREE/build/tar/"`basename "$SRCVECTOR"`
379 if [ ! -f "$SRCVECTOR" ]
381 echo "== Downloading Vector webapp"
382 url
=https
://bintray.com
/artifact
/download
/netflixoss
/downloads
/vector.
tar.gz
383 wget
-H -q -O "$SRCVECTOR" "$url"
384 [ $?
-eq 0 ] && echo "Wrote: $SRCVECTOR"
385 mkdir
$tmp/vector
&& pushd $tmp/vector
&& $TAR -zxf "$SRCVECTOR"
386 $topdir/scripts
/build-vector
387 [ $?
-eq 0] ||
exit 1
388 cd dist
&& $TAR -czf "$DESTVECTOR" *
391 cp "$SRCVECTOR" "$DESTVECTOR"
397 if [ ! -f "$SRCWEBJS" ]
399 echo "== Downloading webjs webapps"
400 url
=https
://github.com
/performancecopilot
/pcp-webjs
/archive
/master.
zip
401 wget
-H -q -O $tmp/js.
zip "$url"
402 [ $?
-eq 0 ] && .
/scripts
/zip2tar
$tmp/js.
zip "$SRCWEBJS"
404 if [ -f "$SRCWEBJS" ]
406 DESTWEBJS
="$SRCTREE/build/tar/"`basename "$SRCWEBJS"`
407 cp "$SRCWEBJS" "$DESTWEBJS"
412 # Generate a list of all the files git knows about, create the
413 # source tarball and then unpack it. We'll then do the package
414 # build in a guaranteed pristine environment.
418 if [ -z "$TAR" -o ! -z "$USE_GIT_ARCHIVE" ]
420 # no suitable GNU tar is available, use git-archive(1) - no local changes
421 if git status
-s src man |
grep '^.M'
423 echo "Arrgh, modified src files and either no tar ($TAR) or no --transform"
424 echo "support in tar, so local changes would not be included in the build."
427 git archive
--format=tar --prefix=$source/ HEAD |
$ZIP > $SRCTAR
429 # build git file list and make tarball by hand to pick up any changes
431 git ls-files
> .gitcensus
433 # but first ensure a "build everything" debian/control has been
441 echo "Error: debian/pre-build failed when creating debian/control"
445 echo "debian/control" >> .gitcensus
447 $TAR -cz --transform="s,^,$source/," --files-from=.gitcensus \
451 echo "Wrote: $SRCTAR"
454 # On sanity checks :- this is sick, but I'm really tired of QA failing
455 # because of bad binaries being built from the Debian/Ubuntu toolchain
456 # for # i?86 platforms
457 # - Ken McDonell Apr 2010
459 sanity_check_settings
()
462 ARCH
=`uname -m | sed -e 's/i.86/ia32/'`
463 if [ "$ARCH" != "ia32" ]
465 OPT
=true
# no workarounds needed for non-i?86 platforms
466 elif [ -f /etc
/lsb-release
]
468 if grep -q 'DISTRIB_ID=Ubuntu' /etc
/lsb-release
470 eval `grep DISTRIB_RELEASE= /etc/lsb-release`
471 XDISTRIB_RELEASE
=`echo $DISTRIB_RELEASE | sed -e 's/[^0-9]//g'`
472 [ -z "$XDISTRIB_RELEASE" ] && XDISTRIB_RELEASE
=0000
473 if [ $XDISTRIB_RELEASE -gt 1110 ]
475 # Hope the problem is fixed after Ubuntu 11.10
479 $OPT ||
echo "Building without optimization for Ubuntu $DISTRIB_RELEASE"
480 elif [ -f /etc
/debian_version
]
482 DISTRIB_RELEASE
=`cat /etc/debian_version`
483 XDISTRIB_RELEASE
=`echo $DISTRIB_RELEASE | sed -e 's/[^0-9]//g'`
484 [ -z "$XDISTRIB_RELEASE" ] && XDISTRIB_RELEASE
=0000
485 if [ $XDISTRIB_RELEASE -ge 700 ]
487 # Hope the problem is fixed in Debian 7.0.0
490 $OPT ||
echo "Building without optimization for Debian $DISTRIB_RELEASE"
496 if grep -q '^my $default_flags .*O2' /usr
/bin
/dpkg-buildpackage
498 echo 'dpkg-buildpackage: need to remove O2 from $default_flags'
501 if grep -q '^[ ]*LDFLAGS.*-Bsymbolic-functions' /usr
/bin
/dpkg-buildpackage
503 echo 'dpkg-buildpackage: need to remove -Bsymbolic-function from LDFLAGS'
508 echo "Refer to Debian/Ubuntu notes in PCP's ./INSTALL"
511 # as of Debian 6.0.1 and Ubuntu 10.10, build flags are hidden and
512 # extracted using dpkg-buildflags which fortunately honours some
513 # environment variable settings
515 export DEB_CFLAGS_SET
=''
516 export DEB_CXXFLAGS_SET
=''
517 export DEB_LDFLAGS_SET
=''
521 # Build Debian packages using the dpkg-buildpackage utility which runs
522 # the complete build, from configure through to final deb preparation.
524 debian_buildpackage
()
527 echo "== Building deb packages using dpkg-buildpackage"
529 SUDO
=${SUDO:-fakeroot}
530 # don't sign by default
532 # sign if --signed and $DEB_SIGN_KEYID set in the environment
533 $signed && [ -n "$DEB_SIGN_KEYID" ] && sign
=''
536 (dpkg-buildpackage
$sign -r$SUDO ||
touch $tmp/failed
) 2>&1 |
tee -a $LOGDIR/pcp
538 (dpkg-buildpackage
$sign -r$SUDO ||
touch $tmp/failed
) >>$LOGDIR/pcp
2>&1
540 [ -f $tmp/failed
] && build_failure debian buildpackage
543 prepare_debian_sources
()
545 # shortcut for dpkg-buildpackage which does everything itself from here
547 mkdir
-p "$SRCDIR" 2>/dev
/null
549 cd "$SRCDIR" ||
exit 1
550 $TAR -zxf "$SRCTAR" ||
exit 1
552 cd "$SRCTREE" ||
exit 1
555 fix_version
${topdir}/VERSION.pcp VERSION.pcp
558 prepare_debian_control
()
561 echo "== Preparing source tree for dpkg-buildpackage"
562 rm -f $tmp/failed debian
/control
564 ($MAKE -C debian control
2>&1 ||
touch $tmp/failed
) 2>&1 |
tee -a $LOGDIR/pcp
566 ($MAKE -C debian control
2>&1 ||
touch $tmp/failed
) >>$LOGDIR/pcp
2>&1
568 [ -f $tmp/failed
] && build_failure debian control
573 SRCDIR
="${topdir}/build/deb"
574 SRCTREE
="${topdir}/build/deb/$source"
575 prepare_debian_sources
577 # Note: we need to run configure here to get things like builddefs
578 # created, but configure will be run _again_ from
579 # debian_buildpackage, but we need to make sure the same
580 # configure options are used in both places
582 export configure_opts
="$configopts"
583 if [ ! -f debian
/rules
]
585 echo "Botch: cannot find debian/rules"
588 debian_opts
=`sed -n <debian/rules -e '/^configure_paths/s/^[^=]*= *//p'`
589 if [ -z "$debian_opts" ]
591 echo "Botch: cannot get config options from configure_paths in debian/rules"
594 configopts
="$debian_opts $configopts"
596 prepare_debian_control
597 sanity_check_settings
602 grep ^dpkg-deb
$LOGDIR/pcp | \
603 sed -e 's,\.$,,g' -e "s,',,g" -e "s,\.\.,$topdir/build/deb,g" | \
604 awk '{ print "Wrote:", $NF }'
612 echo "== Preparing fresh build tree for packaging build"
614 if [ ! -d "$SRCDIR" ]; then
615 # extract gzipped tar archive
616 $TAR -xz --file="$SRCTAR" ||
exit 1
617 fix_version VERSION.pcp
$SRCDIR/VERSION.pcp
624 echo "== Configuring pcp, log is in $LOGDIR/pcp ($configopts)"
629 ($configure $configopts 2>&1 ||
touch $tmp/failed
) 2>&1 |
tee -a $LOGDIR/pcp
631 ($configure $configopts 2>&1 ||
touch $tmp/failed
) >>$LOGDIR/pcp
2>&1
633 [ -f $tmp/failed
] && build_failure Configure
639 echo "== Building pcp, log is in $LOGDIR/pcp"
643 ($MAKE default_pcp
2>&1 ||
touch $tmp/failed
) 2>&1 |
tee -a $LOGDIR/pcp
645 ($MAKE default_pcp
2>&1 ||
touch $tmp/failed
) >>$LOGDIR/pcp
2>&1
647 [ -f $tmp/failed
] && build_failure Make default_pcp
653 echo "== Packaging pcp, log is in $LOGDIR/pcp" |
tee -a $LOGDIR/pcp
657 ($MAKE -C build pack_pcp
2>&1 ||
touch $tmp/failed
) 2>&1 |
tee -a $LOGDIR/pcp
659 ($MAKE -C build pack_pcp
2>&1 ||
touch $tmp/failed
) >>$LOGDIR/pcp
2>&1
661 [ -f $tmp/failed
] && build_failure Packaging via pack_pcp
667 echo "== Building rpm packages, log is in $LOGDIR/pcp" |
tee -a $LOGDIR/pcp
670 export DIST_ROOT
=${topdir}/build
/rpm
/${source}
671 # sign if --signed and $RPM_SIGN_KEYID set in the environment
672 $signed && [ -z "$RPM_SIGN_KEYID" ] && unset RPM_SIGN_KEYID
674 ($MAKE -C build
/rpm pack_pcp
2>&1 ||
touch $tmp/failed
) 2>&1 |
tee -a $LOGDIR/pcp
676 ($MAKE -C build
/rpm pack_pcp
2>&1 ||
touch $tmp/failed
) >>$LOGDIR/pcp
2>&1
678 [ -f $tmp/failed
] && build_failure Packaging RPMs via pack_pcp
684 echo "== Building docker container images, log is in $LOGDIR/pcp" |
tee -a $LOGDIR/pcp
687 if docker version
>/dev
/null
2>&1; then
688 v
=`docker version | sed -e 's/\./ /g' | \
689 awk '/^Server/ {s=1; if($2 == "version:") {print 10*$3+$4; exit}}
690 /Version:/ {if (s) {print 10*$2+$3; exit}}'`
691 if [ -z "$v" -o "$v" -lt 14 ]; then
692 echo 'Error: docker version too old. Containers build skipped.'
696 echo 'Error: docker not enabled or not properly configured for non-root access.'
697 echo 'Check the docker service is enabled and running. You can allow non-root access'
698 echo 'as follows: edit /etc/sysconfig/docker and add OPTIONS="-G gid" where gid is a'
699 echo 'group name that you are a member of. Then restart the docker service.'
703 [ -f $tmp/failed
] && build_failure Packaging docker images
, docker configuration
706 ($MAKE -C build
/containers pack_pcp
2>&1 ||
touch $tmp/failed
) 2>&1 |
tee -a $LOGDIR/pcp
708 ($MAKE -C build
/containers pack_pcp
2>&1 ||
touch $tmp/failed
) >>$LOGDIR/pcp
2>&1
711 [ -f $tmp/failed
] && build_failure Packaging docker containers via pack_pcp
714 # real build starts here
719 # short-circuit for performing builds with dpkg-buildpackage
720 $dodeb && debian_build
724 # download any requested third party sources we're packaging
727 # shift into the clean packaging build tree from here onward
732 # short-circuit for performing rpm-only builds with rpmbuild
733 # (skips over the default_build stage as rpmbuild does that).
738 default_build
# perform a complete build in-situ
739 packaging_pcp
# create all known package formats
743 # --with-docker, currently only for RPM platforms with docker
751 grep '^Wrote:' $LOGDIR/pcp |
sed -e 's/\.\.\/\.\.\///'