blob: 0a9efa721c0b07d64ecc367d832a320f992812f4 [file] [log] [blame]
michajlocab889d2020-02-20 17:48:36 -08001// Copyright 2020 The Bazel Authors. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.devtools.build.lib.packages;
16
Googler31c51b92023-05-12 09:38:54 -070017import java.util.Map;
Googler0511bb42023-05-17 14:34:51 -070018import net.starlark.java.annot.Param;
19import net.starlark.java.annot.StarlarkMethod;
adonovan450c7ad2020-09-14 13:00:21 -070020import net.starlark.java.eval.EvalException;
Googler31c51b92023-05-12 09:38:54 -070021import net.starlark.java.eval.Starlark;
Googler31c51b92023-05-12 09:38:54 -070022import net.starlark.java.eval.StarlarkThread;
michajlocab889d2020-02-20 17:48:36 -080023
Googler31c51b92023-05-12 09:38:54 -070024/**
Googler0511bb42023-05-17 14:34:51 -070025 * Utility class encapsulating the standard definition of the {@code package()} function of BUILD
26 * files.
Googler31c51b92023-05-12 09:38:54 -070027 */
28public class PackageCallable {
michajlocab889d2020-02-20 17:48:36 -080029
Googler0511bb42023-05-17 14:34:51 -070030 protected PackageCallable() {}
31
32 public static final PackageCallable INSTANCE = new PackageCallable();
33
34 @StarlarkMethod(
35 name = "package",
36 documented = false, // documented in docgen/templates/be/functions.vm
37 extraKeywords = @Param(name = "kwargs", defaultValue = "{}"),
38 useStarlarkThread = true)
39 public Object packageCallable(Map<String, Object> kwargs, StarlarkThread thread)
40 throws EvalException {
Googler57e4ff52024-07-03 08:20:48 -070041 Package.Builder pkgBuilder = Package.Builder.fromOrFailAllowBuildOnly(thread, "package()");
Googler0511bb42023-05-17 14:34:51 -070042 if (pkgBuilder.isPackageFunctionUsed()) {
43 throw new EvalException("'package' can only be used once per BUILD file");
44 }
45 pkgBuilder.setPackageFunctionUsed();
46
47 if (kwargs.isEmpty()) {
48 throw new EvalException("at least one argument must be given to the 'package' function");
49 }
50
Googler1f18b192023-06-12 12:23:56 -070051 PackageArgs.Builder pkgArgsBuilder = PackageArgs.builder();
Googler0511bb42023-05-17 14:34:51 -070052 for (Map.Entry<String, Object> kwarg : kwargs.entrySet()) {
53 String name = kwarg.getKey();
54 Object rawValue = kwarg.getValue();
Googler1f18b192023-06-12 12:23:56 -070055 processParam(name, rawValue, pkgBuilder, pkgArgsBuilder);
Googler0511bb42023-05-17 14:34:51 -070056 }
Googler1f18b192023-06-12 12:23:56 -070057 pkgBuilder.mergePackageArgsFrom(pkgArgsBuilder);
Googler0511bb42023-05-17 14:34:51 -070058 return Starlark.NONE;
59 }
michajlocab889d2020-02-20 17:48:36 -080060
Googler31c51b92023-05-12 09:38:54 -070061 /**
Googler0511bb42023-05-17 14:34:51 -070062 * Handles one parameter. Subclasses can add new parameters by overriding this method and falling
63 * back on the super method when the parameter does not match.
Googler31c51b92023-05-12 09:38:54 -070064 */
Googler0511bb42023-05-17 14:34:51 -070065 protected void processParam(
Googler1f18b192023-06-12 12:23:56 -070066 String name, Object rawValue, Package.Builder pkgBuilder, PackageArgs.Builder pkgArgsBuilder)
Googler0511bb42023-05-17 14:34:51 -070067 throws EvalException {
Googlere8184e02023-08-30 08:35:42 -070068
Googler1f18b192023-06-12 12:23:56 -070069 PackageArgs.processParam(
70 name,
71 rawValue,
72 "package() argument '" + name + "'",
73 pkgBuilder.getLabelConverter(),
74 pkgArgsBuilder);
michajlocab889d2020-02-20 17:48:36 -080075 }
76}