public class Genrule extends BaseGenrule<GenruleBuildable> implements HasOutputName, HasMultipleOutputs
genrule(
name = 'katana_manifest',
srcs = [
'wakizashi_to_katana_manifest.py',
'AndroidManifest.xml',
],
cmd = 'python wakizashi_to_katana_manifest.py ${SRCDIR}/AndroidManfiest.xml > $OUT',
out = 'AndroidManifest.xml',
)
The output of this rule would likely be used as follows:
android_binary(
name = 'katana',
manifest = ':katana_manifest',
deps = [
# Additional dependent android_library rules would be listed here, as well.
],
)
Named outputs are availabe in genrules by using `outs` instead of `out`. Only one of 'out' or 'outs' may be present in a genrule. For example, the aforementioned rule can be defined as:
genrule(
name = 'katana_manifest',
srcs = [
'wakizashi_to_katana_manifest.py',
'AndroidManifest.xml',
],
cmd = 'python wakizashi_to_katana_manifest.py ${SRCDIR}/AndroidManfiest.xml > $OUT',
outs = {
'manifest': [ 'AndroidManifest.xml'] ,
},
)
The key-value pairs in 'outs' define the named output groups provided by this genrule. The
keys are OutputLabel instances, while the values are outputs relative to this genrule's
output directory. Genrule outputs with 'outs' can be consumed using the BuildTargetWithOutputs syntax. For example:
android_binary(
name = 'katana',
manifest = ':katana_manifest[manifest]',
deps = [
# Additional dependent android_library rules would be listed here, as well.
],
)
If a rule with 'outs' is consumed without an output label, the default output group is returned. Currently, the default output group is an empty set. In the future, it would be the set of all named outputs.
A genrule is evaluated by running the shell command specified by cmd with
the following environment variable substitutions:
SRCS will be a space-delimited string expansion of the srcs
attribute where each element of srcs will be translated into an absolute path.
SRCDIR will be a directory containing all files mentioned in the srcs.
TMP will be a temporary directory which can be used for intermediate results
OUT is the output file for the genrule() if 'out' is used.
If using `outs`, it is the output directory. The file specified by this variable must
always be written by this command. If not, the execution of this rule will be considered a
failure, halting the build process.
katana_manifest rule were defined in the src/com/facebook/wakizashi directory, then the command that would be executed would be:
python convert_to_katana.py src/com/facebook/wakizashi/AndroidManifest.xml > \
buck-out/gen/src/com/facebook/wakizashi/AndroidManifest.xml
Note that cmd could be run on either Mac or Linux, so it should contain logic that works
on either platform. If this becomes an issue in the future (or we want to support building on
different platforms), then we could introduce a new attribute that is a map of target platforms
to the appropriate build command for that platform.
Note that the SRCDIR is populated by symlinking the sources.
| Modifier | Constructor and Description |
|---|---|
protected |
Genrule(BuildTarget buildTarget,
ProjectFilesystem projectFilesystem,
BuildRuleResolver buildRuleResolver,
SandboxExecutionStrategy sandboxExecutionStrategy,
SourceSet srcs,
Optional<Arg> cmd,
Optional<Arg> bash,
Optional<Arg> cmdExe,
Optional<String> type,
Optional<String> out,
Optional<com.google.common.collect.ImmutableMap<String,com.google.common.collect.ImmutableSet<String>>> outs,
boolean enableSandboxingInGenrule,
boolean isCacheable,
Optional<String> environmentExpansionSeparator,
Optional<AndroidTools> androidTools,
boolean executeRemotely) |
getOutputLabels, getOutputName, getSourcePathToOutput, getSourcePathToOutput, getType, isCacheablecompareTo, getBuildable, getBuildCellPathFactory, getBuildDeps, getBuildSteps, getOutputPathResolver, getSetupStepsForBuildable, getSourcePath, getSourcePaths, injectFieldsIfNecessary, inputBasedRuleKeyIsEnabled, recordOutputs, recordOutputs, recordOutputs, stepsForBuildable, stepsForBuildable, updateBuildRuleResolverequals, getBuildTarget, getDependencies, getProjectFilesystem, getSourcePathOutputs, hasBuildSteps, hashCode, injectFields, toStringclone, finalize, getClass, notify, notifyAll, wait, wait, waitgetOutputNamegetOutputLabels, getSourcePathToOutput, getSourcePathToOutputcompareTo, getBuildDeps, getBuildSteps, getBuildTarget, getFullyQualifiedName, getProjectFilesystem, hasBuildSteps, isCacheable, outputFileCanBeCopied, shouldRespectInputSizeLimitForRemoteExecution, toString, updateBuildRuleResolvergetDependencies, getSourcePathOutputsgetTypeisSupportedprotected Genrule(BuildTarget buildTarget, ProjectFilesystem projectFilesystem, BuildRuleResolver buildRuleResolver, SandboxExecutionStrategy sandboxExecutionStrategy, SourceSet srcs, Optional<Arg> cmd, Optional<Arg> bash, Optional<Arg> cmdExe, Optional<String> type, Optional<String> out, Optional<com.google.common.collect.ImmutableMap<String,com.google.common.collect.ImmutableSet<String>>> outs, boolean enableSandboxingInGenrule, boolean isCacheable, Optional<String> environmentExpansionSeparator, Optional<AndroidTools> androidTools, boolean executeRemotely)