カラクリサイクル

『輝かしい青春』なんて無かった人の雑記

設定ファイルをPerlとmakeとSubversionを使って管理する

概要: 設定ファイル類をperlとmakeとSubversionを使って管理する


設定ファイルをまとめて管理する でMakefileを使って設定ファイルを管理する方法が紹介されてるんだけど、 Makefileを手で生成するのはめんどくせーと言うことで、 サクっとPerlでMakefileを生成するスクリプトを書いてみた。

で、以下スクリプト。

#!perl

use strict;
use warnings;

use File::Find;
use FindBin ();

my $source = $FindBin::Bin;
my @files = ();

find(
    sub {
        my $path = $File::Find::name;

        return if ( -d $path );

        if ( $path =~ m{^$source/(.+)$} ) {
            my $filename = $1;

            # いらないファイルを除外
            return if ( $filename eq 'Makefile.PL' );
            return if ( $filename eq 'Makefile' );
            return if ( $filename =~ m{~$} );

            push @files, $1;
        }

    },
    $source,
);

@files = sort { $a cmp $b } @files;

my $generated = q{};

$generated .= q{TARGETS = };
$generated .= join qq{ \\\n\t}, map { "/$_" } @files;
$generated .= qq{\n\n};

$generated .=  q{INSTALL = sudo /usr/bin/install -o root -m 0644};
$generated .= qq{\n\n};
$generated .=  q{all: ${TARGETS}};
$generated .= qq{\n\n};

for my $path ( @files ) {
    $generated .= qq{/${path}: ${path}};
    $generated .= qq{\n};
    $generated .= qq{\t} . q{${INSTALL} $? $@};
    $generated .= qq{\n\n};
}

if ( open( my $fh, '>', 'Makefile' ) ) {
    print $fh $generated;
    close($fh);
}

自分の所ではsvkを使ってディレクトリを管理しているので、.svnディレクトリとか除外してないんだけど、 生のSubversionとかで管理してる場合は、いらないファイルを除外の部分で、 .svnディレクトリをを除外するコードを足さないとダメだと思う。

で、使い方。

使い方は簡単で

perl Makefile.PL

という感じで実行すると、実行されたディレクトリ以下のファイルを ルートディレクトリからの場所に対応させたMakefileを吐き出します。

説明しづらいしわかりづらいんで、図で説明すると

~/
    config/                 # 設定ファイルディレクトリ
        Makefile.PL         # 上記スクリプト
        home/
            nyarla/
                .zshrc      # /home/nyarla/.zshrcにインストールされる
                .vimrc      # /home/nyarla/.vimrcにインストールされる
        etc/
            apt/
                source.list # /etc/apt/source.listにインストールされる

という感じです。

作業の流れとしては、

  1. 編集したい設定ファイルを~/configをルートに見立ててコピー
  2. perl Makefile.PLを実行 (Makefileが生成される)
  3. 設定ファイルを編集
  4. makeして設定ファイルをインストール

という感じ。Makefileを手で書かなくていいからすごい楽ちんです。

まあでも複数のホストで使用する設定ファイルとか、ディレクトリ構成をルートと対応させてないとか、 そういった場合には手でMakefileを書いたほうが楽かも知れません。 まあ一つのホストだけで管理する場合にはこのスクリプトでだいぶ楽ができると思います。

ちなみにこのスクリプトを書いたとき、区切り文字であるタブ文字でちょっとはまったりした。 まあそれ以外はすんなり書けたけど。

で、実際にperl + make + svkで設定ファイルを管理してるけど、かなり楽ちんです。 設定ファイルを追加したときにperl Makefile.PLして、設定ファイルを書いたらmake、 でまた編集したらmakeで反映、という感じでかなり楽な感じ。

まあでも設定ファイルに書く設定の値がよく分かりません><になってるので、 そこら辺調べながらやってるので遅々として進まないんだけど。

まあ一応公開してみたので良かったら使ってみてください。