]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
install-deps.sh: point gcc to the one shipped by distro
authorKefu Chai <kchai@redhat.com>
Wed, 13 Dec 2017 05:36:54 +0000 (13:36 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 25 Dec 2017 17:11:40 +0000 (01:11 +0800)
to define a struct in a method is legal in C++11, but it causes internal
compiler error due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82155
if we are using GCC-7. so we need to either workaround in our source
code by moving the struct definition out of the member method or revert
to a GCC without this bug. but if we go with the first route, the jewel
build still fails, because GCC-7 starts to use the new CXX11 ABI, which
is not compatible with the libboost we use in jewel. the libboost was
still built with the old ABI for backward compatibility. so let's just
fix the install-deps.sh to point gcc to the origin one.

See: http://tracker.ceph.com/issues/22220
Signed-off-by: Kefu Chai <kchai@redhat.com>
Conflicts: the libboost issue does not affect master. as master builds
 boost from source. so, it's not cherry-picked from master.
(cherry picked from commit ccc4dea90e483ea8bf6bee0721ef929e7f48ff5a)

install-deps.sh

index bb10f9a753a1d979be2f9f6669081130fd9222ac..14d0470c13d18ec6bb22c88226bad2aea91213ec 100755 (executable)
@@ -24,6 +24,34 @@ function munge_ceph_spec_in {
     sed -e 's/@//g' -e 's/%bcond_with make_check/%bcond_without make_check/g' < ceph.spec.in > $OUTFILE
 }
 
+function ensure_decent_gcc_on_deb {
+    # point gcc to the one offered by distro if the used one is different
+    local old=$(readlink -e /usr/bin/x86_64-linux-gnu-gcc | cut -d'-' -f2)
+    local new=$1
+    if dpkg --compare-versions $old eq $new; then
+           return
+    fi
+
+    cat <<EOF
+/usr/bin/x86_64-linux-gnu-gcc now points to gcc-$old, which is not the version
+shipped with the distro: gcc-$new. Reverting...
+EOF
+
+    $SUDO update-alternatives \
+        --install /usr/bin/gcc gcc /usr/bin/gcc-${new} 20 \
+        --slave   /usr/bin/g++ g++ /usr/bin/g++-${new}
+
+    $SUDO update-alternatives \
+        --install /usr/bin/gcc gcc /usr/bin/gcc-${old} 10 \
+        --slave   /usr/bin/g++ g++ /usr/bin/g++-${old}
+
+    $SUDO update-alternatives --auto gcc
+
+    # cmake uses the latter by default
+    $SUDO ln -nsf /usr/bin/gcc /usr/bin/x86_64-linux-gnu-gcc
+    $SUDO ln -nsf /usr/bin/g++ /usr/bin/x86_64-linux-gnu-g++
+}
+
 if [ x`uname`x = xFreeBSDx ]; then
     $SUDO pkg install -yq \
         devel/babeltrace \
@@ -80,6 +108,14 @@ else
         echo "Using apt-get to install dependencies"
         $SUDO apt-get install -y lsb-release devscripts equivs
         $SUDO apt-get install -y dpkg-dev gcc
+        case "$VERSION" in
+            *Trusty*)
+                ensure_decent_gcc_on_deb 4.8
+                ;;
+            *Xenial*)
+                ensure_decent_gcc_on_deb 5
+                ;;
+        esac
         if ! test -r debian/control ; then
             echo debian/control is not a readable file
             exit 1