0

I'm trying to port some existing code that uses boost into native-client.

I compiled boost according to the instructions here: https://code.google.com/p/naclports/wiki/InstallingSDL (with boost instead of sdl), and tried injecting some boost code into one of the examples.

I was successfully able to use a boost::shared_ptr by editing examples/api/socket/socket.cc by including the header and adding a simple test method:

#include <boost/shared_ptr.hpp>

The test method:

void ExampleInstance::test_shared_ptr() {
  boost::shared_ptr<std::string> test_ptr(new std::string("hi"));
  PostMessage(test_ptr->c_str());
}

Invoking this method from the constructor results in a "hi" appearing on the console when loading the page you can reach by running "make serve".

Although I'm deeply impressed that this much works, my app uses boost::thread and boost::asio, and there I ran into trouble. In pepper_34, if I add:

#include <boost/threads.hpp>

I get these compilation errors, just by including that file:

~/nacl_sdk/pepper_34/examples/api/socket$ make
CHROME_PATH is undefined, and google-chrome not found in PATH, nor /usr/bin/google-chrome.
  CXX  newlib/Release/socket_x86_32.o
In file included from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/thread/thread_only.hpp:17,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/thread/thread.hpp:12,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/thread.hpp:13,
                 from socket.cc:25:
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/thread/pthread/thread_data.hpp: In member function 'size_t boost::thread_attributes::get_stack_size() const':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/thread/pthread/thread_data.hpp:63: error: invalid conversion from 'const pthread_attr_t*' to 'pthread_attr_t*'
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/thread/pthread/thread_data.hpp:63: error:   initializing argument 1 of 'int pthread_attr_getstacksize(pthread_attr_t*, size_t*)'
make: *** [newlib/Release/socket_x86_32.o] Error 1

Likewise, if I try to include any of the basic asio elements, for instance:

#include <boost/asio/io_service.hpp>

I get these compilation errors after adding that #include line:

~/nacl_sdk/pepper_34/examples/api/socket$ make
CHROME_PATH is undefined, and google-chrome not found in PATH, nor /usr/bin/google-chrome.
  CXX  newlib/Release/socket_x86_32.o
In file included from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/posix_fd_set_adapter.hpp:26,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/fd_set_adapter.hpp:22,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/select_reactor.hpp:27,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/reactor.hpp:29,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/task_io_service.ipp:24,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/task_io_service.hpp:203,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/impl/io_service.hpp:71,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/io_service.hpp:767,
                 from socket.cc:25:
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/socket_types.hpp:283: error: 'IF_NAMESIZE' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/socket_types.hpp:304: error: 'sockaddr_un' does not name a type
In file included from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/socket_ops.hpp:326,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/select_reactor.ipp:30,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/select_reactor.hpp:212,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/reactor.hpp:29,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/task_io_service.ipp:24,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/task_io_service.hpp:203,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/impl/io_service.hpp:71,
                 from /home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/io_service.hpp:767,
                 from socket.cc:25:
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'int boost::asio::detail::socket_ops::close(boost::asio::detail::socket_type, boost::asio::detail::socket_ops::state_type&, bool, boost::system::error_code&)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:342: error: 'FIONBIO' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'bool boost::asio::detail::socket_ops::set_user_non_blocking(boost::asio::detail::socket_type, boost::asio::detail::socket_ops::state_type&, bool, boost::system::error_code&)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:384: error: 'FIONBIO' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'bool boost::asio::detail::socket_ops::set_internal_non_blocking(boost::asio::detail::socket_type, boost::asio::detail::socket_ops::state_type&, bool, boost::system::error_code&)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:437: error: 'FIONBIO' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'bool boost::asio::detail::socket_ops::sockatmark(boost::asio::detail::socket_type, boost::system::error_code&)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:617: error: '::sockatmark' has not been declared
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'size_t boost::asio::detail::socket_ops::available(boost::asio::detail::socket_type, boost::system::error_code&)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:637: error: 'FIONREAD' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'void boost::asio::detail::socket_ops::init_buf(boost::asio::detail::socket_ops::buf&, void*, size_t)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:687: error: invalid use of incomplete type 'struct iovec'
/home/jholland/nacl_sdk/pepper_34/include/newlib/sys/socket.h:304: error: forward declaration of 'struct iovec'
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:688: error: invalid use of incomplete type 'struct iovec'
/home/jholland/nacl_sdk/pepper_34/include/newlib/sys/socket.h:304: error: forward declaration of 'struct iovec'
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'void boost::asio::detail::socket_ops::init_buf(boost::asio::detail::socket_ops::buf&, const void*, size_t)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:698: error: invalid use of incomplete type 'struct iovec'
/home/jholland/nacl_sdk/pepper_34/include/newlib/sys/socket.h:304: error: forward declaration of 'struct iovec'
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:699: error: invalid use of incomplete type 'struct iovec'
/home/jholland/nacl_sdk/pepper_34/include/newlib/sys/socket.h:304: error: forward declaration of 'struct iovec'
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'int boost::asio::detail::socket_ops::ioctl(boost::asio::detail::socket_type, boost::asio::detail::socket_ops::state_type&, int, boost::asio::detail::ioctl_arg_type*, boost::system::error_code&)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:1689: error: 'FIONBIO' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'const char* boost::asio::detail::socket_ops::inet_ntop(int, const void*, char*, size_t, long unsigned int, boost::system::error_code&)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:1974: error: 'IF_NAMESIZE' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:1979: error: 'if_name' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:1979: error: 'if_indextoname' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:1981: error: 'if_name' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'int boost::asio::detail::socket_ops::inet_pton(int, const char*, void*, long unsigned int*, boost::system::error_code&)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:2209: error: 'if_nametoindex' was not declared in this scope
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp: In function 'int boost::asio::detail::socket_ops::gethostname(char*, int, boost::system::error_code&)':
/home/jholland/nacl_sdk/pepper_34/toolchain/linux_x86_newlib/i686-nacl/usr/include/boost/asio/detail/impl/socket_ops.ipp:2251: error: '::gethostname' has not been declared
make: *** [newlib/Release/socket_x86_32.o] Error 1

(Side Note: I don't think the CHROME_PATH warning at the top is causing these errors, since I get the same warning for the examples even without my edits, but the examples still work. I imagine it's because I'm building on a vm without chrome installed (or a window manager in which to run it), since I had to use linux to build boost according to the error message the boost build process gave when I tried building it on OSX. The error messages suggest this interferes with "make run_package", but otherwise the examples run properly under "make serve", and can be tested from a different machine, using chrome to access the pages. I'm writing this question while waiting for chromium-browser to install, in hopes I can confirm that theory.)

In case it matters, I'm running Ubuntu 12.04.

My questions:

  1. Is there a previous pepper version in which somebody has successfully used boost::asio and/or boost::threads?
  2. Has anyone encountered this problem and discovered a workaround?

1 Answers1

0

Try building the glibc build of boost instead of newlib. You can do this by running:

TOOLCHAIN=glibc make boost

from the naclports directory.

It seems that the newlib build of boost doesn't support many boost libraries:

Component configuration:

- atomic                   : not building
- chrono                   : not building
- context                  : not building
- coroutine                : not building
- date_time                : building
- exception                : not building
- filesystem               : not building
- graph                    : not building
- graph_parallel           : not building
- iostreams                : not building
- locale                   : not building
- log                      : not building
- math                     : not building
- mpi                      : not building
- program_options          : building
- python                   : not building
- random                   : not building
- regex                    : not building
- serialization            : not building
- signals                  : not building
- system                   : not building
- test                     : not building
- thread                   : not building
- timer                    : not building
- wave                     : not building

The glibc build seems to support many more libraries:

Component configuration:

- atomic                   : building
- chrono                   : building
- context                  : not building
- coroutine                : not building
- date_time                : building
- exception                : building
- filesystem               : building
- graph                    : building
- graph_parallel           : building
- iostreams                : building
- locale                   : building
- log                      : building
- math                     : building
- mpi                      : not building
- program_options          : building
- python                   : not building
- random                   : building
- regex                    : building
- serialization            : building
- signals                  : not building
- system                   : building
- test                     : building
- thread                   : building
- timer                    : building
- wave                     : building
binji
  • 1,860
  • 9
  • 9