From e889f8091a5a60d5961f545107b57b8e840204d0 Mon Sep 17 00:00:00 2001 From: Jauhien Piatlicki Date: Sun, 17 Aug 2014 08:23:36 +0200 Subject: [PATCH] Look for standard crates in LIBDIR provided by --libdir option, not in hardcoded libdir path. If there was no LIBDIR provided during configuration fallback to hardcoded paths. Thanks to Jan Niklas Hasse for solution and to Alex Crichton for improvements. Closes #11671 --- configure | 23 +++++++++++++++++++++-- mk/main.mk | 8 ++++++++ src/etc/install.sh | 15 +++++++++++---- src/librustc/metadata/filesearch.rs | 15 ++++++++++----- 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/configure b/configure index 7790025301401..c5c1bb4eb6c35 100755 --- a/configure +++ b/configure @@ -550,9 +550,19 @@ CFG_LIBDIR_RELATIVE=lib if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] then CFG_LIBDIR_RELATIVE=bin -fi + CFG_LIBDIR="${CFG_PREFIX}/${CFG_LIBDIR_RELATIVE}" +else + valopt libdir "${CFG_PREFIX}/${CFG_LIBDIR_RELATIVE}" "install libraries (ignored on windows platform)" + + case "$CFG_LIBDIR" in + "$CFG_PREFIX"/*) CAT_INC=2;; + "$CFG_PREFIX"*) CAT_INC=1;; + *) + err "libdir must begin with the prefix. Use --prefix to set it accordingly.";; + esac -valopt libdir "${CFG_PREFIX}/${CFG_LIBDIR_RELATIVE}" "install libraries" + CFG_LIBDIR_RELATIVE=`echo ${CFG_LIBDIR} | cut -c$((${#CFG_PREFIX}+${CAT_INC}))-` +fi if [ $HELP -eq 1 ] then @@ -989,6 +999,15 @@ for h in $CFG_HOST do for t in $CFG_TARGET do + # host lib dir stage0 + make_dir $h/stage0/lib + + # target bin dir stage0 + make_dir $h/stage0/lib/rustlib/$t/bin + + # target lib dir stage0 + make_dir $h/stage0/lib/rustlib/$t/lib + for i in 0 1 2 3 do # host bin dir diff --git a/mk/main.mk b/mk/main.mk index 3df4d3bfa5ec6..7b42c5b4ae9dd 100644 --- a/mk/main.mk +++ b/mk/main.mk @@ -332,7 +332,15 @@ define SREQ # Destinations of artifacts for the host compiler HROOT$(1)_H_$(3) = $(3)/stage$(1) HBIN$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/bin +ifeq ($$(CFG_WINDOWSY_$(3)),1) HLIB$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/$$(CFG_LIBDIR_RELATIVE) +else +ifeq ($(1),0) +HLIB$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/lib +else +HLIB$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/$$(CFG_LIBDIR_RELATIVE) +endif +endif # Destinations of artifacts for target architectures TROOT$(1)_T_$(2)_H_$(3) = $$(HLIB$(1)_H_$(3))/rustlib/$(2) diff --git a/src/etc/install.sh b/src/etc/install.sh index 4f43b1ed13033..8bc48fc7934e2 100644 --- a/src/etc/install.sh +++ b/src/etc/install.sh @@ -301,9 +301,16 @@ fi flag uninstall "only uninstall from the installation prefix" opt verify 1 "verify that the installed binaries run correctly" valopt prefix "/usr/local" "set installation prefix" -# NB This isn't quite the same definition as in `configure`. -# just using 'lib' instead of CFG_LIBDIR_RELATIVE +# NB This is exactly the same definition as in `configure`. valopt libdir "${CFG_PREFIX}/${CFG_LIBDIR_RELATIVE}" "install libraries" +case "$CFG_LIBDIR" in + "$CFG_PREFIX"/*) CAT_INC=2;; + "$CFG_PREFIX"*) CAT_INC=1;; + *) + err "libdir must begin with the prefix. Use --prefix to set it accordingly.";; +esac +CFG_LIBDIR_RELATIVE=`echo ${CFG_LIBDIR} | cut -c$((${#CFG_PREFIX}+${CAT_INC}))-` + valopt mandir "${CFG_PREFIX}/share/man" "install man pages in PATH" if [ $HELP -eq 1 ] @@ -428,9 +435,9 @@ while read p; do # Decide the destination of the file FILE_INSTALL_PATH="${CFG_PREFIX}/$p" - if echo "$p" | grep "^lib/" > /dev/null + if echo "$p" | grep "^${CFG_LIBDIR_RELATIVE}/" > /dev/null then - pp=`echo $p | sed 's/^lib\///'` + pp=`echo $p | sed "s%^${CFG_LIBDIR_RELATIVE}/%%"` FILE_INSTALL_PATH="${CFG_LIBDIR}/$pp" fi diff --git a/src/librustc/metadata/filesearch.rs b/src/librustc/metadata/filesearch.rs index 99e9deb46376c..d536d8b3fa744 100644 --- a/src/librustc/metadata/filesearch.rs +++ b/src/librustc/metadata/filesearch.rs @@ -255,11 +255,16 @@ fn find_libdir(sysroot: &Path) -> String { // to lib64/lib32. This would be more foolproof by basing the sysroot off // of the directory where librustc is located, rather than where the rustc // binary is. - - if sysroot.join(primary_libdir_name()).join(rustlibdir()).exists() { - return primary_libdir_name(); - } else { - return secondary_libdir_name(); + //If --libdir is set during configuration to the value other than + // "lib" (i.e. non-default), this value is used (see issue #16552). + + match option_env!("CFG_LIBDIR_RELATIVE") { + Some(libdir) if libdir != "lib" => return libdir.to_string(), + _ => if sysroot.join(primary_libdir_name()).join(rustlibdir()).exists() { + return primary_libdir_name(); + } else { + return secondary_libdir_name(); + } } #[cfg(target_word_size = "64")]