/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

plugins {
  id 'net.freudasoft.gradle-cmake-plugin'
  id 'com.github.johnrengelman.shadow'
  id 'com.google.osdetector'
}

description = 'mnemonic-pmalloc-service'

dependencies {
  implementation project(':mnemonic-common')
  implementation 'org.flowcomputing.commons:commons-primitives'
  testCompileOnly 'org.testng:testng'
}

def nativeDir = "$projectDir/src/main/native"

cmake {
  sourceFolder = file("$nativeDir")
  workingFolder = file("$nativeDir/build")
  buildSharedLibs = true
  buildConfig = 'Release'
  buildTarget = 'install'
}

task copyResources(type: Copy) {
  from "$nativeDir/dist/native"
  into "${buildDir}/classes/java/main/native"
}

shadowJar {
  minimize()
  destinationDirectory = file("$projectDir/../service-dist")
  archiveClassifier = osdetector.classifier
}

task cleanDist(type: Delete) {
  delete "$nativeDir/dist"
}

compileJava.dependsOn cmakeBuild
processResources.dependsOn copyResources
build.dependsOn shadowJar
clean.dependsOn cmakeClean
clean.dependsOn cleanDist

test.useTestNG()
