代码之家  ›  专栏  ›  技术社区  ›  Chan Kim

使用makefile只在目录之间复制更改的文件

  •  0
  • Chan Kim  · 技术社区  · 6 年前

    我读到: Makefile: Copying files with a rule 但做不到。
    为了简单起见,假设我有两个目录dir1和dir2。在dir1下,我有三个文件:rabbit.c、tiger.c和bus.c。 我做了这样的文件:

    dir2/rabbit.c:dir1/rabbit.c
    dir2/tiger.c:dir1/tiger.c
    dir2/bike.c:dir1/bike.c
    
    dir2/%:
        cp -f $< $@
    

    我在三行中分别指定了先决条件,并为这三个目标指定了统一的配方。当我接触到dir1下的任何文件时, make 将该文件复制到dir2。但这只发生在兔子身上。怎么了?


    添加(选择答案后): 在意识到Takkat的答案有什么问题之后,我修复了它,然后进一步修改了它,我认为这是这个案例中最简单的makefile。

    .PHONY:all
    LIST:=rabbit.c tiger.c bike.c
    DSTFILES:=$(addprefix dir2/, $(LIST))
    all: $(DSTFILES)
    
    dir2/%:dir1/%
        cp -f $< $@
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   MadScientist    6 年前

    make在makefile中选择一个默认目标,除非在命令行中指定不同的目标,否则它只生成该目标(以及生成该目标所需的所有先决条件)。

    默认情况下,makefile中的默认目标是列出的第一个显式目标。

    所以在makefile中,第一个规则是:

    dir2/rabbit.c:dir1/rabbit.c
    

    所以第一个明确的目标是 dir2/rabbit.c ,这就是所有的构建。

    如果您希望在默认情况下构建多个目标,您需要一个第一个目标,将所有“实际”目标列为前提条件;将此行放在makefile的第一行:

    all: dir2/rabbit.c dir2/tiger.c dir2/bike.c
    

    它会起作用的。通常认为,将与磁盘上真实文件无关的目标声明为虚假目标是一种良好的做法:

    .PHONY: all