Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
6842-ei-Add-enable-ei-dynamic-lib.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 6842-ei-Add-enable-ei-dynamic-lib.patch of Package erlang
From 96e8bea9c7f4e6071ae16588a6b2d3bbebff67f8 Mon Sep 17 00:00:00 2001 From: Lukas Larsson <lukas@erlang.org> Date: Mon, 29 Nov 2021 16:51:08 +0100 Subject: [PATCH 2/2] ei: Add --enable-ei-dynamic-lib This configure option makes it so that a shared library is build as well as the archive to be included in ei. --- HOWTO/INSTALL.md | 2 + erts/aclocal.m4 | 15 +- lib/erl_interface/configure | 547 +++++++++++++++++++++ lib/erl_interface/configure.in | 11 + lib/erl_interface/src/Makefile.in | 104 ++-- lib/erl_interface/src/connect/ei_connect.c | 2 +- lib/erl_interface/src/connect/ei_resolve.c | 28 +- lib/erl_interface/src/misc/ei_locking.h | 2 +- lib/erl_interface/src/prog/erl_call.c | 5 - 9 files changed, 642 insertions(+), 74 deletions(-) diff --git a/HOWTO/INSTALL.md b/HOWTO/INSTALL.md index 3a041f7e6c..e7fb4ad27a 100644 --- a/HOWTO/INSTALL.md +++ b/HOWTO/INSTALL.md @@ -422,6 +422,8 @@ Some of the available `configure` options are: and scalability compared to the default clock sources chosen. * `--disable-saved-compile-time` - Disable saving of compile date and time in the emulator binary. +* `--enable-ei-dynamic-lib` - Make erl\_interface build a shared library in addition + to the archive normally built. If you or your system has special requirements please read the `Makefile` for additional configuration information. diff --git a/erts/aclocal.m4 b/erts/aclocal.m4 index 4720a422c8..6f3238b3d2 100644 --- a/erts/aclocal.m4 +++ b/erts/aclocal.m4 @@ -3062,9 +3062,18 @@ case $host_os in DED_LDFLAGS="-Bshareable" ;; darwin*) - # Mach-O linker: a shared lib and a loadable - # object file is not the same thing. - DED_LDFLAGS="-bundle -bundle_loader ${ERL_TOP}/bin/$host/beam.smp" + # Mach-O linker: a shared lib and a loadable object file is not the same thing. + + if test "X${ERL_DED_FLAT_BUNDLE}" = "Xtrue"; then + # EI sets this variable when building its .so file as beam.smp + # has not been built yet and any ei lib will not + # link to beam.smp anyways + DED_LDFLAGS="-bundle -flat_namespace -undefined suppress" + else + # Cannot use flat namespaces for drivers/nifs as that may cause + # symbols to collide during loading + DED_LDFLAGS="-bundle -bundle_loader ${ERL_TOP}/bin/$host/beam.smp" + fi if test X${enable_m64_build} = Xyes; then DED_LDFLAGS="-m64 $DED_LDFLAGS" else diff --git a/lib/erl_interface/configure b/lib/erl_interface/configure index bc5aa490d7..fa5feb72f3 100755 --- a/lib/erl_interface/configure +++ b/lib/erl_interface/configure @@ -619,6 +619,21 @@ ac_includes_default="\ #endif" ac_subst_vars='LTLIBOBJS +DED_OSTYPE +DED_LIBS +DED_LD_FLAG_RUNTIME_LIBRARY_PATH +DED_LDFLAGS +DED_WERRORFLAGS +DED_WARN_FLAGS +DED_STATIC_CFLAGS +DED_CFLAGS +DED_BASIC_CFLAGS +DED_INCLUDE +DED_SYS_INCLUDE +DED_EXT +DED_GCC +DED_CC +DED_LD LIB_CFLAGS WFLAGS GETCONF @@ -647,6 +662,7 @@ CPPFLAGS LDFLAGS CFLAGS CC +DYNAMIC_LIB TARGET host_os host_vendor @@ -700,6 +716,7 @@ ac_user_opts=' enable_option_checking enable_threads enable_mask_real_errno +enable_ei_dynamic_lib with_gmp enable_sanitizers ' @@ -1336,6 +1353,7 @@ Optional Features: --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-threads use to only build single threaded libs --disable-mask-real-errno do not mask real 'errno' + --enable-ei-dynamic-lib build ei as a dynamic library --enable-sanitizers[=comma-separated list of sanitizers] Default=address,undefined @@ -2529,6 +2547,17 @@ else fi +# Check whether --enable-ei-dynamic-lib was given. +if test "${enable_ei_dynamic_lib+set}" = set; then : + enableval=$enable_ei_dynamic_lib; case "$enableval" in + yes) DYNAMIC_LIB=yes ;; + *) DYNAMIC_LIB=no ;; + esac +else + DYNAMIC_LIB=no +fi + + ac_ext=c @@ -7967,6 +7996,524 @@ else fi + +USER_LD=$LD +USER_LDFLAGS="$LDFLAGS" + +DED_CC=$CC +DED_GCC=$GCC + +DED_CFLAGS= +DED_OSTYPE=unix +case $host_os in + linux*) + DED_CFLAGS="-D_GNU_SOURCE" ;; + win32) + DED_CFLAGS="-D_WIN32_WINNT=0x0600 -DWINVER=0x0600" + DED_OSTYPE=win32 ;; + *) + ;; +esac + +DED_WARN_FLAGS="-Wall -Wstrict-prototypes" +case "$host_cpu" in + tile*) + # tile-gcc is a bit stricter with -Wmissing-prototypes than other gccs, + # and too strict for our taste. + ;; + *) + DED_WARN_FLAGS="$DED_WARN_FLAGS -Wmissing-prototypes";; +esac + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)" >&5 +$as_echo_n "checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)... " >&6; } + saved_CFLAGS=$CFLAGS; + CFLAGS="-Wdeclaration-after-statement $DED_WARN_FLAGS"; + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + can_enable_flag=true +else + can_enable_flag=false +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$saved_CFLAGS; + if test "X$can_enable_flag" = "Xtrue"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + DED_WARN_FLAGS="-Wdeclaration-after-statement $DED_WARN_FLAGS" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)" >&5 +$as_echo_n "checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)... " >&6; } + saved_CFLAGS=$CFLAGS; + CFLAGS="-Werror=return-type $DED_WERRORFLAGS"; + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + can_enable_flag=true +else + can_enable_flag=false +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$saved_CFLAGS; + if test "X$can_enable_flag" = "Xtrue"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + DED_WERRORFLAGS="-Werror=return-type $DED_WERRORFLAGS" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)" >&5 +$as_echo_n "checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)... " >&6; } + saved_CFLAGS=$CFLAGS; + CFLAGS="-Werror=implicit $DED_WERRORFLAGS"; + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + can_enable_flag=true +else + can_enable_flag=false +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$saved_CFLAGS; + if test "X$can_enable_flag" = "Xtrue"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + DED_WERRORFLAGS="-Werror=implicit $DED_WERRORFLAGS" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)" >&5 +$as_echo_n "checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)... " >&6; } + saved_CFLAGS=$CFLAGS; + CFLAGS="-Werror=undef $DED_WERRORFLAGS"; + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + can_enable_flag=true +else + can_enable_flag=false +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$saved_CFLAGS; + if test "X$can_enable_flag" = "Xtrue"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + DED_WERRORFLAGS="-Werror=undef $DED_WERRORFLAGS" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + + +DED_SYS_INCLUDE="-I${ERL_TOP}/erts/emulator/beam -I${ERL_TOP}/erts/include -I${ERL_TOP}/erts/include/$host -I${ERL_TOP}/erts/include/internal -I${ERL_TOP}/erts/include/internal/$host -I${ERL_TOP}/erts/emulator/sys/$DED_OSTYPE -I${ERL_TOP}/erts/emulator/sys/common" +DED_INCLUDE=$DED_SYS_INCLUDE + +DED_CFLAGS="$CFLAGS $CPPFLAGS $DED_CFLAGS" +if test "x$GCC" = xyes; then + # Use -fno-common for gcc, that is link error if multiple definitions of + # global variables are encountered. This is ISO C compliant. + # Until version 10, gcc has had -fcommon as default, which allows and merges + # such dubious duplicates. + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)" >&5 +$as_echo_n "checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)... " >&6; } + saved_CFLAGS=$CFLAGS; + CFLAGS="-fno-common $DED_CFLAGS"; + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + can_enable_flag=true +else + can_enable_flag=false +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$saved_CFLAGS; + if test "X$can_enable_flag" = "Xtrue"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + DED_CFLAGS="-fno-common $DED_CFLAGS" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + + + DED_STATIC_CFLAGS="$DED_CFLAGS" + DED_CFLAGS="$DED_CFLAGS -fPIC" + # Remove -fPIE and -fno-PIE + DED_CFLAGS=`echo $DED_CFLAGS | sed 's/-f\(no-\)\?PIE//g'` +fi + +DED_EXT=so +case $host_os in + win32) DED_EXT=dll;; + darwin*) + DED_CFLAGS="$DED_CFLAGS -fno-common" + DED_STATIC_CFLAGS="$DED_STATIC_CFLAGS -fno-common";; + *) + ;; +esac + +DED_STATIC_CFLAGS="$DED_STATIC_CFLAGS -DSTATIC_ERLANG_NIF -DSTATIC_ERLANG_DRIVER" + +if test "$CFLAG_RUNTIME_LIBRARY_PATH" = ""; then + + CFLAG_RUNTIME_LIBRARY_PATH="-Wl,-R" + case $host_os in + darwin*) + CFLAG_RUNTIME_LIBRARY_PATH= + ;; + win32) + CFLAG_RUNTIME_LIBRARY_PATH= + ;; + osf*) + CFLAG_RUNTIME_LIBRARY_PATH="-Wl,-rpath," + ;; + *) + ;; + esac + +fi + +# If DED_LD is set in environment, we expect all DED_LD* variables +# to be specified (cross compiling) +if test "x$DED_LD" = "x"; then + +DED_LDFLAGS_CONFTEST= + +DED_LD_FLAG_RUNTIME_LIBRARY_PATH="-R" +case $host_os in + win32) + DED_LD="ld.sh" + DED_LDFLAGS="-dll" + DED_LD_FLAG_RUNTIME_LIBRARY_PATH= + ;; + solaris2*|sysv4*) + DED_LDFLAGS="-G" + if test X${enable_m64_build} = Xyes; then + DED_LDFLAGS="-64 $DED_LDFLAGS" + fi + ;; + aix*|os400*) + DED_LDFLAGS="-G -bnoentry -bexpall" + ;; + freebsd2*) + # Non-ELF GNU linker + DED_LDFLAGS="-Bshareable" + ;; + darwin*) + # Mach-O linker: a shared lib and a loadable + # object file is not the same thing. + DED_LDFLAGS="-bundle -bundle_loader ${ERL_TOP}/bin/$host/beam.smp" + # DED_LDFLAGS_CONFTEST is for use in configure tests only. We + # cannot use DED_LDFLAGS in configure tests since beam.smp has not + # been built yet... + DED_LDFLAGS_CONFTEST="-bundle" + if test X${enable_m64_build} = Xyes; then + DED_LDFLAGS="-m64 $DED_LDFLAGS" + else + if test X${enable_m32_build} = Xyes; then + DED_LDFLAGS="-m32 $DED_LDFLAGS" + else + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 +$as_echo_n "checking size of void *... " >&6; } +if ${ac_cv_sizeof_void_p+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_void_p" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (void *) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_void_p=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 +$as_echo "$ac_cv_sizeof_void_p" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOID_P $ac_cv_sizeof_void_p +_ACEOF + + + case "$ac_cv_sizeof_void_p" in + 8) + DED_LDFLAGS="-m64 $DED_LDFLAGS";; + *) + ;; + esac + fi + fi + DED_LD="$CC" + DED_LD_FLAG_RUNTIME_LIBRARY_PATH="$CFLAG_RUNTIME_LIBRARY_PATH" + ;; + linux*) + DED_LD="$CC" + DED_LD_FLAG_RUNTIME_LIBRARY_PATH="$CFLAG_RUNTIME_LIBRARY_PATH" + DED_LDFLAGS="-shared -Wl,-Bsymbolic" + if test X${enable_m64_build} = Xyes; then + DED_LDFLAGS="-m64 $DED_LDFLAGS" + fi; + if test X${enable_m32_build} = Xyes; then + DED_LDFLAGS="-m32 $DED_LDFLAGS" + fi + ;; + freebsd*) + DED_LD="$CC" + DED_LD_FLAG_RUNTIME_LIBRARY_PATH="$CFLAG_RUNTIME_LIBRARY_PATH" + DED_LDFLAGS="-shared" + if test X${enable_m64_build} = Xyes; then + DED_LDFLAGS="-m64 $DED_LDFLAGS" + fi; + if test X${enable_m32_build} = Xyes; then + DED_LDFLAGS="-m32 $DED_LDFLAGS" + fi + ;; + openbsd*) + DED_LD="$CC" + DED_LD_FLAG_RUNTIME_LIBRARY_PATH="$CFLAG_RUNTIME_LIBRARY_PATH" + DED_LDFLAGS="-shared" + ;; + osf*) + # NOTE! Whitespace after -rpath is important. + DED_LD_FLAG_RUNTIME_LIBRARY_PATH="-rpath " + DED_LDFLAGS="-shared -expect_unresolved '*'" + ;; + *) + # assume GNU linker and ELF + DED_LDFLAGS="-shared" + # GNU linker has no option for 64bit build, should not propagate -m64 + ;; +esac + +if test "$DED_LD" = "" && test "$USER_LD" != ""; then + DED_LD="$USER_LD" + DED_LDFLAGS="$USER_LDFLAGS $DED_LDFLAGS" +fi + +DED_LIBS=$LIBS + +fi # "x$DED_LD" = "x" + +test "$DED_LDFLAGS_CONFTEST" != "" || DED_LDFLAGS_CONFTEST="$DED_LDFLAGS" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. +set dummy ${ac_tool_prefix}ld; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DED_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DED_LD"; then + ac_cv_prog_DED_LD="$DED_LD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DED_LD="${ac_tool_prefix}ld" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DED_LD=$ac_cv_prog_DED_LD +if test -n "$DED_LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5 +$as_echo "$DED_LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DED_LD"; then + ac_ct_DED_LD=$DED_LD + # Extract the first word of "ld", so it can be a program name with args. +set dummy ld; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DED_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DED_LD"; then + ac_cv_prog_ac_ct_DED_LD="$ac_ct_DED_LD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DED_LD="ld" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DED_LD=$ac_cv_prog_ac_ct_DED_LD +if test -n "$ac_ct_DED_LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DED_LD" >&5 +$as_echo "$ac_ct_DED_LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DED_LD" = x; then + DED_LD="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DED_LD=$ac_ct_DED_LD + fi +else + DED_LD="$ac_cv_prog_DED_LD" +fi + +test "$DED_LD" != "false" || as_fn_error $? "No linker found" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for static compiler flags" >&5 +$as_echo_n "checking for static compiler flags... " >&6; } +DED_STATIC_CFLAGS="$DED_WERRORFLAGS $DED_WFLAGS $DED_THR_DEFS $DED_STATIC_CFLAGS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_STATIC_CFLAGS" >&5 +$as_echo "$DED_STATIC_CFLAGS" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for basic compiler flags for loadable drivers" >&5 +$as_echo_n "checking for basic compiler flags for loadable drivers... " >&6; } +DED_BASIC_CFLAGS=$DED_CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5 +$as_echo "$DED_CFLAGS" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler flags for loadable drivers" >&5 +$as_echo_n "checking for compiler flags for loadable drivers... " >&6; } +DED_CFLAGS="$DED_WERRORFLAGS $DED_WARN_FLAGS $DED_THR_DEFS $DED_CFLAGS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5 +$as_echo "$DED_CFLAGS" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker for loadable drivers" >&5 +$as_echo_n "checking for linker for loadable drivers... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5 +$as_echo "$DED_LD" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker flags for loadable drivers" >&5 +$as_echo_n "checking for linker flags for loadable drivers... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LDFLAGS" >&5 +$as_echo "$DED_LDFLAGS" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'runtime library path' linker flag" >&5 +$as_echo_n "checking for 'runtime library path' linker flag... " >&6; } +if test "x$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" != "x"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&5 +$as_echo "$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } +fi + + + + + + + + + + + + + + + + + + + + # Check whether --enable-sanitizers was given. if test "${enable_sanitizers+set}" = set; then : diff --git a/lib/erl_interface/configure.in b/lib/erl_interface/configure.in index fa07048424..7ce895683b 100644 --- a/lib/erl_interface/configure.in +++ b/lib/erl_interface/configure.in @@ -85,6 +85,14 @@ AC_ARG_ENABLE(mask-real-errno, esac ], [ mask_real_errno=yes ]) +AC_ARG_ENABLE(ei-dynamic-lib, +[ --enable-ei-dynamic-lib build ei as a dynamic library], +[ case "$enableval" in + yes) DYNAMIC_LIB=yes ;; + *) DYNAMIC_LIB=no ;; + esac ], +[ DYNAMIC_LIB=no ]) +AC_SUBST(DYNAMIC_LIB) dnl ---------------------------------------------------------------------- dnl Checks for programs @@ -346,6 +354,9 @@ else fi fi +ERL_DED_FLAT_BUNDLE=true +ERL_DED_FLAGS + dnl ---------------------------------------------------------------------- dnl Enable -fsanitize= flags. dnl ---------------------------------------------------------------------- diff --git a/lib/erl_interface/src/Makefile.in b/lib/erl_interface/src/Makefile.in index 466f6f5e87..e3ee72ad67 100644 --- a/lib/erl_interface/src/Makefile.in +++ b/lib/erl_interface/src/Makefile.in @@ -106,7 +106,10 @@ endif WARNFLAGS += -DEI_NO_DEPR_WARN -CFLAGS = @LIB_CFLAGS@ $(WARNFLAGS) $(INCFLAGS) $(TYPE_FLAGS) +CFLAGS = @DED_CFLAGS@ $(WARNFLAGS) $(INCFLAGS) $(TYPE_FLAGS) +DED_LD = @DED_LD@ +DED_LDFLAGS = @DED_LDFLAGS@ +DED_LD_FLAG_RUNTIME_LIBRARY_PATH = @DED_LD_FLAG_RUNTIME_LIBRARY_PATH@ PROG_CFLAGS = @CFLAGS@ $(WARNFLAGS) $(INCFLAGS) $(TYPE_FLAGS) -Iglobal INSTALL = @INSTALL@ @@ -127,6 +130,7 @@ MT_OBJDIR = $(ERL_TOP)/lib/erl_interface/obj.mt$(TYPEMARKER)/$(TARGET) MD_OBJDIR = $(ERL_TOP)/lib/erl_interface/obj.md$(TYPEMARKER)/$(TARGET) MDD_OBJDIR = $(ERL_TOP)/lib/erl_interface/obj.mdd$(TYPEMARKER)/$(TARGET) OBJDIR = $(ERL_TOP)/lib/erl_interface/obj$(TYPEMARKER)/$(TARGET) +LIBDIR = $(ERL_TOP)/lib/erl_interface/lib/$(TARGET) BINDIR = $(ERL_TOP)/lib/erl_interface/bin/$(TARGET) # FIXME maybe use this opt and remove (int) cast to is*() functions @@ -149,14 +153,14 @@ ifeq ($(USING_VC),yes) LIBEXT=.lib LIBPRE= MTFLAG=-MT - else LIBEXT=.a LIBPRE=lib MTFLAG= - endif +DYNLIBEXT=.@DED_EXT@ + ########################################################################### # Specify targets names ########################################################################### @@ -166,11 +170,16 @@ ERL_CALL = $(BINDIR)/erl_call$(EXE) ifdef THR_DEFS ST_EILIB = $(OBJDIR)/$(LIBPRE)ei_st$(LIBEXT) MT_EILIB = $(OBJDIR)/$(LIBPRE)ei$(LIBEXT) +ST_EISHLIB = $(LIBDIR)/$(LIBPRE)ei_st$(DYNLIBEXT) +MT_EISHLIB = $(LIBDIR)/$(LIBPRE)ei$(DYNLIBEXT) else ST_EILIB = $(OBJDIR)/$(LIBPRE)ei$(LIBEXT) +ST_EISHLIB = $(LIBDIR)/$(LIBPRE)ei$(DYNLIBEXT) endif MD_EILIB = $(OBJDIR)/$(LIBPRE)ei_md$(LIBEXT) MDD_EILIB = $(OBJDIR)/$(LIBPRE)ei_mdd$(LIBEXT) +MD_EISHLIB = $(LIBDIR)/$(LIBPRE)ei_md$(DYNLIBEXT) +MDD_EISHLIB = $(LIBDIR)/$(LIBPRE)ei_mdd$(DYNLIBEXT) ########################################################################### # Specify targets to build @@ -183,17 +192,17 @@ ifeq ($(USING_VC),yes) # Windows targets -TARGETS = \ - $(OBJ_TARGETS) \ - $(EXE_TARGETS) \ - $(APP_TARGET) \ - $(APPUP_TARGET) - OBJ_TARGETS = \ $(MT_EILIB) \ $(MD_EILIB) \ $(MDD_EILIB) +SH_TARGETS = \ + $(MT_EISHLIB) \ + $(MD_EISHLIB) \ + $(MDD_EISHLIB) + + FAKE_TARGETS = \ $(OBJDIR)/erl_fake_prog_mt$(EXE) \ $(OBJDIR)/ei_fake_prog_mt$(EXE) \ @@ -210,36 +219,18 @@ FAKE_TARGETS = \ else -ifeq ($USING_MINGW,yes) -TARGETS = \ - $(OBJ_TARGETS) \ - $(EXE_TARGETS) \ - $(APP_TARGET) \ - $(APPUP_TARGET) - -OBJ_TARGETS = \ - $(MD_EILIB) - -FAKE_TARGETS = \ - $(OBJDIR)/erl_fake_prog_md$(EXE) \ - $(OBJDIR)/ei_fake_prog_md$(EXE) \ - $(OBJDIR)/erl_fake_prog_cxx_md$(EXE) \ - $(OBJDIR)/ei_fake_prog_cxx_md$(EXE) -else # Unix targets ifdef THR_DEFS -TARGETS = \ - $(OBJ_TARGETS) \ - $(EXE_TARGETS) \ - $(APP_TARGET) \ - $(APPUP_TARGET) - OBJ_TARGETS = \ $(ST_EILIB) \ $(MT_EILIB) +SH_TARGETS = \ + $(ST_EISHLIB) \ + $(MT_EISHLIB) + FAKE_TARGETS = \ $(ST_OBJDIR)/erl_fake_prog_st$(EXE) \ $(ST_OBJDIR)/ei_fake_prog_st$(EXE) \ @@ -252,15 +243,12 @@ FAKE_TARGETS = \ else -TARGETS = \ - $(OBJ_TARGETS) \ - $(EXE_TARGETS) \ - $(APP_TARGET) \ - $(APPUP_TARGET) - OBJ_TARGETS = \ $(ST_EILIB) +SH_TARGETS = \ + $(ST_EISHLIB) + FAKE_TARGETS = \ $(ST_OBJDIR)/erl_fake_prog_st$(EXE) \ $(ST_OBJDIR)/ei_fake_prog_st$(EXE) \ @@ -271,7 +259,13 @@ endif endif -endif +TARGETS = \ + $(OBJ_TARGETS) \ + $(SH_TARGETS) \ + $(EXE_TARGETS) \ + $(APP_TARGET) \ + $(APPUP_TARGET) + ########################################################################### # List all source files ########################################################################### @@ -415,10 +409,10 @@ docs: tests: clean: - rm -f $(ST_EIOBJECTS) $(ST_EILIB) - rm -f $(MT_EIOBJECTS) $(MT_EILIB) - rm -f $(MD_EIOBJECTS) $(MD_EILIB) - rm -f $(MDD_EIOBJECTS) $(MDD_EILIB) + rm -f $(ST_EIOBJECTS) $(ST_EILIB) $(ST_EISHLIB) + rm -f $(MT_EIOBJECTS) $(MT_EILIB) $(MT_EISHLIB) + rm -f $(MD_EIOBJECTS) $(MD_EILIB) $(MD_EISHLIB) + rm -f $(MDD_EIOBJECTS) $(MDD_EILIB) $(MDD_EISHLIB) rm -f $(ERL_CALL) rm -f $(FAKE_TARGETS) rm -f $(APP_TARGET) @@ -451,7 +445,7 @@ $(MDD_OBJDIR)/%.o: %.c # Create directories ########################################################################### -_create_dirs := $(shell mkdir -p $(EBINDIR) $(BINDIR) $(OBJDIR) $(ST_OBJDIR) $(MT_OBJDIR) $(MD_OBJDIR) $(MDD_OBJDIR)) +_create_dirs := $(shell mkdir -p $(EBINDIR) $(BINDIR) $(OBJDIR) $(ST_OBJDIR) $(MT_OBJDIR) $(MD_OBJDIR) $(MDD_OBJDIR) $(LIBDIR)) ########################################################################### # Special rules @@ -482,6 +476,8 @@ $(MDD_EILIB) : $(MDD_EIOBJECTS) $(V_AR) -out:$@ $(MDD_EIOBJECTS) $(V_RANLIB) $@ +WIN_SOCKET=-lsocket + else # Unix archive creation @@ -493,7 +489,6 @@ ifdef RANLIB $(V_RANLIB) $@ endif - $(MT_EILIB) : $(MT_EIOBJECTS) $(V_at)rm -f $@ $(V_AR) $(AR_FLAGS) $@ $(MT_EIOBJECTS) @@ -503,6 +498,23 @@ endif endif +$(ST_EISHLIB): $(ST_EIOBJECTS) + $(ld_verbose) $(DED_LD) $(DED_LDFLAGS) -o $@ \ + $(DED_LD_FLAG_RUNTIME_LIBRARY_PATH) $(ST_EIOBJECTS) \ + $(THR_LIBS) $(LIBS) $(WIN_SOCKET) +$(MT_EISHLIB): $(MT_EIOBJECTS) + $(ld_verbose) $(DED_LD) $(DED_LDFLAGS) -o $@ \ + $(DED_LD_FLAG_RUNTIME_LIBRARY_PATH) $(MT_EIOBJECTS) \ + $(THR_LIBS) $(LIBS) $(WIN_SOCKET) +$(MD_EISHLIB): $(MD_EIOBJECTS) + $(ld_verbose) $(DED_LD) -MD $(DED_LDFLAGS) -o $@ \ + $(DED_LD_FLAG_RUNTIME_LIBRARY_PATH) $(MD_EIOBJECTS) \ + $(THR_LIBS) $(LIBS) $(WIN_SOCKET) +$(MDD_EISHLIB): $(MDD_EIOBJECTS) + $(ld_verbose) $(DED_LD) -MDd $(DED_LDFLAGS) -o $@ \ + $(DED_LD_FLAG_RUNTIME_LIBRARY_PATH) $(MDD_EIOBJECTS) \ + $(THR_LIBS) $(LIBS) $(WIN_SOCKET) + ########################################################################### # erl_call FIXME how to avoid explicit -lsocket on winows??? ########################################################################### @@ -688,6 +700,10 @@ release: opt $(INSTALL_DATA) $(HEADERS) "$(RELEASE_PATH)/usr/include" $(INSTALL_DATA) $(OBJ_TARGETS) "$(RELSYSDIR)/lib" $(INSTALL_DATA) $(OBJ_TARGETS) "$(RELEASE_PATH)/usr/lib" +ifeq (@DYNAMIC_LIB@, yes) + $(INSTALL_PROGRAM) $(SH_TARGETS) "$(RELSYSDIR)/lib" + $(INSTALL_PROGRAM) $(SH_TARGETS) "$(RELEASE_PATH)/usr/lib" +endif $(INSTALL_PROGRAM) $(EXE_TARGETS) "$(RELSYSDIR)/bin" $(INSTALL_DATA) $(EXTRA) "$(RELSYSDIR)/src" $(INSTALL_DATA) connect/*.[ch] "$(RELSYSDIR)/src/connect" diff --git a/lib/erl_interface/src/connect/ei_connect.c b/lib/erl_interface/src/connect/ei_connect.c index 99d709a97c..c310c93012 100644 --- a/lib/erl_interface/src/connect/ei_connect.c +++ b/lib/erl_interface/src/connect/ei_connect.c @@ -671,7 +671,7 @@ int ei_make_pid(ei_cnode *ec, erlang_pid *pid) #undef EI_MAKE_REF_ATOMIC__ #ifdef _REENTRANT -# if ((SIZEOF_LONG == 8 || SIZEOF_LONGLONG == 8) \ +# if ((SIZEOF_LONG == 8 || SIZEOF_LONG_LONG == 8) \ && (ETHR_HAVE___atomic_compare_exchange_n & 8) \ && (ETHR_HAVE___atomic_load_n & 8)) # define EI_MAKE_REF_ATOMIC__ diff --git a/lib/erl_interface/src/connect/ei_resolve.c b/lib/erl_interface/src/connect/ei_resolve.c index 1d11c5043d..e28902da82 100644 --- a/lib/erl_interface/src/connect/ei_resolve.c +++ b/lib/erl_interface/src/connect/ei_resolve.c @@ -102,7 +102,7 @@ int ei_init_resolve(void) return 0; } -#if _REENTRANT +#ifdef _REENTRANT /* * Copy the contents of one struct hostent to another, i.e. don't just @@ -290,10 +290,6 @@ static struct hostent *my_gethostbyname_r(const char *name, return rval; } -#endif /* _REENTRANT */ - -#if EI_THREADS != false - static struct hostent *my_gethostbyaddr_r(const char *addr, int length, int type, @@ -358,7 +354,7 @@ static struct hostent *my_gethostbyaddr_r(const char *addr, return rval; } -#endif /* EI_THREADS != false */ +#endif /* _REENTRANT */ #endif /* !HAVE_GETHOSTBYNAME_R */ @@ -394,14 +390,12 @@ struct hostent *ei_gethostbyaddr_r(const char *addr, int buflen, int *h_errnop) { -#if (EI_THREADS == false) +#ifndef _REENTRANT /* threads disabled, no need to call reentrant function */ - return gethostbyaddr(addr, length, type); -#else -#ifndef HAVE_GETHOSTBYNAME_R + return gethostbyaddr(addr, length, type); +#elif !defined(HAVE_GETHOSTBYNAME_R) return my_gethostbyaddr_r(addr,length,type,hostp,buffer,buflen,h_errnop); -#else -#if (defined(__GLIBC__) || defined(__linux__) || (__FreeBSD_version >= 602000) || defined(__DragonFly__)) +#elif (defined(__GLIBC__) || defined(__linux__) || (__FreeBSD_version >= 602000) || defined(__DragonFly__)) struct hostent *result; gethostbyaddr_r(addr, length, type, hostp, buffer, buflen, &result, @@ -411,8 +405,6 @@ struct hostent *ei_gethostbyaddr_r(const char *addr, #else return gethostbyaddr_r(addr,length,type,hostp,buffer,buflen,h_errnop); #endif -#endif -#endif } struct hostent *ei_gethostbyname_r(const char *name, @@ -424,11 +416,9 @@ struct hostent *ei_gethostbyname_r(const char *name, #ifndef _REENTRANT /* threads disabled, no need to call reentrant function */ return gethostbyname(name); -#else -#ifndef HAVE_GETHOSTBYNAME_R +#elif !defined(HAVE_GETHOSTBYNAME_R) return my_gethostbyname_r(name,hostp,buffer,buflen,h_errnop); -#else -#if (defined(__GLIBC__) || defined(__linux__) || (__FreeBSD_version >= 602000) || defined(__DragonFly__) || defined(__ANDROID__)) +#elif (defined(__GLIBC__) || defined(__linux__) || (__FreeBSD_version >= 602000) || defined(__DragonFly__) || defined(__ANDROID__)) struct hostent *result; int err; @@ -440,8 +430,6 @@ struct hostent *ei_gethostbyname_r(const char *name, #else return gethostbyname_r(name,hostp,buffer,buflen,h_errnop); #endif -#endif -#endif } #endif /* win, unix */ diff --git a/lib/erl_interface/src/misc/ei_locking.h b/lib/erl_interface/src/misc/ei_locking.h index ac9ba41a47..7ee7715448 100644 --- a/lib/erl_interface/src/misc/ei_locking.h +++ b/lib/erl_interface/src/misc/ei_locking.h @@ -32,7 +32,7 @@ #ifdef HAVE_MIT_PTHREAD_H #include <pthread/mit/pthread.h> -#elif HAVE_PTHREAD_H +#elif defined(HAVE_PTHREAD_H) && HAVE_PTHREAD_H #include <pthread.h> #endif diff --git a/lib/erl_interface/src/prog/erl_call.c b/lib/erl_interface/src/prog/erl_call.c index 7e58904a9b..e62931de35 100644 --- a/lib/erl_interface/src/prog/erl_call.c +++ b/lib/erl_interface/src/prog/erl_call.c @@ -1209,11 +1209,6 @@ void exit_free_flags_fields(int exit_status, struct call_flags* flags) { /* Constants and helper functions used by erl_start_sys */ -/* FIXME is this a case a vfork can be used? */ -#if !HAVE_WORKING_VFORK -# define vfork fork -#endif - #ifndef MAXPATHLEN #define MAXPATHLEN 1024 #endif -- 2.31.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor