生成文件函数

Makefile functions

Makefile 新手

有没有办法在 Makefile 中定义一个函数来删除重复代码。 例如我有一个 Makefile

.PHONE do-something-one-dependent
do-something-one-dependent:
    <some logic>

.PHONE do-something-two-dependent
do-something-two-dependent:
    <some different logic>

.PHONY: do-something-one
do-something-one: do-something-one-dependent
ifeq ($(COPY), )
        echo "Not copying"
else
        echo "Copying to: $(COPY)"
        mv $(WORKDIR) $(COPY)
endif

PHONY: do-something-two
do-something-one: do-something-two-dependent
ifeq ($(COPY), )
        echo "Not copying"
else
        echo "Copying to: $(COPY)"
        mv $(WORKDIR) $(COPY)
endif

正如您所知,do-something-one 和 do-something-two 做同样的事情,只是它们依赖于做不同事情的不同 make 目标

我想知道是否可以将做某事一和做某事二的逻辑外包给一个函数

您不必在创建配方的同时声明所有依赖项。它们可以稍后添加。此外,您可以在同一配方声明中放置多个目标。你可以创建变量。所以,你可以这样做:

TARGETS := do-something-one do-something-two

.PHONY: $(TARGETS)
$(TARGETS):
ifeq ($(COPY),)
        echo Not copying
else
        echo "Copying to: $(COPY)"
        mv $(WORKDIR) $(COPY)
endif

do-something-one: do-something-one-dependent
do-something-two: do-something-two-dependent

还有其他各种更复杂的方法,但它们通常会使代码更粗糙而不是更少。

预计到达时间

对于不同的变量,您可以使用特定于目标的变量:

TARGETS := do-something-one do-something-two

.PHONY: $(TARGETS)
$(TARGETS):
ifeq ($(COPY),)
        echo Not copying
else
        echo "Copying to: $(COPY)"
        mv $(FROMDIR) $(COPY)
endif

do-something-one: do-something-one-dependent
do-something-one: FROMDIR = $(WORKDIR)
do-something-two: do-something-two-dependent
do-something-two: FROMDIR = $(TEMPDIR)

或者,您可以切换到成熟的功能。那看起来像这样:

TARGETS := do-something-one do-something-two

define MAKE_A_TARGET
.PHONY: 
: 
ifeq ($$(COPY),)
        echo Not copying
else
        echo "Copying to: $$(COPY)"
        mv  $$(COPY)
endif
endef

$(eval $(call MAKE_A_TARGET,do-something-one,$(WORKDIR),do-something-one-dependent))
$(eval $(call MAKE_A_TARGET,do-something-two,$(TEMPDIR),do-something-two-dependent))