你可以轻松地编写自己的宏“包”,以执行此操作。例如,将此文件创建为您的样板,命名为
program.mk
,并将其放置在树形结构中的中央位置:
lang.c.objs = $(patsubst %.c,%.o,$(1))
lang.c.link = $(CC) $(CFLAGS) $(LDFLAGS) -o $(1) $(2)
lang.c++.objs = $(patsubst %.cpp,%.o,$(1))
lang.c++.link = $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(1) $(2)
define make-program
program.$(1).lang ?= c
program.$(1).objects ?= $$(call lang.$$(program.$(1).lang).objs,$$(program.$(1).sources))
$$(program.$(1).name): $$(program.$(1).objects) $$(program.$(1).extra-deps)
$$(call lang.$$(program.$(1).lang).link,$$@,$$^ $$(program.$(1).ldlibs))
CLEANABLE += $$(program.$(1).name)
ALL_PROGRAMS += $$(program.$(1).name)
endef
ifndef PROGRAMS
PROGRAMS = $(foreach p,$(filter program.%.name,$(.VARIABLES)),\
$(patsubst program.%.name,%,$(p)))
endif
$(foreach p,$(PROGRAMS),$(eval $(call make-program,$(p))))
.PHONY: all clean
all: $(ALL_PROGRAMS)
clean: ; rm -f $(CLEANABLE)
.DEFAULT_GOAL := all
现在,在您想要构建程序的每个目录中,您的 makefile 可以是这样的:
program.p.name = Program
program.p.sources = Program1.c Program2.c
include path/to/program.mk
可以使用类似的
library.mk
来处理库文件。这种方法非常强大且易于扩展。
src = $(shell find . -name "*.c")
或者$(grep -H "main(")
这样的东西。这并不难,而且你会感觉自己掌控了整个环境。 - Alexandre C.