]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
install-deps.sh: point gcc to the one shipped by distro 19461/head
authorKefu Chai <kchai@redhat.com>
Wed, 13 Dec 2017 05:36:54 +0000 (13:36 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 14 Dec 2017 11:35:41 +0000 (19:35 +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.

install-deps.sh

index 94def86e6dd5b942ca778d162825847cd7003bbc..0b36c6bd13e5942b17bf1cc56cba486c4a7dab01 100755 (executable)
@@ -19,12 +19,52 @@ if test $(id -u) != 0 ; then
 fi
 export LC_ALL=C # the following is vulnerable to i18n
 
+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
+
+    case $- in
+    *i*)
+        # interactive shell
+        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
+    esac
+
+    $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++
+}
+
 source /etc/os-release
 case $ID in
     debian|ubuntu|devuan)
         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