From 63553bdf1972f043ea0b9e0f77b07964d7b33611 Mon Sep 17 00:00:00 2001 From: Zach Yu Date: Mon, 2 Oct 2023 18:32:15 -0700 Subject: Add objc support to macOS toolchain. A minimal example is also added as a baseline test for the toolchain. Test: bazel build //build/bazel/toolchains/cc/objc_example:hello Change-Id: I2ae0597cbf4f2905f5c77856959240fe0e2018d2 --- tool.bazelrc | 2 +- toolchains/cc/actions.bzl | 8 ++++- toolchains/cc/clang.BUILD | 13 ++++---- toolchains/cc/linux_clang/features.bzl | 57 ++++++++++++++++++++-------------- toolchains/cc/mac_clang/BUILD.bazel | 4 ++- toolchains/cc/mac_clang/features.bzl | 40 +++++++++++++----------- toolchains/cc/mac_clang/sdk.BUILD | 17 ++++++++-- toolchains/cc/objc_example/BUILD | 9 ++++++ toolchains/cc/objc_example/defs/defs.h | 3 ++ toolchains/cc/objc_example/hello.m | 7 +++++ 10 files changed, 108 insertions(+), 52 deletions(-) create mode 100644 toolchains/cc/objc_example/BUILD create mode 100644 toolchains/cc/objc_example/defs/defs.h create mode 100644 toolchains/cc/objc_example/hello.m diff --git a/tool.bazelrc b/tool.bazelrc index e250851b..9adfd453 100644 --- a/tool.bazelrc +++ b/tool.bazelrc @@ -11,7 +11,7 @@ build:linux --force_pic build:macos --host_platform='//build/bazel/platforms:host_clang' build:macos --features='generate_debug_symbols' -build:linux --force_pic +build:macos --force_pic build:windows --host_platform='//build/bazel/platforms:host_clang-cl' build:windows --features='-supports_start_end_lib' diff --git a/toolchains/cc/actions.bzl b/toolchains/cc/actions.bzl index b962a544..7e56dd01 100644 --- a/toolchains/cc/actions.bzl +++ b/toolchains/cc/actions.bzl @@ -1,15 +1,16 @@ """Cc toolchain actions and configs.""" +load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") load( "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", "action_config", "tool", "with_feature_set", ) -load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") C_COMPILE_ACTIONS = [ ACTION_NAMES.c_compile, + ACTION_NAMES.objc_compile, ] # C++ actions that directly reads the source @@ -17,12 +18,14 @@ CPP_SOURCE_ACTIONS = [ ACTION_NAMES.cpp_compile, ACTION_NAMES.cpp_header_parsing, ACTION_NAMES.cpp_module_compile, + ACTION_NAMES.objcpp_compile, ] # C++ actions that generate machine code CPP_CODEGEN_ACTIONS = [ ACTION_NAMES.cpp_compile, ACTION_NAMES.cpp_module_codegen, + ACTION_NAMES.objcpp_compile, ] CPP_COMPILE_ACTIONS = CPP_SOURCE_ACTIONS + [ @@ -40,10 +43,13 @@ LINK_ACTIONS = [ ACTION_NAMES.cpp_link_executable, ACTION_NAMES.cpp_link_dynamic_library, ACTION_NAMES.cpp_link_nodeps_dynamic_library, + ACTION_NAMES.objc_executable, + ACTION_NAMES.objc_fully_link, ] ARCHIVER_ACTIONS = [ ACTION_NAMES.cpp_link_static_library, + ACTION_NAMES.objc_archive, ] def create_action_configs(tool_configs): diff --git a/toolchains/cc/clang.BUILD b/toolchains/cc/clang.BUILD index e64dc84e..a1cfeb5c 100644 --- a/toolchains/cc/clang.BUILD +++ b/toolchains/cc/clang.BUILD @@ -1,15 +1,16 @@ -load( - "@//build/bazel/toolchains/cc:rules.bzl", - "cc_tool", - "cc_toolchain_import", -) load( "@//build/bazel/toolchains/cc:actions.bzl", + "ARCHIVER_ACTIONS", "ASSEMBLE_ACTIONS", "CPP_COMPILE_ACTIONS", "C_COMPILE_ACTIONS", "LINK_ACTIONS", ) +load( + "@//build/bazel/toolchains/cc:rules.bzl", + "cc_tool", + "cc_toolchain_import", +) load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") load("@toolchain_defs//:defs.bzl", "TOOL_VERSIONS") @@ -134,7 +135,7 @@ cc_tool( cc_tool( name = "macos_all_archiver", - applied_actions = [ACTION_NAMES.cpp_link_static_library], + applied_actions = ARCHIVER_ACTIONS, tool = target_macos_all + "/bin/llvm-ar", ) diff --git a/toolchains/cc/linux_clang/features.bzl b/toolchains/cc/linux_clang/features.bzl index 331176e5..4f51e9f5 100644 --- a/toolchains/cc/linux_clang/features.bzl +++ b/toolchains/cc/linux_clang/features.bzl @@ -1,20 +1,5 @@ """Cc toolchain features that works with clang.""" -load( - "@//build/bazel/toolchains/cc:utils.bzl", - "check_args", - "filter_none", - "flatten", -) -load( - "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", - "feature", - "flag_group", - "flag_set", - "variable_with_value", - "with_feature_set", -) -load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") load( "@//build/bazel/toolchains/cc:actions.bzl", "ARCHIVER_ACTIONS", @@ -25,11 +10,6 @@ load( "C_COMPILE_ACTIONS", "LINK_ACTIONS", ) -load( - "@//build/bazel/toolchains/cc:rules.bzl", - "CcFeatureConfigInfo", - "CcToolchainImportInfo", -) load( "@//build/bazel/toolchains/cc:features_common.bzl", "OBJECT_EXTENSIONS_UNIX", @@ -48,6 +28,26 @@ load( "user_compile_flags_feature", "user_link_flags_feature", ) +load( + "@//build/bazel/toolchains/cc:rules.bzl", + "CcFeatureConfigInfo", + "CcToolchainImportInfo", +) +load( + "@//build/bazel/toolchains/cc:utils.bzl", + "check_args", + "filter_none", + "flatten", +) +load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") +load( + "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", + "feature", + "flag_group", + "flag_set", + "variable_with_value", + "with_feature_set", +) def get_toolchain_include_paths_feature(import_config): return feature( @@ -105,7 +105,10 @@ def get_toolchain_libraries_to_link_feature(import_config): enabled = True, flag_sets = [ flag_set( - actions = [ACTION_NAMES.cpp_link_executable], + actions = [ + ACTION_NAMES.cpp_link_executable, + ACTION_NAMES.objc_executable, + ], flag_groups = filter_none([ check_args( len, @@ -123,7 +126,10 @@ def get_toolchain_libraries_to_link_feature(import_config): ], ), flag_set( - actions = [ACTION_NAMES.cpp_link_executable], + actions = [ + ACTION_NAMES.cpp_link_executable, + ACTION_NAMES.objc_executable, + ], flag_groups = filter_none([ check_args( len, @@ -144,6 +150,7 @@ def get_toolchain_libraries_to_link_feature(import_config): actions = [ ACTION_NAMES.cpp_link_dynamic_library, ACTION_NAMES.cpp_link_nodeps_dynamic_library, + ACTION_NAMES.objc_fully_link, ], flag_groups = filter_none([ check_args( @@ -320,6 +327,7 @@ shared_flag_feature = feature( actions = [ ACTION_NAMES.cpp_link_dynamic_library, ACTION_NAMES.cpp_link_nodeps_dynamic_library, + ACTION_NAMES.objc_fully_link, ], flag_groups = [ flag_group( @@ -544,7 +552,10 @@ force_pic_feature = feature( enabled = True, flag_sets = [ flag_set( - actions = [ACTION_NAMES.cpp_link_executable], + actions = [ + ACTION_NAMES.cpp_link_executable, + ACTION_NAMES.objc_executable, + ], flag_groups = [ flag_group( expand_if_available = "force_pic", diff --git a/toolchains/cc/mac_clang/BUILD.bazel b/toolchains/cc/mac_clang/BUILD.bazel index e96947d5..57d05be2 100644 --- a/toolchains/cc/mac_clang/BUILD.bazel +++ b/toolchains/cc/mac_clang/BUILD.bazel @@ -1,4 +1,3 @@ -load(":features.bzl", "cc_features") load( "@//build/bazel/toolchains/cc:rules.bzl", "cc_artifact_name", @@ -6,6 +5,7 @@ load( "cc_toolchain_dynamic_runtime", "cc_toolchain_static_runtime", ) +load(":features.bzl", "cc_features") package(default_visibility = ["//visibility:public"]) @@ -27,6 +27,7 @@ cc_features( link_flags = [ "--target=x86_64-apple-darwin-macho", "-undefined dynamic_lookup", + "-fobjc-link-runtime", "-fuse-ld=lld", ], toolchain_imports = _imports, @@ -108,6 +109,7 @@ cc_features( link_flags = [ "--target=arm64e-apple-darwin-macho", "-undefined dynamic_lookup", + "-fobjc-link-runtime", "-fuse-ld=lld", ], toolchain_imports = _imports, diff --git a/toolchains/cc/mac_clang/features.bzl b/toolchains/cc/mac_clang/features.bzl index c45228f1..8e195036 100644 --- a/toolchains/cc/mac_clang/features.bzl +++ b/toolchains/cc/mac_clang/features.bzl @@ -1,28 +1,11 @@ """Cc toolchain features that works with clang.""" -load( - "@//build/bazel/toolchains/cc:utils.bzl", - "flatten", -) -load( - "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", - "feature", - "flag_group", - "flag_set", - "variable_with_value", -) -load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") load( "@//build/bazel/toolchains/cc:actions.bzl", "CPP_COMPILE_ACTIONS", "C_COMPILE_ACTIONS", "LINK_ACTIONS", ) -load( - "@//build/bazel/toolchains/cc:rules.bzl", - "CcFeatureConfigInfo", - "CcToolchainImportInfo", -) load( "@//build/bazel/toolchains/cc:features_common.bzl", "OBJECT_EXTENSIONS_UNIX", @@ -41,6 +24,15 @@ load( "user_compile_flags_feature", "user_link_flags_feature", ) +load( + "@//build/bazel/toolchains/cc:rules.bzl", + "CcFeatureConfigInfo", + "CcToolchainImportInfo", +) +load( + "@//build/bazel/toolchains/cc:utils.bzl", + "flatten", +) load( "@//build/bazel/toolchains/cc/linux_clang:features.bzl", "archiver_flags_feature", @@ -64,6 +56,14 @@ load( "strip_debug_symbols_feature", "sysroot_feature", ) +load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") +load( + "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", + "feature", + "flag_group", + "flag_set", + "variable_with_value", +) # https://cs.opensource.google/bazel/bazel/+/master:src/main/java/com/google/devtools/build/lib/rules/cpp/CppActionConfigs.java;drc=feea781b30788997c0b97ad9103a13fdc3f627c8;l=537 rpath_feature = feature( @@ -98,6 +98,7 @@ set_install_name_feature = feature( actions = [ ACTION_NAMES.cpp_link_dynamic_library, ACTION_NAMES.cpp_link_nodeps_dynamic_library, + ACTION_NAMES.objc_executable, ], flag_groups = [ flag_group( @@ -238,7 +239,10 @@ force_pic_feature = feature( enabled = True, flag_sets = [ flag_set( - actions = [ACTION_NAMES.cpp_link_executable], + actions = [ + ACTION_NAMES.cpp_link_executable, + ACTION_NAMES.objc_executable, + ], flag_groups = [ flag_group( expand_if_available = "force_pic", diff --git a/toolchains/cc/mac_clang/sdk.BUILD b/toolchains/cc/mac_clang/sdk.BUILD index c7da65c9..8965e625 100644 --- a/toolchains/cc/mac_clang/sdk.BUILD +++ b/toolchains/cc/mac_clang/sdk.BUILD @@ -18,10 +18,23 @@ sysroot( ), ) +# keep sorted +ALL_FRAMEWORKS = [ + "CFNetwork", + "CoreFoundation", + "CoreGraphics", + "CoreServices", + "DiskArbitration", + "Foundation", + "IOKit", + "Security", +] + cc_toolchain_import( name = "frameworks", framework_paths = [":System/Library/Frameworks"], support_files = glob([ - "System/Library/Frameworks/CoreFoundation.framework/**", + "System/Library/Frameworks/{}.framework/**".format(f) + for f in ALL_FRAMEWORKS ]), -) \ No newline at end of file +) diff --git a/toolchains/cc/objc_example/BUILD b/toolchains/cc/objc_example/BUILD new file mode 100644 index 00000000..27de3587 --- /dev/null +++ b/toolchains/cc/objc_example/BUILD @@ -0,0 +1,9 @@ +objc_library( + name = "hello", + srcs = [ + "defs/defs.h", + "hello.m", + ], + copts = ["-iquote $(execpath defs)"], + data = ["defs"], +) diff --git a/toolchains/cc/objc_example/defs/defs.h b/toolchains/cc/objc_example/defs/defs.h new file mode 100644 index 00000000..0cf51316 --- /dev/null +++ b/toolchains/cc/objc_example/defs/defs.h @@ -0,0 +1,3 @@ +#pragma once + +#define HELLO @"Hello objc!" diff --git a/toolchains/cc/objc_example/hello.m b/toolchains/cc/objc_example/hello.m new file mode 100644 index 00000000..b9f5a418 --- /dev/null +++ b/toolchains/cc/objc_example/hello.m @@ -0,0 +1,7 @@ +#import +#import "defs.h" + +int main() { + NSLog(HELLO); + return 0; +} -- cgit v1.2.3