2017-11-17 2 views
1

背景

私は現在リファクタリングしている大きなプロジェクトがあります。大規模なC/C++プロジェクトのコンパイル時にGNU m4を使用

  • C /:問題の一つは、以下を含む、あらゆる場所に製品(すなわち/opt/devへの参照と、この位置のサブパス)で使用される一般的なパスの文字列リテラル(300+インスタンス)の大規模な乱用でありますC++のソースファイルとヘッダーファイル。
  • pythonスクリプト。
  • bashスクリプト。
  • systemdスクリプト。
  • バイナリイメージ(ドライバ)。

ゴール

ことを我々のコードが分岐している場合ので、私たちは、「一度書けばどこでも使う」ことができますので、私は一般的なマクロのセットを使用してファイルを定義するためにGNU を使用したい

(典型的には新製品の場合)、重複した文字列リテラルを掘り下げて数日間デバッグするのではなく、その1つのファイル内のマクロを変更することができます。これは、ビルド出力パスにソースツリーのコピーを作成し、スクリプトでM4を直接実行するだけで、スクリプトのような単純なものでも簡単です。


問題

これまでのところ唯一の欠点は、私はコンパイル時にのみM4マクロ展開/置換を実行したいので、これは、C/C++プロジェクトのための大規模な取り組みになりますように見えるということです。つまり、gitからチェックアウトされたソースファイルを変更するのを避けるために、オリジナルのソースファイルではなく、コードの一時コピーを処理するためにビルドスクリプト(多くのMakefiles)を変更する必要があります。それ以外の場合は、バージョン管理されたソースに直接M4を実行すると、ローカルの作業コピーが変更され、開発者はこのM4で評価されたコードのコピーをバージョン管理にコミットして、M4の努力を破ります。


質問

それはいくつかの外部ツールやGCC自体のいくつかの機能のいずれかを介して、は、コンパイル時にマクロ/展開を評価するように指示することは可能ですか?もしそうでなければ、私のビルドスクリプトはM4マクロをサポートするために大規模なオーバーホールを必要とするでしょう。

+3

Cおよび/またはC++コードの 'project-config.h'ヘッダを生成するには' m4'を使います。マクロの1つを使用する必要があるすべてのファイルで、そのヘッダーを使用します。プログラマーは、それが何を使用すべきかを知っていることを確認してください。チェックインの前にコードチェックを行うか、定期的に実施しますか?ヘッダーが変更されたときに再コンパイルします。それを不必要に変更しないでください。 –

+0

@JonathanLeffler一息、とてもエレガントでシンプルです。どのように私はこれを見落としたか分からない。これを回答に変換すると、私はそれを受け入れたとマークします。 – DevNull

答えて

3

m4を使用して、Cおよび/またはC++コードのヘッダーをproject-config.hとして生成します。マクロの1つを使用する必要があるすべてのファイルで、そのヘッダーを使用します。プログラマーは、それが何を使用すべきかを知っていることを確認してください。チェックインやコードベースの定期的なスキャンの前に、コードチェックを使用する可能性がありますか?ヘッダーが変更されると、影響を受けたファイルを再コンパイルします。それを不必要に変更しないでください。

+0

M4がストリームエディタとして扱われていたと思います。sed + grepの "派手な"バージョンのように)、ファイル生成ツールとしてではなく、間違った精神モデル。 – DevNull

+1

簡単に間違えてしまいます。 AutoConfシステムは 'm4'を使い、設定ファイルを生成します。これはゆるやかに類似している。 –

関連する問題