require 'build-tool/errors' module BuildTool; module BuildSystem # # Base class for all build system implementations # class Base def initialize @module = nil @options = Hash.new @out_of_source = true end # ### ATTRIBUTES # attr_accessor :module attr_accessor :out_of_source def build_directory @module.build_directory end def dup cp = self.clone cp.instance_variable_set( "@options", Marshal.load( Marshal.dump( @options ) ) ) cp end def env @module.environment.values end def merge( other ) if name == other.name @options.merge!( other.option_hash ) @out_of_source = other.out_of_source else raise ConfigurationError, "Can't merge build system #{name} with #{other.name}" end end def option_hash @options end def options @options.keys end def install_prefix return @module.install_prefix_required if @module raise ConfigurationError, "No module set for build-system" end def source_directory return @module.source_directory_required if @module raise ConfigurationError, "No module set for build-system" end def after_rebase end # ### METHODS # # ### VIRTUAL FUNCTIONS # for method in [ :configure, :configured?, :make, :name, :reconfigure, :install, :install_fast, :install_fast_supported? ] do class_eval <<-EOS def #{method} raise NotImplementedError, "Method #{method} is not implemented for class #{self}" end EOS end def check_build_directory( create = false ) if !out_of_source if File.exist? build_directory if !File.symlink?( build_directory ) logger.warn( "Could not link build directory to source directory for inplace build of #{@module.name}." ) end elsif !$noop FileUtils.mkdir_p( Pathname.new( build_directory ).parent ) File.symlink( source_directory, build_directory ) end else if File.exist? build_directory if File.directory? build_directory return true else raise ConfigurationError, "Build directory #{build_directory} exists and is no directory!" end elsif create FileUtils.mkdir_p( build_directory ) if !$noop return true else return false end end end def recipe Application::instance.recipe end def remove_build_directory self.class.execute "rm -rf #{build_directory}" end end # class Base end; end # module BuildTool::BuildSystem