1#!/bin/sh
2
3shell_quote_string() {
4  echo "$1" | sed -e 's,\([^a-zA-Z0-9/_.=-]\),\\\1,g'
5}
6
7usage () {
8    cat <<EOF
9Usage: $0 [OPTIONS]
10    The following options may be given :
11        --builddir=DIR      Absolute path to the dir where all actions will be performed
12        --get_sources       Source will be downloaded from github
13        --build_src_rpm     If it is 1 src rpm will be built
14        --build_source_deb  If it is 1 source deb package will be built
15        --build_rpm         If it is 1 rpm will be built
16        --build_deb         If it is 1 deb will be built
17        --build_tarball     If it is 1 tarball will be built
18        --install_deps      Install build dependencies(root previlages are required)
19        --branch            Branch for build
20        --repo              Repo for build
21        --yassl             build tarball with yassl
22        --perconaft_repo    PerconaFT repo
23        --perconaft_branch  Branch for PerconaFT
24        --tokubackup_repo   TokuBackup repo
25        --tokubackup_branch Btanch for TokuBackup
26        --help) usage ;;
27Example $0 --builddir=/tmp/PS56 --get_sources=1 --build_src_rpm=1 --build_rpm=1
28EOF
29        exit 1
30}
31
32append_arg_to_args () {
33  args="$args "$(shell_quote_string "$1")
34}
35
36parse_arguments() {
37    pick_args=
38    if test "$1" = PICK-ARGS-FROM-ARGV
39    then
40        pick_args=1
41        shift
42    fi
43
44    for arg do
45        val=$(echo "$arg" | sed -e 's;^--[^=]*=;;')
46        case "$arg" in
47            # these get passed explicitly to mysqld
48            --builddir=*) WORKDIR="$val" ;;
49            --build_src_rpm=*) SRPM="$val" ;;
50            --build_source_deb=*) SDEB="$val" ;;
51            --build_rpm=*) RPM="$val" ;;
52            --build_deb=*) DEB="$val" ;;
53            --get_sources=*) SOURCE="$val" ;;
54            --build_tarball=*) TARBALL="$val" ;;
55            --branch=*) BRANCH="$val" ;;
56            --repo=*) REPO="$val" ;;
57            --install_deps=*) INSTALL="$val" ;;
58            --yassl=*) YASSL="$val" ;;
59            --perconaft_branch=*) PERCONAFT_BRANCH="$val" ;;
60            --tokubackup_branch=*) 	TOKUBACKUP_BRANCH="$val" ;;
61            --perconaft_repo=*) PERCONAFT_REPO="$val" ;;
62            --tokubackup_repo=*) TOKUBACKUP_REPO="$val" ;;
63            --help) usage ;;
64            *)
65              if test -n "$pick_args"
66              then
67                  append_arg_to_args "$arg"
68              fi
69              ;;
70        esac
71    done
72}
73
74check_workdir(){
75    if [ "x$WORKDIR" = "x$CURDIR" ]
76    then
77        echo >&2 "Current directory cannot be used for building!"
78        exit 1
79    else
80        if ! test -d "$WORKDIR"
81        then
82            echo >&2 "$WORKDIR is not a directory."
83            exit 1
84        fi
85    fi
86    return
87}
88
89add_percona_yum_repo(){
90    if [ ! -f /etc/yum.repos.d/percona-dev.repo ]
91    then
92        cat >/etc/yum.repos.d/percona-dev.repo <<EOL
93[percona-dev-$basearch]
94name=Percona internal YUM repository for build slaves \$releasever - \$basearch
95baseurl=http://jenkins.percona.com/yum-repo/\$releasever/RPMS/\$basearch
96gpgkey=http://jenkins.percona.com/yum-repo/PERCONA-PACKAGING-KEY
97gpgcheck=0
98enabled=1
99
100[percona-dev-noarch]
101name=Percona internal YUM repository for build slaves \$releasever - noarch
102baseurl=http://jenkins.percona.com/yum-repo/\$releasever/RPMS/noarch
103gpgkey=http://jenkins.percona.com/yum-repo/PERCONA-PACKAGING-KEY
104gpgcheck=0
105enabled=1
106EOL
107    fi
108    return
109}
110
111add_percona_apt_repo(){
112  if [ ! -f /etc/apt/sources.list.d/percona-dev.list ]; then
113    cat >/etc/apt/sources.list.d/percona-dev.list <<EOL
114deb http://jenkins.percona.com/apt-repo/ @@DIST@@ main
115deb-src http://jenkins.percona.com/apt-repo/ @@DIST@@ main
116EOL
117    sed -i "s:@@DIST@@:$OS_NAME:g" /etc/apt/sources.list.d/percona-dev.list
118  fi
119  wget -qO - http://jenkins.percona.com/apt-repo/8507EFA5.pub | apt-key add -
120  return
121}
122
123get_sources(){
124    cd "${WORKDIR}"
125    if [ "${SOURCE}" = 0 ]
126    then
127        echo "Sources will not be downloaded"
128        return 0
129    fi
130
131    git clone "$REPO"
132    retval=$?
133    if [ $retval != 0 ]
134    then
135        echo "There were some issues during repo cloning from github. Please retry one more time"
136        exit 1
137    fi
138
139    cd percona-server
140    if [ ! -z "$BRANCH" ]
141    then
142        git reset --hard
143        git clean -xdf
144        git checkout "$BRANCH"
145    fi
146
147    REVISION=$(git rev-parse --short HEAD)
148    git reset --hard
149    #
150    source VERSION
151    cat VERSION > ../percona-server-5.6.properties
152    echo "REVISION=${REVISION}" >> ../percona-server-5.6.properties
153    BRANCH_NAME="${BRANCH}"
154    echo "BRANCH_NAME=${BRANCH_NAME}" >> ../percona-server-5.6.properties
155    export PRODUCT=Percona-Server-${MYSQL_VERSION_MAJOR}.${MYSQL_VERSION_MINOR}
156    echo "PRODUCT=Percona-Server-${MYSQL_VERSION_MAJOR}.${MYSQL_VERSION_MINOR}" >> ../percona-server-5.6.properties
157    export PRODUCT_FULL=${PRODUCT}.${MYSQL_VERSION_PATCH}${MYSQL_VERSION_EXTRA}
158    echo "PRODUCT_FULL=${PRODUCT}.${MYSQL_VERSION_PATCH}${MYSQL_VERSION_EXTRA}" >> ../percona-server-5.6.properties
159    echo "BUILD_NUMBER=${BUILD_NUMBER}" >> ../percona-server-5.6.properties
160    echo "BUILD_ID=${BUILD_ID}" >> ../percona-server-5.6.properties
161    echo "PERCONAFT_REPO=${PERCONAFT_REPO}" >> ../percona-server-5.6.properties
162    echo "PERCONAFT_BRANCH=${PERCONAFT_BRANCH}" >> ../percona-server-5.6.properties
163    echo "TOKUBACKUP_REPO=${TOKUBACKUP_REPO}" >> ../percona-server-5.6.properties
164    echo "TOKUBACKUP_BRANCH=${TOKUBACKUP_BRANCH}" >> ../percona-server-5.6.properties
165    echo "TOKUDB_VERSION=${MYSQL_VERSION_MAJOR}.${MYSQL_VERSION_MINOR}.${MYSQL_VERSION_PATCH}${MYSQL_VERSION_EXTRA}" >> ../percona-server-5.6.properties
166    #
167    if [ -z "${DESTINATION}" ]; then
168        export DESTINATION=experimental
169    fi
170    #
171    TIMESTAMP=$(date "+%Y%m%d-%H%M%S")
172    echo "DESTINATION=${DESTINATION}" >> ../percona-server-5.6.properties
173    echo "UPLOAD=UPLOAD/${DESTINATION}/BUILDS/${PRODUCT}/${PRODUCT_FULL}/${BRANCH_NAME}/${REVISION}/${TIMESTAMP}" >> ../percona-server-5.6.properties
174    #
175    # initialize git submodules
176    rm -rf storage/tokudb/PerconaFT
177    rm -rf plugin/tokudb-backup-plugin/Percona-TokuBackup
178    git submodule deinit -f .
179    rm -rf storage/tokudb/PerconaFT
180    rm -rf plugin/tokudb-backup-plugin/Percona-TokuBackup
181    if [ -z ${PERCONAFT_REPO} -a -z ${TOKUBACKUP_REPO} ]; then
182        mkdir plugin/tokudb-backup-plugin/Percona-TokuBackup
183        mkdir storage/tokudb/PerconaFT
184        git submodule init
185        git submodule update
186        cd storage/tokudb/PerconaFT
187        git fetch origin
188        git checkout ${PERCONAFT_BRANCH}
189        if [ ${PERCONAFT_BRANCH} = "master" ]; then
190            git pull
191        fi
192        cd $WORKDIR/percona-server
193        cd plugin/tokudb-backup-plugin/Percona-TokuBackup
194        git fetch origin
195        git checkout ${TOKUBACKUP_BRANCH}
196        if [ ${TOKUBACKUP_BRANCH} = "master" ]; then
197            git pull
198        fi
199        cd $WORKDIR/percona-server
200    else
201        cd storage/tokudb
202        git clone ${PERCONAFT_REPO}
203        cd PerconaFT
204        git checkout ${PERCONAFT_BRANCH}
205        cd ../
206        cd ${WORKDIR}/percona-server
207        cd plugin/tokudb-backup-plugin
208        git clone ${TOKUBACKUP_REPO}
209        cd Percona-TokuBackup
210        git checkout ${TOKUBACKUP_BRANCH}
211        cd ../
212        cd ${WORKDIR}/percona-server
213    fi
214    #
215    cmake . -DDOWNLOAD_BOOST=1 -DWITH_BOOST=${WORKDIR}/build-ps/boost
216    make dist
217    #
218    EXPORTED_TAR=$(basename $(find . -type f -name *.tar.gz | sort | tail -n 1))
219    #
220    PSDIR=${EXPORTED_TAR%.tar.gz}
221    rm -fr ${PSDIR}
222    tar xzf ${EXPORTED_TAR}
223    rm -f ${EXPORTED_TAR}
224    # add git submodules because make dist uses git archive which doesn't include them
225    rsync -av storage/tokudb/PerconaFT ${PSDIR}/storage/tokudb --exclude .git
226    rsync -av plugin/tokudb-backup-plugin/Percona-TokuBackup ${PSDIR}/plugin/tokudb-backup-plugin --exclude .git
227    #
228    cd ${PSDIR}
229    # set tokudb version - can be seen with show variables like '%version%'
230    sed -i "1s/^/SET(TOKUDB_VERSION ${TOKUDB_VERSION})\n/" storage/tokudb/CMakeLists.txt
231    #
232    sed -i "s:@@PERCONA_VERSION_EXTRA@@:${MYSQL_VERSION_EXTRA#-}:g" build-ps/debian/rules
233    sed -i "s:@@REVISION@@:${REVISION}:g" build-ps/debian/rules
234    sed -i "s:@@TOKUDB_BACKUP_VERSION@@:${TOKUDB_VERSION}:g" build-ps/debian/rules
235    sed -i "s:@@PERCONA_VERSION_EXTRA@@:${MYSQL_VERSION_EXTRA#-}:g" build-ps/debian/rules.yakkety
236    sed -i "s:@@REVISION@@:${REVISION}:g" build-ps/debian/rules.yakkety
237    sed -i "s:@@TOKUDB_BACKUP_VERSION@@:${TOKUDB_VERSION}:g" build-ps/debian/rules.yakkety
238
239    sed -i "s:@@PERCONA_VERSION_EXTRA@@:${MYSQL_VERSION_EXTRA#-}:g" build-ps/debian/rules.notokudb
240    sed -i "s:@@REVISION@@:${REVISION}:g" build-ps/debian/rules.notokudb
241    #
242    sed -i "s:@@MYSQL_VERSION@@:${MYSQL_VERSION_MAJOR}.${MYSQL_VERSION_MINOR}.${MYSQL_VERSION_PATCH}:g" build-ps/percona-server.spec
243    sed -i "s:@@PERCONA_VERSION@@:${MYSQL_VERSION_EXTRA#-}:g" build-ps/percona-server.spec
244    sed -i "s:@@REVISION@@:${REVISION}:g" build-ps/percona-server.spec
245    sed -i "s:@@TOKUDB_BACKUP_VERSION@@:${TOKUDB_VERSION}:g" build-ps/percona-server.spec
246    #
247    sed -i "s:@@TOKUDB_BACKUP_VERSION@@:${TOKUDB_VERSION}:g" build-ps/build-binary.sh
248    # create a PS tar
249    cd ${WORKDIR}/percona-server
250    tar --owner=0 --group=0 --exclude=.bzr --exclude=.git -czf ${PSDIR}.tar.gz ${PSDIR}
251    rm -fr ${PSDIR}
252
253
254    mkdir $WORKDIR/source_tarball
255    mkdir $CURDIR/source_tarball
256    cp ${PSDIR}.tar.gz $WORKDIR/source_tarball
257    cp ${PSDIR}.tar.gz $CURDIR/source_tarball
258    cd $CURDIR
259    rm -rf percona-server
260    return
261}
262
263get_system(){
264    if [ -f /etc/redhat-release ]; then
265        RHEL=$(rpm --eval %rhel)
266        ARCH=$(echo $(uname -m) | sed -e 's:i686:i386:g')
267        OS_NAME="el$RHEL"
268        OS="rpm"
269    else
270        ARCH=$(uname -m)
271        OS_NAME="$(lsb_release -sc)"
272        OS="deb"
273    fi
274    return
275}
276
277install_deps() {
278    if [ $INSTALL = 0 ]
279    then
280        echo "Dependencies will not be installed"
281        return;
282    fi
283    if [ ! $( id -u ) -eq 0 ]
284    then
285        echo "It is not possible to instal dependencies. Please run as root"
286        exit 1
287    fi
288    CURPLACE=$(pwd)
289
290    if [ "x$OS" = "xrpm" ]; then
291        RHEL=$(rpm --eval %rhel)
292        ARCH=$(echo $(uname -m) | sed -e 's:i686:i386:g')
293        add_percona_yum_repo
294	yum -y install https://repo.percona.com/yum/percona-release-1.0-11.noarch.rpm || true
295        yum -y install epel-release git redhat-lsb
296        yum clean metadata
297        yum -y install libtool rpm-build gcc-c++ gperf ncurses-devel perl readline-devel openssl-devel jemalloc
298        yum -y install time zlib-devel libaio-devel bison cmake pam-devel libeatmydata jemalloc-devel
299        yum -y install perl-Time-HiRes numactl-devel || true
300        yum -y install selinux-policy-devel || true
301	    if [ ${RHEL} -lt 7 ]; then
302	        if [ $(uname -m) = x86_64 ]; then
303               yum install -y percona-devtoolset-gcc percona-devtoolset-binutils percona-devtoolset-gcc-c++ percona-devtoolset-libstdc++-devel percona-devtoolset-valgrind-devel
304	        else
305               wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
306               wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-cern https://raw.githubusercontent.com/cms-sw/cms-docker/master/slc6-vanilla/RPM-GPG-KEY-cern
307               yum -y install  devtoolset-2-gcc-c++ devtoolset-2-binutils libevent2-devel
308            fi
309            yum -y install Percona-Server-shared-56
310        fi
311    else
312        apt-get -y install dirmngr || true
313        add_percona_apt_repo
314      	apt-get update
315        apt-get -y install dirmngr || true
316        apt-get -y install lsb-release
317        apt-get -y purge eatmydata || true
318    	apt-get -y install git libtool curl bison cmake perl libssl-dev gcc g++ libaio-dev libldap2-dev libwrap0-dev gdb
319  	apt-get -y install lsb-release libmecab-dev libncurses5-dev libreadline-dev libpam-dev zlib1g-dev
320  	apt-get -y install libnuma-dev libjemalloc-dev libeatmydata
321        apt-get -y install cmake autotools-dev autoconf automake build-essential devscripts debconf debhelper fakeroot
322        apt-get -y install chrpath ghostscript gawk bison cmake libaio-dev libmecab-dev libncurses5-dev lsb-release perl po-debconf psmisc zlib1g-dev libreadline-dev libpam-dev libssl-dev libnuma-dev libwrap0-dev libldap2-dev dh-systemd || true
323    fi
324    if [ ! -d /usr/local/percona-subunit2junitxml ]; then
325        cd /usr/local
326        git clone https://github.com/percona/percona-subunit2junitxml.git
327        rm -rf /usr/bin/subunit2junitxml
328        ln -s /usr/local/percona-subunit2junitxml/subunit2junitxml /usr/bin/subunit2junitxml
329        cd ${CURPLACE}
330    fi
331    return;
332}
333
334get_tar(){
335    TARBALL=$1
336    TARFILE=$(basename $(find $WORKDIR/$TARBALL -name 'percona-server*.tar.gz' | sort | tail -n1))
337    if [ -z $TARFILE ]
338    then
339        TARFILE=$(basename $(find $CURDIR/$TARBALL -name 'percona-server*.tar.gz' | sort | tail -n1))
340        if [ -z $TARFILE ]
341        then
342            echo "There is no $TARBALL for build"
343            exit 1
344        else
345            cp $CURDIR/$TARBALL/$TARFILE $WORKDIR/$TARFILE
346        fi
347    else
348        cp $WORKDIR/$TARBALL/$TARFILE $WORKDIR/$TARFILE
349    fi
350    return
351}
352
353get_deb_sources(){
354    param=$1
355    echo $param
356    FILE=$(basename $(find $WORKDIR/source_deb -name "percona-server*.$param" | sort | tail -n1))
357    if [ -z $FILE ]
358    then
359        FILE=$(basename $(find $CURDIR/source_deb -name "percona-server*.$param" | sort | tail -n1))
360        if [ -z $FILE ]
361        then
362            echo "There is no sources for build"
363            exit 1
364        else
365            cp $CURDIR/source_deb/$FILE $WORKDIR/
366        fi
367    else
368        cp $WORKDIR/source_deb/$FILE $WORKDIR/
369    fi
370    return
371}
372
373build_srpm(){
374    if [ $SRPM = 0 ]
375    then
376        echo "SRC RPM will not be created"
377        return;
378    fi
379    if [ "x$OS" = "xdeb" ]
380    then
381        echo "It is not possible to build src rpm here"
382        exit 1
383    fi
384    cd $WORKDIR
385    get_tar "source_tarball"
386    rm -fr rpmbuild
387    ls | grep -v percona-server*.tar.* | xargs rm -rf
388    mkdir -vp rpmbuild/{SOURCES,SPECS,BUILD,SRPMS,RPMS}
389
390    TARFILE=$(basename $(find . -name 'percona-server-*.tar.gz' | sort | tail -n1))
391    NAME=$(echo ${TARFILE}| awk -F '-' '{print $1"-"$2}')
392    VERSION=$(echo ${TARFILE}| awk -F '-' '{print $3}')
393    #
394    SHORTVER=$(echo ${VERSION} | awk -F '.' '{print $1"."$2}')
395    TMPREL=$(echo ${TARFILE}| awk -F '-' '{print $4}')
396    RELEASE=${TMPREL%.tar.gz}
397    #
398    cd ${WORKDIR}/rpmbuild/SPECS
399    tar vxzf ${WORKDIR}/${TARFILE} --wildcards '*/build-ps/*.spec' --strip=2
400    #
401    cd ${WORKDIR}/rpmbuild/SOURCES
402    tar vxzf ${WORKDIR}/${TARFILE} --wildcards '*/build-ps/rpm/*.patch' --strip=3
403    #
404    cd ${WORKDIR}
405    #
406    mv -fv ${TARFILE} ${WORKDIR}/rpmbuild/SOURCES
407
408    rpmbuild -bs --define "_topdir ${WORKDIR}/rpmbuild" --with tokudb --define "dist .generic" --define "pkg_ver .${RPM_RELEASE}" rpmbuild/SPECS/percona-server.spec
409    #
410
411    mkdir -p ${WORKDIR}/srpm
412    mkdir -p ${CURDIR}/srpm
413    cp rpmbuild/SRPMS/*.src.rpm ${CURDIR}/srpm
414    cp rpmbuild/SRPMS/*.src.rpm ${WORKDIR}/srpm
415    return
416}
417
418build_rpm(){
419    if [ $RPM = 0 ]
420    then
421        echo "RPM will not be created"
422        return;
423    fi
424    if [ "x$OS" = "xdeb" ]
425    then
426        echo "It is not possible to build rpm here"
427        exit 1
428    fi
429    SRC_RPM=$(basename $(find $WORKDIR/srpm -name 'Percona-Server-*.src.rpm' | sort | tail -n1))
430    if [ -z $SRC_RPM ]
431    then
432        SRC_RPM=$(basename $(find $CURDIR/srpm -name 'Percona-Server-*.src.rpm' | sort | tail -n1))
433        if [ -z $SRC_RPM ]
434        then
435            echo "There is no src rpm for build"
436            echo "You can create it using key --build_src_rpm=1"
437            exit 1
438        else
439            cp $CURDIR/srpm/$SRC_RPM $WORKDIR
440        fi
441    else
442        cp $WORKDIR/srpm/$SRC_RPM $WORKDIR
443    fi
444    cd $WORKDIR
445    rm -fr rpmbuild
446    mkdir -vp rpmbuild/{SOURCES,SPECS,BUILD,SRPMS,RPMS}
447    cp $SRC_RPM rpmbuild/SRPMS/
448
449    RHEL=$(rpm --eval %rhel)
450    ARCH=$(echo $(uname -m) | sed -e 's:i686:i386:g')
451    #
452    echo "RHEL=${RHEL}" >> percona-server-5.6.properties
453    echo "ARCH=${ARCH}" >> percona-server-5.6.properties
454    #
455    if [ ${RHEL} = 6 ]; then
456        if [ ${ARCH} = x86_64 ]; then
457            source /opt/percona-devtoolset/enable
458            rpmbuild --define "_topdir ${WORKDIR}/rpmbuild" --with tokudb --define "dist .el${RHEL}" --define "pkg_ver .${RPM_RELEASE}" --rebuild rpmbuild/SRPMS/${SRC_RPM}
459	else
460            source /opt/rh/devtoolset-2/enable
461            rpmbuild --define "_topdir ${WORKDIR}/rpmbuild" --define "dist .el${RHEL}" --define "pkg_ver .${RPM_RELEASE}" --rebuild rpmbuild/SRPMS/${SRC_RPM}
462        fi
463    else
464        rpmbuild --define "_topdir ${WORKDIR}/rpmbuild" --with tokudb --define "dist .el${RHEL}" --define "pkg_ver .${RPM_RELEASE}" --rebuild rpmbuild/SRPMS/${SRC_RPM}
465    fi
466
467    return_code=$?
468    if [ $return_code != 0 ]; then
469        exit $return_code
470    fi
471    mkdir -p ${WORKDIR}/rpm
472    mkdir -p ${CURDIR}/rpm
473    cp rpmbuild/RPMS/*/*.rpm ${WORKDIR}/rpm
474    cp rpmbuild/RPMS/*/*.rpm ${CURDIR}/rpm
475
476}
477
478build_source_deb(){
479    if [ $SDEB = 0 ]
480    then
481        echo "source deb package will not be created"
482        return;
483    fi
484    if [ "x$OS" = "xrpm" ]
485    then
486        echo "It is not possible to build source deb here"
487        exit 1
488    fi
489    rm -rf percona-server*
490    get_tar "source_tarball"
491    rm -f *.dsc *.orig.tar.gz *.debian.tar.gz *.changes
492    #
493
494    TARFILE=$(basename $(find . -name 'percona-server-*.tar.gz' | grep -v tokudb | sort | tail -n1))
495    NAME=$(echo ${TARFILE}| awk -F '-' '{print $1"-"$2}')
496    VERSION=$(echo ${TARFILE}| awk -F '-' '{print $3}')
497    SHORTVER=$(echo ${VERSION} | awk -F '.' '{print $1"."$2}')
498    TMPREL=$(echo ${TARFILE}| awk -F '-' '{print $4}')
499    RELEASE=${TMPREL%.tar.gz}
500    #
501  #  rm -fr ${NAME}-${VERSION}-${RELEASE}
502    #
503    NEWTAR=${NAME}-${SHORTVER}_${VERSION}-${RELEASE}.orig.tar.gz
504    mv ${TARFILE} ${NEWTAR}
505    #
506    tar xzf ${NEWTAR}
507    cd ${NAME}-${VERSION}-${RELEASE}
508    cp -ap build-ps/debian/ .
509    dch -D unstable --force-distribution -v "${VERSION}-${RELEASE}-1" "Update to new upstream release Percona Server ${VERSION}-${RELEASE}-2"
510    dpkg-buildpackage -S
511    #
512    cd ${WORKDIR}
513  #  rm -fr ${NAME}-${VERSION}-${RELEASE}
514
515    mkdir -p $WORKDIR/source_deb
516    mkdir -p $CURDIR/source_deb
517    cp *.debian.tar.* $WORKDIR/source_deb
518    cp *_source.changes $WORKDIR/source_deb
519    cp *.dsc $WORKDIR/source_deb
520    cp *.orig.tar.gz $WORKDIR/source_deb
521    cp *.debian.tar.* $CURDIR/source_deb
522    cp *_source.changes $CURDIR/source_deb
523    cp *.dsc $CURDIR/source_deb
524    cp *.orig.tar.gz $CURDIR/source_deb
525}
526
527build_deb(){
528    if [ $DEB = 0 ]
529    then
530        echo "source deb package will not be created"
531        return;
532    fi
533    if [ "x$OS" = "xrpm" ]
534    then
535        echo "It is not possible to build source deb here"
536        exit 1
537    fi
538    for file in 'dsc' 'orig.tar.gz' 'changes' 'debian.tar*'
539    do
540        get_deb_sources $file
541    done
542    cd $WORKDIR
543    rm -fv *.deb
544    #
545    export DEBIAN_VERSION=$(lsb_release -sc)
546    export ARCH=$(echo $(uname -m) | sed -e 's:i686:i386:g')
547    #
548    rm -fv *.deb
549
550    export DEBIAN_VERSION="$(lsb_release -sc)"
551    DSC=$(basename $(find . -name '*.dsc' | sort | tail -n 1))
552    DIRNAME=$(echo ${DSC%-1.dsc} | sed -e 's:_:-:g')
553    VERSION=$(echo ${DSC} | sed -e 's:_:-:g' | awk -F'-' '{print $4}')
554    RELEASE=$(echo ${DSC} | sed -e 's:_:-:g' | awk -F'-' '{print $5}')
555    ARCH=$(uname -m)
556    export EXTRAVER=${MYSQL_VERSION_EXTRA#-}
557    #
558    echo "ARCH=${ARCH}" >> percona-server-5.6.properties
559    echo "DEBIAN_VERSION=${DEBIAN_VERSION}" >> percona-server-5.6.properties
560    echo VERSION=${VERSION} >> percona-server-5.6.properties
561    #
562
563    dpkg-source -x ${DSC}
564    #mv percona-server-source-5.6.tar.gz ${DIRNAME}/debian
565    cd ${DIRNAME}
566    #
567    dch -b -m -D "$DEBIAN_VERSION" --force-distribution -v "${VERSION}-${RELEASE}-1.${DEBIAN_VERSION}" 'Update distribution'
568    #
569    #
570    if [ ${ARCH} != "x86_64" ]; then
571        rm -f debian/rules
572        rm -f debian/control
573        mv debian/rules.notokudb debian/rules
574        mv debian/control.notokudb debian/control
575    else
576        if [ ${DEBIAN_VERSION} != trusty -a ${DEBIAN_VERSION} != xenial -a ${DEBIAN_VERSION} != stretch -a ${DEBIAN_VERSION} != jessie -a ${DEBIAN_VERSION} != vivid -a ${DEBIAN_VERSION} != yakkety -a ${DEBIAN_VERSION} != artful -a ${DEBIAN_VERSION} != bionic -a ${DEBIAN_VERSION} != cosmic -a ${DEBIAN_VERSION} != disco -a ${DEBIAN_VERSION} != buster ]; then
577            gcc47=$(which gcc-4.7 2>/dev/null || true)
578            if [ -x "${gcc47}" ]; then
579                export CC=gcc-4.7
580                export USE_THIS_GCC_VERSION="-4.7"
581                export CXX=g++-4.7
582            else
583                export CC=gcc-4.8
584                export USE_THIS_GCC_VERSION="-4.8"
585                export CXX=g++-4.8
586            fi
587        fi
588    fi
589    #
590
591    if [ ${DEBIAN_VERSION} = "artful" -o ${DEBIAN_VERSION} = "bionic" -o ${DEBIAN_VERSION} = "cosmic" -o ${DEBIAN_VERSION} = "disco" -o ${DEBIAN_VERSION} = "buster" ]; then
592        sed -i 's/export CFLAGS=/export CFLAGS=-Wimplicit-fallthrough=0 /' debian/rules
593        sed -i 's/export CXXFLAGS=/export CXXFLAGS=-Wimplicit-fallthrough=0 /' debian/rules
594    fi
595
596
597    dpkg-buildpackage -rfakeroot -uc -us -b
598    #
599    cd ${WORKDIR}
600    mkdir -p $CURDIR/deb
601    mkdir -p $WORKDIR/deb
602    cp $WORKDIR/*.deb $WORKDIR/deb
603    cp $WORKDIR/*.deb $CURDIR/deb
604}
605
606build_tarball(){
607    if [ $TARBALL = 0 ]
608    then
609        echo "Binary tarball will not be created"
610        return;
611    fi
612    get_tar "source_tarball"
613    cd $WORKDIR
614    TARFILE=$(basename $(find . -name 'percona-server-*.tar.gz' | sort | tail -n1))
615    if [ -f /etc/debian_version ]; then
616      export OS_RELEASE="$(lsb_release -sc)"
617    fi
618    #
619    if [ -f /etc/redhat-release ]; then
620      export OS_RELEASE="centos$(lsb_release -sr | awk -F'.' '{print $1}')"
621      RHEL=$(rpm --eval %rhel)
622    fi
623    #
624
625    ARCH=$(uname -m 2>/dev/null||true)
626    TARFILE=$(basename $(find . -name 'percona-server-*.tar.gz' | sort | grep -v "tools" | tail -n1))
627    NAME=$(echo ${TARFILE}| awk -F '-' '{print $1"-"$2}')
628    VERSION=$(echo ${TARFILE}| awk -F '-' '{print $3}')
629    #
630    SHORTVER=$(echo ${VERSION} | awk -F '.' '{print $1"."$2}')
631    TMPREL=$(echo ${TARFILE}| awk -F '-' '{print $4}')
632    RELEASE=${TMPREL%.tar.gz}
633    #
634    if [ -f /etc/redhat-release ]; then
635      if [ ${RHEL} = 6 ]; then
636        if [ ${ARCH} = x86_64 ]; then
637          source /opt/percona-devtoolset/enable
638        else
639          source /opt/rh/devtoolset-2/enable
640        fi
641      fi
642    fi
643    export CFLAGS=$(rpm --eval %{optflags} | sed -e "s|march=i386|march=i686|g")
644    export CXXFLAGS="${CFLAGS}"
645    if [ "${YASSL}" = 0 ]; then
646        if [ -f /etc/redhat-release ]; then
647            SSL_VER_TMP=$(yum list installed|grep -i openssl|head -n1|awk '{print $2}'|awk -F "-" '{print $1}'|sed 's/\.//g'|sed 's/[a-z]$//' | awk -F':' '{print $2}')
648            if [ -z "${SSL_VER_TMP}" ]; then
649                SSL_VER_TMP=$(yum list installed|grep -i openssl|head -n1|awk '{print $2}'|awk -F "-" '{print $1}'|sed 's/\.//g'|sed 's/[a-z]$//')
650            fi
651            if [[ ${SSL_VER_TMP} == 102 ]]; then
652                export SSL_VER=".ssl${SSL_VER_TMP}.rpm"
653            else
654                export SSL_VER=".ssl${SSL_VER_TMP}"
655            fi
656        else
657            SSL_VER_TMP=$(dpkg -l|grep -i libssl|grep -v "libssl\-"|head -n1|awk '{print $2}'|awk -F ":" '{print $1}'|sed 's/libssl/ssl/g'|sed 's/\.//g')
658            if [[ ${SSL_VER_TMP} == 'ssl102' ]]; then
659                export SSL_VER=".${SSL_VER_TMP}.deb"
660            else
661                export SSL_VER=".${SSL_VER_TMP}"
662            fi
663        fi
664    fi
665    #
666    rm -fr TARGET && mkdir TARGET
667    rm -rf jemalloc
668    git clone https://github.com/jemalloc/jemalloc
669    (
670    cd jemalloc
671    git checkout 3.6.0
672    bash autogen.sh
673    )
674    #
675    rm -fr ${TARFILE%.tar.gz}
676    tar xzf ${TARFILE}
677    cd ${TARFILE%.tar.gz}
678    if [ "${YASSL}" = 1 ]; then
679        DIRNAME="tarball_yassl"
680        bash -xe ./build-ps/build-binary.sh --with-jemalloc=../jemalloc/ --with-yassl ../TARGET
681    else
682        bash -xe ./build-ps/build-binary.sh --with-jemalloc=../jemalloc/ ../TARGET
683        DIRNAME="tarball"
684    fi
685    mkdir -p ${WORKDIR}/${DIRNAME}
686    mkdir -p ${CURDIR}/${DIRNAME}
687    cp ../TARGET/*.tar.gz ${WORKDIR}/${DIRNAME}
688    cp ../TARGET/*.tar.gz ${CURDIR}/${DIRNAME}
689}
690
691#main
692
693CURDIR=$(pwd)
694VERSION_FILE=$CURDIR/percona-server-5.6.properties
695args=
696WORKDIR=
697SRPM=0
698SDEB=0
699RPM=0
700DEB=0
701SOURCE=0
702TARBALL=0
703OS_NAME=
704ARCH=
705OS=
706TOKUBACKUP_REPO=
707PERCONAFT_REPO=
708INSTALL=0
709RPM_RELEASE=1
710DEB_RELEASE=1
711REVISION=0
712BRANCH="5.6"
713YASSL=0
714REPO="git://github.com/percona/percona-server.git"
715PRODUCT=Percona-Server-5.6
716MYSQL_VERSION_MAJOR=5
717MYSQL_VERSION_MINOR=6
718MYSQL_VERSION_PATCH=40
719MYSQL_VERSION_EXTRA=-84.0
720PRODUCT_FULL=Percona-Server-5.6.40-84.0
721PERCONAFT_BRANCH=Percona-Server-5.6.40-84.0
722TOKUBACKUP_BRANCH=Percona-Server-5.6.40-84.0
723parse_arguments PICK-ARGS-FROM-ARGV "$@"
724if [ ${YASSL} = 1 ]; then
725  TARBALL=1
726fi
727
728check_workdir
729get_system
730install_deps
731get_sources
732build_tarball
733build_srpm
734build_source_deb
735build_rpm
736build_deb
737
738