Makefile 子目录中的多个目标

标签 makefile

嗨!

几天前我开始摆弄 makefile,所以我给自己一个学习的练习,同时让我的生活更轻松。 我基本上想读取 makefile 所在的目录(root)并使用 luamin在将文件部署到我们的服务器之前尽可能地压缩该文件。但我希望它尽可能灵活,因此根据所述文件在目录中的位置,它应该将其镜像到服务器。

因此,如果它在名为 home 的子文件夹中找到文件,它应该创建一个与其中压缩文件同名的新文件夹。我已经开始对根文件夹中的文件进行压缩,并创建文件应驻留的目录。

objs = $(wildcard *.lua)
dirs = $(wildcard */)

compress: $(objs)
    mkdir -p .build
    luamin -f $(objs) > .build/$(objs)
    mkdir .build/$(dirs)

clean:
    rm -rf ./.build

deploy: .build
    cp ./.build/* ~

最佳答案

如果您使用GNU make,有几个功能可以真正帮助您完成您想要的事情。警告:当且仅当您的文件名不包含空格时,此方法才有效:

srcfiles := $(shell find . -path .build -prune -o -type f -name '*.lua' -print)
dstfiles := $(addprefix .build/,$(srcfiles))

.PHONY: compress clean deploy

compress: $(dstfiles)

$(dstfiles): .build/%: %
    mkdir -p $(dir $@)
    luamin -f $< > $@

clean:
    rm -rf ./.build

deploy: .build
    cp ./.build/* ~

说明:

  1. shell make 函数用于运行find搜索所有子目录的命令,除了 .build ,对于*.lua文件。结果分配给srcfiles使变量。
  2. addprefix make函数用于添加.build/ srcfiles 的所有单词的前缀创建变量并将结果分配给 dstfiles使变量。
  3. compress target 是 Makefile 中的第一个(真实)目标。因此,它是仅调用 make 时运行的默认目标。 。与调用 make compress 相同。 compress目标被声明为虚假的。这告诉 make 它不是一个真正的文件,就像 clean 一样。和deploycompress target 取决于所有目标文件。如果其中一个丢失或比其相应的源文件旧,则必须重建它。
  4. 品牌 static pattern rule $(dstfiles): .build/%: %...声明一个通用规则,其中每个目标文件 ( .build/./foo/bar/baz.lua ) 取决于相应的源文件 ( ./foo/bar/baz.lua )。该配方创建目标目录( ./foo/bar/ ),该目录由 dir 计算得出。使函数。然后,它应用 luamin命令。该配方使用 $@$< automatic variables .

关于Makefile 子目录中的多个目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53026696/

相关文章:

c - 了解 XV6 makefile 中的代码块

c++ - 带有自定义 makefile 的 C++14 的 Eclipse Luna 索引器

c - Makefile递归不传递CPPFLAGS

linux - makefile 中的空检查和空字符串检查

linux - 从源代码编译 GCC 到 .s 汇编文件

c - 为 GLFW3 编写 make 文件

bash - 无法在 makefile 中捕获命令退出代码

使用 make 在 linux 上编译驱动程序

linux makefile 帮助声明基于 make gnu 或 make linux 规则的 FC FFLAGS 变量

linux - 使 os 独立配置文件检查 curl 依赖性