From: Shiz Date: Thu, 20 Aug 2017 01:48:22 +0200 Subject: [PATCH] Add need_rpath target option to force RPATH generation This adds a `need_rpath` option to the target options in order to implicitly have the equivalent of `-C rpath` specified by default for final products (executables and dynamic libraries), so that RPATHs are always added. We have to skip this step in the bootstrap phase as it does its own manual RPATH additions, but unfortunately there's no clean way to detect this. As such, we have to resort to checking the `RUSTC_BOOTSTRAP` variable. Hacky hacky! --- a/src/librustc_back/target/mod.rs +++ b/src/librustc_back/target/mod.rs @@ -379,6 +379,8 @@ pub allows_weak_linkage: bool, /// Whether the linker support rpaths or not. Defaults to false. pub has_rpath: bool, + /// Whether to force rpath support on by default. Defaults to false. + pub need_rpath: bool, /// Whether to disable linking to the default libraries, typically corresponds /// to `-nodefaultlibs`. Defaults to true. pub no_default_libraries: bool, @@ -519,6 +519,7 @@ linker_is_gnu: false, allows_weak_linkage: true, has_rpath: false, + need_rpath: false, no_default_libraries: true, position_independent_executables: false, static_position_independent_executables: false, @@ -776,6 +776,7 @@ key!(linker_is_gnu, bool); key!(allows_weak_linkage, bool); key!(has_rpath, bool); + key!(need_rpath, bool); key!(no_default_libraries, bool); key!(position_independent_executables, bool); key!(static_position_independent_executables, bool); @@ -980,6 +980,7 @@ target_option_val!(linker_is_gnu); target_option_val!(allows_weak_linkage); target_option_val!(has_rpath); + target_option_val!(need_rpath); target_option_val!(no_default_libraries); target_option_val!(position_independent_executables); target_option_val!(static_position_independent_executables); --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -1092,7 +1092,10 @@ // FIXME (#2397): At some point we want to rpath our guesses as to // where extern libraries might live, based on the // addl_lib_search_paths - if sess.opts.cg.rpath { + // XXX: hacky hacky + let bootstrap = env::var("RUSTC_BOOTSTRAP").is_ok(); + if !bootstrap && !sess.crt_static() && + (sess.opts.cg.rpath || sess.target.target.options.need_rpath) { let sysroot = sess.sysroot(); let target_triple = sess.opts.target_triple.triple(); let mut get_install_prefix_lib_path = || {