""" # Usage overview Building the extractor can be done with bazel. If building from the internal repository, it is recommended to use `tools/bazel` from there. A specific kotlin extractor variant can be built with ``` bazel build @codeql//java/kotlin-extractor:codeql-extractor-kotlin-- ``` where `` is either `standalone` or `embeddable`, and `` is one of the supported versions. ``` bazel build @codeql//java/kotlin-extractor ``` will build a default variant: * standalone, unless `CODEQL_KOTLIN_SINGLE_VERSION_EMBEDDABLE` is set to true, in which case it will go for embeddable * the version will be taken as the last supported version less than the version of the currently installed `kotlinc` * if `CODEQL_KOTLIN_SINGLE_VERSION` is set, that will be used instead * if `kotlinc` is not installed, `1.9.20-Beta` will be used If `kotlinc` is updated, bazel won't be aware of it and will therefore keep the same default version. Possible workarounds for that: * `bazel clean` * `bazel fetch --force @codeql//java/kotlin-extractor` * `bazel fetch --force @codeql_kotlin_defaults//:all` (only from `codeql`) If building from the `codeql` repository, `@codeql` can be skipped. """ # This file is used in the `@codeql_kotlin_embeddable` external repo, which means we need to # reference explicitly @codeql load( "@codeql//java/kotlin-extractor:versions.bzl", "VERSIONS", "get_compatilibity_sources", "get_language_version", "version_less", ) load("@rules_kotlin//kotlin:core.bzl", "kt_javac_options", "kt_kotlinc_options") load("@rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") package(default_visibility = ["//java/kotlin-extractor:__subpackages__"]) _for_embeddable = repo_name().endswith("codeql_kotlin_embeddable") _common_extractor_name_prefix = "codeql-extractor-kotlin" _extractor_name_prefix = "%s-%s" % ( _common_extractor_name_prefix, "embeddable" if _for_embeddable else "standalone", ) py_binary( name = "generate_dbscheme", srcs = ["generate_dbscheme.py"], ) _resources = [ ( r, r[len("src/main/resources/"):], ) for r in glob(["src/main/resources/**"]) ] kt_javac_options( name = "javac-options", release = "8", ) [ ( kt_kotlinc_options( name = "kotlinc-options-%s" % v, include_stdlibs = "none", jvm_target = "1.8", language_version = get_language_version(v), warn = "error", x_optin = [ "kotlin.RequiresOptIn", "org.jetbrains.kotlin.ir.symbols.%s" % ("IrSymbolInternals" if version_less(v, "2.0.0") else "UnsafeDuringIrConstructionAPI"), ], x_suppress_version_warnings = True, ), # * extractor.name is different for each version, so we need to put it in different output dirs # * in order to put it in `resources`, we need to define `resource_strip_prefix` to strip this version # * `resource_strip_prefix` is unique per jar, so we must also put other resources under the same version prefix genrule( name = "resources-%s" % v, srcs = [src for src, _ in _resources], outs = [ "%s/com/github/codeql/extractor.name" % v, ] + [ "%s/%s" % (v, target) for _, target in _resources ], cmd = "\n".join([ "echo %s-%s > $(RULEDIR)/%s/com/github/codeql/extractor.name" % (_extractor_name_prefix, v, v), ] + [ "cp $(execpath %s) $(RULEDIR)/%s/%s" % (source, v, target) for source, target in _resources ]), ), kt_jvm_library( name = "%s-%s" % (_extractor_name_prefix, v), srcs = ["@codeql//java/kotlin-extractor:generated-dbscheme"] + glob( [ "src/**/*.kt", "src/**/*.java", ], exclude = ["src/main/kotlin/utils/versions/**"], ) + get_compatilibity_sources(v, "src/main/kotlin/utils/versions"), javac_opts = ":javac-options", kotlinc_opts = ":kotlinc-options-%s" % v, module_name = "codeql-kotlin-extractor", # resource_strip_prefix is very nit-picky: the following makes it work from # `codeql`, `@codeql_kotlin_embeddable` and `semmle-code` resource_strip_prefix = ( ("../%s/" % repo_name() if repo_name() else "") + ("%s/" % package_name() if package_name() else "") + v ), resources = [ ":resources-%s" % v, ], visibility = ["//visibility:public"], deps = [ "@kotlin-compiler%s-%s" % ( "-embeddable" if _for_embeddable else "", v, ), "@kotlin-stdlib-%s" % v, ], ), # if in main repository, alias the embeddable versions from the modified @codeql_kotlin_embeddable repo alias( name = "%s-embeddable-%s" % (_common_extractor_name_prefix, v), actual = "@codeql_kotlin_embeddable//:%s-embeddable-%s" % (_common_extractor_name_prefix, v), visibility = ["//visibility:public"], ) if not _for_embeddable else None, ) for v in VERSIONS ] ( genrule( name = "generated-dbscheme", srcs = ["@codeql//java:dbscheme"], outs = ["KotlinExtractorDbScheme.kt"], cmd = "$(execpath :generate_dbscheme) $< $@", tools = [":generate_dbscheme"], visibility = ["@codeql_kotlin_embeddable//:__pkg__"], ), [ alias( name = n, actual = "//java/kotlin-extractor/defaults:%s" % n, visibility = ["//visibility:public"], ) for n in ( "%s-standalone" % _common_extractor_name_prefix, "%s-embeddable" % _common_extractor_name_prefix, _common_extractor_name_prefix, ) ], alias( name = "kotlin-extractor", actual = _common_extractor_name_prefix, visibility = ["//visibility:public"], ), filegroup( name = "many", srcs = ["%s-%s-%s" % ( _common_extractor_name_prefix, variant, version, ) for variant in ("standalone", "embeddable") for version in VERSIONS], visibility = ["//visibility:public"], ), sh_binary( name = "print-default-version", srcs = ["//java/kotlin-extractor/defaults:default-version-printer"], ), ) if not _for_embeddable else None