devx_400.sfs をフルインストールで使う

ついでに, 開発環境も整え始めた. Puppy Linux では, devx_400.sfs にmakeやgcc, libディレクトリといった開発環境一式が納められている.

フルインストールの場合, devx_400.sfsをmountし, 中身をすべて / 以下にコピーする方法しか見つからなかった. そこで, シンボリックリンクでなんとかできないものか考えてみた.

lndir という, ディレクトリツリーを保ってシンボリックリンクをつくるプログラムがある. これのRuby移植版 lndir.rb を改造して使った.

"--append"というオプションを追加し, 本来ならディレクトリやファイルが存在している場合にエラーを返すところを無視して(!進めるようにした.

具体的には, lndirメソッド内の,

# create srcdir name
  dirname = ndir.expand_path.basename
  if dirname.exist?
    raise IOError, "\n\n  Error : \"#{dirname.to_s}\" is already exist.\n\n"
  end

  print "  Directory: #{relpath2dst.join(dirname)} is created\n" if OPTS[:verbose]
  dirname.mkdir
  Dir.chdir(dirname.to_s)

を,

# create srcdir name
  dirname = ndir.expand_path.basename
  if dirname.exist?
    raise IOError, "\n\n  Error : \"#{dirname.to_s}\" is already exist.\n\n" unless OPTS[:append]
  else
    print "  Directory: #{relpath2dst.join(dirname)} is created\n" if OPTS[:verbose]
    dirname.mkdir
  end
  Dir.chdir(dirname.to_s)
if f_or_d.exist?
        raise IOError, "\n\n  Error : \"#{f_or_d.to_s}\" is alread exist.\n\n"
      end
      f_or_d.make_symlink(dir.join(f_or_d)) unless OPTS[:dryrun]
      print "  SymLink  : #{path2src.join(f_or_d.basename)} => #{relpath2dst.join(dirname, f_or_d)}\n" if OPTS[:verbose]

if f_or_d.exist?
        raise IOError, "\n\n  Error : \"#{f_or_d.to_s}\" is alread exist.\n\n" unless OPTS[:append]
      else
      	f_or_d.make_symlink(dir.join(f_or_d)) unless OPTS[:dryrun]
      	print "  SymLink  : #{path2src.join(f_or_d.basename)} => #{relpath2dst.join(dirname, f_or_d)}\n" if OPTS[:verbose]
      end

に変えた. あと, --appendオプション(OPTS[:append])の追加も.

で,

# mount -o loop /devx_400.sfs /mnt/devx
# cd /
# lndir.rb ./mnt/devx/bin
...(libとかsbinとか)...

./mnt/devx などと相対パスで指定すれば, 実際のファイルがumountでなくなってもシンボリックリンクはなくならないので便利.

試しに sl をmakeしてみたら, しっかり機関車が走ってくれた.