From ea1818f1ca644154100a735a41e19df3eefa7e09 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 27 Jun 2016 18:53:17 -0700 Subject: [PATCH 1/2] rustbuild: Update how compiler-rt is called Looks like compiler-rt has been tweaked slightly during the last update, propagate these changes to rustbuild as well. --- src/bootstrap/build/native.rs | 69 +++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/src/bootstrap/build/native.rs b/src/bootstrap/build/native.rs index 5691b2da6a448..1e677aa48b0f6 100644 --- a/src/bootstrap/build/native.rs +++ b/src/bootstrap/build/native.rs @@ -135,27 +135,64 @@ pub fn compiler_rt(build: &Build, target: &str) { let dst = build.compiler_rt_out(target); let arch = target.split('-').next().unwrap(); let mode = if build.config.rust_optimize {"Release"} else {"Debug"}; + + let build_llvm_config = build.llvm_config(&build.config.build); + let mut cfg = cmake::Config::new(build.src.join("src/compiler-rt")); + cfg.target(target) + .host(&build.config.build) + .out_dir(&dst) + .profile(mode) + .define("LLVM_CONFIG_PATH", build_llvm_config) + .define("COMPILER_RT_DEFAULT_TARGET_TRIPLE", target) + .define("COMPILER_RT_BUILD_SANITIZERS", "OFF") + .define("COMPILER_RT_BUILD_EMUTLS", "OFF") + // inform about c/c++ compilers, the c++ compiler isn't actually used but + // it's needed to get the initial configure to work on all platforms. + .define("CMAKE_C_COMPILER", build.cc(target)) + .define("CMAKE_CXX_COMPILER", build.cc(target)); + let (dir, build_target, libname) = if target.contains("linux") || target.contains("freebsd") || target.contains("netbsd") { - let os = if target.contains("android") {"-android"} else {""}; - let arch = if arch.starts_with("arm") && target.contains("eabihf") { - "armhf" + let os_extra = if target.contains("android") && target.contains("arm") { + "-android" } else { - arch + "" }; - let target = format!("clang_rt.builtins-{}{}", arch, os); + let builtins_arch = match arch { + "i586" => "i386", + "arm" | "armv7" if target.contains("android") => "armhf", + "arm" if target.contains("eabihf") => "armhf", + _ => arch, + }; + let target = format!("clang_rt.builtins-{}{}", builtins_arch, os_extra); ("linux".to_string(), target.clone(), target) - } else if target.contains("darwin") { - let target = format!("clang_rt.builtins_{}_osx", arch); + } else if target.contains("apple-darwin") { + let builtins_arch = match arch { + "i686" => "i386", + _ => arch, + }; + let target = format!("clang_rt.builtins_{}_osx", builtins_arch); + ("builtins".to_string(), target.clone(), target) + } else if target.contains("apple-ios") { + cfg.define("COMPILER_RT_ENABLE_IOS", "ON"); + let target = match arch { + "armv7s" => "hard_pic_armv7em_macho_embedded".to_string(), + "aarch64" => "builtins_arm64_ios".to_string(), + _ => format!("hard_pic_{}_macho_embedded", arch), + }; ("builtins".to_string(), target.clone(), target) } else if target.contains("windows-gnu") { let target = format!("clang_rt.builtins-{}", arch); ("windows".to_string(), target.clone(), target) } else if target.contains("windows-msvc") { + let builtins_arch = match arch { + "i586" | "i686" => "i386", + _ => arch, + }; (format!("windows/{}", mode), "lib/builtins/builtins".to_string(), - format!("clang_rt.builtins-{}", arch.replace("i686", "i386"))) + format!("clang_rt.builtins-{}", builtins_arch)) } else { panic!("can't get os from target: {}", target) }; @@ -168,21 +205,7 @@ pub fn compiler_rt(build: &Build, target: &str) { } let _ = fs::remove_dir_all(&dst); t!(fs::create_dir_all(&dst)); - let build_llvm_config = build.llvm_config(&build.config.build); - let mut cfg = cmake::Config::new(build.src.join("src/compiler-rt")); - cfg.target(target) - .host(&build.config.build) - .out_dir(&dst) - .profile(mode) - .define("LLVM_CONFIG_PATH", build_llvm_config) - .define("COMPILER_RT_DEFAULT_TARGET_TRIPLE", target) - .define("COMPILER_RT_BUILD_SANITIZERS", "OFF") - .define("COMPILER_RT_BUILD_EMUTLS", "OFF") - // inform about c/c++ compilers, the c++ compiler isn't actually used but - // it's needed to get the initial configure to work on all platforms. - .define("CMAKE_C_COMPILER", build.cc(target)) - .define("CMAKE_CXX_COMPILER", build.cc(target)) - .build_target(&build_target); + cfg.build_target(&build_target); cfg.build(); } From 3fd411e017ca78eb814272a3b3a71c8b755c4550 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 27 Jun 2016 18:59:55 -0700 Subject: [PATCH 2/2] mk: Make some LLVM building support more robust * Implement the clean-llvm target for those cases where makefiles are being used * Have all cross-compiled LLVMs depend on the **host** LLVM as they'll require the llvm-tablegen executable from there --- mk/llvm.mk | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/mk/llvm.mk b/mk/llvm.mk index cc868a49e4b02..6d8601f3dad6d 100644 --- a/mk/llvm.mk +++ b/mk/llvm.mk @@ -27,12 +27,18 @@ endif define DEF_LLVM_RULES +ifeq ($(1),$$(CFG_BUILD)) +LLVM_DEPS_TARGET_$(1) := $$(LLVM_DEPS) +else +LLVM_DEPS_TARGET_$(1) := $$(LLVM_DEPS) $$(LLVM_CONFIG_$$(CFG_BUILD)) +endif + # If CFG_LLVM_ROOT is defined then we don't build LLVM ourselves ifeq ($(CFG_LLVM_ROOT),) LLVM_STAMP_$(1) = $$(CFG_LLVM_BUILD_DIR_$(1))/llvm-auto-clean-stamp -$$(LLVM_CONFIG_$(1)): $$(LLVM_DEPS) $$(LLVM_STAMP_$(1)) +$$(LLVM_CONFIG_$(1)): $$(LLVM_DEPS_TARGET_$(1)) $$(LLVM_STAMP_$(1)) @$$(call E, cmake: llvm) ifeq ($$(findstring msvc,$(1)),msvc) $$(Q)$$(CFG_CMAKE) --build $$(CFG_LLVM_BUILD_DIR_$(1)) \ @@ -42,7 +48,13 @@ else endif $$(Q)touch $$(LLVM_CONFIG_$(1)) +ifeq ($$(findstring msvc,$(1)),msvc) clean-llvm$(1): +else +clean-llvm$(1): + @$$(call E, clean: llvm) + $$(Q)$$(MAKE) -C $$(CFG_LLVM_BUILD_DIR_$(1)) clean +endif else clean-llvm$(1):