我正在努力列出我所有的 Makefile 并从主文件中调用它们..
我有一个这样的子项目目录:
/awesome
/john
/doe
Makefile
/foo
Makefile
/bar
Makefile
Makefile (master one)
假设每个子 makefile 如下所示
hell-yeah:
echo HEY!
我想做的是搜索所有子makefile,就像这样
SOURCES := $(wildcard **/Makefile)
一旦我得到了它们,我想运行这样的东西
make awesome
SOURCES := $(wildcard **/Makefile)
awesome: ## Run all submakefile hell-yeah rule
for submakefile in $$SOURCES; do \
$(MAKE) -C $$submakefile hell-yeah \
done
我怎样才能实现它?
截至目前,我收到以下错误
for submakefile in $SOURCES; do \
/Library/Developer/CommandLineTools/usr/bin/make -C $submakefile hell-yeah \
done
/bin/sh: -c: line 1: syntax error: unexpected end of file
谢谢
你可以编写这个 shell 脚本,或者类似的东西:
#!/bin/sh
find * -mindepth 1 -name Makefile -print0 |
sed -z 's,/Makefile,,' |
xargs -0 -r -P1 -I{} make -C {} hell-yeah
这确实依赖于所使用的实用程序的 GNU 版本。如果依赖 GNU 版本是不可接受的,那么这个变体基本上做同样的事情,尽管它会跳过包含空白或换行符的路径:
#!/bin/sh
find * -mindepth 1 -name Makefile -print |
sed 's,/Makefile,,' |
xargs -P1 -I{} make -C {} hell-yeah
这两个都假设您将从顶级目录(
/awesome
)运行它们,并且都不会在该目录本身中运行make
,尽管可以轻松添加。
您可以将其中任何一个嵌入到 makefile 的配方中,但您不应该这样做。如果您想从顶级 makefile 驱动所有这些构建,那么该 makefile 应该具有要构建的项目文件夹的显式枚举:
projects = \
john/doe \
foo \
bar
.PHONY: $(projects)
all: $(projects)
$(projects): %:
make -C $@ hell-yeah
这确实依赖于 GNU 特有的功能
make
。
你可以尝试:
SOURCES := $(SOURCES := $(shell find . -mindepth 2 -type f -name Makefile))
SUBDIRS := $(sort $(dir $(SOURCES)))
.PHONY: awesome $(SUBDIRS)
awesome: $(SUBDIRS)
$(SUBDIRS): %:
$(MAKE) -C $@ hell-yeah