emscripten icon indicating copy to clipboard operation
emscripten copied to clipboard

Emscripten arm64 > 3.1.26 cannot build certain libboost libraries

Open NorrinRadd opened this issue 10 months ago • 5 comments

Version of emscripten/emsdk: Failing: 3.1.27 through 3.1.57 Passing: 3.1.10 through 3.1.26

Failing command line in full: My goal is to build boost single threaded, so as not to require content isolation (COOP and COEP) when running within a browser. Tested with libboost src from 1.79 through 1.85. Within boost rootdir:

./bootstrap.sh \
  --with-libraries=system,thread,chrono,serialization,regex```

cat "import os ; \
local EMSCRIPTEN = [ os.environ EMSCRIPTEN ] ; \
 \
using clang : emscripten \
: \
	emcc -v -s USE_ZLIB=1 -s USE_PTHREADS=0 \
: \
	<root>$(EMSCRIPTEN) \
	<archiver>$(EMSCRIPTEN)/emar \
	<ranlib>$(EMSCRIPTEN)/emranlib \
	<linker>$(EMSCRIPTEN)/emlink \
	<cxxflags>-std=c++11 \
; \
 \
 \
import type : change-generated-target-suffix ; \
type.change-generated-target-suffix EXE : <toolset-clang:version>emscripten : js ;" >>  project-config.jam

rm -rf ./output
mkdir -p ./output

./b2 -q -a -j 10    \
  toolset=clang-emscripten    \
  threading=single            \
  link=static                 \
  optimization=space          \
  variant=release             \
  cxxflags=-no-pthread        \
  stage                       \
  --stagedir=./output
  
unset NO_BZIP2

Output

 /Users/user/code/emsdk/upstream/bin/clang -target wasm32-unknown-emscripten -fignore-exceptions -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --sysroot=/Users/user/code/emsdk/upstream/emscripten/cache/sysroot -DEMSCRIPTEN -Xclang -iwithsysroot/include/fakesdl -Xclang -iwithsysroot/include/compat -v -x c++ -fvisibility-inlines-hidden -std=c++11 -Os -Wall -fvisibility=hidden -Wno-inline -Wextra -Wno-long-long -Wno-unused-parameter -Wno-variadic-macros -Wunused-function -no-pthread -DBOOST_ALL_NO_LIB=1 -DBOOST_THREAD_BUILD_LIB=1 -DBOOST_THREAD_DONT_USE_CHRONO -DBOOST_THREAD_POSIX -DNDEBUG -I. -c libs/thread/src/pthread/once.cpp -o bin.v2/libs/thread/build/clang-darwin-emscripten/release/link-static/optimization-space/threadapi-pthread/threading-multi/visibility-hidden/pthread/once.o
clang version 19.0.0git (https:/github.com/llvm/llvm-project ccdebbae4d77d3efc236af92c22941de5d437e01)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Users/user/code/emsdk/upstream/bin
 (in-process)
 "/Users/user/code/emsdk/upstream/bin/clang-19" -cc1 -triple wasm32-unknown-emscripten -emit-obj -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name once.cpp -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/Users/user/code/monero-ts/external/monero-cpp/external/boost-sdk -v -fcoverage-compilation-dir=/Users/user/code/monero-ts/external/monero-cpp/external/boost-sdk -resource-dir /Users/user/code/emsdk/upstream/lib/clang/19 -D EMSCRIPTEN -D BOOST_ALL_NO_LIB=1 -D BOOST_THREAD_BUILD_LIB=1 -D BOOST_THREAD_DONT_USE_CHRONO -D BOOST_THREAD_POSIX -D NDEBUG -I . -isysroot /Users/user/code/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1 -internal-isystem /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1 -internal-isystem /Users/user/code/emsdk/upstream/lib/clang/19/include -internal-isystem /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include -Os -Wall -Wno-inline -Wextra -Wno-long-long -Wno-unused-parameter -Wno-variadic-macros -Wunused-function -std=c++11 -fdeprecated-macro -ferror-limit 19 -fvisibility=hidden -fvisibility-inlines-hidden -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fignore-exceptions -fexceptions -vectorize-loops -vectorize-slp -iwithsysroot/include/fakesdl -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o bin.v2/libs/thread/build/clang-darwin-emscripten/release/link-static/optimization-space/threadapi-pthread/threading-multi/visibility-hidden/pthread/once.o -x c++ libs/thread/src/pthread/once.cpp
clang -cc1 version 19.0.0git based upon LLVM 19.0.0git default target x86_64-apple-darwin22.4.0
ignoring nonexistent directory "/Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
 .
 /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl
 /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/compat
 /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
 /Users/user/code/emsdk/upstream/lib/clang/19/include
 /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
In file included from libs/thread/src/pthread/once.cpp:6:
In file included from ./boost/thread/detail/config.hpp:13:
In file included from ./boost/thread/detail/platform.hpp:17:
./boost/config/requires_threads.hpp:47:5: error: "Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)"
   47 | #   error "Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)"
      |     ^
1 error generated.

    "emcc" "-v" "-s" "USE_ZLIB=1" "-s" "USE_PTHREADS=0" -x c++ -fvisibility-inlines-hidden -std=c++11 -Os -Wall -fvisibility=hidden -Wno-inline -Wextra -Wno-long-long -Wno-unused-parameter -Wno-variadic-macros -Wunused-function -no-pthread -DBOOST_ALL_NO_LIB=1 -DBOOST_THREAD_BUILD_LIB=1 -DBOOST_THREAD_DONT_USE_CHRONO -DBOOST_THREAD_POSIX -DNDEBUG -I"."  -c -o "bin.v2/libs/thread/build/clang-darwin-emscripten/release/link-static/optimization-space/threadapi-pthread/threading-multi/visibility-hidden/pthread/once.o" "libs/thread/src/pthread/once.cpp"

NorrinRadd avatar Apr 21 '24 06:04 NorrinRadd

It looks like the ./boost/config/requires_threads.hpp header in boost requires threading support. In fact that whole point of that header seems to be to error out when threads are not supported, so it seems to be doing the correct thing here.

I does looks you probably want to be defining BOOST_DISABLE_THREADS in order to make a build without threading support. However, even with this defined that header will still produce an error. See https://github.com/dials/boost/blob/1c586c3c45f994f92c7270c01f64278a7bdf457d/boost/config/requires_threads.hpp#L29

So I guess that platform.hpp should not be including requires_threads.hpp when threads are disabled. Perhaps enabling BOOST_DISABLE_THREADS will fix that?

sbc100 avatar Apr 21 '24 15:04 sbc100

@sbc100 our confusion is that emscripten 3.1.10 through 3.1.26 build them fine. That was a defect in emscripten?

So essentially boost cannot be used within a browser unless cors is restricted to origin?

NorrinRadd avatar Apr 21 '24 20:04 NorrinRadd

the symbol didnt work

ignoring nonexistent directory "/Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/ wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/ wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
 .
 /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl
 /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/compat
 /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
 /Users/user/code/emsdk/upstream/lib/clang/19/include
 /Users/user/code/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
In file included from libs/thread/src/pthread/thread.cpp:9:
In file included from ./boost/thread/detail/config.hpp:13:
In file included from ./boost/thread/detail/platform.hpp:17:
./boost/config/requires_threads.hpp:29:4: error: "Threading support unavaliable: it has been      explicitly disabled with BOOST_DISABLE_THREADS"
   29 | #  error "Threading support unavaliable: it has been explicitly disabled with             BOOST_DISABLE_THREADS"
      |    ^   
1 error generated.

NorrinRadd avatar Apr 22 '24 00:04 NorrinRadd

Regarding that compile issue it looks like platform.hpp would need to be configured somehow to not include requires_threads.hpp. I assume that is possible, otherwise BOOST_DISABLE_THREADS wouldn't be a thing?

Regarding how you were able to compile with 3.1.10 through 3.1.26 that would require some more investigation. Emscripten has never supported threads without the COOP/COEP stuff enabled. My only guess is that perhaps with 3.1.10 through 3.1.26 boost was detecting that threads were not supported at build time and therefore not including requires_threads.hpp

sbc100 avatar Apr 23 '24 22:04 sbc100

./bootstrap.sh \
  --with-libraries=system,thread,chrono,serialization,regex```

You are asking to build Boost.Thread but you are disabling threads support with threading=single cxxflags=-no-pthread. It makes no sense, the error message is legit.

Kojoley avatar Apr 23 '24 23:04 Kojoley