Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions apple/internal/resource_actions/datamodel.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ def generate_datamodels(
datamodel_path,
input_files,
output_dir,
outputs,
platform_prerequisites,
xctoolrunner,
swift_version = None):
Expand All @@ -119,6 +120,7 @@ def generate_datamodels(
datamodel_path: The path to the directory containing the datamodels.
input_files: The list of files to process for the given datamodel.
output_dir: The output directory reference where generated datamodel classes will be.
outputs: The list of generated datamodel files or the directory containing those files.
platform_prerequisites: Struct containing information on the platform being targeted.
xctoolrunner: A files_to_run for the wrapper around the "xcrun" tool.
swift_version: (optional) Target Swift version for generated datamodel classes.
Expand All @@ -136,9 +138,9 @@ def generate_datamodels(
args.add("--swift-version", swift_version)

args.add(xctoolrunner_support.prefixed_path(datamodel_path))
args.add(xctoolrunner_support.prefixed_path(output_dir.path))
args.add(xctoolrunner_support.prefixed_path(output_dir))

args.add("--xctoolrunner_assert_nonempty_dir", output_dir.path)
args.add("--xctoolrunner_assert_nonempty_dir", output_dir)

apple_support.run(
actions = actions,
Expand All @@ -147,6 +149,6 @@ def generate_datamodels(
executable = xctoolrunner,
inputs = input_files,
mnemonic = "MomGenerate",
outputs = [output_dir],
outputs = outputs,
xcode_config = platform_prerequisites.xcode_version_config,
)
25 changes: 20 additions & 5 deletions apple/internal/resource_rules/apple_core_data_model.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,13 @@ def _apple_core_data_model_impl(ctx):
["xcdatamodeld"],
attr = "datamodels",
)
output_file_groups = group_files_by_directory(
ctx.outputs.outs,
["coredata.sources"],
attr = "sources",
)

output_files = []
output_files = list(ctx.outputs.outs)
for datamodel_path, files in datamodel_groups.items():
datamodel_name = paths.replace_extension(
paths.basename(datamodel_path),
Expand All @@ -97,20 +102,24 @@ def _apple_core_data_model_impl(ctx):
datamodel_name.lower(),
ctx.label.name,
)
output_dir = actions.declare_directory(dir_name)
output_dir_path = "{}/{}/{}".format(ctx.genfiles_dir.path, ctx.label.package, dir_name)
data_model_outputs = output_file_groups.get(output_dir_path, depset()).to_list()
if len(data_model_outputs) == 0:
output_dir = actions.declare_directory(dir_name)
data_model_outputs.append(output_dir)
output_files.append(output_dir)

resource_actions.generate_datamodels(
actions = actions,
datamodel_path = datamodel_path,
input_files = files.to_list(),
output_dir = output_dir,
output_dir = output_dir_path,
outputs = data_model_outputs,
platform_prerequisites = platform_prerequisites,
swift_version = swift_version,
xctoolrunner = apple_mac_toolchain_info.xctoolrunner,
)

output_files.append(output_dir)

return [DefaultInfo(files = depset(output_files))]

apple_core_data_model = rule(
Expand All @@ -127,6 +136,12 @@ apple_core_data_model = rule(
"swift_version": attr.string(
doc = "Target Swift version for generated classes.",
),
"outs": attr.output_list(
doc = """
An optional list of expected output files. If not empty, the rule will
return these files individually rather than returning a directory.
""",
),
},
),
fragments = ["apple"],
Expand Down
3 changes: 2 additions & 1 deletion doc/rules-resources.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ targets (i.e. `apple_resource_bundle` and `apple_resource_group`) through the
## apple_core_data_model

<pre>
apple_core_data_model(<a href="#apple_core_data_model-name">name</a>, <a href="#apple_core_data_model-srcs">srcs</a>, <a href="#apple_core_data_model-swift_version">swift_version</a>)
apple_core_data_model(<a href="#apple_core_data_model-name">name</a>, <a href="#apple_core_data_model-srcs">srcs</a>, <a href="#apple_core_data_model-outs">outs</a>, <a href="#apple_core_data_model-swift_version">swift_version</a>)
</pre>

This rule takes a Core Data model definition from a .xcdatamodeld bundle
Expand All @@ -44,6 +44,7 @@ dependency to a swift_library target.
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="apple_core_data_model-name"></a>name | A unique name for this target. | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required | |
| <a id="apple_core_data_model-srcs"></a>srcs | - | <a href="https://bazel.build/concepts/labels">List of labels</a> | required | |
| <a id="apple_core_data_model-outs"></a>outs | An optional list of expected output files. If not empty, the rule will return these files individually rather than returning a directory. | List of labels | optional | `[]` |
| <a id="apple_core_data_model-swift_version"></a>swift_version | Target Swift version for generated classes. | String | optional | `""` |


Expand Down
11 changes: 11 additions & 0 deletions test/starlark_tests/apple_core_data_model_tests.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,17 @@ def apple_core_data_model_test_suite(name):
tags = [name],
)

# Test outputs a list of files rather than directories
analysis_target_outputs_test(
name = "{}_outputs_explicit_swift_files_test".format(name),
target_under_test = "//test/starlark_tests/targets_under_test/apple:explicit_outs_data_model",
expected_outputs = [
"swift_datamodel.explicit_outs_data_model.coredata.sources/Item+CoreDataProperties.swift",
"swift_datamodel.explicit_outs_data_model.coredata.sources/swift_datamodel+CoreDataModel.swift",
],
tags = [name],
)

# Test registered actions and mnemonics for Obj-C and Swift data models.
analysis_target_actions_test(
name = "{}_actions_swift_test".format(name),
Expand Down
12 changes: 12 additions & 0 deletions test/starlark_tests/targets_under_test/apple/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,18 @@ apple_core_data_model(
tags = common.fixture_tags,
)

apple_core_data_model(
name = "explicit_outs_data_model",
srcs = [
"//test/starlark_tests/resources:swift_datamodel",
],
outs = [
"swift_datamodel.explicit_outs_data_model.coredata.sources/Item+CoreDataProperties.swift",
"swift_datamodel.explicit_outs_data_model.coredata.sources/swift_datamodel+CoreDataModel.swift",
],
tags = common.fixture_tags,
)

objc_library(
name = "fmwk_lib",
srcs = [
Expand Down