[llvm] 4a96b2e - [gn build] Add libclang_rt.ios.a, libclang_rt.iossim.a to the build
Nico Weber via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 12 13:21:41 PDT 2020
Author: Nico Weber
Date: 2020-10-12T16:21:04-04:00
New Revision: 4a96b2e75f6db5b6f51febdd2ee559bacb7833b7
URL: https://github.com/llvm/llvm-project/commit/4a96b2e75f6db5b6f51febdd2ee559bacb7833b7
DIFF: https://github.com/llvm/llvm-project/commit/4a96b2e75f6db5b6f51febdd2ee559bacb7833b7.diff
LOG: [gn build] Add libclang_rt.ios.a, libclang_rt.iossim.a to the build
It's built with just-built clang, like all other compiler-rt parts
in the GN build.
This requires adding some cross build support to the mac toolchain.
Also add explicit mmacosx-version-min and miphoneos-version-min
flags to the build.
ios.a is only built with the arm64 slice, iossim.a only with the
x86_64 slice for now. (The latter should maybe become host_cpu
when Arm Macs become a common iOS development platform.)
With this, it's possible to build chromium/iOS with a GN-built LLVM.
Differential Revision: https://reviews.llvm.org/D89260
Added:
Modified:
llvm/utils/gn/build/BUILD.gn
llvm/utils/gn/build/mac_sdk.gni
llvm/utils/gn/build/toolchain/BUILD.gn
llvm/utils/gn/build/toolchain/target_flags.gni
llvm/utils/gn/secondary/compiler-rt/BUILD.gn
llvm/utils/gn/secondary/compiler-rt/lib/builtins/BUILD.gn
llvm/utils/gn/secondary/compiler-rt/target.gni
llvm/utils/gn/secondary/llvm/triples.gni
Removed:
################################################################################
diff --git a/llvm/utils/gn/build/BUILD.gn b/llvm/utils/gn/build/BUILD.gn
index f88f4bcc4b6b..a8f4f073de39 100644
--- a/llvm/utils/gn/build/BUILD.gn
+++ b/llvm/utils/gn/build/BUILD.gn
@@ -42,17 +42,36 @@ config("compiler_defaults") {
cflags = target_flags
ldflags = target_flags + target_ldflags
- if (host_os == "mac" && clang_base_path != "") {
+ if ((current_os == "ios" || current_os == "mac") && clang_base_path != "") {
+ if (current_os == "ios" && current_cpu == "arm64") {
+ sdk_path = ios_sdk_path
+ } else if (current_os == "ios" && current_cpu == "x64") {
+ sdk_path = iossim_sdk_path
+ } else if (current_os == "mac") {
+ sdk_path = mac_sdk_path
+ }
cflags += [
"-isysroot",
- mac_sdk_path,
+ sdk_path,
]
ldflags += [
"-isysroot",
- mac_sdk_path,
+ sdk_path,
]
}
+ # Mostly for compiler-rt, see compiler-rt/cmake/config-ix.cmake
+ if (current_os == "ios") {
+ asmflags += [ "-miphoneos-version-min=8.0" ]
+ cflags += [ "-miphoneos-version-min=8.0" ]
+ ldflags += [ "-miphoneos-version-min=8.0" ]
+ }
+ if (current_os == "mac") {
+ asmflags += [ "-mmacosx-version-min=10.10" ]
+ cflags += [ "-mmacosx-version-min=10.10" ]
+ ldflags += [ "-mmacosx-version-min=10.10" ]
+ }
+
if (host_os != "win") {
if (is_debug) {
cflags += [ "-g" ]
@@ -296,7 +315,7 @@ config("no_rtti") {
# To make an archive that can be distributed, you need to remove this config and
# set complete_static_lib.
config("thin_archive") {
- if (current_os != "win" && current_os != "mac") {
+ if (current_os != "ios" && current_os != "mac" && current_os != "win") {
arflags = [ "-T" ]
}
}
diff --git a/llvm/utils/gn/build/mac_sdk.gni b/llvm/utils/gn/build/mac_sdk.gni
index 8fa75647afd1..b6c9baa53096 100644
--- a/llvm/utils/gn/build/mac_sdk.gni
+++ b/llvm/utils/gn/build/mac_sdk.gni
@@ -9,7 +9,12 @@ declare_args() {
# but that makes `gn gen` take twice as long and almost everyone has Xcode
# installed. So require that people who don't have it installed set a gn arg.
if (mac_use_commandline_tools_sdk) {
+ ios_sdk_path = "/Library/Developer/CommandLineTools/SDKs/iPhoneOS.sdk"
+ iossim_sdk_path =
+ "/Library/Developer/CommandLineTools/SDKs/iPhoneSimulator.sdk"
mac_sdk_path = "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk"
} else {
+ ios_sdk_path = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk"
+ iossim_sdk_path = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk"
mac_sdk_path = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"
}
diff --git a/llvm/utils/gn/build/toolchain/BUILD.gn b/llvm/utils/gn/build/toolchain/BUILD.gn
index d716e57e3612..b822d4e5868d 100644
--- a/llvm/utils/gn/build/toolchain/BUILD.gn
+++ b/llvm/utils/gn/build/toolchain/BUILD.gn
@@ -56,7 +56,7 @@ template("unix_toolchain") {
}
tool("alink") {
- if (current_os == "mac") {
+ if (current_os == "ios" || current_os == "mac") {
command = "libtool -D -static -no_warning_for_no_symbols {{arflags}} -o {{output}} {{inputs}}"
} else {
# Remove the output file first so that ar doesn't try to modify the
@@ -70,7 +70,7 @@ template("unix_toolchain") {
default_output_dir = "{{root_out_dir}}/lib"
}
- if (current_os == "mac") {
+ if (current_os == "ios" || current_os == "mac") {
# gn < 1693 (e214b5d35898) doesn't support |frameworks|, requiring
# frameworks to be listed in |libs|, but gn >= 1808 (3028c6a426a4) forbids
# frameworks from appearing in |libs|. This assertion provides a helpful
@@ -89,7 +89,7 @@ template("unix_toolchain") {
tool("solink") {
outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
- if (current_os == "mac") {
+ if (current_os == "ios" || current_os == "mac") {
command = "$ld -shared {{ldflags}} -o $outfile {{inputs}} {{libs}} {{frameworks}}"
default_output_extension = ".dylib"
} else {
@@ -105,7 +105,7 @@ template("unix_toolchain") {
tool("solink_module") {
outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
- if (current_os == "mac") {
+ if (current_os == "ios" || current_os == "mac") {
command = "$ld -shared {{ldflags}} -Wl,-flat_namespace -Wl,-undefined,suppress -o $outfile {{inputs}} {{libs}} {{frameworks}}"
default_output_extension = ".dylib"
} else {
@@ -120,7 +120,7 @@ template("unix_toolchain") {
tool("link") {
outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
- if (current_os == "mac") {
+ if (current_os == "ios" || current_os == "mac") {
command =
"$ld {{ldflags}} -o $outfile {{inputs}} {{libs}} {{frameworks}}"
} else {
@@ -141,7 +141,7 @@ template("unix_toolchain") {
description = "COPY {{source}} {{output}}"
}
- if (current_os == "mac") {
+ if (current_os == "ios" || current_os == "mac") {
tool("copy_bundle_data") {
# http://serverfault.com/q/209888/43689
_copydir = "mkdir -p {{output}} && cd {{source}} && " +
@@ -164,7 +164,7 @@ template("unix_toolchain") {
}
unix_toolchain("unix") {
- if (current_os != "mac") {
+ if (current_os != "ios" && current_os != "mac") {
ar = "ar"
}
@@ -189,7 +189,7 @@ template("stage2_unix_toolchain") {
"//:clang($host_toolchain)",
"//:lld($host_toolchain)",
]
- if (current_os != "mac") {
+ if (current_os != "ios" && current_os != "mac") {
ar = "bin/llvm-ar"
deps += [ "//:llvm-ar($host_toolchain)" ]
}
@@ -219,6 +219,22 @@ if (android_ndk_path != "") {
}
}
+if (host_os == "mac") {
+ stage2_unix_toolchain("stage2_ios_aarch64") {
+ toolchain_args = {
+ current_os = "ios"
+ current_cpu = "arm64"
+ }
+ }
+
+ stage2_unix_toolchain("stage2_iossim_x64") {
+ toolchain_args = {
+ current_os = "ios"
+ current_cpu = "x64"
+ }
+ }
+}
+
toolchain("win") {
cl = "cl"
link = "link"
diff --git a/llvm/utils/gn/build/toolchain/target_flags.gni b/llvm/utils/gn/build/toolchain/target_flags.gni
index 02dfeda9d62f..0af52a0db6da 100644
--- a/llvm/utils/gn/build/toolchain/target_flags.gni
+++ b/llvm/utils/gn/build/toolchain/target_flags.gni
@@ -1,6 +1,11 @@
import("//llvm/triples.gni")
import("//llvm/utils/gn/build/toolchain/compiler.gni")
+# Flags in this file are passed both to the compiler that's building
+# compiler-rt at build time (via normal gn cflags/ldflags), as well as to the
+# compiler building compiler-rt test programs at test time (via
+# COMPILER_RT_TEST_COMPILER_CFLAGS).
+
target_flags = []
target_ldflags = []
@@ -14,6 +19,26 @@ if (current_os == "android") {
if (current_cpu == "arm") {
target_flags += [ "-march=armv7-a" ]
}
+} else if (current_os == "ios") {
+ if (current_cpu == "arm64") {
+ target_flags += [
+ "-arch",
+ "arm64",
+ ]
+ target_ldflags += [
+ "-arch",
+ "arm64",
+ ]
+ } else if (current_cpu == "x64") {
+ target_flags += [
+ "-arch",
+ "x86_64",
+ ]
+ target_ldflags += [
+ "-arch",
+ "x86_64",
+ ]
+ }
}
if (current_cpu == "x86") {
diff --git a/llvm/utils/gn/secondary/compiler-rt/BUILD.gn b/llvm/utils/gn/secondary/compiler-rt/BUILD.gn
index 7a1961678b05..5444f6621350 100644
--- a/llvm/utils/gn/secondary/compiler-rt/BUILD.gn
+++ b/llvm/utils/gn/secondary/compiler-rt/BUILD.gn
@@ -1,3 +1,4 @@
+import("//llvm/lib/Target/targets.gni")
import("//llvm/utils/gn/build/toolchain/compiler.gni")
# In the GN build, compiler-rt is always built by just-built clang and lld.
@@ -10,10 +11,20 @@ if (android_ndk_path != "") {
"//llvm/utils/gn/build/toolchain:stage2_android_arm",
]
}
-
group("compiler-rt") {
deps = []
foreach(toolchain, supported_toolchains) {
deps += [ "//compiler-rt/lib($toolchain)" ]
}
+
+ # FIXME: Do this only if a gn arg compiler_rt_enable_ios is set?
+ # That would match the cmake build.
+ if (host_os == "mac") {
+ if (llvm_build_AArch64) {
+ deps += [ "//compiler-rt/lib/builtins(//llvm/utils/gn/build/toolchain:stage2_ios_aarch64)" ]
+ }
+ if (llvm_build_X86) {
+ deps += [ "//compiler-rt/lib/builtins(//llvm/utils/gn/build/toolchain:stage2_iossim_x64)" ]
+ }
+ }
}
diff --git a/llvm/utils/gn/secondary/compiler-rt/lib/builtins/BUILD.gn b/llvm/utils/gn/secondary/compiler-rt/lib/builtins/BUILD.gn
index 5ce3cba59ac4..0292479ecd66 100644
--- a/llvm/utils/gn/secondary/compiler-rt/lib/builtins/BUILD.gn
+++ b/llvm/utils/gn/secondary/compiler-rt/lib/builtins/BUILD.gn
@@ -13,6 +13,10 @@ static_library("builtins") {
output_dir = crt_current_out_dir
if (current_os == "mac") {
output_name = "clang_rt.osx"
+ } else if (current_os == "ios" && current_cpu == "arm64") {
+ output_name = "clang_rt.ios"
+ } else if (current_os == "ios" && current_cpu == "x64") {
+ output_name = "clang_rt.iossim"
} else {
output_name = "clang_rt.builtins$crt_current_target_suffix"
}
@@ -177,7 +181,7 @@ static_library("builtins") {
sources += [ "clear_cache.c" ]
}
- if (current_os == "mac") {
+ if (current_os == "mac" || current_os == "ios") {
sources += [
"atomic_flag_clear.c",
"atomic_flag_clear_explicit.c",
@@ -496,8 +500,7 @@ static_library("builtins") {
}
}
-# Currently unused but necessary to make the sync_source_lists_from_cmake.py
-# happy.
+# Currently unused but necessary to make sync_source_lists_from_cmake.py happy.
source_set("_unused") {
sources = [
# Thumb1
diff --git a/llvm/utils/gn/secondary/compiler-rt/target.gni b/llvm/utils/gn/secondary/compiler-rt/target.gni
index 1f2372e8f1d6..ead515fa5014 100644
--- a/llvm/utils/gn/secondary/compiler-rt/target.gni
+++ b/llvm/utils/gn/secondary/compiler-rt/target.gni
@@ -26,7 +26,7 @@ if (clang_enable_per_target_runtime_dir) {
if (current_os == "android") {
crt_current_target_suffix += "-android"
}
-} else if (current_os == "mac") {
+} else if (current_os == "ios" || current_os == "mac") {
crt_current_out_dir = "$clang_resource_dir/lib/darwin"
} else {
assert(false, "unimplemented current_os " + current_os)
diff --git a/llvm/utils/gn/secondary/llvm/triples.gni b/llvm/utils/gn/secondary/llvm/triples.gni
index c72910f02f99..a0ea488e04f3 100644
--- a/llvm/utils/gn/secondary/llvm/triples.gni
+++ b/llvm/utils/gn/secondary/llvm/triples.gni
@@ -7,7 +7,7 @@ if (current_cpu == "x86") {
llvm_current_triple = "x86_64-unknown-freebsd"
} else if (current_os == "linux") {
llvm_current_triple = "x86_64-unknown-linux-gnu"
- } else if (current_os == "mac") {
+ } else if (current_os == "ios" || current_os == "mac") {
llvm_current_triple = "x86_64-apple-darwin"
} else if (current_os == "win") {
llvm_current_triple = "x86_64-pc-windows-msvc"
@@ -19,7 +19,7 @@ if (current_cpu == "x86") {
} else if (current_cpu == "arm64") {
if (current_os == "android") {
llvm_current_triple = "aarch64-linux-android29"
- } else if (current_os == "mac") {
+ } else if (current_os == "ios" || current_os == "mac") {
llvm_current_triple = "arm64-apple-darwin"
}
} else if (current_cpu == "ppc64") {
More information about the llvm-commits
mailing list