背景
私は現在リファクタリングしている大きなプロジェクトがあります。大規模なC/C++プロジェクトのコンパイル時にGNU m4を使用
- C /:問題の一つは、以下を含む、あらゆる場所に製品(すなわち
/opt/dev
への参照と、この位置のサブパス)で使用される一般的なパスの文字列リテラル(300+インスタンス)の大規模な乱用でありますC++のソースファイルとヘッダーファイル。 - pythonスクリプト。
- bashスクリプト。
- systemdスクリプト。
- バイナリイメージ(ドライバ)。
ゴール
ことを我々のコードが分岐している場合ので、私たちは、「一度書けばどこでも使う」ことができますので、私は一般的なマクロのセットを使用してファイルを定義するためにGNU m4を使用したい(典型的には新製品の場合)、重複した文字列リテラルを掘り下げて数日間デバッグするのではなく、その1つのファイル内のマクロを変更することができます。これは、ビルド出力パスにソースツリーのコピーを作成し、スクリプトでM4を直接実行するだけで、スクリプトのような単純なものでも簡単です。
問題
これまでのところ唯一の欠点は、私はコンパイル時にのみM4
マクロ展開/置換を実行したいので、これは、C/C++プロジェクトのための大規模な取り組みになりますように見えるということです。つまり、gitからチェックアウトされたソースファイルを変更するのを避けるために、オリジナルのソースファイルではなく、コードの一時コピーを処理するためにビルドスクリプト(多くのMakefiles)を変更する必要があります。それ以外の場合は、バージョン管理されたソースに直接M4
を実行すると、ローカルの作業コピーが変更され、開発者はこのM4で評価されたコードのコピーをバージョン管理にコミットして、M4の努力を破ります。
質問
それはいくつかの外部ツールやGCC自体のいくつかの機能のいずれかを介して、gccは、コンパイル時にm4マクロ/展開を評価するように指示することは可能ですか?もしそうでなければ、私のビルドスクリプトはM4マクロをサポートするために大規模なオーバーホールを必要とするでしょう。
Cおよび/またはC++コードの 'project-config.h'ヘッダを生成するには' m4'を使います。マクロの1つを使用する必要があるすべてのファイルで、そのヘッダーを使用します。プログラマーは、それが何を使用すべきかを知っていることを確認してください。チェックインの前にコードチェックを行うか、定期的に実施しますか?ヘッダーが変更されたときに再コンパイルします。それを不必要に変更しないでください。 –
@JonathanLeffler一息、とてもエレガントでシンプルです。どのように私はこれを見落としたか分からない。これを回答に変換すると、私はそれを受け入れたとマークします。 – DevNull