diff --git a/.travis.yml b/.travis.yml index dd89b3aec..949920138 100644 --- a/.travis.yml +++ b/.travis.yml @@ -106,15 +106,13 @@ script: # (and might work) for the next build - DURATION=2400 - scripts/travis-command-wrapper.py -s "date" -i 120 --deadline=$(( $(date +%s) + ${DURATION} )) make - # dump glibcxx symbols >= 3.4.20 (if this returns output - # then it means the binaries will not run on ubuntu trusty without upgrading libstdc++) - - nm src/libmapnik* | grep "GLIBCXX_3.4.2[0-9]" || true - RESULT=0 - make test || RESULT=$? # we allow visual failures with g++ for now: https://github.com/mapnik/mapnik/issues/3567 - if [[ ${RESULT} != 0 ]] && [[ ${CXX} =~ 'clang++' ]]; then false; fi; - enabled ${COVERAGE} coverage - enabled ${BENCH} make bench + - ./scripts/check_glibcxx.sh after_success: - enabled ${TRIGGER} trigger_downstream diff --git a/scons/scons-time.py b/scons/scons-time.py index 3fdb8f2eb..79f5bc109 100755 --- a/scons/scons-time.py +++ b/scons/scons-time.py @@ -264,7 +264,7 @@ def tee_to_file(command, log): return '%s 2>&1 | tee %s' % (command, log) - + class SConsTimer(object): """ Usage: scons-time SUBCOMMAND [ARGUMENTS] @@ -360,7 +360,7 @@ class SConsTimer(object): 'SCons' : 'Total SCons execution time', 'commands' : 'Total command execution time', } - + time_string_all = 'Total .* time' # diff --git a/scons/sconsign.py b/scons/sconsign.py index 7391807c4..be7844faa 100755 --- a/scons/sconsign.py +++ b/scons/sconsign.py @@ -23,6 +23,7 @@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + from __future__ import print_function __revision__ = "src/script/sconsign.py 74b2c53bc42290e911b334a6b44f187da698a668 2017/11/14 13:16:53 bdbaddog" diff --git a/scripts/check_glibcxx.sh b/scripts/check_glibcxx.sh new file mode 100755 index 000000000..ae298939e --- /dev/null +++ b/scripts/check_glibcxx.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -eu +set -o pipefail +shopt -s nullglob + +: ' + +Ensure no GLIBCXX_3.4.2x symbols are present in the binary +if ENABLE_GLIBC_WORKAROUND is set. + +If symbols >= 3.4.20 then it means the binaries would not run on ubuntu trusty without upgrading libstdc++ + +' + +FINAL_RETURN_CODE=0 + +function check() { + local RESULT=0 + nm ${1} | grep "GLIBCXX_3.4.2[0-9]" > /tmp/out.txt || RESULT=$? + if [[ ${RESULT} != 0 ]]; then + echo "Success: GLIBCXX_3.4.2[0-9] symbols not present in binary (as expected)" + else + echo "$(cat /tmp/out.txt | c++filt)" + if [[ ${ENABLE_GLIBC_WORKAROUND:-false} == true ]]; then + FINAL_RETURN_CODE=1 + fi + fi +} + +for i in src/libmapnik*; do + echo "checking $i" + check $i +done + +exit ${FINAL_RETURN_CODE} diff --git a/src/build.py b/src/build.py index 528db58e9..62cbc7012 100644 --- a/src/build.py +++ b/src/build.py @@ -312,6 +312,13 @@ cairo/process_markers_symbolizer.cpp cairo/process_group_symbolizer.cpp """) +if env['ENABLE_GLIBC_WORKAROUND']: + source += Split( + """ + glibc_workaround.cpp + """ + ) + if env['HAS_CAIRO']: lib_env.AppendUnique(LIBPATH=env['CAIRO_LIBPATHS']) lib_env.Append(CPPDEFINES = '-DHAVE_CAIRO') diff --git a/src/glibc_workaround.cpp b/src/glibc_workaround.cpp index c07a22d9a..27c97f4dd 100644 --- a/src/glibc_workaround.cpp +++ b/src/glibc_workaround.cpp @@ -1,3 +1,25 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2017 Artem Pavlenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + *****************************************************************************/ + #ifdef __linux__ #ifdef MAPNIK_ENABLE_GLIBC_WORKAROUND