# -*- ruby -*-
#
# 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.

require "bundler/gem_helper"
require "rake/clean"
require "yard"

base_dir = File.join(__dir__)

helper = Bundler::GemHelper.new(base_dir)
helper.install
spec = helper.gemspec

release_task = Rake::Task["release"]
release_task.prerequisites.replace(["build", "release:rubygem_push"])

def run_extconf(build_dir, extension_dir, *arguments)
  cd(build_dir) do
    ruby(File.join(extension_dir, "extconf.rb"),
         *arguments)
  end
end

spec.extensions.each do |extension|
  extension_dir = File.join(base_dir, File.dirname(extension))
  build_dir = ENV["BUILD_DIR"]
  if build_dir
    build_dir = File.join(build_dir, "red-arrow")
    directory build_dir
  else
    build_dir = extension_dir
  end
  CLOBBER << File.join(build_dir, "Makefile")
  CLOBBER << File.join(build_dir, "mkmf.log")

  makefile = File.join(build_dir, "Makefile")
  file makefile => build_dir do
    run_extconf(build_dir, extension_dir)
  end

  desc "Configure"
  task :configure => build_dir do
    run_extconf(build_dir, extension_dir)
  end

  desc "Compile"
  task :compile => makefile do
    cd(build_dir) do
      sh("make")
    end
  end

  task :clean do
    cd(build_dir) do
      sh("make", "clean") if File.exist?("Makefile")
    end
  end
end

desc "Run tests"
task :test do
  cd(base_dir) do
    ruby("test/run-test.rb")
  end
end

task default: :test

desc "Run benchmarks"
task :benchmark do
  benchmarks = if ENV["BENCHMARKS"]
                 ENV["BENCHMARKS"].split
               else
                 FileList["benchmark/{,*/**/}*.yml"]
               end
  cd(base_dir) do
    benchmarks.each do |benchmark|
      sh("benchmark-driver", benchmark)
    end
  end
end

YARD::Rake::YardocTask.new do |task|
end
