[librsvg: 1/2] Ensure that the __clzsi2 symbol is present



commit 449fdccaffd316eddb394589008310c327eb31bb
Author: Kleis Auke Wolthuizen <github kleisauke nl>
Date:   Tue Jul 16 09:00:00 2019 +0200

    Ensure that the __clzsi2 symbol is present
    
    e310e36 solved static linking and the MinGW-w64 builds but included a
    workaround for Rust 1.34 and 1.35 that didn't work for Rust 1.36.
    
    The main problem with Rust 1.34 and 1.35 is that it included its own version
    of the `__clzsi2` intrinsic instead of the C version. This caused duplicate
    symbols during linking and required a workaround by removing the duplicated
    symbol, see:
    https://github.com/rust-lang/rust/issues/58277
    
    Fortunately, this is solved within rustc 1.36, see:
    https://github.com/rust-lang-nursery/compiler-builtins/commit/752e35a11f2e7eb29df84668bef0945e75cf3eb5
    
    The workaround, however, did not ensure that `__clzsi2` intrinsic is only
    removed when it is duplicated (it could also remove the optimized C version).
    
    This commit ensures that the `__clzsi2` intrinsic is present only once. Note
    that the entire workaround can be removed when the minimum Rust version is
    bumped to 1.36.
    
    Closes: https://gitlab.gnome.org/GNOME/librsvg/issues/485

 Makefile.am             | 12 +++++++-----
 configure.ac            |  1 +
 rsvg_internals/build.rs |  2 +-
 3 files changed, 9 insertions(+), 6 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index f9205080..9289a384 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -136,11 +136,11 @@ cargo_verbose_ = $(cargo_verbose_$(AM_DEFAULT_VERBOSITY))
 cargo_verbose_0 =
 cargo_verbose_1 = --verbose
 
-RUST_LIB=@abs_top_builddir@/.libs/librsvg_internals.a
-CARGO_TARGET_DIR=@abs_top_builddir@/target
-
 LIBRSVG_BUILD_DIR=@abs_top_builddir@
-LIBRSVG_TARGET_DIR=@abs_top_builddir@/target/@RUST_TARGET_SUBDIR@
+CARGO_TARGET_DIR=$(LIBRSVG_BUILD_DIR)/target
+LIBRSVG_TARGET_DIR=$(CARGO_TARGET_DIR)/$(RUST_TARGET_SUBDIR)
+
+RUST_LIB=$(LIBRSVG_BUILD_DIR)/.libs/librsvg_internals.a
 
 check-local:
        cd $(srcdir) && \
@@ -177,7 +177,9 @@ librsvg_internals.la: $(librsvg_internals_la_SOURCES)
        LIBRSVG_BUILD_DIR=$(LIBRSVG_BUILD_DIR)                                  \
        LIBRSVG_TARGET_DIR=$(LIBRSVG_TARGET_DIR)                                        \
        $(CARGO) --locked build $(CARGO_VERBOSE) $(CARGO_TARGET_ARGS) $(CARGO_RELEASE_ARGS) --features 
"c-library" \
-       && $(AR) d $(RUST_LIB) clzsi2.o # HACK: https://github.com/rust-lang/rust/issues/58277
+       && if [[ $$($(NM) -g $(RUST_LIB) | grep "T __clzsi2" -c) -gt 1 ]] ; then \
+               $(AR) d $(RUST_LIB) clzsi2.o;                                   \
+       fi
 
 librsvg_@RSVG_API_MAJOR_VERSION@_la_CPPFLAGS = \
        -I$(top_srcdir)                         \
diff --git a/configure.ac b/configure.ac
index e416231a..fea5fa67 100644
--- a/configure.ac
+++ b/configure.ac
@@ -109,6 +109,7 @@ AS_IF(test x$RUSTC = xno,
     AC_MSG_ERROR([rustc is required.  Please install the Rust toolchain from https://www.rust-lang.org/])
 )
 AC_CHECK_PROGS(AR, ar)
+AC_CHECK_PROGS(NM, nm)
 
 dnl Minimum version of rustc that we support
 dnl If you change this, please update COMPILING.md
diff --git a/rsvg_internals/build.rs b/rsvg_internals/build.rs
index eaa17b05..eafaa2b4 100644
--- a/rsvg_internals/build.rs
+++ b/rsvg_internals/build.rs
@@ -7,7 +7,7 @@ use std::path::Path;
 use std::os::unix::fs::symlink;
 
 #[cfg(all(windows, not(target_env = "msvc")))]
-use std::os::windows::fs::symlink_file;
+use std::os::windows::fs::symlink_file as symlink;
 
 #[cfg(not(target_env = "msvc"))]
 use std::fs;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]