makefile:将单个规则应用于一堆目标

时间:2016-10-31 14:52:23

标签: makefile

我开始学习如何编写makefile,但我无法找到与我的问题相关的现有主题,所以如果已存在则道歉。

截至目前,它看起来像这样(并且有效):

INSTALL_DIR = $(realpath /home/$(USER)/bin/)
SRC         = $(realpath ./)
script      = $(SRC)/foo.sh
TAR         = $(INSTALL_DIR)/foo

all : $(TAR)

$(TAR) : $(script)
    ln -s $^ $@ 

我想要做的是使用最少行数生成符号链接(即,将现有规则用于构建TAR)到每个 bash脚本(即$(SRC) )*。sh)与我在第一个(' foo.sh')中所用的方式相同。 我可以制作脚本'和' TAR'像手动的每个脚本的变量,但我敢肯定必须有更好的方法。帮助不大?

2 个答案:

答案 0 :(得分:0)

您正在寻找模式规则。类似的东西:

SCRIPTS := foo bar xxx yyy

all: $(SCRIPTS)  

% : %.sh
    ln -s $< $@

请注意,如果make没有生成任何脚本,$(SCRIPTS)也可以填充$(wildcard ...)(否则,$(SCRIPTS)将丢失make第一个时不存在的任何文件调用)。

答案 1 :(得分:0)

首先我们必须找到脚本:

INSTALL_DIR = bin # there is no need for a full path here
SRC = $(realpath ./)

SCRIPTS := $(wildcard $(SRC)/*.sh) # /some/path/foo.sh /some/path/bar.sh /some/path/baz.sh
SCRIPTS := $(notdir $(SCRIPTS)) # foo.sh bar.sh baz.sh

请注意我使用“:=”而不是“=”。你可以阅读差异here,但通常“:=”更好。

现在针对目标,我们正在尝试构建的链接:

TARGETS := $(basename $(SCRIPTS)) # foo bar baz
TARGETS := $(addprefix $(INSTALL_DIR)/, $(TARGETS)) # bin/foo bin/bar bin/baz

规则:

all: $(TARGETS)

$(INSTALL_DIR)/%: $(SRC)/%.sh
    ln -s $< $@

最后一条规则很普遍。我们可以将它限制在我们定义的目标列表中:

$(TARGETS): $(INSTALL_DIR)/%: $(SRC)/%.sh
    ln -s $< $@

一旦完美运作,可以进一步改进。