なかだです。

At Thu, 03 Jan 2002 14:11:08 +0900,
Takaaki Tateishi <ttate / kt.jaist.ac.jp> wrote:
> > 今のインターフェースに合わせるとしたら、こんなのとか?
> > $INSTALLFILES = {
> >   :archdir => 'hoge.h',
> >   :libdir => %w[hoge.data hoge.icon]
> > }
> > create_makefile("hoge")
> 
> この方法を実現するようなパッチを作ってみました.
> 個人的には任意のファイルをarchdirとlibdirにインストール
> できるようになれば十分なので他に良い手段があればそちらで
> も構いません.

これだと、extconf.rbの方で:libdirか:sitelibdirを選ばなければな
りません。ではなくて、extconf.rbで指定するのは:libdirか:archdir
かだけにしたかったのです。でinstallとsite-installで自動的に
$(rubylibdir)と$(archdir)か、$(sitelibdir)と$(sitearchdir)かに
切り替わる、というものを考えてました。

ただよく考えてみたら、シンボルで指定するとサブディレクトリにイ
ンストールしたい場合にはうまくいきそうにないので、キーはマクロ
を含む文字列にしてみました。

#!/usr/bin/ruby
require "mkmf"

$INSTALLFILES = {
  '$(rubylibdir)' => ["hoge.h"],
  '$(commondir)' => [["data", "**/*.data"], "hoge.icon"]
}
create_makefile("hoge")

たとえばこのようなextconf.rbと、hoge.h lib/hoge.rb
data/hoge.data data/hoge/x.data hoge.iconのファイルがあるとき、
それぞれ以下のようにインストールされるという感じです。

make install
  lib/hoge.h		-> $(prefix)/ruby/1.7/hoge.h
  hoge.h		-> $(prefix)/ruby/1.7/hoge.h
  data/hoge.data	-> $(prefix)/ruby/1.7/hoge.data
  data/hoge/x.data	-> $(prefix)/ruby/1.7/hoge/x.data
  hoge.icon		-> $(prefix)/ruby/1.7/hoge.icon

make site-install
  lib/hoge.h		-> $(prefix)/ruby/site_ruby/1.7/hoge.h
  hoge.h		-> $(prefix)/ruby/site_ruby/1.7/hoge.h
  data/hoge.data	-> $(prefix)/ruby/site_ruby/hoge.data
  data/hoge/x.data	-> $(prefix)/ruby/site_ruby/hoge/x.data
  hoge.icon		-> $(prefix)/ruby/site_ruby/hoge.icon

$INSTALLFILESの値は配列で、その要素はファイル名または、ディレク
トリ名とglobパターンのペアです。ペアの場合はディレクトリ名部分
は取り除かれます。


Index: mkmf.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/mkmf.rb,v retrieving revision 1.68 diff -u -2 -p -r1.68 mkmf.rb --- mkmf.rb 2002/01/02 14:41:57 1.68 +++ mkmf.rb 2002/01/05 16:02:47 @@ -20,4 +20,18 @@ $sitelibdir = CONFIG["sitelibdir"] $sitearchdir = CONFIG["sitearchdir"] +commondir = /\$\(commondir\)(?:\$\(target_prefix\))?/ + +INSTALL_DIRS = [ + [commondir, "$(rubylibdir)"], + [/\$\(sitelibdir\)(?:\$\(target_prefix\))?/, "$(rubylibdir)$(target_prefix)"], + [/\$\(sitearchdir\)(?:\$\(target_prefix\))?/, "$(archdir)$(target_prefix)"] +] + +SITEINSTALL_DIRS = [ + [commondir, "$(sitedir)$(target_prefix)"], + [/\$\(rubylibdir\)(?:\$\(target_prefix\))?/, "$(sitelibdir)$(target_prefix)"], + [/\$\(archdir\)(?:\$\(target_prefix\))?/, "$(sitearchdir)$(target_prefix)"] +] + if File.exist? Config::CONFIG["archdir"] + "/ruby.h" $hdrdir = $archdir @@ -141,31 +155,48 @@ def try_run(src, opt="") end -def install_rb(mfile, dest, srcdir = nil) - libdir = "lib" - libdir = srcdir + "/" + libdir if srcdir - path = [] - dir = [] - if File.directory? libdir - Find.find(libdir) do |f| - next unless /\.rb$/ =~ f - f = f[libdir.length+1..-1] - path.push f - dir |= [File.dirname(f)] +def install_files(mfile, ifiles, srcdir = nil, map = nil) + ifiles or return + if srcdir and srcdir != "." + srcdir += "/" + else + srcdir = "" + end + dirs = [] + path = Hash.new {|h, i| h[i] = dirs.push([i])[-1]} + ifiles.each do |dir, files| + dir = map.inject(dir) {|dir, (orig, new)| dir.gsub(orig, new)} if map + files.each do |f| + if Array === f + d, *f = f + d = "." if !d or (d = srcdir + d).empty? + Dir.glob(File.join(d, *f)) do |f| + path[dir + File.dirname(f)[d.length..-1]] << f.sub(/^\.\//, '') + end + else + path[dir] << srcdir + f + end end end - for f in dir - if f == "." - mfile.printf "\t@$(RUBY) -r ftools -e 'File::makedirs(*ARGV)' %s\n", dest - else - mfile.printf "\t@$(RUBY) -r ftools -e 'File::makedirs(*ARGV)' %s/%s\n", dest, f + + dirs.each do |dir, *files| + mfile.printf("\t@$(MAKEDIRS) %s\n", dir) + files.each do |f| + mfile.printf("\t@$(INSTALL_DATA) %s %s\n", f, dir) end end - for f in path - d = '/' + File::dirname(f) - d = '' if d == '/.' - mfile.printf "\t@$(RUBY) -r ftools -e 'File::install(ARGV[0], ARGV[1], 0644, true)' %s/%s %s%s\n", libdir, f, dest, d +end + +def search_install(dest, pattern, dir = nil, srcdir = nil) + dir = srcdir + "/" + dir if srcdir and srcdir != "." + dir += "/" unless /\/$/ =~ dir + path.to_a.each do |f| + f[0] = f[0] && !f[0].empty? ? File.join(dest, f[0]) : dest end end +def install_rb(mfile, dest, srcdir = nil) + install_files(mfile, {dest => [["lib", "**/*.rb"]]}, srcdir) +end + def append_library(libs, lib) if /mswin32/ =~ RUBY_PLATFORM @@ -490,4 +522,7 @@ DLLIB = $(TARGET).#{CONFIG["DLEXT"]} RUBY = #{CONFIG["ruby_install_name"]} RM = $(RUBY) -rftools -e "File::rm_f(*ARGV.map{|x|Dir[x]}.flatten.uniq)" +MAKEDIRS = $(RUBY) -r ftools -e 'File::makedirs(*ARGV)' +INSTALL_PROG = $(RUBY) -r ftools -e 'File::install(ARGV[0], ARGV[1], 0555, true)' +INSTALL_DATA = $(RUBY) -r ftools -e 'File::install(ARGV[0], ARGV[1], 0644, true)' EXEEXT = #{CONFIG["EXEEXT"]} @@ -509,17 +544,19 @@ site-install: $(sitearchdir)$(target_pre $(archdir)$(target_prefix)/$(DLLIB): $(DLLIB) - @$(RUBY) -r ftools -e 'File::makedirs(*ARGV)' $(rubylibdir) $(archdir)$(target_prefix) - @$(RUBY) -r ftools -e 'File::install(ARGV[0], ARGV[1], 0555, true)' $(DLLIB) $(archdir)$(target_prefix)/$(DLLIB) -EOMF - install_rb(mfile, "$(rubylibdir)$(target_prefix)", srcdir) - mfile.printf "\n" + @$(MAKEDIRS) $(rubylibdir) $(archdir)$(target_prefix) + @$(INSTALL_PROG) $(DLLIB) $(archdir)$(target_prefix)/$(DLLIB) - mfile.printf <<EOMF $(sitearchdir)$(target_prefix)/$(DLLIB): $(DLLIB) - @$(RUBY) -r ftools -e 'File::makedirs(*ARGV)' $(sitearchdir)$(target_prefix) - @$(RUBY) -r ftools -e 'File::install(ARGV[0], ARGV[1], 0555, true)' $(DLLIB) $(sitearchdir)$(target_prefix)/$(DLLIB) + @$(MAKEDIRS) $(sitearchdir)$(target_prefix) + @$(INSTALL_PROG) $(DLLIB) $(sitearchdir)$(target_prefix)/$(DLLIB) + EOMF + mfile.print "install:\n" + install_rb(mfile, "$(rubylibdir)$(target_prefix)", srcdir) + install_files(mfile, $INSTALLFILES, srcdir) + mfile.print "\n" + mfile.print "site-install:\n" install_rb(mfile, "$(sitelibdir)$(target_prefix)", srcdir) - mfile.printf "\n" + install_files(mfile, $INSTALLFILES, srcdir, SITEINSTALL_DIRS) unless /mswin32/ =~ RUBY_PLATFORM
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦