Class: Xezat::Command::Generate

Inherits:
Object
  • Object
show all
Defined in:
lib/xezat/command/generate.rb

Overview

追加のファイルを生成する

Instance Method Summary collapse

Constructor Details

#initialize(program) ⇒ Generate

Returns a new instance of Generate.



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/xezat/command/generate.rb', line 18

def initialize(program)
  program.command(:generate) do |c|
    c.syntax 'generate [options] cygport'
    c.description 'generate additional files'
    c.option 'overwrite', '-o', '--overwrite', 'overwrite file'
    c.option 'pc', '-p', '--pkg-config', 'generate *.pc'
    c.action do |args, options|
      execute(c, args, options)
    end
  end
end

Instance Method Details

#append_commands_to_cmakelists(variables) ⇒ Object

CMakeLists.txt の末尾に *.pc を生成する命令を追記する



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/xezat/command/generate.rb', line 62

def append_commands_to_cmakelists(variables)
  srcdir = variables[:CYGCMAKE_SOURCE] || variables[:S]
  cmakelists = File::expand_path(File::join(srcdir, "CMakeLists.txt"))
  puts cmakelists
  original = File::read(cmakelists)
  commands = File::read(File::expand_path(File::join(TEMPLATE_DIR, 'pkgconfig.cmake')))

  unless original.match(/DESTINATION \$\{CMAKE_INSTALL_PREFIX\}\/lib\/pkgconfig/)
    File::atomic_open(cmakelists, 'a') do |f|
      f.write(commands)
    end
    return [true, "append #{variables[:PN]}.pc installation commands to #{cmakelists}"]
  end
  return [false, '']
end

#append_commands_to_configure(variables) ⇒ Object

configure.ac と Makefile.am の末尾に *.pc を生成する命令を追加する



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/xezat/command/generate.rb', line 79

def append_commands_to_configure(variables)
  result = false
  detail = []

  srcdir = variables[:CYGCONF_SOURCE] || variables[:S]
  configure_ac = File::expand_path(File::join(srcdir, 'configure.ac'))
  configure_ac = File::expand_path(File::join(srcdir, 'configure.in')) unless File::exist?(configure_ac)
  raise ConfigureNotFoundError unless File::exist?(configure_ac)
  original_ac = File::read(configure_ac)

  unless original_ac.match(/#{variables[:PN]}.pc/)
    original_ac.gsub!(/(AC_CONFIG_FILES\(\[)/, '\1' + "#{variables[:PN]}.pc ")
    File::atomic_write(configure_ac) do |fa|
      fa.write(original_ac)
    end
    result = true
    detail << "append #{variables[:PN]}.pc installation commands to #{configure_ac}"
  end

  makefile_am = File::expand_path(File::join(srcdir, 'Makefile.am'))
  raise MakefileNotFoundError unless File::exist?(makefile_am)
  original_am = File::read(makefile_am)

  unless original_am.match(/pkgconfig_DATA/)
    commands_am = File::read(File::expand_path(File::join(TEMPLATE_DIR, 'Makefile.am')))
    File::atomic_open(makefile_am, 'a') do |fm|
      fm.write(commands_am)
    end
    result = true
    detail << "append #{variables[:PN]}.pc installation commands to #{makefile_am}"
  end

  [result, detail.join(',')]
end

#execute(c, args, options) ⇒ Object

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/xezat/command/generate.rb', line 32

def execute(c, args, options)
  cygport = args.shift
  raise ArgumentError, 'wrong number of arguments (0 for 1)' unless cygport
  c.logger.info "ignore extra arguments: #{args.to_s}" unless args.empty?

  variables = VariableManager::get_default_variables(cygport)

  if options['pc']
    generate_pkg_config(variables, options)
  end

  if variables[:_cmake_CYGCLASS_]
    result, detail = append_commands_to_cmakelists(variables)
  else
    result, detail = append_commands_to_configure(variables)
  end
  c.logger.info detail if result
end

#generate_pkg_config(variables, options) ⇒ Object

*.pc を生成する



52
53
54
55
56
57
58
59
# File 'lib/xezat/command/generate.rb', line 52

def generate_pkg_config(variables, options)
  srcdir = variables[:CYGCMAKE_SOURCE] || variables[:S]
  pc = File::expand_path(File::join(srcdir, "#{variables[:PN]}.pc.in"))
  raise UnregeneratableConfigurationError, "#{variables[:PN]}.pc.in already exists" if File::exist?(pc) && !options['overwrite']
  File::atomic_write(pc) do |f|
    f.write(get_package_config(variables))
  end
end

#get_package_config(variables) ⇒ Object

シェル変数群を埋め込まれたテンプレート文字列を返す



115
116
117
118
# File 'lib/xezat/command/generate.rb', line 115

def get_package_config(variables)
  erb = File::expand_path(File::join(TEMPLATE_DIR, 'pkgconfig.erb'))
  ERB.new(File::readlines(erb).join(nil), nil, '%-').result(binding)
end