代码之家  ›  专栏  ›  技术社区  ›  graywolf

如何使目标依赖于特定的文件名?

  •  0
  • graywolf  · 技术社区  · 5 年前

    我想用 Makefile 管理我的项目周围的一些任务(例如打包分发)。然而,我找不到一种方法来依赖于特定的文件名,而不是一些自动魔法。见示例:

    +   $ cat Makefile
    dist: ctl
            echo "package it here"
    
    +   $ tree
    .
    ├── ctl
    └── Makefile
    
    0 directories, 2 files
    
    +   $ make
    echo "package it here"
    package it here
    

    正如你所看到的,这很好用。但当我创建文件时,它就停止工作了 ctl.h ctl.c :

    +   $ touch ctl.{h,c}
    
    +   $ make
    cc     ctl.c   -o ctl
    /usr/bin/ld: /usr/lib/gcc/x86_64-pc-linux-gnu/8.2.1/../../../../lib/Scrt1.o: in function `_start':
    (.text+0x24): undefined reference to `main'
    collect2: error: ld returned 1 exit status
    make: *** [<builtin>: ctl] Error 1
    
    +   $ tree
    .
    ├── ctl.c
    ├── ctl.h
    └── Makefile
    
    0 directories, 3 files
    

    我的假设是 make ctl 编译程序 ctl.c

    3 回复  |  直到 5 年前
        1
  •  2
  •   zwol    5 年前

    要创建的“隐式规则” ctl 从…起 ctl.c 仅在没有明确规定的规则可创建时使用 ctl ctl ctlcmd.c common.c ,然后写:

    ctl: ctlcmd.o common.o
            $(CC) $(CFLAGS) -o $@ $^
    

    (修订) .o 将从中创建文件 .c 使用其他隐式规则的文件。)

    如果 ctl 根本不需要重新创建(例如,它是手写脚本),然后您可以为它编写虚拟规则,如下所示:

    # `ctl` is a hand-written file, don't try to recreate it from anything
    ctl:
            touch ctl
    

    干什么 ctl.c

        2
  •  2
  •   bobbogo    5 年前

    制作 其中一个是如何创建可执行文件 foo 从…里面 foo.c . 这就是发生在你身上的事情。

    就我个人而言,我非常不喜欢这些规则,通常使用 -R 参数

    $ ls
    ctl  ctl.c  Makefile
    
    $ make -R
    echo "package it here"
    package it here
    
    $ make
    cc     ctl.c   -o ctl
    /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o: In function `_start':
    (.text+0x20): undefined reference to `main'
    collect2: error: ld returned 1 exit status
    make: *** [ctl] Error 1
    

    现在,要求用户必须使用某个参数是不好的。 一种方法是简单地取消所有隐式规则。 您可以销毁已删除的文件扩展名列表 制作 简单的 SUFFIXES: 行。

    $ ls
    ctl  ctl.c  Makefile
    
    $ cat Makefile
    .SUFFIXES:
    dist: ctl
           echo "package it here"
    
    $ make
    echo "package it here"
    package it here
    
        3
  •  0
  •   Bodo    5 年前

    正常地 make 假设所有目标将创建一个同名文件。如果没有为指定依赖项 ctl 制作 ctl.c 它假设它可以构建 从…起 ctl.c

    假设你的目标 dist ctl 不应构建为文件您可以通过添加一行将其声明为虚假目标

    .PHONY: dist ctl
    

    https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html