Skip to content

Commit

Permalink
Pass swift defines into xcode build setting so indexing works on both…
Browse files Browse the repository at this point in the history
… swift and objc side (#96)

* Pass all defines isnide SwiftInfo to active_compilation_context flag

* properly populate value definition to swift side

* Added test case to verify the changes

* Add debug as default for debug config

* Have DEBUG macro for debug config for objective-c side as well
  • Loading branch information
gyfelton authored Aug 7, 2020
1 parent 9b9f158 commit 0f34ead
Show file tree
Hide file tree
Showing 9 changed files with 143 additions and 31 deletions.
58 changes: 56 additions & 2 deletions rules/xcodeproj.bzl
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
load("@build_bazel_rules_apple//apple:providers.bzl", "AppleBundleInfo")
load("@build_bazel_rules_swift//swift:swift.bzl", "SwiftInfo")
load("@bazel_skylib//lib:paths.bzl", "paths")

def _get_attr_values_for_name(deps, provider, field):
Expand Down Expand Up @@ -95,6 +96,7 @@ def _xcodeproj_aspect_impl(target, ctx):
asset_srcs = depset([], transitive = _get_attr_values_for_name(deps, _SrcsInfo, "asset_srcs")),
framework_includes = depset([], transitive = _get_attr_values_for_name(deps, _SrcsInfo, "framework_includes")),
cc_defines = depset([], transitive = _get_attr_values_for_name(deps, _SrcsInfo, "cc_defines")),
swift_defines = depset([], transitive = _get_attr_values_for_name(deps, _SrcsInfo, "swift_defines")),
build_files = depset(_srcs_info_build_files(ctx), transitive = _get_attr_values_for_name(deps, _SrcsInfo, "build_files")),
product_type = bundle_info.product_type[_PRODUCT_SPECIFIER_LENGTH:],
platform_type = bundle_info.platform_type,
Expand All @@ -111,6 +113,7 @@ def _xcodeproj_aspect_impl(target, ctx):
asset_srcs = info.asset_srcs,
framework_includes = info.framework_includes,
cc_defines = info.cc_defines,
swift_defines = info.swift_defines,
build_files = depset(_srcs_info_build_files(ctx)),
direct_srcs = [],
),
Expand All @@ -136,9 +139,14 @@ def _xcodeproj_aspect_impl(target, ctx):
asset_srcs = [f for f in asset_srcs if _is_current_project_file(f)]
framework_includes = _get_attr_values_for_name(deps, _SrcsInfo, "framework_includes")
cc_defines = _get_attr_values_for_name(deps, _SrcsInfo, "cc_defines")
swift_defines = _get_attr_values_for_name(deps, _SrcsInfo, "swift_defines")
if CcInfo in target:
framework_includes.append(target[CcInfo].compilation_context.framework_includes)
cc_defines.append(target[CcInfo].compilation_context.defines)

if SwiftInfo in target:
swift_defines.append(depset(target[SwiftInfo].direct_defines))
swift_defines.append(target[SwiftInfo].transitive_defines)
providers.append(
_SrcsInfo(
srcs = depset(srcs, transitive = _get_attr_values_for_name(deps, _SrcsInfo, "srcs")),
Expand All @@ -147,6 +155,7 @@ def _xcodeproj_aspect_impl(target, ctx):
framework_includes = depset([], transitive = framework_includes),
cc_defines = depset([], transitive = cc_defines),
build_files = depset(_srcs_info_build_files(ctx), transitive = _get_attr_values_for_name(deps, _SrcsInfo, "build_files")),
swift_defines = depset([], transitive = swift_defines),
direct_srcs = srcs,
),
)
Expand Down Expand Up @@ -178,6 +187,27 @@ _xcodeproj_aspect = aspect(
attr_aspects = ["deps", "actual", "tests", "infoplists", "entitlements", "resources", "test_host"],
)

# Borrowed from rules_swift/compiling.bzl
def _exclude_swift_incompatible_define(define):
"""A `map_each` helper that excludes a define if it is not Swift-compatible.
This function rejects any defines that are not of the form `FOO=1` or `FOO`.
Note that in C-family languages, the option `-DFOO` is equivalent to
`-DFOO=1` so we must preserve both.
Args:
define: A string of the form `FOO` or `FOO=BAR` that represents an
Objective-C define.
Returns:
The token portion of the define it is Swift-compatible, or `None`
otherwise.
"""
token, equal, value = define.partition("=")
if (not equal and not value) or (equal == "=" and value == "1"):
return token
return None

def _xcodeproj_impl(ctx):
xcodegen_jsonfile = ctx.actions.declare_file(
"%s-xcodegen.json" % ctx.attr.name,
Expand All @@ -197,7 +227,7 @@ def _xcodeproj_impl(ctx):
"groupSortPosition": "none",
"settingPresets": "none",
}
proj_settings = {
proj_settings_base = {
"BAZEL_BUILD_EXEC": "$BAZEL_STUBS_DIR/build-wrapper",
"BAZEL_OUTPUT_PROCESSOR": "$BAZEL_STUBS_DIR/output-processor.rb",
"BAZEL_PATH": ctx.attr.bazel_path,
Expand All @@ -217,6 +247,16 @@ def _xcodeproj_impl(ctx):
"SWIFT_OBJC_INTERFACE_HEADER_NAME": "",
"SWIFT_VERSION": 5,
}
proj_settings_debug = {
"GCC_PREPROCESSOR_DEFINITIONS": "DEBUG",
"SWIFT_ACTIVE_COMPILATION_CONDITIONS": "DEBUG",
}
proj_settings = {
"base": proj_settings_base,
"configs": {
"Debug": proj_settings_debug,
},
}

targets = []
all_transitive_targets = depset(transitive = _get_attr_values_for_name(ctx.attr.deps, _TargetInfo, "targets")).to_list()
Expand Down Expand Up @@ -269,10 +309,24 @@ def _xcodeproj_impl(ctx):
fi = "$BAZEL_WORKSPACE_ROOT/%s" % fi
framework_search_paths.append("\"%s\"" % fi)
target_settings["FRAMEWORK_SEARCH_PATHS"] = " ".join(framework_search_paths)
target_settings["GCC_PREPROCESSOR_DEFINITIONS"] = " ".join(["\"%s\"" % d for d in target_info.cc_defines.to_list()])

macros = ["\"%s\"" % d for d in target_info.cc_defines.to_list()]
macros.append("$(inherited)")
target_settings["GCC_PREPROCESSOR_DEFINITIONS"] = " ".join(macros)

defines_without_equal_sign = ["$(inherited)"]
for d in target_info.swift_defines.to_list():
d = _exclude_swift_incompatible_define(d)
if d != None:
defines_without_equal_sign.append(d)
target_settings["SWIFT_ACTIVE_COMPILATION_CONDITIONS"] = " ".join(
["\"%s\"" % d for d in defines_without_equal_sign],
)

if target_info.product_type == "application":
target_settings["INFOPLIST_FILE"] = "$BAZEL_STUBS_DIR/Info-stub.plist"
target_settings["PRODUCT_BUNDLE_IDENTIFIER"] = target_info.bundle_id

if target_info.product_type == "bundle.unit-test":
target_settings["SUPPORTS_MACCATALYST"] = False
target_dependencies = []
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,10 +271,11 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = ObjcFramework;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Release;
Expand All @@ -295,9 +296,11 @@
CXX = $CC;
DEBUG_INFORMATION_FORMAT = dwarf;
DONT_RUN_SWIFT_STDLIB_TOOL = 1;
GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
LD = "$BAZEL_STUBS_DIR/ld-stub";
LIBTOOL = /usr/bin/true;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EXEC = "$BAZEL_STUBS_DIR/swiftc-stub";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_VERSION = 5;
Expand All @@ -311,10 +314,11 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT/bazel-out/applebin_ios-ios_x86_64-fastbuild-ST-cecbe3cb5ea2880cd67bf87ed1de59490130c0d897af2739d7b0f3dd10b40f24/bin/tests/ios/frameworks/objc/ObjcFramework\"";
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = ObjcFrameworkTestLib;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Debug;
Expand All @@ -326,10 +330,11 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = ObjcFramework;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Debug;
Expand Down Expand Up @@ -366,11 +371,12 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT/bazel-out/applebin_ios-ios_x86_64-fastbuild-ST-cecbe3cb5ea2880cd67bf87ed1de59490130c0d897af2739d7b0f3dd10b40f24/bin/tests/ios/frameworks/objc/ObjcFramework\" \"$BAZEL_WORKSPACE_ROOT/bazel-out/applebin_ios-ios_x86_64-fastbuild-ST-b6e49002cb7dafa9fcd24b0dd76f1c63efbe73d59588c29fc9a7b41408f04f90/bin/tests/ios/frameworks/objc/ObjcFrameworkTestLib\"";
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = ObjcFrameworkTests;
SUPPORTS_MACCATALYST = 0;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Debug;
Expand All @@ -382,11 +388,12 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT/bazel-out/applebin_ios-ios_x86_64-fastbuild-ST-cecbe3cb5ea2880cd67bf87ed1de59490130c0d897af2739d7b0f3dd10b40f24/bin/tests/ios/frameworks/objc/ObjcFramework\" \"$BAZEL_WORKSPACE_ROOT/bazel-out/applebin_ios-ios_x86_64-fastbuild-ST-b6e49002cb7dafa9fcd24b0dd76f1c63efbe73d59588c29fc9a7b41408f04f90/bin/tests/ios/frameworks/objc/ObjcFrameworkTestLib\"";
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = ObjcFrameworkTests;
SUPPORTS_MACCATALYST = 0;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Release;
Expand All @@ -398,10 +405,11 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "\"$BAZEL_WORKSPACE_ROOT/bazel-out/applebin_ios-ios_x86_64-fastbuild-ST-cecbe3cb5ea2880cd67bf87ed1de59490130c0d897af2739d7b0f3dd10b40f24/bin/tests/ios/frameworks/objc/ObjcFramework\"";
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = ObjcFrameworkTestLib;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Release;
Expand Down
10 changes: 8 additions & 2 deletions tests/macos/xcodeproj/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ ios_unit_test(
name = "Single-Application-UnitTests",
srcs = ["test.swift"],
args = ["-h"],
defines = ["REQUIRED_DEFINED_FLAG"],
defines = [
"REQUIRED_DEFINED_FLAG=1",
"FLAG_WITH_VALUE_ZERO=0",
],
env = {
"test_envvar_key1": "test_envvar_value1",
"test_envvar_key2": "test_envvar_value2",
Expand Down Expand Up @@ -38,7 +41,10 @@ ios_unit_test(
name = "Single-Application-RunnableTestSuite",
srcs = ["test.swift"],
args = ["-h"],
defines = ["REQUIRED_DEFINED_FLAG"],
defines = [
"REQUIRED_DEFINED_FLAG=1",
"FLAG_WITH_VALUE_ZERO=0",
],
env = {
"test_envvar_key1": "test_envvar_value1",
"test_envvar_key2": "test_envvar_value2",
Expand Down
7 changes: 7 additions & 0 deletions tests/macos/xcodeproj/NonArcObject.m
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
#import "NonArcObject.h"

@implementation NonArcObject
#if REQUIRED_DEFINED_FLAG
@end
#endif

#if FLAG_WITH_VALUE_ZERO
Note: Should not produce build error or index error (on xcode) here because
$FLAG_WITH_VALUE_ZERO should set to to zero
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -285,11 +285,12 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_PREPROCESSOR_DEFINITIONS = "\"REQUIRED_DEFINED_FLAG\"";
GCC_PREPROCESSOR_DEFINITIONS = "\"REQUIRED_DEFINED_FLAG=1\" \"FLAG_WITH_VALUE_ZERO=0\" $(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = "Single-Application-UnitTests";
SUPPORTS_MACCATALYST = 0;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\" \"REQUIRED_DEFINED_FLAG\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Debug;
Expand All @@ -301,12 +302,13 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
INFOPLIST_FILE = "$BAZEL_STUBS_DIR/Info-stub.plist";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.example.ios-app-host-12.0";
PRODUCT_NAME = "iOS-12.0-AppHost";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Debug;
Expand All @@ -318,12 +320,13 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_PREPROCESSOR_DEFINITIONS = "";
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
INFOPLIST_FILE = "$BAZEL_STUBS_DIR/Info-stub.plist";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.example.ios-app-host-12.0";
PRODUCT_NAME = "iOS-12.0-AppHost";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Release;
Expand All @@ -344,9 +347,11 @@
CXX = $CC;
DEBUG_INFORMATION_FORMAT = dwarf;
DONT_RUN_SWIFT_STDLIB_TOOL = 1;
GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
LD = "$BAZEL_STUBS_DIR/ld-stub";
LIBTOOL = /usr/bin/true;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EXEC = "$BAZEL_STUBS_DIR/swiftc-stub";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_VERSION = 5;
Expand Down Expand Up @@ -385,11 +390,12 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_PREPROCESSOR_DEFINITIONS = "\"REQUIRED_DEFINED_FLAG\"";
GCC_PREPROCESSOR_DEFINITIONS = "\"REQUIRED_DEFINED_FLAG=1\" \"FLAG_WITH_VALUE_ZERO=0\" $(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = "Single-Application-RunnableTestSuite";
SUPPORTS_MACCATALYST = 0;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\" \"REQUIRED_DEFINED_FLAG\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Debug;
Expand All @@ -401,11 +407,12 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_PREPROCESSOR_DEFINITIONS = "\"REQUIRED_DEFINED_FLAG\"";
GCC_PREPROCESSOR_DEFINITIONS = "\"REQUIRED_DEFINED_FLAG=1\" \"FLAG_WITH_VALUE_ZERO=0\" $(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = "Single-Application-RunnableTestSuite";
SUPPORTS_MACCATALYST = 0;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\" \"REQUIRED_DEFINED_FLAG\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Release;
Expand All @@ -417,11 +424,12 @@
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
FRAMEWORK_SEARCH_PATHS = "";
GCC_PREPROCESSOR_DEFINITIONS = "\"REQUIRED_DEFINED_FLAG\"";
GCC_PREPROCESSOR_DEFINITIONS = "\"REQUIRED_DEFINED_FLAG=1\" \"FLAG_WITH_VALUE_ZERO=0\" $(inherited)";
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MACH_O_TYPE = "$(inherited)";
PRODUCT_NAME = "Single-Application-UnitTests";
SUPPORTS_MACCATALYST = 0;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "\"$(inherited)\" \"REQUIRED_DEFINED_FLAG\"";
VALID_ARCHS = "arm64 arm64e";
};
name = Release;
Expand Down
Loading

0 comments on commit 0f34ead

Please sign in to comment.