/*
 * 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 'base'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE' apply false
    id 'net.freudasoft.gradle-cmake-plugin' version '0.0.2' apply false
    id 'com.github.johnrengelman.shadow' version '6.1.0' apply false
    id 'com.google.osdetector' version '1.6.2' apply false
}

project.gradle.startParameter.excludedTaskNames.add('test')

allprojects  {
  group = 'org.apache.mnemonic'
  version = '0.14.0-SNAPSHOT'
}

subprojects {
  apply plugin: 'java-library'
  apply plugin: 'io.spring.dependency-management'

  dependencyManagement {
    dependencies {
      dependency 'org.apache.commons:commons-lang3:3.4'
      dependency 'org.testng:testng:6.8.17'
      dependency 'org.flowcomputing.commons:commons-resgc:0.8.17'
      dependency 'org.flowcomputing.commons:commons-primitives:0.6.1'
      dependency 'commons-cli:commons-cli:1.3.1'
      dependency 'com.squareup:javapoet:1.11.1'
      dependency 'org.slf4j:slf4j-api:1.7.21'
      dependency 'org.slf4j:slf4j-log4j12:1.7.21'
      dependency 'org.slf4j:jul-to-slf4j:1.7.21'
      dependency 'org.slf4j:jcl-over-slf4j:1.7.21'
      dependency 'log4j:log4j:1.2.17'
      dependency 'ch.qos.logback:logback-classic:1.1.7'
      dependency 'ch.qos.logback:logback-core:1.1.7'
    }
  }

  repositories {
    maven { url "https://repo.maven.apache.org/maven2" }
    mavenCentral()
  }

  sourceCompatibility = 1.8
  targetCompatibility = 1.8
  tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
  }

  configurations.all {
  }
}
