PERLMAKE
Perl Makefile Documents

説明書兼計画書
【ごたく:このプログラムの目的】
Perlは元々高機能だし、誰にでも扱いやすくて良い!別にCGIに限定しなくても、工夫次第では活用出来る分野も多いのだ。でも、今までC/C++等に慣れてしまった、おいらとしては、少々不満を感じる部分が有ったりする。
特に、複雑なCGIを書こうと思った時…

  • ファイルロックの部分や、クエリの読みとり等、いつも同じ様な事を書いていたりするので、モジュール化して、簡単に扱える様にしたいが、ライブラリ化して、requireする様にすると、実行速度が犠牲になる様な気がする。

  • ファイルが、めっちゃ長くなってしまって、デバッグが面倒くさい
    C言語の分割コンパイルに慣れてしまっているので、スクリプトが長くなると嫌だ。修正目的の場所を見つけるのもしんどい

  • 良くできたモジュールは、公開して、便利に利用して貰いたいし、誰かが造ったモジュールも活用して、効率的に造りたい

  • システム自体が大きくなってしまったので、何とかして複数人で分担管理したいが、ライブラリ化するのは性に合わない
などと考える人もいるでしょう?いや、居るはずだ。賢明な人は、ライブラリ化してしまうんだろうね〜?でも、偏屈なおいらとしては、ファイルが複数あるのと、コンパイルまでのタイムラグが気になってしまうので、最終的には、1本のスクリプトに纏めて書きたいと、思ってしまったのだ。そこで、少々強引ではあるが、C言語ライクに、Perl用のMAKE(PERL MAKE)を造ってしまえ!と思い立った訳だ。
ぶっちゃけた話、require使ってライブラリ化すると、パッケージ名が付いてまわるし、読み辛くなるのが嫌で、C言語の#includeライクな仕様が、require無しで使える様にしたかっただけなんですが…。
PERL MAKEと言っても、やってる事は単純で、複数のファイルを、指定された順番に結合して、1個のファイルとして出力するだけです!C/C++のMAKEの様に、ファイル日時のチェックや、制御変数は使えないので悪しからず。でも、これが結構使える訳だ。
ただ、単純にくっつけるだけでは芸が無いので、各ソースに、制御用のコマンドを記述出来る様にした。これで、少々複雑な結合や、生成されたPerl Scriptの見た目を調整出来る様にしてみたのだ。

【使用環境等:OS及び配布内容とインストール方法】
perlmake.zipに同梱
pm.exe … PERL MAKE本体
pm.html … 本説明書
label&mask.xls … 捕捉説明
    pmsample/ … PMFILEを使ったサンプル
    • readme.txt … 説明
    • pmfile
    • samp.plb
    • counter.plb
    • htmlparts.plb
    singlesample/ … 単独モードのサンプル
    • readme.txt … 説明
    • mimehead.plb
    • htmlhead.plb
    • htmlfoot.plb
    • sample.plb
使用環境
OS Windows95/98(200,Me,Xp上では未確認)
インストール
インストーラはありませんので、パスの通ったフォルダに、pm.exeを格納しておいて貰えれば動作します。

【実行方法:起動オプション等】
用語説明
この説明書では、便宜上、以下の用語を定義します。
  • PERL MAKE
    このプログラム自体の名前として定義します。

  • ターゲットファイル
    結合されたファイルの出力先ファイルを、この様に呼びます。

  • リンク
    モジュールファイルを、ターゲットファイルに結合(追加)出力する事を、リンクと呼びます。

  • モジュールファイル
    リンク前の、各ファイルを、この様に呼びます。C/C++における、各ソースファイルと考えて下さい。

  • サブモジュールファイル
    基本的に、モジュールファイルと同じですが、制御コマンドを実行しないので、モジュールファイルと区別して、この様に呼びます。

  • PMFILE
    PERL MAKEの実行シナリオ(実行手順)を記載するファイル(PERL MAKEFILE)を、この様に呼びます。C/C++における、MAKEFILEと考えて下さい。

  • ソースファイル
    単独モードで実行する場合、PMFILE名の代わりに指定するファイル名をソースファイル名と呼びます。
実行方法
MS-DOSプロンプト(コマンドプロンプト)にて、実行します。
> pm [/(options)|/C] [/P(path)] [/T(target)] [(PMFILE名)] [CR]
  • オプション(options)の説明
    • /Hまたは、/?を指定すると、簡単なヘルプのみを表示して終了します。他のオプションは無効となります。
    • /Eを指定すると、PMFILE中に書かれた実行コマンドをSYSYTEM実行します。
    • /M(logmapfile)を指定すると、リンク状況を示すマップファイルを出力します。(logmapfile)に、出力するファイル名を指定しますが、省略した場合は、_OUT.MAPに出力されます。
    • /Cを指定すると、単独モード(※)として動作します。
  • /P(path)及び/T(target)指定について
    • 単独モードでは、/P及び/Tのオプションにて、それぞれ,
      Perlへのパス指定(例:/P/usr/bin/perl)と,
      ターゲットファイルの指定(例:/Tbbs.cgi)
      が使用出来ます。(※)
  • PMFILE名について
    • PMFILE名は、PMFILEの名前を記載しますが、ファイル名が、(pmfile)の場合は、省略しても構いません。
      単独モードの場合は、PMFILE名に、ソースファイル名(モジュールファイル名)を指定して下さい。
※※アルファベットについては、大文字/小文字を問いません
単独モード(※)
単独モードは、C/C++で言うCCの様に、MAKEFILE(ここではPMFILE)を造らなくてもターゲットを自動作成するモードです。内部的に、仮想のPMFILEを生成して実行しています。
  • PMFILE名の代わりに、ソースファイル名を指定して下さい。
    単独モードでは、ソースファイル名を省略する事は出来ません。
    指定されたソースファイル名は、仮想PMFILEの中で、
    link=(ソースファイル名)
    という行として定義されます。

  • /Tオプションにて、ターゲットファイル名を指定出来ます。
    例) /Tbbs.cgi
    指定されたターゲットファイル名は、仮想PMFILEの中で、
    target=(ターゲットファイル名)
    という行として定義されます。(/T*という指定も可能です。)
    省略した場合は、ソースファイル名の拡張子を、.cgiに変更したものが、ターゲットファイル名として採用されます。ソースファイル名の拡張子が、.cgiの場合は、拡張子を.plに変更したものが採用されます。
    /Tのみで指定された場合は、ターゲットファイルは開けませんので、コンソールに出力されます。

  • /Pオプションにて、Perlへのパスを指定出来ます。
    例) /P/usr/bin/perl
    指定されたパスは、仮想PMFILEの中で、
    perlpath=(Perlへのパス)
    という行として定義されます。
    省略した場合は、デフォルトの/usr/local/bin/perlが指定されたものとして動作します。
    /Pのみで指定した場合は、Perlへのパスが指定されていないものとして動作しますので、ソースファイルに、既にパスの指定がある場合は、この様に指定するか、ソースファイル内で、制御コマンドの、#'nopathを指定して下さい。

  • /Eオプションとの併用が可能ですが、この場合、仮想PMFILEの中で、
    exec=perl (ターゲットファイル名)
    として定義されますので、自分の環境に合わない場合は併用しないで下さい。

  • /Mオプションとの併用が可能です。

【PMFILE(PERL MAKEFILE)書式】
PMFILEには、PERLMAKEが実行する手順を、以下のコマンドを使用して記述します。targetと、perlpath以外は、実行される順に記述して下さい。
  • 注釈
    PMFILEの各行に於ける#以降は注釈となります。
    勿論、行の途中からを注釈とする事も可能ですので、コマンドを記述した後に、注釈を入れても構いません。


  • target=(ターゲットファイル名)
    ターゲットファイル(結果として作成するファイル)名を記述します。
    PMFILE中、何処に記述しても構いませんが、採用されるのは、最初に現れた1個のみです
    target=*と指定した場合、デフォルトの_out.cgiに出力します。
    target(ターゲットファイル)の記述が無い場合,若しくは、ターゲットファイルが開けなければ、コンソールに出力します。


  • perlpath=(パス名)
    生成されるCGIスクリプトの先頭に記載するPerlへのPATHを指定します。
    PMFILE中の何処に記述しても構いませんが、採用されるのは、最初に現れた1個のみです。
    この指定が無い場合は、ターゲットへの記述は行われませんが、先頭にリンクするモジュールファイルに記述されていれば、そのまま反映されるので、問題はありません。
    perlpath=*と指定した場合、デフォルトの/usr/local/bin/perlを使用します。


  • link=(モジュールファイル名) または
    add=(モジュールファイル名) (どちらでも同じ動作をします)
    リンクするモジュールファイル名を記載します。PERL MAKEは、追加したモジュールファイル名を記憶しており、指定されたファイルが既にリンクされている場合は、そのファイルのリンクをパスします。(重複チェック)
    モジュールファイル名には、test.plb<label1>の様に、<〜>に挟んでラベル名を付加する事が出来ます。この様に指定した場合は、指定のモジュールファイル中、ラベル名で指定された部分のみをリンクさせます。


  • exec=(実行コマンド)
    この行が現れた時点で、コマンドを実行します。生成されたターゲットファイルを、そのまま実行したい場合,リンク作業の途中で、モジュールファイルに手を加えてからリンクするという操作を行う場合に利用して下さい。ただし、PERLMAKE実行時に、/Eオプションが付加されていなければ、実行は行われず、この行は無効となります。

  • lib=(ライブラリパス)
    この行以降のlinkに、指定したパスを付加して扱います。モジュールファイルをサーチするディレクトリを指定すると考えて良いでしょう。ライブラリ(モジュールファイル)を他のディレクトリに纏めて入れた場合に指定しておけば、linkコマンドに、長いパスを記述しなくて良いという訳です。
    lib=*でデフォルトのカレントディレクトリに戻ります。
    注)サブモジュールファイルには適用されません。


  • end
    PMFILEの終了を意味します。この行以降は、実行されません
例)
# pmfile
target=bbs.cgi #掲示板
perlpath=/usr/local/bin/perl
link=filelock.plb
link=fileread.plb
link=filewrite.plb
link=display.plb<normal>
link=main.plb
exec=perl bbs.cgi
end

【モジュールファイル書式】
モジュールファイルは、Perl Script全体の一部分を切り出したものと考えて下さい。即ち、スクリプトの中で、良く使う部分を、切り出して、ファイルに保存しておけば完成です。幾つかのサブルーチン関数(sub)をまとめてモジュールファイルに入れておくのが便利ですが、結果としては、PMFILEに記述された順番にリンクされるだけなので、適当なところでぶった切っても問題はありません。極端な話、サブルーチン関数(sub)の途中で切っても良いです…あまり意味はありませんが…
ファイル名の制限
ファイル名に、#を含むものは、#以降が注釈と見なされるので避ける様にしてください。(ターゲットファイル名も同様)
ターゲットファイル名と同じファイル名のものがあると、上書きされてしまう恐れがあるので、拡張子を変える等して区別する事を推奨します。拡張子については、PLB(Perl LiB file)を推奨しますが、制限は無いので、PL,CGI等でも何ら問題はありません。
制御コマンド
モジュールファイル内に、#'から始まる行が存在する場合、PERLMAKEは、これを制御コマンドとして扱い、ターゲットファイルには出力しません。制御コマンドとしては、以下の制御コマンドを記述する事が出来ますが、記述出来る場所に制限が有りますので、以下「制御ヘッダ」「制御行」の項目を参照して下さい。
以下、コマンド中の青色部分は、任意の文字列と解釈してください。

  • #'
    ターゲットファイルに出力しません。以下の何れかの制御コマンドに合致しない場合でも、#'から始まる行は、ターゲットファイルには出力されません。どうしても必要な場合は、先頭にスペースを挿入する等して下さい。

  • #'nopath
    モジュールファイルの1行目を出力しません。モジュール毎にデバッグを行って、先頭に『Perlへのパス』が記述されている場合等に指定して下さい。

  • #'nocom
    PERL MAKEは、モジュールファイルをリンクした後,リンクしたモジュールファイル名を、コメントとしてターゲットファイルに出力しますが、この制御行がある場合は、このコメント出力を(該当ファイルについてのみ限定で)行いません。ターゲットファイルのサイズを少しでも節約したい場合,勝手に付加されるコメントがうざい!という場合に指定して下さい。

  • #'need test.plb(モジュールファイル名)
    そのモジュールファイルをリンクする前に、リンクしておきたいモジュールファイルを記述します。このコマンドが有る場合、PERL MAKEは、現モジュールファイルのリンクを一旦保留し、指定されたモジュールファイルを先にリンクします。現在のモジュールファイルは、その後にリンクされます。別のモジュールファイルの変数を参照しているとか、他のモジュールにあるサブルーチンを呼んでいるという場合に指定しておくと便利です。有る意味では、C/C++の#includeに似ています。勿論,既にリンクされている場合はリンクしません。基本的には、順序よくPMFILEに記述すれば良いのですが、書き忘れや順序のミスを修正する等の効果が期待出来ます。
    ※モジュールファイル名には、linkコマンド同様にラベル名を含める事が出来ます。


  • #'head{
    〜制御ヘッダ(拡張)〜
    #'}head または、 #'headend
    (V1.4.1.以降で追加)制御ヘッダ部を記述している事を明示します。モジュールファイルの先頭5行目以内に、#'head{が存在する場合は、行頭から、#'}headが見つかるまでを、拡張制御ヘッダとして扱います。拡張制御ヘッダは、最大で、モジュールファイル先頭から32行とします。(従来版との互換性を保つ為、若干ややこしい仕様となっていますが、要は、モジュールファイルの5行目までに、#'head{があれば、拡張ヘッダとして認識され、もう少し、制御ヘッダに多くの情報を含める事が出来るという事です,多分、32行以上使う事は無いでしょうという勝手な解釈で、最大行数を32としています)
    #'}headと、#'headendは、同一の意味を持ちます。これらが、#'head{を伴わず、単独で使用された場合、それ以降の行をヘッダとして扱いませんので、ヘッダを、5行より短くする事も出来ます。


  • #'(ラベル名){
    〜ラベル名に相当するコード
    #'}(ラベル名)
    ラベル処理:この2つのコマンドに囲まれた部分を、ラベル名の名前で定義付けます。モジュールファイル内の1部分だけを、ターゲットファイルに出力したい場合、この「ラベル名」にて指定する事が出来ます。モジュールファイルの指定で、ラベル名を指定されていない場合は、このコマンドは無視されます。
    ラベル名には、アルファベット,数字を使用して下さい。記号が含まれた場合の動作は保証されていません。
    ラベル名がdebugの場合、下記の除外処理となります。また、ラベル名がheadの場合、上記の制御ヘッダラベルと混同する為、ラベルとしては認識されません。このため、リンクさせるラベル名として、debug,headを指定する事は出来ません。(V1.4.1.修正)
    除外処理より優先されるので、除外処理中に記述されていた場合でも、ラベルが一致した場合は採用されます。
    指定したモジュールファイル内に、複数の同名ラベルが定義されている場合は、それら全てを出力します。
    ラベルの範囲が重なっていたり、ラベルの範囲と除外の範囲が重なった場合の処理については、保証しませんが、計画通りであれば、この表の通りの動作をします。
    ラベル名を指定されていて、指定されたラベル名が見つからない場合は、全てがターゲットファイルに出力されません。
    ラベル処理の終了コマンドが省略された場合は、ファイルの終わりまでをラベルと認識します。


  • #'debug{
    〜デバッグ用のコード
    #'}debug
    除外処理:この2つのコマンドに挟まれた部分について、ターゲットファイルに出力しません。C/C++言語で、よく使われる、
    #define _DEBUG_

    #ifdef _DEBUG_
    〜デバッグ用のコード
    #endif
    の代用と考えて下さい。モジュール単位でのデバッグを行った場合等、最終的には不要となる部分は、この記述で挟んでおけば、ターゲットファイルには反映されない訳です。尚、この間は、制御コマンドについても無視されます。尚、#'}debugが省略された場合は、ファイルの終わりまでが、除外の対象となります。


  • #'<=test2.plb(サブモジュールファイル名)
    C/C++の#includeの様に、指定箇所に、サブモジュールファイルを単純に展開します。サブモジュールファイルは、実質的に、モジュールファイルですが、この制御コマンドにて取り込んだ場合には、内部の制御コマンドは実行されずに、単純に展開されます。また、重複チェックは行われない為、2重に読み込まれる可能性もあります。これについては、使用者の方で気を付けて下さい。
制御ヘッダ
モジュールファイルの先頭の5行目(拡張で最大32行)までを、制御ヘッダと呼びます。この部分には、以下の制御コマンドを記述する事が出来ます。
  1. #'
  2. #'nopath
  3. #'nocom
  4. #'need test.plb(モジュールファイル名)
  5. #'head{
    〜制御ヘッダ(拡張)〜
    #'}head または、 #'headend
制御行
上記、制御ヘッダ以外の部分に記述した制御コマンドを制御行と呼びます。使用出来る制御コマンドは、以下の通りです。
  1. #'
  2. #'(ラベル名){
    〜ラベル名に相当するコード
    #'}(ラベル名)
  3. #'debug{
    〜デバッグ用のコード
    #'}debug
  4. #'<=test2.plb(サブモジュールファイル名)

【その他:注意事項/改版予定等】
注意事項
  • PMFILE中に無効なコマンドが記述されている場合、その行は無視されますが、無効コマンドが連続する場合には、PERL MAKEが異常終了する可能性が有りますので、なるべく有効コマンドのみで記述して下さい。(将来の版で修正します)(1.1.1.対応)

  • PMFILEのlink=..にてリンクされるファイルと、制御コマンドの#'needでリンクされるファイルの数は、合計で128個までが限界です。これを越えた場合の動作保証はしません。#'needにて要求されたファイル内で、更に#'needが有る場合も、全てリンクの対象となるので、注意が必要です。

  • 上述の、#'needにて要求されたファイル内で、更に#'needが有る場合は許容されますが、このネストの深さも、128までが限界です。こちらも保証はしませんので、注意が必要です。

  • 127バイト以上のファイル(モジュールファイル,ターゲットファイル等)名,モジュールファイル内に、1行が、127バイト以上の行が存在する場合,その他、127バイト以上の文字列が存在する場合、動作については保証出来ません。多少の余裕を考慮している部分もありますが、一般的には、存在しない状況と考えて仕様として保証はしませんので、注意して下さい。
免責事項
  • 本ツールの使用にあたっては、以下の免責事項を全て承諾していただいた上で、使用されるものとします。
  • 本ツールを使用した上で発生した、如何なる問題,障害に関しても、当方は責任を負いかねます。
  • 本ツールは、フリーソフトですが、著作権については放棄しておりません。本ツールを、サイト等にて再配布される場合は、COOL(http://homepage2.nifty.com/ozzaki/)へのリンクを貼るか、若しくは、当方サイトのURL:http://homepage2.nifty.com/ozzaki/の表記を行う義務があるものとします。
改版履歴
0.9.5.デバッグ開始版(β)未配布
1.0.0.内部配布開始一部テスタ殿配布
1.0.5.重複チェックで、抜けがあった点,修正テスタ殿指摘
1.1.1.PMFILEの無効コマンド無視対応(ローカル)--
1.2.0.#'<=...コマンド対応テスタ殿要望
1.3.0.単独モード実装--
1.3.2.単独モードバグ修正配布版1
1.3.5.部分リンク実装ローカルテスト版
1.4.0.リンクマップ作成機能実装ローカルテスト版
1.4.1.拡張制御ヘッダ対応ローカルテスト版
1.5.0.1.4.1.同等配布版2
改版予定
  • #'<=...コマンド対応(1.2.0.対応)
  • PMFILEの無効コマンド無視対応(1.1.1.対応)
  • 単独モードの実装
    PM /c target.cgi exam.plb
    にて実行し、架空のPMFILE
    target=target.cgi
    link=exam.plb
    を作成して実行するモード。CC test.cppの様な環境を実現する事が目的
    仕様未確定の為、未実装
    (1.3.0.対応)
  • 部分リンク(ラベル指定)の実装(1.3.5.対応)
  • 制御ヘッダの行数が5行より多い若しくは少ない場合の対応 (1.4.1.対応)
  • リンクマップ作成機能の追加(1.4.0.対応)

Perl Make by COOL