Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.')

like image 295
Mr_LinDowsMac Avatar asked Oct 15 '25 12:10

Mr_LinDowsMac


1 Answers

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__)
like image 52
zakki Avatar answered Oct 19 '25 10:10

zakki