如何列出所有子 makefile 并使用循环调用它们

问题描述 投票:0回答:2

我正在努力列出我所有的 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

谢谢

makefile
2个回答
0
投票

你可以编写这个 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


0
投票

你可以尝试:

SOURCES := $(SOURCES := $(shell find . -mindepth 2 -type f -name Makefile))
SUBDIRS := $(sort $(dir $(SOURCES)))

.PHONY: awesome $(SUBDIRS)

awesome: $(SUBDIRS)

$(SUBDIRS): %:
    $(MAKE) -C $@ hell-yeah
© www.soinside.com 2019 - 2024. All rights reserved.