これを行う独自のマクロ「パッケージ」を簡単に作成できます。たとえば、このファイルをボイラープレートとして作成し、それを呼び出して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
# If the user didn't specify a list of programs, build them all
ifndef PROGRAMS
PROGRAMS = $(foreach p,$(filter program.%.name,$(.VARIABLES)),\
$(patsubst program.%.name,%,$(p)))
endif
# Generate the rule to build each program
$(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
をライブラリにも使用できます。このアプローチは非常に強力で、拡張が非常に簡単です。