- - PR -
sedコマンドを使って選択的に置換する方法について
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-02-14 21:23
こんにちは。juiceと申します。
これまでWindowsの環境で開発を行っていたのですがLinuxの環境で開発を行う必要が生じたためLinux上で使用するmakefileを書いています。 makefileの中でsedコマンドを使用し、選択的に置換を行いたいのですが、何かよい方法をご存知の方がいらっしゃいましたらご教授ください。 現在以下のようなことをmakefileで行いたく、よい案を模索中です。
上記条件のうち3を除いた条件(すべてCCC_???.hを見に行く)をクリアしたmakefileは出来たのですが、3を実現できる方法がわかりません。 ちなみに、現在は以下のように置換しています。
理想としては、
のようにCCC_つきのファイル名で参照してほしいヘッダのみ指定し、CHANGEHEADDERにあてはまるファイル名があった場合のみソース内で置換を行う、というようにしたいと考えていますが、このような方法はないのでしょうか? 最悪の場合は
のどちらかの方法で決着をつけようかと思っています。 質問文が長くなってしまい申し訳ありません。 なにか心当たりのある方がいらっしゃればヒントをいただきたく存じます。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2005-02-15 09:59
このような経験がありませんので伺いたいのですが、ソースファイルやヘッダファイルを コピーする際にリネームするのってよく行われるものなのでしょうか? make用のディレクトリを作成しているのならば、リネームせずに単純にコピーしてしまえば そもそもソース内のinclude宣言部を書換する必要もなくなるのではないかなと考えてしまいました。 さて、本題の部分に関してですが 普通のシェルスクリプトならば、awkかperlに投げるもしくはcsh等の シェルスクリプトにして配列でも使えばできそうだなと思うのですが、 makefileということで、/bin/shでもできるように考えてみました。
位置パラメータを使って、リネームしたいヘッダファイルを回しています。 あとは、do - done 内部をカスタマイズして頂ければできるかな、と。 | ||||||||||||
|
投稿日時: 2005-02-15 11:23
Utaさん、ご回答ありがとうございます。
よくあるかどうかはわからないのですが、今回の場合はファイル名に一意のコードを含める必要があるため、このようなことをしています。makeの度にmakefileでやらなくとも一度ざっと変換してしまえば楽なのですが、元ソースが別途更新される可能性があるため、更新された場合に自分のモジュールに反映しやすいようにmakefileを利用しようと考えました。…うまく説明できないのですがお分かりいただけたでしょうか? 肝心のシェルスクリプトなのですが、自分でいろいろ調べながら書いていただいたコードの意味を理解しているところです。 ある程度理解が進んだところで、こちらにご報告させていただこうと思っています。ありがとうございました。 | ||||||||||||
|
投稿日時: 2005-02-15 17:01
お世話になっております。
Utaさんに教えていただいた方法を元に、スクリプトを書いておりますがスクリプトの書き方が正しくないのか、syntax errorが出てしまいます。何かお分かりの方がいらっしゃれば、ご教授願います。 現在のコードは以下のようになっています。
このようにmakefileを書き換え、makeを行うと以下のようなエラーメッセージが出力されます。(本題にかかわると思われる部分のみ抜き出しました。他に出力されているエラーメッセージはありません。)
素人考えですが、「$#」,「$1」が効いていないように見えます。 また、以下のように書き換えて実行すると以下のようなエラーが出力されます。
根本的に書き方が間違っているのか、あるいは別の原因(自分の開発環境特有の設定など)で「$#」,「$1」が効いていないのかわからないため、続けて質問させていただきました。 お忙しいとは存じますがよろしくお願いいたします。 [ メッセージ編集済み 編集者: juice 編集日時 2005-02-15 17:06 ] | ||||||||||||
|
投稿日時: 2005-02-15 18:36
ヘッダファイルの読み込みについては,コンパイル時に I オプションを付してヘッダのあるディレクトリを追加することができます。
cc -I /path/to/directory1/ -I /path/to/directory2/ ... CCC_AAA.cの作成は行って、 インクルードには 「change」を追加 ですみませんか? A.h B.h C.h D.h E.h F.h には CCCを付けない。 ソースの変更なら #ifdef などがノーマルと思いますが ================================================= あるいは、インクルード順位の最高位のディレクトリに 、BBB → #INCLUDE CCC_BBB をする間接インクルードの中継地でも置くとか。ですね [ メッセージ編集済み 編集者: MMX 編集日時 2005-02-16 09:49 ] | ||||||||||||
|
投稿日時: 2005-02-15 20:01
MMXさん、ご回答ありがとうございます。
"CCC_"を付加しないソース群でmakeした場合では正常にオブジェクトが生成されるため、ヘッダのパスが通っていない、ということはないと思います。"-I"オプションも正しく使われています。
"CCC_"をつけない、という選択肢はないようなのです…(技術的でなく他の事情により) ソース自身に修正を加えると、元ソースが改変された場合に再度同じ修正を自分のソースに加えなければならないと考えたため、"#ifdef"は使わずにmakefileのみで実現しようとしています。 以下引用を参照のこと。
また、MMXさんのおっしゃる"インクルードには 「change」を追加"の意味がわかりかねるのですが、具体的にはどのような方法を指すのでしょうか? お手数おかけしますがお答えいただけると幸いです。 やはりこのような方法はないのでしょうか… 私の作成したシェルスクリプトが基本的に間違っているかもしれないので、「そもそも書き方が違う」といったヒントでもいただければありがたく存じます。 よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2005-02-16 08:34
すみません、勘違いをしていました。
makefileを作るためのスクリプトを作成するのだと思っていました。 makefile内に記述しておくことでsedを呼び出せるのですねぇ。。 知りませんでした。 オープンソースによく見られるように、 configure(シェルスクリプト) → makefile作成 → make というように手順を分けることは難しいのでしょうか? | ||||||||||||
|
投稿日時: 2005-02-16 14:24
configureというのがよくわからなかったので調べてみたのですが、configureの書き方がわからないので時間がかかりそうです。。。 makefileは自分でがりがり書くものだと思っていました。 ひとつお聞きしたいのですが、「configure(シェルスクリプト) → makefile作成 → make というように手順を分ける」と何かいいことがあるのでしょうか?今現在問題となっているポイント(CCC_をつけたファイル名に対応する)を除けば正しくコンパイル〜リンクが行えているのであまりここから大幅に変更はしたくないと考えているのですが。 |
1|2|3
次のページへ»