我正在开发一个包含多个静态库的项目。我构建它们的方式总是一样的。我想知道如何为所有库重用这些规则,避免复制和复制。粘贴每一个。以下是构建“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 $@
此外,如果您对以前的代码摘录有任何评论,我很乐意了解它。我在写Makefiles方面很陌生。
提前致谢
答案 0 :(得分:3)
您可以使用模板和Make中的eval
功能来完成此操作。 GNU Make Manual在the section on 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)