class Rscons::Builders::Install
The Install
builder copies files/directories to new locations.
Public Instance Methods
run(target, sources, cache, env, vars)
click to toggle source
Run the builder to produce a build target.
@param target [String] Target file name. @param sources [Array<String>] Source file name(s). @param cache [Cache] The Cache
object. @param env [Environment] The Environment
executing the builder. @param vars [Hash,VarSet] Extra construction variables.
@return [String,false]
Name of the target file on success or false on failure.
# File lib/rscons/builders/install.rb, line 18 def run(target, sources, cache, env, vars) target_is_dir = (sources.length > 1) || Dir.exists?(sources.first) || Dir.exists?(target) outdir = target_is_dir ? target : File.dirname(target) # Collect the list of files to copy over. file_map = {} if target_is_dir sources.each do |src| if Dir.exists? src Dir.glob("#{src}/**/*", File::FNM_DOTMATCH).select do |f| File.file?(f) end.each do |subfile| subpath = Pathname.new(subfile).relative_path_from(Pathname.new(src)).to_s file_map[subfile] = "#{outdir}/#{subpath}" end else file_map[src] = "#{outdir}/#{File.basename(src)}" end end else file_map[sources.first] = target end printed_message = false file_map.each do |src, dest| # Check the cache and copy if necessary unless cache.up_to_date?(dest, :Copy, [src], env) unless printed_message env.print_builder_run_message("#{name} #{target}", nil) printed_message = true end cache.mkdir_p(File.dirname(dest)) FileUtils.rm_f(dest) FileUtils.cp(src, dest, :preserve => true) end cache.register_build(dest, :Copy, [src], env) end target if (target_is_dir ? Dir.exists?(target) : File.exists?(target)) end