3

複数の静的ライブラリを含むプロジェクトを開発しています。私がそれらを構築する方法は常に同じです。これらのルールをすべてのライブラリで再利用し、各ライブラリでコピー&ペーストを行わないようにする方法を知りたいです。'foo'ライブラリを構築する例を次に示します。

# inputs
#
FOO_LIB_NAME  := libfoo.a
FOO_SRC_DIR   := $(SRC_DIR)/foo
FOO_SRC_FILES := \
        foo_file1.cc                              \
        subdir/foo_file2.cc                       \
        subdir/foo_file3.cc                       \
        ...
FOO_CFLAGS    :=

# rules
#
FOO_SRC_FILES := $(addprefix $(FOO_SRC_DIR)/,$(FOO_SRC_FILES))
FOO_OBJ_FILES := $(subst .cc,.o,$(FOO_SRC_FILES))

$(FOO_LIB_NAME): $(FOO_OBJ_FILES)
        $(AR) rc $@ $^

$(FOO_OBJ_FILES): %.o: %.cc
        $(CXX) $(COMMON_CFLAGS) $(FOO_CFLAGS) $< -o $@

さらに、以前のコードの抜粋についてコメントがあれば、喜んでお知らせします。私はMakefileを書くのはまったく新しいです。

前もって感謝します

4

1 に答える 1

3

これは、テンプレートとevalMake の関数を使用して実現できます。GNU Make マニュアルセクションに例があります。eval

マニュアルの例は次のとおりです。

PROGRAMS    = server client

server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol

client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol

# Everything after this is generic

.PHONY: all
all: $(PROGRAMS)

define PROGRAM_template =
 $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
 ALL_OBJS   += $$($(1)_OBJS)
endef

$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))

$(PROGRAMS):
        $(LINK.o) $^ $(LDLIBS) -o $@

clean:
        rm -f $(ALL_OBJS) $(PROGRAMS)
于 2012-06-08T20:40:51.943 に答える