blob: 25f9041d2b05bc69ae23a981c66789ca7d054deb [file] [log] [blame]
# 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.
module Buildr #nodoc
class Project #nodoc
class << self
alias :original_define :define
# Monkey patch the built-in define so that there is a single root directory for
# all of the generated artifacts within a project hierarchy.
#
def define(name, properties = nil, &block) #:yields:project
properties = properties.nil? ? {} : properties.dup
parent_name = name.split(':')[0...-1]
parent = parent_name.empty? ? nil : Buildr.application.lookup(parent_name.join(':'))
# Follow the same algorithm as in project code
if properties[:base_dir]
base_dir = properties[:base_dir]
elsif parent
base_dir = File.expand_path(name.split(':').last, parent.base_dir)
else
base_dir = Dir.pwd
end
# The top directory is the base directory of the root project
top_dir = base_dir
while parent
top_dir = parent.base_dir
parent = parent.parent
end
target_dir = "#{top_dir}/target/#{name.gsub(':', '_')}"
reports_dir = "#{top_dir}/reports/#{name.gsub(':', '_')}"
target_dir = ::Buildr::Util.relative_path(target_dir, File.expand_path(base_dir))
reports_dir = ::Buildr::Util.relative_path(reports_dir, File.expand_path(base_dir))
properties[:layout] = Buildr::Layout::Default.new unless properties[:layout]
properties[:layout][:target] = target_dir
properties[:layout][:reports] = reports_dir
properties[:layout][:target, :main] = target_dir
Project.original_define(name, properties) do
project.instance_eval &block
if top_dir == base_dir && project.iml?
project.iml.excluded_directories << "#{base_dir}/target"
project.iml.excluded_directories << "#{base_dir}/reports"
clean { rm_rf "#{base_dir}/target" }
clean { rm_rf "#{base_dir}/reports" }
end
project
end
end
end
end
end