tree: 413005a023eea2fb574c1844a8d06be7f972408a [path history] [tgz]
  1. AppleBinary.java
  2. AppleBinaryRule.java
  3. AppleCrosstoolTransition.java
  4. AppleDebugOutputsInfo.java
  5. AppleDylibBinaryInfo.java
  6. AppleDynamicFrameworkInfo.java
  7. AppleExecutableBinaryInfo.java
  8. AppleLoadableBundleBinaryInfo.java
  9. AppleSkylarkCommon.java
  10. AppleStaticLibrary.java
  11. AppleStaticLibraryInfo.java
  12. AppleStaticLibraryRule.java
  13. ArtifactListAttribute.java
  14. Attribute.java
  15. BUILD
  16. BundleableFile.java
  17. BundleMergeControlBytes.java
  18. BundleSupport.java
  19. Bundling.java
  20. CompilationArtifacts.java
  21. CompilationAttributes.java
  22. CompilationSupport.java
  23. HeaderThinning.java
  24. IntermediateArtifacts.java
  25. Interspersing.java
  26. IterableWrapper.java
  27. J2ObjcAspect.java
  28. J2ObjcCommandLineOptions.java
  29. J2ObjcConfiguration.java
  30. J2ObjcEntryClassProvider.java
  31. J2ObjcLibrary.java
  32. J2ObjcLibraryBaseRule.java
  33. J2ObjcLibraryRule.java
  34. J2ObjcMappingFileProvider.java
  35. J2ObjcSource.java
  36. LipoSupport.java
  37. MultiArchBinarySupport.java
  38. MultiArchSplitTransitionProvider.java
  39. ObjcBuildInfoFactory.java
  40. ObjcCommandLineOptions.java
  41. ObjcCommon.java
  42. ObjcConfiguration.java
  43. ObjcConfigurationLoader.java
  44. ObjcCppSemantics.java
  45. ObjcImport.java
  46. ObjcImportRule.java
  47. ObjcLibrary.java
  48. ObjcLibraryRule.java
  49. ObjcProtoAspect.java
  50. ObjcProtoLibrary.java
  51. ObjcProtoLibraryRule.java
  52. ObjcProtoProvider.java
  53. ObjcProvider.java
  54. ObjcProviderSkylarkConverters.java
  55. ObjcRuleClasses.java
  56. ObjcVariablesExtension.java
  57. PlMergeControlBytes.java
  58. ProtoAttributes.java
  59. ProtobufSupport.java
  60. README.md
  61. ResourceSupport.java
  62. SdkFramework.java
  63. TargetDeviceFamily.java
  64. Value.java
  65. Xcdatamodel.java
  66. Xcdatamodels.java
src/main/java/com/google/devtools/build/lib/rules/objc/README.md

The Apple Rule Implementations:

The packages devtools/build/lib/rules/objc and devtools/build/lib/rules/apple implement the objc and ios Bazel rules.

Interfacing from Skylark

Information exchange between skylark rules and native objc_* or ios_* rules occurs by three mechanisms:

  1. AppleToolchain:

AppleToolchain.java houses constants and static methods for use in rule implementations. It is accessed in skylark through the global apple_common namespace:

def __impl(ctx):
    platform_dir = apple_common.apple_toolchain().platform_dir('iphoneos')
    sdk_dir = apple_common.apple_toolchain().sdk_dir()
  1. AppleConfiguration and ObjcConfiguration:

In Bazel, configuration fragments are used as containers for invocation-specific build information (that is, information that cannot always be derived strictly from BUILD files). The contents of these configurations can be inspected by looking at rules/objc/ObjcConfiguration.java and rules/apple/AppleConfiguration.java. To access a configuration fragment from skylark, the fragment must be declared in the rule definition:

def __impl(ctx):
    cpu = ctx.fragments.apple.ios_cpu()
my_rule = rule(
  implementation = __impl
  fragments = ['apple']
)
  1. ObjcProvider:

The ObjcProvider maps “keys” to NestedSet instances, where “keys” are singleton objects defined in ObjcProvider that identify a category of transitive information to be communicated between targets in a dependency chain.

Native objc/ios rules export ObjcProvider instances, which are made available to skylark dependants:

def __impl(ctx):
    dep = ctx.attr.deps[0]
    objc_provider = dep.objc

The provider can be queried by accessing fields that correspond to ObjcProvider keys.

    libraries = objc_provider.library  # A SkylarkNestedSet of Artifacts

A skylark rule that is intended to be a dependency of native objc rules should export an ObjcProvider itself. An ObjcProvider is constructed using a constructor exposed on the apple_common namespace.

def __impl(ctx):
    define = 'some_define'
    objc_provider = apple_common.new_objc_provider(define=define)
    return struct(objc = objc_provider)

Arguments to new_objc_provider should correspond to ObjcProvider keys, and values should be skylark sets that should be added to the provider. Other instances of ObjcProvider can also be used in provider construction.

def __impl(ctx):
    dep = ctx.attr.deps[0]
    define = 'some_define'
    objc_provider = apple_common.new_objc_provider(providers=[dep.objc], define=define)
    return struct(objc = objc_provider)