我开始学习如何编写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'像手动的每个脚本的变量,但我敢肯定必须有更好的方法。帮助不大?
答案 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 $< $@
一旦完美运作,可以进一步改进。