support shared libraries for the emscripten target

This commit is contained in:
Marius Gerbershagen 2024-01-01 19:40:42 +01:00
parent 00f96d34b0
commit 693761a9f6
8 changed files with 31 additions and 16 deletions

10
INSTALL
View file

@ -127,9 +127,6 @@ Emscripten target is a little fickle so keep in mind that:
- to build emscripten you need to use their SDK that provides the toolchain, and
set the environment variable EMSDK_PATH
- the optimization level -O0 is forced because otherwsise binaryen miscompiles
ECL
1. Build the host ECL
#+begin_src shell-script
@ -166,7 +163,6 @@ After that activate the toolchain and configure build flags:
--build=x86_64-pc-linux-gnu \
--with-cross-config=`pwd`/src/util/wasm32-unknown-emscripten.cross_config \
--prefix=`pwd`/ecl-emscripten \
--disable-shared \
--with-tcp=no \
--with-cmp=no
@ -190,12 +186,12 @@ After that activate the toolchain and configure build flags:
If the output does not show on the webpage then open the javascript console.
This is a default html website produced by emscripten.
5. Build an external program linked against libecl.a
5. Build an external program linked against libecl.so
The default stack size proposed by emscripten is 64KB. This is too little for
ECL, so when you build a program that is linked against libecl.a, then it is
ECL, so when you build a program that is linked against libecl.so, then it is
imoprtant to specify a different size. For example:
#+begin_src shell-script
emcc program.c -sSTACK_SIZE=1048576 lib/*.a -I./include -o program.o
emcc program.c -sSTACK_SIZE=1048576 lib/libecl.so -I./include -o program.o
#+end_src

View file

@ -274,6 +274,7 @@ compile.lsp: bare.lsp $(srcdir)/compile.lsp.in Makefile
"@LDFLAGS@" "$(LDFLAGS)" \
"@SHARED_LDFLAGS@" "$(SHARED_LDFLAGS)" \
"@BUNDLE_LDFLAGS@" "$(SHARED_LDFLAGS)" \
"@PROGRAM_LDFLAGS@" "" \
"@CLIBS@" "$(CLIBS)" \
"@STATICLIBS@" "$(STATICLIBS)" \
"@LIBS@" "$(LIBS)" \
@ -316,6 +317,7 @@ cmp/cmpdefs.lsp: $(srcdir)/cmp/cmpdefs.lsp Makefile
"@LDFLAGS@" "$(LDFLAGS)" \
"@SHARED_LDFLAGS@" "$(SHARED_LDFLAGS)" \
"@BUNDLE_LDFLAGS@" "$(SHARED_LDFLAGS)" \
"@PROGRAM_LDFLAGS@" "" \
"@CLIBS@" "$(CLIBS)" \
"@STATICLIBS@" "$(STATICLIBS)" \
"@OBJEXT@" "obj" \

4
src/aclocal.m4 vendored
View file

@ -533,6 +533,10 @@ case "${host}" in
enable_threads='no'
enable_libffi='no'
enable_gmp='portable'
with_c_gmp=yes
SHARED_LDFLAGS="-shared -sSIDE_MODULE ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared -sSIDE_MODULE ${LDFLAGS}"
PROGRAM_LDFLAGS="-sMAIN_MODULE -sERROR_ON_UNDEFINED_SYMBOLS=0 ${LDFLAGS}"
;;
esac

View file

@ -103,7 +103,9 @@ the environment variable TMPDIR to a different value." template))
#+msvc
(defun linker-cc (o-pathname object-files &key
(type :program)
(ld-flags (split-program-options *ld-flags*))
(ld-flags (split-program-options (if (eq type :program)
*ld-program-flags*
*ld-flags*)))
(ld-libs (split-program-options *ld-libs*)))
(safe-run-program
*ld*
@ -126,7 +128,9 @@ the environment variable TMPDIR to a different value." template))
#-msvc
(defun linker-cc (o-pathname object-files &key
(type :program)
(ld-flags (split-program-options *ld-flags*))
(ld-flags (split-program-options (if (eq type :program)
*ld-program-flags*
*ld-flags*)))
(ld-libs (split-program-options *ld-libs*)))
(declare (ignore type))
(safe-run-program

View file

@ -57,6 +57,7 @@ coprocessor).")
(defvar *ld-shared-flags* "@SHARED_LDFLAGS@ @LDFLAGS@")
#+dlopen
(defvar *ld-bundle-flags* "@BUNDLE_LDFLAGS@ @LDFLAGS@")
(defvar *ld-program-flags* "@PROGRAM_LDFLAGS@ @LDFLAGS@")
(defvar +shared-library-prefix+ "@SHAREDPREFIX@")
(defvar +shared-library-extension+ "@SHAREDEXT@")

View file

@ -95,7 +95,9 @@
c::*ld-shared-flags*
"@SHARED_LDFLAGS@ @LDFLAGS@"
c::*ld-bundle-flags*
"@BUNDLE_LDFLAGS@ @LDFLAGS@")
"@BUNDLE_LDFLAGS@ @LDFLAGS@"
c::*ld-program-flags*
"@PROGRAM_LDFLAGS@ @LDFLAGS@")
;;; FIXME: The nonstop platform does not support soname
#+(and :wants-dlopen nonstop)
(setf c::*ld-libs*
@ -182,7 +184,7 @@
(push "@LIBPREFIX@eclgmp.@LIBEXT@" extra-args)))
(print extra-args)
(c::shared-cc (compile-file-pathname "ecl" :type :dll)
(list* "c/main.@OBJEXT@"
(list* #-emscripten "c/main.@OBJEXT@"
"c/all_symbols2.@OBJEXT@"
"@LIBPREFIX@lsp.@LIBEXT@"
"@LIBPREFIX@eclmin.@LIBEXT@"

15
src/configure vendored
View file

@ -739,6 +739,7 @@ LIBRARIES
SUBDIRS
TARGETS
EXTRA_OBJS
PROGRAM_LDFLAGS
BUNDLE_LDFLAGS
SHARED_LDFLAGS
CORE_LIBS
@ -3692,7 +3693,7 @@ test -z "${ecldir}" && ecldir="${libdir}/ecl-${PACKAGE_VERSION}"
boehm_configure_flags=""
TARGETS='bin/ecl$(EXE)'
TARGETS='bin/ecl$(EXE)'
SUBDIRS='c doc'
LSP_FEATURES='*features*'
@ -5052,11 +5053,11 @@ if test x$ac_prog_cxx_stdcxx = xno
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
printf %s "checking for $CXX option to enable C++11 features... " >&6; }
if test ${ac_cv_prog_cxx_11+y}
if test ${ac_cv_prog_cxx_cxx11+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_cv_prog_cxx_11=no
ac_cv_prog_cxx_cxx11=no
ac_save_CXX=$CXX
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@ -5098,11 +5099,11 @@ if test x$ac_prog_cxx_stdcxx = xno
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
printf %s "checking for $CXX option to enable C++98 features... " >&6; }
if test ${ac_cv_prog_cxx_98+y}
if test ${ac_cv_prog_cxx_cxx98+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_cv_prog_cxx_98=no
ac_cv_prog_cxx_cxx98=no
ac_save_CXX=$CXX
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@ -6233,6 +6234,10 @@ LSP_FEATURES="(cons :android ${LSP_FEATURES})"
enable_threads='no'
enable_libffi='no'
enable_gmp='portable'
with_c_gmp=yes
SHARED_LDFLAGS="-shared -sSIDE_MODULE ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared -sSIDE_MODULE ${LDFLAGS}"
PROGRAM_LDFLAGS="-sMAIN_MODULE -sERROR_ON_UNDEFINED_SYMBOLS=0 ${LDFLAGS}"
;;
esac

View file

@ -317,6 +317,7 @@ AC_SUBST(CORE_LIBS, []) dnl Locally compiled libs to link into
dnl ecl/ecl_min/libecl.so and nowhere else.
AC_SUBST(SHARED_LDFLAGS) dnl Flags for shared libraries linker
AC_SUBST(BUNDLE_LDFLAGS) dnl Flags for FASL files linker
AC_SUBST(PROGRAM_LDFLAGS) dnl Flags for executable program linker
AC_SUBST(EXTRA_OBJS) dnl Extra *.o files to be compiled into libecl.a
AC_SUBST(TARGETS, ['bin/ecl$(EXE)'])dnl Versions of ECL to be built
AC_SUBST(SUBDIRS, ['c doc']) dnl Subdirectories that make should process