= Common Porting Problems = This page serves to collect information about common problems encountered when porting applications/libraries to the Haiku/BeOS platform. The problems should be identified by the (compiler) errors that typify them. Information about BeOS's POSIX compatibility, see [wiki:BeOSPosix]. === no undefined references allowed in i586-pc-beos shared libraries === ports: [wiki:dev-util/subversion], [wiki:dev-libs/apr] You need to pass the {{{-no-undefined}}} option to libtool Alternatively, libtool can be patched to always exhibit this behavior, at the risk of breaking static compilation when dynamic linking fails. -- andreasf === (stat) structure has no member named `st_blocks' (Now fixed in Haiku) === ports: [wiki:app-arch/tar] (make check), [wiki:net-fs/samba], [wiki:dev-util/cvs] The stat struct in sys/stat.h in BeOS ~~and Haiku~~ ([http://dev.haiku-os.org/ticket/2261 Haiku now has it] [http://dev.haiku-os.org/changeset/27791 as seen here]) doesn't have an st_blocks member. In projects with autoconf, you can check for HAVE_STAT_ST_BLOCKS. http://lists.samba.org/archive/samba-technical/2005-January/039275.html === -lm === ports: [wiki:dev-lang/lua], others The -lm refers to libm which isn't needed for Haiku or BeOS as the math library is part of libroot and linked by default Please DO NOT create a shortcut of libroot.so and rename to libm.so on gcc4 and gcc2 lib directory (Haiku hybrids case) or change the -lm references in the configure file to -lroot. If the port is using the autotools chances are this can be fixed by doing an AC_CHECK_LIB for cos in m and then setting a variable such as LIBM or MLIB to by ="-lm" if true or "" if not. Here is some explanation: http://www.freelists.org/archives/haiku-development/04-2008/msg00904.html === -lc === This sometimes turns up, and I think it is due to the port using an older libtool. Try running libtoolize --force --copy --install, aclocal, autoconf and automake before ./configure to see if that clears it up. === conflicting types for `restrict' (Now fixed in Haiku) === /boot/develop/headers/posix/search.h:35: conflicting types for `restrict' /boot/develop/headers/posix/search.h:35: previous declaration of `restrict' This seems to be an issue with Haiku and has been reported [http://dev.haiku-os.org/ticket/2262 Haiku-2262] This has been fixed in Haiku. If using a version prior to the fix you can copy the search.h file over the one in your headers/posix folder. === GCC 2.9 related build problems === output_operand_lossage `invalid expression as operand' This can be avoided by not passing the '-g' option to gcc for this test. === GCC 4.3 related build problems === Typical errors look like these: error: 'find' is not a member of 'std' error: 'exit' was not declared in this scope Please take a look at: http://www.cyrius.com/journal/2007/05/10#gcc-4.3-include or http://www.comp.leeds.ac.uk/hannah/cpp/errors.html === MSG_NOSIGNAL undeclared === Add below to header/source file. {{{ #ifndef MSG_NOSIGNAL #define MSG_NOSIGNAL 0 #endif }}} === FNDELAY undeclared === Add below to header/source file. {{{ #ifndef FNDELAY #define FNDELAY O_NONBLOCK #endif }}} === O_NOATIME undeclared === Add below to header/source file. {{{ #include #ifndef _GNU_SOURCE #define _GNU_SOURCE // for O_NOATIME #define O_NOATIME 01000000 #endif }}} === stdbool.in.h (Now fixed in Haiku) === This has been fixed: http://ports.haiku-files.org/wiki/dev-libs/gnulib So any releases posted AFTER May 25, 2008 'should' include an updated stdbool.in.h === iconv (Now fixed in Haiku)) === Iconv is included in Haiku, but many times ./configure does not detect and use it. This is because it is in libtextencoding.so ([http://dev.haiku-os.org/ticket/2294 should be fixed now]). So try adding a check for iconv in libtextextencoding and see if that works. === Cannot find socket libraries === The socket functionalities are provided in Haiku's libnetwork. The proper fix for this is to patch Configure to check that library as well. This is an example patch of libevent. {{{ diff -Naur libevent-1.4.13-stable/configure.in libevent-1.4.13-stable-haiku/configure.in --- libevent-1.4.13-stable/configure.in 2009-05-24 13:37:49.000000000 +0000 +++ libevent-1.4.13-stable-haiku/configure.in 2009-05-28 16:55:17.000000000 +0000 @@ -33,7 +33,7 @@ AC_SUBST(LIBTOOL_DEPS) dnl Checks for libraries. -AC_CHECK_LIB(socket, socket) +AC_SEARCH_LIBS(socket, socket network) AC_CHECK_LIB(resolv, inet_aton) AC_CHECK_LIB(rt, clock_gettime) AC_CHECK_LIB(nsl, inet_ntoa) }}} === DT_DIR undeclared === The use of DT_DIR doesn't work on non-ext* filesystems So replace for {{{ #ifndef DT_DIR /* dirent.d_type is a BSD extension, not part of POSIX */ #include #include static int is_dir (const char *path, const char *name) { int len1 = strlen(path); int len2 = strlen(name); char pathname[len1 + 1 + len2 + 1 + 13]; strcpy (pathname, path); /* Avoid UNC-path "//name" on Cygwin. */ if (len1 > 0 && pathname[len1 - 1] != '/') strcat (pathname, "/"); strcat (pathname, name); struct stat st; if (stat (pathname, &st)) return 0; return S_ISDIR (st.st_mode); } #endif }}} And after a check function {{{ info.dir = !! is_dir (path, de->d_name); }}}