ユーザーを驚かせないことに関するポイントは有効ですが、一部のフラグはデフォルトでオンにするのが妥当であり(eg -Wall -Wextra
)、他のフラグはコードベース固有であり、必要になる場合があります(eg -std=gnu99
)。
問題は、これを移植可能に行う方法になります。私は個人的にlibuvプロジェクトからフラグチェックマクロを盗みます。これを行うには、プロジェクトのディレクトリに追加libuv-check-flags.m4
します。m4
その後、次のことを実行できますconfigure.ac
。
m4_include([m4/libuv-check-flags.m4])
AM_INIT_AUTOMAKE([-Wall -Werror foreign 1.11.2])
# Checks for programs.
AC_PROG_CC
CC_CHECK_CFLAGS_APPEND([-std=gnu99])
CC_CHECK_CFLAGS_APPEND([-Wall])
CC_CHECK_CFLAGS_APPEND([-Wextra])
AC_PROG_LIBTOOL
生成された構成ファイルは、次のコンパイラコマンドラインを生成します。
gcc -g -O2 -std=gnu99 -Wall -Wextra
-g -O2
上記のソリューションを使用して、デフォルトをオーバーライドできます。例:
./configure CFLAGS='-O0 -g'
次のコマンドラインを生成します。
gcc -O0 -g -std=gnu99 -Wall -Wextra
また、gccセマンティクスを利用して、必要に応じてベースフラグを無効にすることもできます。たとえば、本当に必要な場合は、警告を無効にすることができます。
./configure CFLAGS='-Wno-all -Wno-extra'
「コンパイラがこれらのフラグをサポートしていない場合はどうなるでしょうか?」と言うかもしれません。そのため、これらのマクロは、コンパイラの機能が最初にチェックされることを保証するため、非常に便利で優れています-Wall
。-Wextra
サポートされていない場合、そもそも追加されません。
libuvは、地球上で最もポータブルで広く使用されているCライブラリの1つであるため、それらのリードに従うことは合理的だと思います。これらのマクロは純粋なC固有のものですが、CXXFLAGSで使用するためにそれらを適合させるのは簡単です。
参照: