From 0a60c5147e2211172bc899e87cbd971572022f91 Mon Sep 17 00:00:00 2001 From: Karlatemp Date: Wed, 5 Apr 2023 13:10:47 +0800 Subject: [PATCH] [build] Use project lazy instead of global lazy --- build.gradle.kts | 1 + buildSrc/src/main/kotlin/HmppConfigure.kt | 12 ++++---- buildSrc/src/main/kotlin/LocalProperties.kt | 31 +++++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5f5bd6396..2ebe1040f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -45,6 +45,7 @@ plugins { osDetector = osdetector BuildSrcRootProjectHolder.value = rootProject +BuildSrcRootProjectHolder.lastUpdateTime = System.currentTimeMillis() analyzes.CompiledCodeVerify.run { registerAllVerifyTasks() } diff --git a/buildSrc/src/main/kotlin/HmppConfigure.kt b/buildSrc/src/main/kotlin/HmppConfigure.kt index 709a09069..0604594d7 100644 --- a/buildSrc/src/main/kotlin/HmppConfigure.kt +++ b/buildSrc/src/main/kotlin/HmppConfigure.kt @@ -82,7 +82,7 @@ enum class HostArch { /// eg. "!a;!b" means to enable all targets but a or b /// eg. "a;b;!other" means to disable all targets but a or b -val ENABLED_TARGETS by lazy { +val ENABLED_TARGETS by projectLazy { val targets = getMiraiTargetFromGradle() // enable all by default @@ -117,7 +117,7 @@ fun isTargetEnabled(name: String): Boolean { fun Set.filterTargets() = this.filter { isTargetEnabled(it) }.toSet() -val MAC_TARGETS: Set by lazy { +val MAC_TARGETS: Set by projectLazy { setOf( // "watchosX86", "macosX64", @@ -142,13 +142,13 @@ val MAC_TARGETS: Set by lazy { ).filterTargets() } -val WIN_TARGETS by lazy { setOf("mingwX64").filterTargets() } +val WIN_TARGETS by projectLazy { setOf("mingwX64").filterTargets() } -val LINUX_TARGETS by lazy { setOf("linuxX64").filterTargets() } +val LINUX_TARGETS by projectLazy { setOf("linuxX64").filterTargets() } -val UNIX_LIKE_TARGETS by lazy { LINUX_TARGETS + MAC_TARGETS } +val UNIX_LIKE_TARGETS by projectLazy { LINUX_TARGETS + MAC_TARGETS } -val NATIVE_TARGETS by lazy { UNIX_LIKE_TARGETS + WIN_TARGETS } +val NATIVE_TARGETS by projectLazy { UNIX_LIKE_TARGETS + WIN_TARGETS } private val POSSIBLE_NATIVE_TARGETS by lazy { setOf("mingwX64", "macosX64", "macosArm64", "linuxX64") } diff --git a/buildSrc/src/main/kotlin/LocalProperties.kt b/buildSrc/src/main/kotlin/LocalProperties.kt index 34834150f..5eb40a4a5 100644 --- a/buildSrc/src/main/kotlin/LocalProperties.kt +++ b/buildSrc/src/main/kotlin/LocalProperties.kt @@ -21,10 +21,41 @@ import java.util.* object BuildSrcRootProjectHolder { lateinit var value: Project + var lastUpdateTime: Long = 0 } val rootProject: Project get() = BuildSrcRootProjectHolder.value +fun projectLazy(action: () -> T): Lazy { + val projLazy = object : Lazy { + private lateinit var delegate: Lazy + private var holdTime: Long = -1 + + override val value: T + get() { + if (holdTime != BuildSrcRootProjectHolder.lastUpdateTime) { + synchronized(this) { + if (holdTime != BuildSrcRootProjectHolder.lastUpdateTime) { + delegate = lazy(action) + holdTime = BuildSrcRootProjectHolder.lastUpdateTime + } + } + } + return delegate.value + } + + override fun isInitialized(): Boolean { + if (!::delegate.isInitialized) return false + + if (holdTime == BuildSrcRootProjectHolder.lastUpdateTime) { + return delegate.isInitialized() + } + return false + } + } + return projLazy +} + private lateinit var localProperties: Properties