Class: Rscons::Builders::Copy

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

Overview

The Copy builder copies files/directories to new locations.

Direct Known Subclasses

Install

Instance Attribute Summary

Attributes inherited from Rscons::Builder

#build_step, #cache, #env, #preferred_ld, #side_effects, #sources, #target, #vars

Instance Method Summary collapse

Methods inherited from Rscons::Builder

#depends, extra_path, #finalize_command, name, #name, #print_run_message, #produces, #register_command, #standard_command, #wait_for

Constructor Details

#initialize(*args) ⇒ Copy

Construct builder.



9
10
11
12
13
# File 'lib/rscons/builders/copy.rb', line 9

def initialize(*args)
  super
  @install_builder = self.class.name == "Install"
  @nop = @install_builder && !Rscons.application.operation("install")
end

Instance Method Details

#nop?Boolean

Return whether the builder is a no-op.

Returns:

  • (Boolean)

    Whether the builder is a no-op.



19
20
21
# File 'lib/rscons/builders/copy.rb', line 19

def nop?
  @nop
end

#run(options) ⇒ Object

Run the builder to produce a build target.



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
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/rscons/builders/copy.rb', line 24

def run(options)
  if @nop
    true
  else
    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
          message = "#{name} <source>#{Util.short_format_paths(@sources)}<reset> => <target>#{@target}<reset>"
          print_run_message(message, nil)
          printed_message = true
        end
        @cache.mkdir_p(File.dirname(dest), install: @install_builder)
        FileUtils.rm_f(dest)
        FileUtils.cp(src, dest, :preserve => true)
      end
      @cache.register_build(dest, :Copy, [src], @env, install: @install_builder)
    end
    (target_is_dir ? Dir.exists?(@target) : File.exists?(@target)) ? true : false
  end
end