2009-07-25 10 views
3

私はperlスクリプトを持っています。私はgppがそれらを普通に処理する前に、基本的に余分な前処理ステップとして、私のcpp/hファイルをフィルタリングしたいと思います。これを行う簡単な方法はありますか?私はスクリプトにcppファイルを供給してgccにstdinからの出力を読み込ませることができることに気づいていますが、これはヘッダファイルには役立ちません。C++をperlスクリプトでフィルタリングしますか?

答えて

7

このようなプロセスを処理する古典的な方法は、ソースコード(Perlフィルタへの入力)を新しいファイルサフィックスで新しい言語として扱うことです。次にmakeに、この新しいファイルタイプからC++ソースファイルをコンパイルする方法がPerlスクリプトであると伝えます。例えば

  • 新しいサフィックス:(.ccサフィックスを想定).ccp
  • 新ルール:

    .ccp.cc: 
         ${FILTERSCRIPT} $< 
    
  • サフィックスリストに新しいサフィックスを追加 - よりも優先して通常のC++ルール

最後の点が最も難しいです。 .ccpという接尾辞を追加するだけでは、ファイルが存在する場合、make.ccpファイルの変更に実際には気を付けません。中間の.ccファイルを削除するか、接尾辞リストの.ccの前に.ccpが表示されていることを確認する必要があります。 (注: '.ccp.cc'ルールなしで '.ccp.o'ルールを作成し、 '.cc'中間がクリーンアップされていないことを確認しないと、コンパイルに失敗した後に再構築すると、makeは '.cc'ファイルがあります。

サフィックスの変更がオプションでない場合は、フィルタリングを実行するコンパイルスクリプトを作成し、C++コンパイラを直接呼び出します。

2

CおよびC++プリプロセッサは、この種のものをサポートしていません。これを処理する唯一の方法は、コンパイラを呼び出す前に、makefile(または何でも)がperlスクリプトを通してすべてのファイルを処理することです。これは明らかに非常に困難であり、このようなステップを必要とするアーキテクチャを設計していない非常に良い理由の1つです。あなたはそのような施設が必要だと思うのですか?おそらくあなたが気付いていないより良い解決策があります。

+0

私は同意します。私はあらゆる種類のソースコードの前処理を行うための複雑な規則を持つMakefileを管理してきましたが、それはあまり面白くありません。 – JesperE

2

Perlスクリプトを実行してgccを呼び出すgccのラッパーはどうですか? plgccのようなものを呼び出し、makefileに​​と設定します。あなたのスクリプトはインクルードディレクティブを処理するのに十分スマートでなければなりません - あなたのスクリプトがインクルードするインクルードするプリプロセッサだけを呼び出すのでなければ、そのことを行い、gccを呼び出します。

2

GCCでは、独自のプリプロセッサを使用できます。スクリプトをプリプロセッサとして設定し、cpp(通常のgccプリプロセッサ)を使って出力を実行することができます。 -Bと-no-integrated-cppコマンドラインオプションのgccマニュアルを見てください。

警告 - 私は自分自身を試したことがないので、どのように面倒かも知れません(C++を含む多くの言語がacコンパイラのプリプロセッサとして実装されていましたが、あまりにも悪い)。

+0

C++は、もともとプリプロセッサとして実装されていません。オブジェクトコードやアセンブリ言語ではなくCを発行するコンパイラとして実装されていました。 –

+0

GCC固有のオプションを使用すると、もちろん他のコンパイラによってコードが消費されることはありません。 – JesperE

1

私はこれまでのように、以下のようなことをして、このようなケースを処理しました。このアプローチでは、未処理のソースコードをある種の命名体系(この場合はベース名の後に_ppという接尾辞)で区別できると仮定しています。

# These are your source files to be preprocessed 
SRC_RAW = mysrc_pp.cpp 

# These are the source files after preprocessing 
SRC_PP = $(patsubst %_pp.cpp, %.cpp, $(SRC_RAW)) 

ALL_SRC = $(SRC) main.cpp other.cpp 

OBJ = $(patsubst %.cpp, %.o, $(ALL_SRC)) 

$(SRC): %.cpp: %_pp.cpp 
     $(PERL) $< > [email protected] 

$(OBJ): %.o: %.cpp 
     $(CXX) ... 

ただし、前処理が必要なヘッダーファイルがある場合は処理されません。その場合、それらを作成するために同様のルールが必要です。

+0

私はヘッダーファイルのものがここでの主な問題だと思います –

関連する問題