/*
 * 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 'org.apache.beam.module' }
applyGoNature()
applyDockerNature()

description = "Apache Beam :: SDKs :: Go :: Container"

// Figure out why the golang plugin does not add a build dependency between projects.
// Without the line below, we get spurious errors about not being able to resolve
// "./github.com/apache/beam/sdks/go"
resolveBuildDependencies.dependsOn ":sdks:go:goBuild"

dependencies {
  golang {
    // TODO(herohde): use "./" prefix to prevent gogradle use base github path, for now.
    // TODO(herohde): get the pkg subdirectory only, if possible. We spend mins pulling cmd/beamctl deps.
    build name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
    test name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
  }
}

golang {
  packagePath = 'github.com/apache/beam/sdks/go/boot'
  goBuild {
    // TODO(herohde): build local platform + linux-amd64, if possible.
    targetPlatform = ['linux-amd64']
    outputLocation = './build/target/${GOOS}_${GOARCH}/boot'
  }
}

docker {
  name containerImageName(
          name: "go_sdk",
          root: project.rootProject.hasProperty(["docker-repository-root"]) ?
                  project.rootProject["docker-repository-root"] : "apachebeam")
  files "./build/"
}
// Ensure that making the docker image builds any required artifacts
dockerPrepare.dependsOn goBuild
