重复使用相同的规则来构建不同的目标
reuse the same rules for building different targets
我正在开发一个包含多个静态库的项目。我构建它们的方式总是相同的。我想知道如何对所有库重用这些规则,并避免为每个库进行复制和粘贴。下面是构建"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方面很陌生。
提前致谢
您可以使用
模板和 Make 中的eval
函数来实现此目的。 GNU 制作手册在关于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)
相关文章:
- 如何让KDevelop & CMake只构建特定目标?
- 指定 NDK 构建的目标架构
- 在多个目标上 CMake 后期构建自定义命令?
- 在QT中的大型项目中指定构建/目标/安装路径
- 在构建 Android 应用程序时禁用 CMake 目标
- CMake 将目标作为项目的一部分独立构建
- Cmake:如何构建自定义编译器二进制文件,然后将其用于某些目标?
- 当许多目标使用相同的C 源时,如何加快介子的构建
- 如何配置要使用默认的HTML包装器构建的Emscripten目标
- 致命错误LNK1112:通过 vcvarsall .bat x86 运行构建'X86'模块计算机类型'x64'与目标计算机类型冲突
- 如何只构建一个依赖项目标
- 制定目标需要32和64位的DLL构建
- Microsoft Visual Studio 2010 没有将构建工具放在 PATH 中以实现干净的目标?
- Scons VisualStudio,多个构建目标生成重复的NMakeOutput标签
- boost构建中的多个构建目标
- 在Qt中使用不同的模板构建目标
- Visual Studio C/C++ 中的多个构建目标
- EclipseCDT-带有现有代码的新Makefile项目-更改全局默认构建目标
- 由于错误条件,构建目标被跳过;("@(条件名称此处)" - 不确定如何更改
- Cmake /ctest:是否可以使用创建的构建目标作为测试