Makefile 在子目录中创建多个目标

Makefile 在子目录中创建多个目标,makefile,Makefile,你好 几天前我开始处理makefiles,所以我给自己做了一个练习来学习,同时也让我的生活更轻松。 我基本上希望读取makefile所在的目录(根目录),并在将其部署到服务器之前尽可能多地压缩该文件。但我希望它尽可能灵活,因此根据所述文件在目录中的位置,它应该将其镜像到服务器 因此,如果它在名为home的子文件夹中找到一个文件,它应该创建一个与压缩文件同名的新文件夹。我已经得到了根文件夹中文件的压缩工作,以及文件应该驻留的目录的创建 objs = $(wildcard *.lua) dirs =

你好

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

因此,如果它在名为
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/* ~

如果您使用gnumake,那么有几个特性可以真正帮助您实现所需的功能。警告:当且仅当文件名不包含空格时,此选项才有效:

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/* ~
srcfiles:=$(shell find.-path.build-prune-o-type f-name'*.lua'-print)
dstfiles:=$(addprefix.build/,$(srcfiles))
.假冒:压缩干净
压缩:$(DST文件)
$(dstfiles):.build/%:%
mkdir-p$(dir$@)
卢阿明-f$<>$@
清洁:
rm-rf./.构建
部署:。生成
cp./.build/*~
说明:

  • shell
    make函数用于运行
    find
    命令,该命令搜索所有子目录,除了
    .build
    ,以查找
    *.lua
    文件。结果分配给
    srcfiles
    make变量
  • addprefix
    make函数用于向
    srcfiles
    make变量的所有单词添加
    .build/
    前缀,并将结果分配给
    dstfiles
    make变量
  • compress
    目标是生成文件中的第一个(真实)目标。因此,当调用just
    make
    时,它是默认的目标。这与调用
    make compress
    相同。
    compress
    目标被声明为虚假。这告诉make它不是一个真正的文件,就像
    clean
    deploy
    一样。压缩目标取决于所有目标文件。如果一个文件丢失或比其相应的源文件旧,则必须重新生成该文件

  • make
    $(dstfiles):.build/%:%…
    声明了一个通用规则,其中每个目标文件(
    .build//foo/bar/baz.lua
    )依赖于相应的源文件(
    /foo/bar/baz.lua
    )。配方创建目标目录(
    /foo/bar/
    ),该目录是通过
    dir
    make函数计算出来的。然后,它应用
    luamin
    命令。配方使用了
    $@
    $,因此如果目录包含
    foo/bar.lua
    ,那么您希望使用
    mkdir.build/foo
    创建一个目录,然后使用
    luamin-f foo/bar>.build/foo/bar.lua
    创建压缩文件,对吗?是的。这样我就不必担心它们被复制到错误的地方,只需给出一个路径,根目的地。我没有安装GNU,也从来没有听说过它。因此,我使路径工作,但我不能使
    destfiles
    变量工作。我尝试了
    cut
    命令,但它只对第一个元素执行此操作。有没有一种方法可以循环遍历类似于
    addprefix
    的变量中的元素?您使用的是什么品牌以及它的哪个版本?我现在看到,当我打印安装了GNU的版本时,它说它使用的是为x86_64-pc-linux-GNU构建的GNU make 4.1。好吧,
    dstfiles
    (不是
    destfiles
    )变量到底发生了什么?问题似乎是它将选项卡转换为空格,因此无法识别该文件。