ショッピングモール  Automotive / Motorcycles ( Repair & Performance )  Automotive ( Parts )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5363

makeマクロの使用法
投稿者---kolona(2006/02/01 20:08:49)


makeファイルでマクロを使おうとしています。
これまでは擬似ターゲットとしてallを定義し、以下のようにしていました。

all:
    bcc32 10-b2.c
    bcc32 b-102.c
    bcc32 b-103.c
    bcc32 findfile.c
    del *.tds
    del *.obj


しかし、コマンドは全て同じなのにちょっと書式が冗長な上、拡張子で判断して全削除は乱暴だと感じたので
マクロでまとめてしまうことを考えました。
考えたマクロはCOMPILEという名前で、コンパイルするファイルのサフィックス(拡張子?)を除いた
文字列でマクロの中身を書き換えることでコマンドを実行させようとしています。

COMPILE = bcc32 CCCC.c; del CCCC.tds; del CCCC.obj

しかし、bcc32コマンドは複数のファイル名を引数にとれるため、「;」を使って分断しても
全て引数として展開してしまうようです。上記の例では

D:\work>make all
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 10-b2.c; del 10-b2.tds; del 10-b2.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
エラー E2194: ファイル '10-b2.c;' が見つからない
エラー E2194: ファイル 'del.cpp' が見つからない
エラー E2194: ファイル '10-b2.tds;' が見つからない
エラー E2194: ファイル 'del.cpp' が見つからない
エラー E2194: ファイル '10-b2.obj' が見つからない

** error 1 ** deleting all
となってしまいます。


複数のコマンドをマクロにする方法として「GNU Make」では慣用コマンド列が使えると書かれていました。
書式は
define COMPILE
  bcc32 CCCCC.c
  del CCCC.tds
  del CCCC.obj
endef

でした。
これをbccのMakeで実行するとdefineの次の行でシンタックスエラーが発生します。
ヘルプを見てみるとどうもbccのmakeにはdefine命令が無いようです。


解決するには
1. コマンドを1行に列挙しても引数に展開されない方法
2. 慣用コマンド列の代替書式

のいずれかが必要だと考えられますが、未だ見つけられません。
ご存じの方は、解決方法、もしくは関係資料を教えてください。


OS :Win Me
コンパイラ :Borland C++ Compiler 5.5.1
make :Borland C++ Compiler 5.5.1についてくる ver 5.2のmake
参考URL
http://radiofly.to/nishi/programming/make-guide.html
http://www.geocities.co.jp/Milano/8000/bcc/make.html
http://www.unixuser.org/~euske/doc/makefile/
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/make-intro/macro.html
http://www.notwork.org/~gotoken/mag/softwaredesign/
http://www005.upp.so-net.ne.jp/h-masuda/cl/CStrPnt/c1090.html
http://docs.sun.com/source/806-4843/Cp3_develop.html

参考書籍
GNUソフトウェアプログラミング,O'REILLYJAPAN,2003
GNU Make,O'REILLYJAPAN,2005
C言語逆引き大辞典,秀和システム,2003


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:makeマクロの使用法 5364 ぽこ 2006/02/02 01:03:06
<子記事> Re:makeマクロの使用法 5365 かずま 2006/02/02 01:53:51


No.5364

Re:makeマクロの使用法
投稿者---ぽこ(2006/02/02 01:03:06)


問題点は以下の認識であっていますか?
(1)Makefile内の似たような記述「bcc ….c」を
 出来るだけ書かないようにするにはどうすれば良いか?
(2)ファイルを削除する時、ある拡張子をまとめて消しても良いものか?

(1)については、kolonaさんが参考URLで示している、
>http://www.geocities.co.jp/Milano/8000/bcc/make.html
にある、「暗黙のルール定義」を使えば良いのではないでしょうか?

(2)については、拡張子指定でファイル削除しても誰も文句は言わないと思います。
ただ、中間ファイルを削除することを目的とする別の擬似ターゲットを作成し、
それを擬似ターゲットallから呼んだ用が良いと思います。
#ただ、make allで中間ファイルを削除するモンでしょうか。。makeの利点を損ねている気がしますが。
#allに依存関係がないのもおかしな気がします。


この投稿にコメントする

削除パスワード

No.5370

Re:makeマクロの使用法
投稿者---kolona(2006/02/02 17:59:40)


>問題点は以下の認識であっていますか?
>(1)Makefile内の似たような記述「bcc ….c」を
> 出来るだけ書かないようにするにはどうすれば良いか?
>(2)ファイルを削除する時、ある拡張子をまとめて消しても良いものか?
はい。

>「暗黙のルール定義」を使えば良いのではないでしょうか?
参考にしていた暗黙のルール定義の例は普通のターゲット相手なら(実行ファイルの名前を直接指定している)$@でファイルの本体の名前を指定できるのですが、疑似ターゲットだとそれはできませんでした。
なので、ターゲットの依存ファイルからファイル名を推定してコンパイルするようにしました。
.c.exe:
    bcc32 $(*<).c
    del $(*<).obj
    del $(*<).tds

ALLEXE = b-102.exe 10-b2.exe

all: $(ALLEXE)

clean:
    del *.tds
    del *.obj


>#ただ、make allで中間ファイルを削除するモンでしょうか。。makeの利点を損ねている気がしますが。
現在、同じディレクトリに全てのソースファイルを保存しており、中間ファイルが邪魔だったのでこのようにしております。allで日常的に使用するプログラムのみをコンパイルしています。私のプログラム程度でしたら、まだ大したロスにはなっていません。

>#allに依存関係がないのもおかしな気がします。
はい。ご指摘を受けてからGNUMakeの疑似ターゲットの項を読み直してみると
allの扱いを誤解していたようです。allは依存関係無視で全てコンパイルと理解していましたが、むしろmakeの課程で生成される実行ファイルを全て構築する単なるフラグとして扱われていました。上記makeファイルはさらにexeファイルの依存関係等を追加する必要があります。
たぶん、これである程度実用的なmakeになりそうです。

指摘とアドバイス、ありがとうございました。


この投稿にコメントする

削除パスワード

No.5365

Re:makeマクロの使用法
投稿者---かずま(2006/02/02 01:53:51)


Windows なんだから、マクロではなく、バッチファイルにするというのは
どうでしょうか?
bcc.bat:
--------------------------
bcc32 %1
del %~n1.obj %~n1.tds
--------------------------

makefile:
--------------------------
all:
    bcc32 10-b2.c
    bcc32 b-102.c
    bcc32 b-103.c
    bcc32 findfile.c
--------------------------



この投稿にコメントする

削除パスワード

No.5367

Re:makeマクロの使用法
投稿者---かずま(2006/02/02 02:53:22)


訂正します。
makefile:
--------------------------
all:
    bcc 10-b2.c
    bcc b-102.c
    bcc b-103.c
    bcc findfile.c
--------------------------




この投稿にコメントする

削除パスワード

No.5371

Re:makeマクロの使用法
投稿者---kolona(2006/02/02 18:12:57)


>Windows なんだから、マクロではなく、バッチファイルにするというのは
どうでしょうか?

やってみたのですが、
del %~n1.obj %~n1.tds
の二つ目の%によるファイル名の変形がうまくいかず、~n1.tdsがそのまま表示されてしまいました。
delコマンドを2行に分けて
del %~n1.obj
del %~n1.tds
としても2回目以降の%による展開に失敗し、さらに2回目のバッチファイルの実行時は2行の%が両方とも無視されてしまいました。
winXPだとそのままうまくいきましたのでwinMeのバグか、仕様の違いと考えられます。

考えた結果、以下のサフィックスルールを使うことにしました。
.c.exe:
    bcc32 $(*<).c
    del $(*<).obj
    del $(*<).tds

ALLEXE = b-102.exe 10-b2.exe

all: $(ALLEXE)

clean:
    del *.tds
    del *.obj



ご指摘とアドバイス、ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity