私はCMakeやGNU Autotoolsのようなツールを知っていますが、私はCとC++のプロジェクトに使うために、自分自身でユニバーサルビルドシステムを作成しようとしています。私はそれがどのように動作するのかを簡単に説明し、うまくいけば誰かが改善かより良いデザインを提案することができます。普遍的なmakeベースのビルドシステムの設計
ビルドシステムは、プロジェクトのサブディレクトリの1つにあります(私はGitサブモジュールとしてインポートします)。プロジェクトのルートディレクトリには、いくつかのマクロを定義し、前記サブディレクトリからのメインメイクファイルを含むラッパーメイクファイルがあります。これはほとんどの作業を行います。つまり、のライブラリlib、バイナリbinなどのライブラリを出力し、ソースコードとDocBookドキュメントの自動依存関係を処理します。事実上の標準ターゲット:すべて,テスト,クリーン,インストールなどがあります。
ここでは、2つのバイナリ、fooとbarを構築するどのようなラッパーのmakefileだ、次のようになります。
# foo-specific macros
FOO_SRC_FILES = foo1.c foo2.c foo3.c
FOO_OBJ_FILES = $(FOO_SRC_FILES:.c=.o)
FOO_BIN_FILE = foo
# bar-specific macros
BAR_SRC_FILES = bar1.c bar2.c
BAR_OBJ_FILES = $(BAR_SRC_FILES:.c=.o)
BAR_BIN_FILE = bar
# Inform the build system about them
SRC_FILES = $(FOO_SRC_FILES) $(BAR_SRC_FILES)
OBJ_FILES = R(BAR_OBJ_FILES) $(BAR_OBJ_FILES)
BIN_FILES = $(FOO_BIN_FILE) $(BAR_BIN_FILE)
# Only install the binaries. If I were building a library, I would instead
# select the "lib" and perhaps "include" directories.
INSTALL = bin
INSTALL_DIR = /usr/share
# Use the build system
include build/build.mk
は今ここに問題があります。 build.mkはパターンルールを使用して依存関係ファイルとオブジェクトファイルを作成できますが、OBJ_FILESと、BIN_FILESの1つのみです。私はこのようになりますビルドシステムでは、次のようなパターンルールを置くのであれば:
$(BIN_DIR)/$(BIN_FILES): $(OBJ_FILES:%=$(OBJ_DIR)/%) $(LIB_FILES:%=$(LIB_DIR)/%) | $(BIN_DIR)
$(CC) $(LDFLAGS) -o [email protected] $(OBJ_FILES:%=$(OBJ_DIR)/%) -L $(LIB_DIR) $(LIB_FILES:lib%.a=-l %)
その後、FOOはバーが行うすべてとその逆とし、リンクに依存するであろう。 、
$(BIN_DIR)/$(FOO_BIN_FILE): $(FOO_OBJ_FILES:%=$(OBJ_DIR)/%) $(FOO_LIB_FILES:%=$(LIB_DIR)/%) | $(BIN_DIR)
$(CC) $(LDFLAGS) -o [email protected] $(FOO_OBJ_FILES:%=$(OBJ_DIR)/%) -L $(LIB_DIR) $(FOO_LIB_FILES:lib%.a=-l %)
$(BIN_DIR)/$(BAR_BIN_FILE): $(BAR_OBJ_FILES:%=$(OBJ_DIR)/%) $(BAR_LIB_FILES:%=$(LIB_DIR)/%) | $(BIN_DIR)
$(CC) $(LDFLAGS) -o [email protected] $(BAR_OBJ_FILES:%=$(OBJ_DIR)/%) -L $(LIB_DIR) $(BAR_LIB_FILES:lib%.a=-l %)
同じ問題が同様のライブラリに適用されるの:だから私がやって終わることは、彼らがbuild.mkに属しているように感じていても、ラッパーメイクファイルにこれらのルールを置くようにユーザーに求めていますコース。このルールは、ほぼそのままコピーして貼り付けることができます。プレフィックスのみを変更する必要があります(たとえば、FOOまたはBAR)。含まこの問題を解決するために
アイデア:
- (例えば、fooの用とバーのための別の)別のもののために別々のラッパーmakefileを持っているユーザーに尋ねるが、それはちょうどひどいです。
- 少し変更してm4を使っていくつかの前処理をしていますが、より洗練された解決策が存在しないかぎり、それを通過したくありません。
私は本当にいくつかのアイデアに感謝します。
PS:最後の2つのコードサンプルのパターンマッチング式は、テキスト関数で置き換えることができますが、それらはGNU Make固有です。私が使ったスタイルは移植性が高く、実際にはPOSIX標準の次のバージョンの追加リストに載っています。
そのおかげでビルドシステムの概念についての詳細を読むことができます。残念ながら、移植可能なmakefileを書く必要があるので、私はPOSIXに従います。したがって、私はevalのようなmake関数を使うことはできません。 –
さて、これにはおそらくエレガントな解決策はありません。実際、 'GNU make'は移植性が高く、すべてのLinuxディストリビューション、MacOS X、Windows(Cygwin)に存在します。ですから、 'GNU make 'が利用できない非常にまれなシステムをサポートする必要があるのでしょうか?あなたの移植性の必要性を再考したいかもしれません。 – igagis