View Raw Ebuild
# Copyright 2021-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
MAVEN_ID="org.jetbrains.kotlin:${PN}:${PV}"
KOTLIN_LIBS_BINJAR_SRC_URI="https://repo1.maven.org/maven2/org/jetbrains/kotlin/${PN}/${PV}/${P}.jar"
KOTLIN_LIBS_SRCJAR_SRC_URI="https://repo1.maven.org/maven2/org/jetbrains/kotlin/${PN}/${PV}/${P}-sources.jar"
inherit kotlin-libs
DESCRIPTION="Kotlin Standard Library for JS"
KEYWORDS="~amd64"
# kotlin.js and default/manifest do not match
RESTRICT="test"
JAVA_BINJAR_FILENAME="${P}.jar"
KOTLIN_LIBS_SRCJAR_FILENAME="${P}-sources.jar"
# No -module-name option for Kotlin/JS compiler
KOTLIN_MODULE_NAME=""
KOTLIN_KOTLINC_JAVA_OPTS="-Xmx1024M"
KOTLIN_LIBS_RUNTIME_COMPONENT="Main"
src_compile() {
if in_iuse binary && use binary; then
kotlin-libs_src_compile
return
fi
export KOTLIN_COMPILER=org.jetbrains.kotlin.cli.js.K2JSCompiler
local target="target"
local src_dirs
# :kotlin-stdlib-js:compileBuiltinsKotlin2Js
local builtins_target="${target}/classes/builtins"
KOTLIN_KOTLINC_ARGS=(
-main noCall
-module-kind commonjs
-no-stdlib
-source-map
-source-map-base-dirs libraries/stdlib/js-v1
-source-map-prefix ./
-target v5
-Xallow-kotlin-package
-Xmulti-platform
)
src_dirs=(
libraries/stdlib/js-v1/runtime
)
KOTLIN_SRC_DIR+=( "${src_dirs[@]}" )
kotlin-utils_kotlinc -output "${builtins_target}/kotlin.js" \
core/builtins/native/kotlin/Comparable.kt \
libraries/stdlib/js/runtime/primitiveCompanionObjects.kt \
$(find "${src_dirs[@]}" -name "*.kt")
# :kotlin-stdlib-js:prepareBuiltinsSources
local builtin_sources_dir="${target}/builtin-sources"
local builtin_cp_target="${builtin_sources_dir}/kotlin"
mkdir -p "${builtin_cp_target}" ||
die "Could not create built-in sources directory"
cp \
core/builtins/native/kotlin/Annotation.kt \
core/builtins/native/kotlin/CharSequence.kt \
core/builtins/native/kotlin/Collections.kt \
core/builtins/native/kotlin/Iterator.kt \
core/builtins/src/kotlin/Function.kt \
core/builtins/src/kotlin/Iterators.kt \
core/builtins/src/kotlin/Progressions.kt \
core/builtins/src/kotlin/ProgressionIterators.kt \
core/builtins/src/kotlin/Range.kt \
core/builtins/src/kotlin/Ranges.kt \
core/builtins/src/kotlin/Unit.kt \
"${builtin_cp_target}" || die "Failed to copy built-in sources"
cp -r core/builtins/src/kotlin/{annotation,internal} \
"${builtin_cp_target}" || die "Failed to copy built-in sources"
# :kotlin-stdlib-js:compileKotlin2Js
local main_target="${target}/classes/main"
local source_map_base_dirs_args=(
"${builtin_sources_dir}"
libraries/stdlib/js-v1/src
libraries/stdlib/js/src
libraries/stdlib/src
libraries/stdlib/{common,unsigned}/src
)
local OLD_IFS="${IFS}"
IFS=':'
local source_map_base_dirs="${source_map_base_dirs_args[*]}"
IFS="${OLD_IFS}"
KOTLIN_COMMON_SOURCES_DIR=( libraries/stdlib/{,common,unsigned}/src )
KOTLIN_KOTLINC_ARGS=(
-main noCall
-meta-info
-module-kind commonjs
-no-stdlib
-source-map
-source-map-base-dirs "${source_map_base_dirs}"
-source-map-prefix ./
-target v5
-Xallow-kotlin-package
-Xmulti-platform
-Xopt-in=kotlin.RequiresOptIn
-Xopt-in=kotlin.ExperimentalMultiplatform
-Xopt-in=kotlin.contracts.ExperimentalContracts
)
src_dirs=(
"${builtin_sources_dir}"
libraries/stdlib/js/src
libraries/stdlib/{,common,unsigned}/src
libraries/stdlib/js-v1/src
)
KOTLIN_SRC_DIR+=( "${src_dirs[@]}" )
kotlin-utils_kotlinc -output "${main_target}/kotlin.js" \
$(find "${src_dirs[@]}" -name "*.kt")
# :kotlin-stdlib-js:compileJs
# Call the JSStdlibLinker directly with Java because it does not recognize
# the standard Kotlin compiler command-line options
local kotlinc_jar="${KOTLIN_UTILS_COMPILER_HOME}/lib/kotlin-compiler.jar"
local js_output_file="${target}/classes/kotlin.js"
java -classpath "${kotlinc_jar}" \
org.jetbrains.kotlin.cli.js.internal.JSStdlibLinker \
"${js_output_file}" \
"." \
libraries/stdlib/js-v1/src/wrapper.js \
$(find libraries/stdlib/js-v1/src/js -name "*.js") \
"${builtins_target}/kotlin.js" \
"${main_target}/kotlin.js" || die "Failed to link standard library"
sed -i -E -e 's/module.exports,\s*require\([^)]+\)//g' \
"${js_output_file}" || die "Failed to modify the final kotlin.js"
sed -i -E -e 's/function\s*\(_,\s*Kotlin\)/function\(\)/g' \
"${js_output_file}" || die "Failed to modify the final kotlin.js"
sed -i -E -e 's/return\s+_;//g' \
"${js_output_file}" || die "Failed to modify the final kotlin.js"
# TODO: Build and use a new kotlin.js.map created
# with the logic of :kotlin-stdlib-js:compileJs
cp "${js_output_file}" "${main_target}" ||
die "Failed to copy the final kotlin.js"
# :kotlin-stdlib-js-ir:commonMainSources is unnecessary
# because it unconditionally copies all files under
# libraries/stdlib/{,common,unsigned}/src without
# any filtering or modification
# :kotlin-stdlib-js-ir:jsMainSources
local ir_js_main_dir="${target}/jsMainSources"
local ir_js_cp_target="${ir_js_main_dir}/kotlin"
mkdir -p "${ir_js_cp_target}" ||
die "Could not create the IR JS main sources directory"
local ir_js_main_unimpl_builtins=(
core/builtins/native/kotlin/Annotation.kt
core/builtins/native/kotlin/Any.kt
core/builtins/native/kotlin/Array.kt
core/builtins/native/kotlin/CharSequence.kt
core/builtins/native/kotlin/Comparable.kt
core/builtins/native/kotlin/Coroutines.kt
core/builtins/native/kotlin/Iterator.kt
core/builtins/native/kotlin/Nothing.kt
core/builtins/native/kotlin/Number.kt
)
cp -r \
core/builtins/src/* \
libraries/stdlib/js/{src,runtime}/* \
"${ir_js_main_dir}" ||
die "Could not copy sources to the IR JS main sources directory"
cp "${ir_js_main_unimpl_builtins[@]}" "${ir_js_cp_target}" ||
die "Could not copy builtins to the IR JS main sources directory"
rm -r \
"${ir_js_main_dir}/generated" \
"${ir_js_main_dir}/kotlin/ArrayIntrinsics.kt" ||
die "Could not remove files from the IR JS main sources directory"
for file in "${ir_js_main_unimpl_builtins[@]##*/}"; do
local file="${ir_js_cp_target}/${file}"
cat - "${file}" <<- _EOC_ > "${file}.new" || \
die "Failed to create a copy of ${file} for editing"
@file:Suppress(
"NON_ABSTRACT_FUNCTION_WITH_NO_BODY",
"MUST_BE_INITIALIZED_OR_BE_ABSTRACT",
"EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE",
"PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED",
"WRONG_MODIFIER_TARGET",
"UNUSED_PARAMETER"
)
_EOC_
mv "${file}.new" "${file}" || die "Failed to overwrite ${file}"
done
# :kotlin-stdlib-js-ir:compileKotlinJs
local js_ir_target="${target}/classes/js-ir"
KOTLIN_COMMON_SOURCES_DIR=( libraries/stdlib/{,common,unsigned}/src )
KOTLIN_KOTLINC_ARGS=(
-main call
-meta-info
-module-kind umd
-no-stdlib
-source-map
-source-map-embed-sources never
-target v5
-Xallow-kotlin-package
-Xir-only
-Xir-produce-klib-dir
-Xir-module-name=kotlin
-Xir-per-module-output-name=kotlin-kotlin-stdlib-js-ir
-Xmulti-platform
-Xopt-in=kotlin.RequiresOptIn
-Xopt-in=kotlin.ExperimentalMultiplatform
-Xopt-in=kotlin.ExperimentalUnsignedTypes
-Xopt-in=kotlin.ExperimentalStdlibApi
-Xopt-in=kotlin.contracts.ExperimentalContracts
-Werror
)
src_dirs=(
"${ir_js_main_dir}"
libraries/stdlib/js-ir/{builtins,runtime,src}
libraries/stdlib/{,common,unsigned}/src
)
KOTLIN_SRC_DIR+=( "${src_dirs[@]}" )
kotlin-utils_kotlinc -output "${js_ir_target}" \
$(find "${src_dirs[@]}" -name "*.kt")
cp -r "${js_ir_target}/default" "${main_target}" ||
die "Could not copy compiled files for IR to main target directory"
# Create MANIFEST.MF
kotlin-libs_create_manifest "${main_target}"
# Create JAR
jar cfm "${JAVA_JAR_FILENAME}" "${main_target}/META-INF/MANIFEST.MF" \
-C "${main_target}" . || die "jar failed"
unset KOTLIN_COMPILER
}