Using Boost with Emscripten

I finally managed to compile the needed libraries with emscripten. Here are the steps I followed.

Changes in emscripten

Edit system/include/libcxx/climits to add the following definitions (see http://github.com/kripken/emscripten/issues/531):

#ifndef CHAR_BIT
# define CHAR_BIT __CHAR_BIT__
#endif

#ifndef CHAR_MIN
# define CHAR_MIN (-128)
#endif

#ifndef CHAR_MAX
# define CHAR_MAX 127
#endif

#ifndef SCHAR_MIN
# define SCHAR_MIN (-128)
#endif

#ifndef SCHAR_MAX
# define SCHAR_MAX 127
#endif

#ifndef UCHAR_MAX

# define UCHAR_MAX 255
#endif

#ifndef SHRT_MIN
# define SHRT_MIN (-32767-1)
#endif

#ifndef SHRT_MAX
# define SHRT_MAX 32767
#endif

#ifndef USHRT_MAX
# define USHRT_MAX 65535
#endif

#ifndef INT_MAX
# define INT_MAX __INT_MAX__
#endif

#ifndef INT_MIN
# define INT_MIN (-INT_MAX-1)
# define INT_MIN (-INT_MAX-1)
#endif

#ifndef UINT_MAX
# define UINT_MAX (INT_MAX * 2U + 1)
#endif

#ifndef LONG_MAX
# define LONG_MAX __LONG_MAX__
#endif

#ifndef LONG_MIN
# define LONG_MIN (-LONG_MAX-1)
#endif

#ifndef ULONG_MAX
# define ULONG_MAX (LONG_MAX * 2UL + 1)
#endif

Add the following line in system/include/libcxx/cwchar

#include <cstdio>

Compiling Boost as shared libraries

As suggested by npclaudiu, bootstrap the library using the gcc toolkit. Then edit project-config.jam to configure the compiler and replace:

# Compiler configuration. This definition will be used unless
# you already have defined some toolsets in your user-config.jam
# file.
if ! gcc in [ feature.values <toolset> ]
{
    using gcc ;
}

with

# Compiler configuration. This definition will be used unless
# you already have defined some toolsets in your user-config.jam
# file.
if ! gcc in [ feature.values <toolset> ]
{
    using gcc : : "/full/path/to/emscripten/em++" ;
}

Force BOOST_HAS_SCHER_YIELD in boost/config/posix_features.hpp, around the line 67.

Then compile the libraries: ./b2 thread regex filesystem signals system

Compiling Boost as static libraries

Do all the above steps, then edit tools/build/v2/tools/gcc.jam and replace:

toolset.flags gcc.archive .AR $(condition) : $(archiver[1]) ;

with

toolset.flags gcc.archive .AR $(condition) : "/full/path/to/emscripten/emar" ;

and

toolset.flags gcc.archive .RANLIB $(condition) : $(ranlib[1]) ;

with

toolset.flags gcc.archive .RANLIB $(condition) :
  "/full/path/to/emscripten/emranlib" ;

Compile the libraries: ./b2 link=static variant=release threading=single runtime-link=static thread signals system filesystem regex

Leave a Comment

tech