Skip to content

Commit

Permalink
Use libunwind from llvm-project submodule for musl targets
Browse files Browse the repository at this point in the history
  • Loading branch information
malbarbo committed Aug 15, 2019
1 parent 082cf2f commit 5941acd
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 60 deletions.
4 changes: 0 additions & 4 deletions src/bootstrap/sanity.rs
Expand Up @@ -202,10 +202,6 @@ pub fn check(build: &mut Build) {
panic!("couldn't find libc.a in musl dir: {}",
root.join("lib").display());
}
if fs::metadata(root.join("lib/libunwind.a")).is_err() {
panic!("couldn't find libunwind.a in musl dir: {}",
root.join("lib").display());
}
}
None => {
panic!("when targeting MUSL either the rust.musl-root \
Expand Down
26 changes: 0 additions & 26 deletions src/ci/docker/scripts/musl-toolchain.sh
Expand Up @@ -54,29 +54,3 @@ if [ "$REPLACE_CC" = "1" ]; then
ln -s $TARGET-g++ /usr/local/bin/$exec
done
fi

export CC=$TARGET-gcc
export CXX=$TARGET-g++

LLVM=70

# may have been downloaded in a previous run
if [ ! -d libunwind-release_$LLVM ]; then
curl -L https://github.com/llvm-mirror/llvm/archive/release_$LLVM.tar.gz | tar xzf -
curl -L https://github.com/llvm-mirror/libunwind/archive/release_$LLVM.tar.gz | tar xzf -
fi

# fixme(mati865): Replace it with https://github.com/rust-lang/rust/pull/59089
mkdir libunwind-build
cd libunwind-build
cmake ../libunwind-release_$LLVM \
-DLLVM_PATH=/build/llvm-release_$LLVM \
-DLIBUNWIND_ENABLE_SHARED=0 \
-DCMAKE_C_COMPILER=$CC \
-DCMAKE_CXX_COMPILER=$CXX \
-DCMAKE_C_FLAGS="$CFLAGS" \
-DCMAKE_CXX_FLAGS="$CXXFLAGS"

hide_output make -j$(nproc)
cp lib/libunwind.a $OUTPUT/$TARGET/lib
cd - && rm -rf libunwind-build
26 changes: 2 additions & 24 deletions src/ci/docker/scripts/musl.sh
Expand Up @@ -20,6 +20,8 @@ exit 1
TAG=$1
shift

# Ancient binutils versions don't understand debug symbols produced by more recent tools.
# Apparently applying `-fPIC` everywhere allows them to link successfully.
export CFLAGS="-fPIC $CFLAGS"

MUSL=musl-1.1.22
Expand All @@ -38,27 +40,3 @@ else
fi
hide_output make install
hide_output make clean

cd ..

LLVM=70

# may have been downloaded in a previous run
if [ ! -d libunwind-release_$LLVM ]; then
curl -L https://github.com/llvm-mirror/llvm/archive/release_$LLVM.tar.gz | tar xzf -
curl -L https://github.com/llvm-mirror/libunwind/archive/release_$LLVM.tar.gz | tar xzf -
fi

mkdir libunwind-build
cd libunwind-build
cmake ../libunwind-release_$LLVM \
-DLLVM_PATH=/build/llvm-release_$LLVM \
-DLIBUNWIND_ENABLE_SHARED=0 \
-DCMAKE_C_COMPILER=$CC \
-DCMAKE_CXX_COMPILER=$CXX \
-DCMAKE_C_FLAGS="$CFLAGS" \
-DCMAKE_CXX_FLAGS="$CXXFLAGS"

hide_output make -j$(nproc)
cp lib/libunwind.a /musl-$TAG/lib
cd ../ && rm -rf libunwind-build
4 changes: 2 additions & 2 deletions src/libunwind/Cargo.toml
Expand Up @@ -22,7 +22,7 @@ compiler_builtins = "0.1.0"
cfg-if = "0.1.8"

[build-dependencies]
cc = { optional = true, version = "1.0.1" }
cc = { version = "1.0.1" }

[features]
llvm-libunwind = ["cc"]
llvm-libunwind = []
16 changes: 12 additions & 4 deletions src/libunwind/build.rs
Expand Up @@ -5,14 +5,14 @@ fn main() {
let target = env::var("TARGET").expect("TARGET was not set");

if cfg!(feature = "llvm-libunwind") &&
(target.contains("linux") ||
((target.contains("linux") && !target.contains("musl")) ||
target.contains("fuchsia")) {
// Build the unwinding from libunwind C/C++ source code.
#[cfg(feature = "llvm-libunwind")]
llvm_libunwind::compile();
} else if target.contains("linux") {
if target.contains("musl") {
// musl is handled in lib.rs
// linking for musl is handled in lib.rs
llvm_libunwind::compile();
} else if !target.contains("android") {
println!("cargo:rustc-link-lib=gcc_s");
}
Expand Down Expand Up @@ -44,7 +44,6 @@ fn main() {
}
}

#[cfg(feature = "llvm-libunwind")]
mod llvm_libunwind {
use std::env;
use std::path::Path;
Expand Down Expand Up @@ -96,6 +95,15 @@ mod llvm_libunwind {
cfg.file(root.join("src").join(src));
}

if target_env == "musl" {
// use the same C compiler command to compile C++ code so we do not need to setup the
// C++ compiler env variables on the builders
cfg.cpp(false);
// linking for musl is handled in lib.rs
cfg.cargo_metadata(false);
println!("cargo:rustc-link-search=native={}", env::var("OUT_DIR").unwrap());
}

cfg.compile("unwind");
}
}

0 comments on commit 5941acd

Please sign in to comment.