Class: Rscons::Builders::Install

Inherits:
Rscons::Builder show all
Defined in:
lib/rscons/builders/install.rb

Overview

The Install builder copies files/directories to new locations.

Direct Known Subclasses

Copy

Instance Method Summary collapse

Methods inherited from Rscons::Builder

#create_build_target, #default_variables, #features, #finalize, #name, #produces?, #setup, #standard_build, #standard_finalize, #standard_threaded_build

Instance Method Details

#run(target, sources, cache, env, vars) ⇒ String, false

Run the builder to produce a build target.

Parameters:

  • target (String)

    Target file name.

  • sources (Array<String>)

    Source file name(s).

  • cache (Cache)

    The Cache object.

  • env (Environment)

    The Environment executing the builder.

  • vars (Hash, VarSet)

    Extra construction variables.

Returns:

  • (String, false)

    Name of the target file on success or false on failure.


18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 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
        desc = "#{name} #{target}"
        env.print_builder_run_message(desc, desc)
        printed_message = true
      end
      cache.mkdir_p(File.dirname(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