|
| 1 | +load("//src/main/starlark/core/compile:common.bzl", "TYPE") |
| 2 | + |
| 3 | +def compile_kotlin_for_jvm( |
| 4 | + actions, |
| 5 | + srcs, |
| 6 | + dep_jars, |
| 7 | + class_jar, |
| 8 | + module_name, |
| 9 | + path_separator, |
| 10 | + toolchain_info, |
| 11 | + kotlinc_opts, |
| 12 | + output_srcjar = None): |
| 13 | + if not srcs: |
| 14 | + actions.run( |
| 15 | + outputs = [output_srcjar], |
| 16 | + executable = toolchain_info.executable_zip, |
| 17 | + inputs = srcs, |
| 18 | + arguments = [actions.args().add("c").add(output_srcjar)], |
| 19 | + mnemonic = "EmptyJar", |
| 20 | + toolchain = TYPE, |
| 21 | + ) |
| 22 | + actions.run( |
| 23 | + outputs = [class_jar], |
| 24 | + executable = toolchain_info.executable_zip, |
| 25 | + inputs = srcs, |
| 26 | + arguments = [actions.args().add("c").add(output_srcjar)], |
| 27 | + mnemonic = "EmptyJar", |
| 28 | + toolchain = TYPE, |
| 29 | + ) |
| 30 | + return |
| 31 | + |
| 32 | + classpath = depset( |
| 33 | + transitive = [ |
| 34 | + dep_jars, |
| 35 | + toolchain_info.kotlin_stdlib.transitive_compile_time_jars, |
| 36 | + ], |
| 37 | + ) |
| 38 | + |
| 39 | + args = actions.args().add("-d", class_jar) |
| 40 | + args.add("-jdk-home", toolchain_info.java_runtime.java_home) |
| 41 | + args.add("-jvm-target", toolchain_info.jvm_target) |
| 42 | + args.add("-no-stdlib") |
| 43 | + args.add("-verbose") |
| 44 | + args.add("-api-version", toolchain_info.api_version) |
| 45 | + args.add("-language-version", toolchain_info.language_version) |
| 46 | + args.add("-module-name", module_name) |
| 47 | + args.add_joined("-cp", classpath, join_with = path_separator) |
| 48 | + for (k, v) in kotlinc_opts.items(): |
| 49 | + args.add(k, v) |
| 50 | + args.add_all(srcs) |
| 51 | + |
| 52 | + actions.run( |
| 53 | + outputs = [class_jar], |
| 54 | + executable = toolchain_info.kotlinc, |
| 55 | + inputs = depset(direct = srcs, transitive = [classpath, toolchain_info.java_runtime.files]), |
| 56 | + arguments = [args], |
| 57 | + mnemonic = toolchain_info.compile_mnemonic, |
| 58 | + toolchain = TYPE, |
| 59 | + ) |
| 60 | + |
| 61 | + if output_srcjar: |
| 62 | + actions.run( |
| 63 | + outputs = [output_srcjar], |
| 64 | + executable = toolchain_info.executable_zip, |
| 65 | + inputs = srcs, |
| 66 | + arguments = [actions.args().add("c").add(output_srcjar).add_all(srcs)], |
| 67 | + mnemonic = "SourceJar", |
| 68 | + toolchain = TYPE, |
| 69 | + ) |
| 70 | + |
| 71 | +def write_jvm_launcher(toolchain_info, actions, path_separator, workspace_prefix, jvm_flags, runtime_jars, main_class, executable_output): |
| 72 | + template = toolchain_info.java_stub_template |
| 73 | + java_runtime = toolchain_info.java_runtime |
| 74 | + java_bin_path = java_runtime.java_executable_runfiles_path |
| 75 | + |
| 76 | + # Following https://github.com/bazelbuild/bazel/blob/6d5b084025a26f2f6d5041f7a9e8d302c590bc80/src/main/starlark/builtins_bzl/bazel/java/bazel_java_binary.bzl#L66-L67 |
| 77 | + # Enable the security manager past deprecation. |
| 78 | + # On bazel 6, this check isn't possible... |
| 79 | + if getattr(java_runtime, "version", 0) >= 17: |
| 80 | + jvm_flags = jvm_flags + " -Djava.security.manager=allow" |
| 81 | + |
| 82 | + classpath = path_separator.join( |
| 83 | + ["${RUNPATH}%s" % (j.short_path) for j in runtime_jars.to_list() + toolchain_info.kotlin_stdlib.transitive_compile_time_jars.to_list()], |
| 84 | + ) |
| 85 | + needs_runfiles = "0" if java_bin_path.startswith("/") or (len(java_bin_path) > 2 and java_bin_path[1] == ":") else "1" |
| 86 | + |
| 87 | + actions.expand_template( |
| 88 | + template = template, |
| 89 | + output = executable_output, |
| 90 | + substitutions = { |
| 91 | + "%classpath%": classpath, |
| 92 | + "%runfiles_manifest_only%": "", |
| 93 | + "%java_start_class%": main_class, |
| 94 | + "%javabin%": "JAVABIN=" + java_bin_path, |
| 95 | + "%jvm_flags%": jvm_flags, |
| 96 | + "%set_jacoco_metadata%": "", |
| 97 | + "%set_jacoco_main_class%": "", |
| 98 | + "%set_jacoco_java_runfiles_root%": "", |
| 99 | + "%set_java_coverage_new_implementation%": """export JAVA_COVERAGE_NEW_IMPLEMENTATION=NO""", |
| 100 | + "%workspace_prefix%": workspace_prefix, |
| 101 | + "%test_runtime_classpath_file%": "export TEST_RUNTIME_CLASSPATH_FILE=${JAVA_RUNFILES}", |
| 102 | + "%needs_runfiles%": needs_runfiles, |
| 103 | + }, |
| 104 | + is_executable = True, |
| 105 | + ) |
| 106 | + |
| 107 | + return depset( |
| 108 | + transitive = [ |
| 109 | + runtime_jars, |
| 110 | + java_runtime.files, |
| 111 | + toolchain_info.kotlin_stdlib.transitive_compile_time_jars, |
| 112 | + ], |
| 113 | + ) |
| 114 | + |
| 115 | +def build_deploy_jar(toolchain_info, actions, jars, output_jar): |
| 116 | + args = actions.args() |
| 117 | + args.add("--exclude_build_data") |
| 118 | + args.add("--dont_change_compression") |
| 119 | + args.add_all("--sources", jars) |
| 120 | + args.add("--normalize") |
| 121 | + args.add("--output", output_jar) |
| 122 | + actions.run( |
| 123 | + inputs = jars, |
| 124 | + outputs = [output_jar], |
| 125 | + executable = toolchain_info.single_jar, |
| 126 | + mnemonic = "SingleJar", |
| 127 | + arguments = [args], |
| 128 | + toolchain = TYPE, |
| 129 | + ) |
0 commit comments