生成文件函数
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))
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))