Search code examples
llvm-clangemscriptenwebassemblystdatomiclibpd

Can't compile libpd with emmake (Emscripten SDK)


I'm trying to compile libpd to javascript or webassembly using emscripten sdk. According to some docs, if there is a Makefile, it can be compiled by using emmake make, (emconfigure is not used because there is no ./configure file), but I get the following error:

/home/ian/Documents/emsdk/emscripten/1.37.37/emcc.py -DPD -DHAVE_UNISTD_H -DUSEAPI_DUMMY -I./pure-data/src -I./libpd_wrapper -I./libpd_wrapper/util -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast -fPIC -I"/usr/lib/jvm/default-java/include/linux" -DHAVE_LIBDL -ffast-math -funroll-loops -fomit-frame-pointer -O3 -DLIBPD_EXTRA      -c -o pure-data/src/d_array.o pure-data/src/d_array.c
pure-data/src/d_array.c:523:2: error: No byte order defined
#error No byte order defined
 ^
1 error generated.
ERROR:root:compiler frontend failed to generate LLVM bitcode, halting
<integrado>: fallo en las instrucciones para el objetivo 'pure-data/src/d_array.o'
make: *** [pure-data/src/d_array.o] Error 1

Any ideas? Do you think is possible to compile this library?

UPDATE: After tweaking every complaining file as suggested in @zakki 's answer I get another error:

libpd_wrapper/util/ringbuffer.c:18:12: fatal error: 'stdatomic.h' file not found
  #include <stdatomic.h>

That file have this content:

#if __STDC_VERSION__ >= 201112L // use stdatomic if C11 is available
  #include <stdatomic.h> // HERE IS WHERE ERROR GOES
  #define SYNC_FETCH(ptr) atomic_fetch_or((_Atomic int *)ptr, 0)
  #define SYNC_COMPARE_AND_SWAP(ptr, oldval, newval) \
          atomic_compare_exchange_strong((_Atomic int *)ptr, &oldval, newval)
//Some other definitions that I didn't put here

I read some threads some time ago about this problem with C++11, how can i fix this?

UPDATE 2: After adding && !defined(__EMSCRIPTEN__) now is able to compile, but I'm getting this warning that I don't understand:

WARNING:root:Dynamic libraries (.so, .dylib, .dll) are currently not supported by Emscripten. For build system emulation purposes, Emscripten will now generate a static library file (.bc) with the suffix '.so'. For best practices, please adapt your build system to directly generate a static LLVM bitcode library by setting the output suffix to '.bc.')


Solution

  • Emscripten has endian.h. So add defined(__EMSCRIPTEN__) to ifdef.

    #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || \
        defined(ANDROID) || defined(__EMSCRIPTEN__)
    #include <endian.h>
    #endif
    

    Second, it seems like Emscripten bug.

    #if __STDC_VERSION__ >= 201112L && !defined(__EMSCRIPTEN__)