“make”不仅对构建编程项目很有用,而且在其他领域似乎还没有得到充分利用。
例如,许多shell脚本可以重写为Makefile,以允许独立部分并行运行(使用“make -jXX”)以保持所有CPU内核繁忙,并将显式声明的依赖项作为额外的好处,以防万一我会考虑在你的shell脚本中重新排序带副作用的一些任务。
您是否有任何有趣的故事与make / Makefiles的不寻常用途分享?您是否使用其他实用程序作为廉价的作业调度程序?
答案 0 :(得分:19)
Make的并行性对于shell脚本来说特别方便。假设您想获得一整套主机的“正常运行时间”(或基本上执行任何慢速操作)。你可以循环地做到这一点:
cat hosts | while read host; do echo "$host: $(ssh $host uptime)"; done
这有效,但速度很慢。你可以通过产生子壳来并行化:
cat hosts | while read host; do (echo "$host: $(ssh $host uptime)")&; done
但是现在你无法控制你产生的线程数,而 CTRL-C 不会干净地中断所有线程。
以下是Make解决方案:将其保存到文件(例如showuptimes
)并标记为可执行文件:
#!/usr/bin/make -f
hosts:=$(shell cat)
all: ${hosts}
${hosts} %:
@echo "$@: `ssh $@ uptime`"
.PHONY: ${hosts} all
现在运行cat hosts | ./showuptimes
将逐个打印正常运行时间。 cat hosts | ./showuptimes -j
将并行运行它们。调用者可以直接控制并行化程度(-j
),也可以通过系统负载(-l
)间接指定它。
答案 1 :(得分:3)
除了在编程中的明显用途之外,我还看到Makefiles用于在服务器上执行重复任务来管理系统设置,例如用户/组创建,包升级/更新以及将配置文件复制到位。我也看到(并使用过)rake在基于Ruby的环境中执行此操作。
我听说的最复杂的例子是ISConf,一个配置管理工具。我是Puppet上his blog的作者Luke Kanies听到的。
答案 2 :(得分:2)
根据'make'的多样性,您可以使用可执行的makefile和shell脚本来完成任务的依赖性。即,在一个init脚本需要启动10个服务的场景中......一个接一个地(即服务二需要服务一个在启动之前启动和活动),它可以通过makefile轻松完成。
很多GNU / Linux打包程序都使用这个,即debian / rules等。所以是的,如果做得正确,make就像启动程序一样好,就像构建它们一样。
问题是,并非所有人都安装了构建工具链..因此shell脚本或批处理文件仍然是可移植的(因此“正确”)方法。
答案 3 :(得分:1)
这可能意味着我的想象力不足,但很难在makefile中获得足够的灵活性来进行此类使用。实现它的“明显”方法是在“make
”命令行上指定宏值。
make -f script.mk MACRO="list of files on which to operate"
这比简单的shell脚本更冗长 - 你失去了使用shell文件名扩展的简单能力。解决方法是:
make -f script.mk MACRO="$(echo *[io]*)"
我提出这个关于Why not use #!/bin/make at the top of makefiles作为(可执行的)makefile的奇怪用法的问题,但是那里的目标是不做不寻常的事情(只是无聊的旧软件构建);只是为make
使用一种不寻常的调用机制。
使用该技术,您可以将调用简化为:
script.mk MACRO="$(echo *[io]*)"
这比以下更加冗长:
script *[io]*
我想可以编写script
来调用make
。这完全取决于。我不相信有足够的里程可以从中获得; YMMV。
答案 4 :(得分:0)
我的工作使用了一个奇怪的:依赖关系不存在所以它总是重建所有东西。
也可能使用了批处理文件。
答案 5 :(得分:0)
make也用来驱动过程........我最近才知道这个, 不仅仅是单独的安装或管理构建,而是整个过程。以前我认为make只用于项目的编译,但是哪里有可能需要执行依赖或一系列活动,make就可以在那里使用...我最近看到了一个管理的代码流程到交付/部署的所有内容,包括数据处理更新(24小时+)....好东西:)
答案 6 :(得分:0)
Make也可以用作同步实用程序。例如:
a/1 a/2 a/3
b/4 b/5 b/6 b/7
c/8 c/9
d/10 d/11 d/12
e/13 e/14 e/15
此Makefile创建一个空文件#!/usr/bin/make -f
FILES = *.html *.js *.css images/*.jpg subpage/*.html
LAST_SYNC = .last_sync
SCP = scp webserver.com:/home/john/public_html
.PHONY: sync
sync : $(LAST_SYNC)
$(LAST_SYNC) : $(FILES)
$(SCP) $?
touch $(LAST_SYNC)
,用于记录我们将本地存储库与远程存储库同步的最后一次。每次运行此脚本时,Make将检查自上次运行同步以来.last_sync
中列出的任何文件是否已被修改,将它们复制到服务器,然后更新{{1}上的时间戳}}。关键是自动变量FILES
,它包含比规则目标更新的所有先决条件的列表。