Source: osgearth Version: 2.4.0+dfsg-5 Tags: patch User: debian-...@lists.debian.org Usertags: kfreebsd X-Debbugs-Cc: debian-...@lists.debian.org Severity: serious Justification: fails to build from source (but built successfully in the past)
Hi, osgearth fails to build on kfreebsd-* because it tries to directly use a Linux-specific syscall: https://buildd.debian.org/status/package.php?p=osgearth&suite=sid > cd /«BUILDDIR»/osgearth-2.4.0+dfsg/build/src/osgEarth && /usr/bin/c++ > -DOSGEARTH_LIBRARY -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DTIXML_USE_STL > -DosgEarth_EXPORTS -g -O2 -fstack-protector --param=ssp-buffer-size=4 > -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -O3 -DNDEBUG -fPIC > -isystem /usr/include/qt4 -isystem /usr/include/qt4/QtGui -isystem > /usr/include/qt4/QtCore -I/«BUILDDIR»/osgearth-2.4.0+dfsg/src > -I/usr/include/gdal -I/usr/include/curl -o > CMakeFiles/osgEarth.dir/ThreadingUtils.cpp.o -c > /«BUILDDIR»/osgearth-2.4.0+dfsg/src/osgEarth/ThreadingUtils.cpp > /«BUILDDIR»/osgearth-2.4.0+dfsg/src/osgEarth/ThreadingUtils.cpp: In function > 'unsigned int osgEarth::Threading::getCurrentThreadId()': > /«BUILDDIR»/osgearth-2.4.0+dfsg/src/osgEarth/ThreadingUtils.cpp:42:30: error: > 'SYS_gettid' was not declared in this scope > return (unsigned)::syscall(SYS_gettid); > ^ osgearth also knows how to use Windows and Mac OS X--specific syscalls to get a thread ID. This is not portable and there is nothing directly equivalent on FreeBSD, see: http://lists.freebsd.org/pipermail/freebsd-hackers/2010-June/031992.html A workaround may be to use pthread_self(), except that the exported getCurrentThreadId function has to return 'unsigned int'. On kfreebsd-amd64 a 64-bit pointer to a pthread_t is not absolutely guaranteed to be unique if truncated to 32 bits, but it is extremely likely, and certainly better than nothing... Please refer to attached patch which fixes package build at least. Thanks! -- System Information: Debian Release: jessie/sid APT prefers unstable APT policy: (500, 'unstable'), (1, 'experimental') Architecture: kfreebsd-amd64 (x86_64) Kernel: kFreeBSD 9.0-2-amd64-xenhvm Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash
Index: osgearth-2.4.0+dfsg/src/osgEarth/ThreadingUtils.cpp =================================================================== --- osgearth-2.4.0+dfsg.orig/src/osgEarth/ThreadingUtils.cpp 2013-04-11 19:07:39.000000000 +0100 +++ osgearth-2.4.0+dfsg/src/osgEarth/ThreadingUtils.cpp 2013-10-04 22:04:38.898332000 +0100 @@ -20,9 +20,11 @@ #ifdef _WIN32 extern "C" unsigned long __stdcall GetCurrentThreadId(); -#else +#elif defined(__APPLE__) || defined(__LINUX__) # include <unistd.h> # include <sys/syscall.h> +#else +# include <pthread.h> #endif using namespace osgEarth::Threading; @@ -38,7 +40,10 @@ return (unsigned)::GetCurrentThreadId(); #elif __APPLE__ return ::syscall(SYS_thread_selfid); -#else +#elif __LINUX__ return (unsigned)::syscall(SYS_gettid); +#else + /* :XXX: this truncates to 32 bits, but better than nothing */ + return (unsigned)pthread_self(); #endif }