definitions.h
関連する FORTRAN ファイルからインクルードされるヘッダー ファイル ( ) とmakefile
. たとえば、コンパイラ、いくつかのライブラリ セット、許可される並列化の種類 (MPI、OpenMP、またはなし) は で選択されmakefile
、コードの一部の組み込みは#define
ヘッダーのディレクティブによって制御されます。
コンパイルをセットアップするために 2 つの異なるファイルを編集する必要はありません。より良いアプローチはありますか?
また、
makefile
とdefinitions.h
ファイルの両方がリビジョン管理下にあります。これは、私の仲間の不注意な開発者が、有効なコンパイル オプションを変更しただけの両方のファイルの新しいバージョンをコミットしてプッシュしたため、リビジョン管理履歴が汚染されたことを意味します。理想的には、コンパイル オプションを設定するために、少なくとも最大のファイル (makefile
) を編集する必要はありません。場合によっては、不一致が発生します。通常、 で選択されたライブラリの組み合わせの中には、ディレクティブ
makefile
によって選択されたコードの一部のセクションと互換性がないものがあります。#define
これを正しく確認する方法はありますか?たとえば、コンパイルを停止するために、if
LIB1=LIBFOO
(内makefile
) andbar
is defined to1
(ヘッダー ファイル内) で、次のコードを試していました。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 プリプロセッサを使用して、ヘッダーを解析した後に変数の値を取得していることに注意してください。