reland "set up GL sample app to build through Bazel Mac toolchain"
https://skia-review.googlesource.com/c/skia/+/549897 G3 error fixed with: https://critique.corp.google.com/cl/456234733 Introduces tracking bug: https://bugs.chromium.org/p/skia/issues/detail?id=13452 Suggested review order. 1) tools/sk_app/* and src/gpu/ganesh/* sets up the actual target to be built by the toolchain 2) toolchain/* and .bazelrc changes to the mac hermetic toolchain, including support for framework dependencies, objc compilation, and dynamic lib dependency resolution Change-Id: Id31e0adb134d385cbb4af6818f2c25c4fdae9598 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/551881 Reviewed-by: Kevin Lubick <kjlubick@google.com> Commit-Queue: Jorge Betancourt <jmbetancourt@google.com>
This commit is contained in:
parent
3bd3b5dfae
commit
c327d1054a
2
.bazelrc
2
.bazelrc
@ -4,7 +4,9 @@ build:clang_linux --crosstool_top=//toolchain:clang_suite_linux
|
||||
build:clang_linux --compiler=host_is_linux_amd64
|
||||
|
||||
build:clang_mac --crosstool_top=//toolchain:clang_suite_mac
|
||||
build:clang_mac --apple_crosstool_top=//toolchain:clang_suite_mac
|
||||
build:clang_mac --compiler=host_is_mac_m1
|
||||
build:clang_mac --apple_platform_type=macos
|
||||
|
||||
# =============================================================================
|
||||
# Alias to build configurations below. This makes configuring things from
|
||||
|
@ -69,6 +69,11 @@ def cc_library(**kwargs):
|
||||
"""A shim around cc_library that lets us tweak settings for G3 if necessary."""
|
||||
native.cc_library(**kwargs)
|
||||
|
||||
# buildifier: disable=unnamed-macro
|
||||
def objc_library(**kwargs):
|
||||
"""A shim around objc_library that lets us tweak settings for G3 if necessary."""
|
||||
native.objc_library(**kwargs)
|
||||
|
||||
# buildifier: disable=unnamed-macro
|
||||
def exports_files_legacy(label_list = None, visibility = None):
|
||||
"""A self-annotating macro to export all files in this package for legacy G3 rules.
|
||||
|
@ -29,8 +29,11 @@ cc_binary_with_flags(
|
||||
},
|
||||
deps = [
|
||||
"//:skia_public",
|
||||
"//tools/sk_app",
|
||||
],
|
||||
] + select({
|
||||
"@platforms//os:macos": ["//tools/sk_app:sk_app_objc"],
|
||||
"@platforms//os:linux": ["//tools/sk_app:sk_app"],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
)
|
||||
|
||||
cc_binary_with_flags(
|
||||
|
@ -65,6 +65,9 @@ use system headers and Mac-specific includes when compiling. Our Bazel toolchain
|
||||
`xcode-select` in your path so that we may symlink the user's current Xcode directory in the
|
||||
toolchain's cache. Make sure `xcode-select -p` returns a valid path.
|
||||
|
||||
Your Xcode path should resemble `/Applications/Xcode.app/Contents/Developer/`. Either move your
|
||||
Xcode or use `xcode-select` to use the Xcode in this location.
|
||||
|
||||
## .bazelrc Tips
|
||||
You should make a [.bazelrc file](https://bazel.build/docs/bazelrc) in your home directory where
|
||||
you can specify settings that apply only to you. These can augment or replace the ones we define
|
||||
|
@ -3,3 +3,11 @@ load("//bazel:macros.bzl", "exports_files_legacy")
|
||||
licenses(["notice"])
|
||||
|
||||
exports_files_legacy()
|
||||
|
||||
filegroup(
|
||||
name = "srcs",
|
||||
srcs = [
|
||||
"GrGLMakeNativeInterface_mac.cpp",
|
||||
],
|
||||
visibility = ["//src/gpu/ganesh/gl:__pkg__"],
|
||||
)
|
||||
|
@ -29,6 +29,7 @@ cc_toolchain_suite(
|
||||
"arm64|host_is_mac_m1": ":mac_m1_host",
|
||||
"darwin|host_is_mac_m1": ":mac_m1_host",
|
||||
"darwin_arm64|host_is_mac_m1": ":mac_m1_host",
|
||||
"darwin_x86_64": ":mac_m1_host",
|
||||
},
|
||||
)
|
||||
|
||||
|
@ -94,6 +94,14 @@ def _make_action_configs():
|
||||
action_name = ACTION_NAMES.cpp_compile,
|
||||
tools = [clang_tool],
|
||||
)
|
||||
objc_compile_action = action_config(
|
||||
action_name = ACTION_NAMES.objc_compile,
|
||||
tools = [clang_tool],
|
||||
)
|
||||
objcpp_compile_action = action_config(
|
||||
action_name = ACTION_NAMES.objcpp_compile,
|
||||
tools = [clang_tool],
|
||||
)
|
||||
linkstamp_compile_action = action_config(
|
||||
action_name = ACTION_NAMES.linkstamp_compile,
|
||||
tools = [clang_tool],
|
||||
@ -118,6 +126,58 @@ def _make_action_configs():
|
||||
tools = [lld_tool],
|
||||
)
|
||||
|
||||
# objc archiver and cpp archiver actions use the same base flags
|
||||
common_archive_flags = [
|
||||
flag_set(
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
# https://llvm.org/docs/CommandGuide/llvm-ar.html
|
||||
# [r]eplace existing files or insert them if they already exist,
|
||||
# [c]reate the file if it doesn't already exist
|
||||
# [s]ymbol table should be added
|
||||
# [D]eterministic timestamps should be used
|
||||
flags = ["rcsD", "%{output_execpath}"],
|
||||
# Despite the name, output_execpath just refers to linker output,
|
||||
# e.g. libFoo.a
|
||||
expand_if_available = "output_execpath",
|
||||
),
|
||||
],
|
||||
),
|
||||
flag_set(
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
iterate_over = "libraries_to_link",
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
flags = ["%{libraries_to_link.name}"],
|
||||
expand_if_equal = variable_with_value(
|
||||
name = "libraries_to_link.type",
|
||||
value = "object_file",
|
||||
),
|
||||
),
|
||||
flag_group(
|
||||
flags = ["%{libraries_to_link.object_files}"],
|
||||
iterate_over = "libraries_to_link.object_files",
|
||||
expand_if_equal = variable_with_value(
|
||||
name = "libraries_to_link.type",
|
||||
value = "object_file_group",
|
||||
),
|
||||
),
|
||||
],
|
||||
expand_if_available = "libraries_to_link",
|
||||
),
|
||||
],
|
||||
),
|
||||
flag_set(
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
flags = ["@%{linker_param_file}"],
|
||||
expand_if_available = "linker_param_file",
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
# This is the same rule as
|
||||
# https://github.com/emscripten-core/emsdk/blob/7f39d100d8cd207094decea907121df72065517e/bazel/emscripten_toolchain/crosstool.bzl#L143
|
||||
# By default, there are no flags or libraries passed to the llvm-ar tool, so
|
||||
@ -125,56 +185,13 @@ def _make_action_configs():
|
||||
# https://docs.bazel.build/versions/main/cc-toolchain-config-reference.html#cctoolchainconfiginfo-build-variables
|
||||
cpp_link_static_library_action = action_config(
|
||||
action_name = ACTION_NAMES.cpp_link_static_library,
|
||||
flag_sets = [
|
||||
flag_set(
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
# https://llvm.org/docs/CommandGuide/llvm-ar.html
|
||||
# replace existing files or insert them if they already exist,
|
||||
# create the file if it doesn't already exist
|
||||
# symbol table should be added
|
||||
# Deterministic timestamps should be used
|
||||
flags = ["rcsD", "%{output_execpath}"],
|
||||
# Despite the name, output_execpath just refers to linker output,
|
||||
# e.g. libFoo.a
|
||||
expand_if_available = "output_execpath",
|
||||
),
|
||||
],
|
||||
),
|
||||
flag_set(
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
iterate_over = "libraries_to_link",
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
flags = ["%{libraries_to_link.name}"],
|
||||
expand_if_equal = variable_with_value(
|
||||
name = "libraries_to_link.type",
|
||||
value = "object_file",
|
||||
),
|
||||
),
|
||||
flag_group(
|
||||
flags = ["%{libraries_to_link.object_files}"],
|
||||
iterate_over = "libraries_to_link.object_files",
|
||||
expand_if_equal = variable_with_value(
|
||||
name = "libraries_to_link.type",
|
||||
value = "object_file_group",
|
||||
),
|
||||
),
|
||||
],
|
||||
expand_if_available = "libraries_to_link",
|
||||
),
|
||||
],
|
||||
),
|
||||
flag_set(
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
flags = ["@%{linker_param_file}"],
|
||||
expand_if_available = "linker_param_file",
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
flag_sets = common_archive_flags,
|
||||
tools = [ar_tool],
|
||||
)
|
||||
|
||||
objc_archive_action = action_config(
|
||||
action_name = ACTION_NAMES.objc_archive,
|
||||
flag_sets = common_archive_flags,
|
||||
tools = [ar_tool],
|
||||
)
|
||||
|
||||
@ -187,16 +204,25 @@ def _make_action_configs():
|
||||
cpp_link_nodeps_dynamic_library_action,
|
||||
cpp_link_static_library_action,
|
||||
linkstamp_compile_action,
|
||||
objc_archive_action,
|
||||
objc_compile_action,
|
||||
objcpp_compile_action,
|
||||
preprocess_assemble_action,
|
||||
]
|
||||
return action_configs
|
||||
|
||||
# In addition to pointing the c and cpp compile actions to our toolchain, we also need to set objc
|
||||
# and objcpp action flags as well. We build .m and .mm files with the objc_library rule, which
|
||||
# will use the default toolchain if not specified here.
|
||||
# https://docs.bazel.build/versions/3.3.0/be/objective-c.html#objc_library
|
||||
def _make_default_flags():
|
||||
"""Here we define the flags for certain actions that are always applied."""
|
||||
cxx_compile_includes = flag_set(
|
||||
actions = [
|
||||
ACTION_NAMES.c_compile,
|
||||
ACTION_NAMES.cpp_compile,
|
||||
ACTION_NAMES.objc_compile,
|
||||
ACTION_NAMES.objcpp_compile,
|
||||
],
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
@ -211,6 +237,13 @@ def _make_default_flags():
|
||||
XCODE_SYMLINK + "/include",
|
||||
"-isystem",
|
||||
EXTERNAL_TOOLCHAIN + "/lib/clang/13.0.0/include",
|
||||
# Set the framework path to the Mac SDK framework directory. We can't include it
|
||||
# through XCODE_SYMLINK because of infinite symlink recursion introduced in the
|
||||
# framework folder.
|
||||
# TODO(jmbetancourt): feed this path similarly to how we used xcode-select
|
||||
# idea: set this in the trampoline script
|
||||
"-F",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks",
|
||||
# We do not want clang to search in absolute paths for files. This makes
|
||||
# Bazel think we are using an outside resource and fail the compile.
|
||||
"-no-canonical-prefixes",
|
||||
@ -222,6 +255,8 @@ def _make_default_flags():
|
||||
cpp_compile_includes = flag_set(
|
||||
actions = [
|
||||
ACTION_NAMES.cpp_compile,
|
||||
ACTION_NAMES.objc_compile,
|
||||
ACTION_NAMES.objcpp_compile,
|
||||
],
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
@ -238,6 +273,14 @@ def _make_default_flags():
|
||||
flag_groups = [
|
||||
flag_group(
|
||||
flags = [
|
||||
# lld goes through dynamic library dependencies for dylib and tbh files through
|
||||
# absolute paths (/System/Library/Frameworks). However, the dependencies live in
|
||||
# [Xcode dir]/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks
|
||||
# -Wl tells clang to forward the next flag to the linker.
|
||||
# -syslibroot appends to the beginning of the dylib dependency path.
|
||||
# https://github.com/llvm/llvm-project/blob/d61341768cf0cff7ceeaddecc2f769b5c1b901c4/lld/MachO/InputFiles.cpp#L1418-L1420
|
||||
"-Wl,-syslibroot",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/",
|
||||
"-fuse-ld=lld",
|
||||
# We chose to use the llvm runtime, not the gcc one because it is already
|
||||
# included in the clang binary
|
||||
@ -259,6 +302,7 @@ def _make_default_flags():
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
return [feature(
|
||||
"default_flags",
|
||||
enabled = True,
|
||||
|
@ -1,4 +1,4 @@
|
||||
load("//bazel:macros.bzl", "cc_library", "exports_files_legacy", "select_multi", "selects")
|
||||
load("//bazel:macros.bzl", "cc_library", "exports_files_legacy", "objc_library", "select_multi", "selects")
|
||||
|
||||
licenses(["notice"])
|
||||
|
||||
@ -20,6 +20,14 @@ selects.config_setting_group(
|
||||
],
|
||||
)
|
||||
|
||||
selects.config_setting_group(
|
||||
name = "gl_mac",
|
||||
match_all = [
|
||||
"//bazel/common_config_settings:gl_backend",
|
||||
"@platforms//os:macos",
|
||||
],
|
||||
)
|
||||
|
||||
selects.config_setting_group(
|
||||
name = "vulkan_unix",
|
||||
match_all = [
|
||||
@ -72,3 +80,49 @@ cc_library(
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
)
|
||||
|
||||
objc_library(
|
||||
name = "sk_app_objc",
|
||||
testonly = True,
|
||||
srcs = [
|
||||
"Window.cpp",
|
||||
"WindowContext.cpp",
|
||||
"RasterWindowContext.h",
|
||||
] + select_multi(
|
||||
{
|
||||
"//bazel/common_config_settings:gl_backend": [
|
||||
"GLWindowContext.cpp",
|
||||
"GLWindowContext.h",
|
||||
],
|
||||
#TODO dawn and metal backend
|
||||
},
|
||||
default = [],
|
||||
) + select({
|
||||
"@platforms//os:macos": ["//tools/sk_app/mac:srcs"],
|
||||
"//conditions:default": [],
|
||||
# TODO ios support
|
||||
}),
|
||||
hdrs = [
|
||||
"Application.h",
|
||||
"DisplayParams.h",
|
||||
"Window.h",
|
||||
"WindowContext.h",
|
||||
],
|
||||
copts = [
|
||||
"-Wno-deprecated-declarations",
|
||||
],
|
||||
sdk_frameworks = [
|
||||
"QuartzCore",
|
||||
"Cocoa",
|
||||
"Foundation",
|
||||
],
|
||||
visibility = ["//:__subpackages__"],
|
||||
deps = [
|
||||
"//:skia_internal",
|
||||
"//tools/skui",
|
||||
"//tools/timer",
|
||||
] + select({
|
||||
"@platforms//os:macos": ["//tools/sk_app/mac:deps"],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
)
|
||||
|
30
tools/sk_app/mac/BUILD.bazel
Normal file
30
tools/sk_app/mac/BUILD.bazel
Normal file
@ -0,0 +1,30 @@
|
||||
load("//bazel:macros.bzl", "cc_library", "exports_files_legacy")
|
||||
|
||||
licenses(["notice"])
|
||||
|
||||
exports_files_legacy()
|
||||
|
||||
filegroup(
|
||||
name = "srcs",
|
||||
testonly = True,
|
||||
srcs = [
|
||||
"RasterWindowContext_mac.mm",
|
||||
"WindowContextFactory_mac.h",
|
||||
"Window_mac.mm",
|
||||
"Window_mac.h",
|
||||
"main_mac.mm",
|
||||
] + select({
|
||||
#TODO Metal and Dawn
|
||||
"//bazel/common_config_settings:gl_backend": ["GLWindowContext_mac.mm"],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
visibility = ["//tools/sk_app:__pkg__"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "deps",
|
||||
testonly = True,
|
||||
linkopts = [],
|
||||
visibility = ["//tools/sk_app:__pkg__"],
|
||||
deps = ["//tools:tool_utils"],
|
||||
)
|
Loading…
Reference in New Issue
Block a user