1

definitions.h関連する FORTRAN ファイルからインクルードされるヘッダー ファイル ( ) とmakefile. たとえば、コンパイラ、いくつかのライブラリ セット、許可される並列化の種類 (MPI、OpenMP、またはなし) は で選択されmakefile、コードの一部の組み込みは#defineヘッダーのディレクティブによって制御されます。

  1. コンパイルをセットアップするために 2 つの異なるファイルを編集する必要はありません。より良いアプローチはありますか?

  2. また、makefiledefinitions.hファイルの両方がリビジョン管理下にあります。これは、私の仲間の不注意な開発者が、有効なコンパイル オプションを変更しただけの両方のファイルの新しいバージョンをコミットしてプッシュしたため、リビジョン管理履歴が汚染されたことを意味します。理想的には、コンパイル オプションを設定するために、少なくとも最大のファイル ( makefile) を編集する必要はありません。

  3. 場合によっては、不一致が発生します。通常、 で選択されたライブラリの組み合わせの中には、ディレクティブmakefileによって選択されたコードの一部のセクションと互換性がないものがあります。#defineこれを正しく確認する方法はありますか?

    たとえば、コンパイルを停止するために、if LIB1=LIBFOO(内makefile) and baris defined to 1(ヘッダー ファイル内) で、次のコードを試していました。makefile

    ifeq ($(LIB1), LIBFOO)
        bar_status:=`grep -i '^[[:space:]]*\#define[[:space:]]*bar[[:space:]]*[[:digit:]]' definitions.h | tail -n1 | grep -ic '^[[:space:]]*#define[[:space:]]*bar[[:space:]]*1[[:space:]]*'`
    ifeq ($(bar_status), 1)
        $(error ERROR: You are trying to compile the code with bar enabled in definitions.h, but this is incompatible with the library LIBFOO selected in the makefile)
    endif
    endif
    

    しかし、(a)これは非常に醜く、(b)明らかにまったく機能していません。これはどのように修正できますか?


私は 3. に取り組みましたが、それに対する答えがあると思います: 新しい.PHONYターゲットを追加しますini_check。これは、他の関連するターゲットの必須条件です。

ifeq ($(LIB1), LIBFOO)
    bar_value:=$(shell echo bar | cat definitions.h - | gcc -E -undef - 2>/dev/null | tail -n1)
endif

ini_check:
ifeq ($(LIB1), LIBFOO)
ifeq ($(bar_value), 1)
    $(error ERROR: You are trying to compile the code with bar enabled in definitions.h, but this is incompatible with the library LIBFOO selected in the makefile)
endif
endif
    @echo "Done with the initial check, starting compilation..."

barここで、C プリプロセッサを使用して、ヘッダーを解析した後に変数の値を取得していることに注意してください。

4

1 に答える 1

0

フラグや引数なしで Make を実行することがポリシーである場合でも、関連するスイッチを (バージョン管理下にないinclude) 付属ファイルに配置することで、多少の負担を軽減できます。

あなたがしようとしたように Make でソースファイルを解析することは、あなたが言うように、醜く困難です。そして、維持するのは悪夢です。definitions.hの 2 つのバージョンをバージョン管理下で別々のディレクトリに保持することをお勧めします。ライブラリを選択するのと同じ Make ロジックでヘッダー ファイルを選択できます。

ヘッダー ファイルがライブラリと「互換性がない」場合に発生するエラーの種類はわかりませんが、ライブラリのインターフェイスが異なる場合は、ライブラリ固有の呼び出しをいくつか入れることで、意図的にコンパイラ エラーを引き起こすことができる場合があります。ヘッダファイル。(そして、それらが異なるインターフェースを持っていない場合、実装に依存した悪い振る舞いをしているようです。)

最後に、このようなコンパイラ エラーを待つには「数分」では長すぎる場合は、そのようなエラーをかなり頻繁に発生させているに違いありません。手順を調べる必要があるかもしれません。(また、1 つまたは 2 つのファイルのみを変更した場合、ビルドにはそれほど時間がかからないはずです。毎日のビルドは可能ですが、1 時間に数回行うようなものではありません。)

于 2013-03-20T19:29:50.507 に答える