AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 441405
Accepted
schily
schily
Asked: 2018-05-03 12:21:48 +0800 CST2018-05-03 12:21:48 +0800 CST 2018-05-03 12:21:48 +0800 CST

如何使用 GNU make 部分序列化

  • 772

当我有一个需要在另一个目标之前制作特定目标的制作任务时,在并行模式下,使用 SunPro Make (dmake) 时这很简单。以下生成文件:

install:  dir dir/file

dir:
    mkdir dir

dir/file:
    cp source dir/file

可以通过将第一行更改为:

install: dir .WAIT dir/file

或通过使用:

.NO_PARALLEL: install

makefile 的其余部分仍将在并行模式下处理,即使是左侧或右侧目标的列表.WAIT也将以并行模式处理。

请参阅:http ://schilytools.sourceforge.net/man/man1/make.1s.html和http://schilytools.sourceforge.net/man/man1/dmake.1.html

但 GNU make 似乎没有类似的选项。用 GNU make 真的没有办法做到这一点吗?

更具体地说,解决方案需要以允许使用其他 make 实现处理 makefile 的方式编写。

特殊目标 .WAIT 可以在一个依赖于 make 程序的宏中,例如 $(WAIT)

请注意,有一个明显的解决方案没有帮助:

从理论上讲,可以dir依赖. dir/file_ 结果,多次调用将一次又一次地复制到,而没有预期的结果,只有在源变得更新的情况下才进行复制dirdir/file,dir,dirdir/filemakedir/filemakedir/file.

这提出了另一个问题,是否可能存在强制在复制到之前make创建而不依赖于dirdir/filedirdir/file.

make gnu
  • 3 3 个回答
  • 7348 Views

3 个回答

  • Voted
  1. filbranden
    2018-05-03T14:03:34+08:002018-05-03T14:03:34+08:00

    在 GNU make 中,您可以使用order-only-prerequisites来确保dir在创建规则dir/file运行之前创建。

    有关详细信息,请参阅此页面。

    您可以从 GNU make 手册中的示例中看到,它实际上是为在创建目录之前添加对正在创建的目录的依赖而量身定制的。

    对于您的具体示例,应该这样做:

    dir/file: | dir
            cp source dir/file
    

    虽然您不需要修改现有规则,但您可以将该依赖项添加到 Makefile 的其他位置...

    更具体地说,解决方案需要以允许使用其他 make 实现处理 makefile 的方式编写。

    我认为这在其他 make 实现中不起作用......一种可能的解决方案是创建一个实际的GNUmakefile并添加 GNU make 特定扩展。includeMakefile

    你也可以让 GNU make 忽略一个规则,比如.WAIT在你的GNUmakefile.

    我希望这些指示对您有所帮助!

    • 8
  2. filbranden
    2018-05-03T15:41:51+08:002018-05-03T15:41:51+08:00

    您需要添加依赖项,以便在它们下的文件之前创建目录。

    可以对目录的依赖项使用“标记”文件,这样在其下创建文件不会触及目录的时间戳。这也不需要任何 GNU 制作特定的功能。

    在您的示例中:

    install: dir/file
    
    dir/.marker:
            mkdir -p dir
            touch dir/.marker
    
    dir/file: dir/.marker
            cp source dir/file
    

    您可以使用类似.directory或.dir或.folder标记文件的东西......

    • 5
  3. Best Answer
    schily
    2018-05-04T05:13:39+08:002018-05-04T05:13:39+08:00

    这是我自己的答案,它源自 Filipe Brandenburger 提出的想法和 Schily Makefile 系统中使用的通用方法:

    makefile 系统确保以make macros这种方式设置以下内容:

    WAIT=       # empty with GNU make
    WAIT= .WAIT # .WAIT special target with SunPro Make
    
    MAKEPROG= <name of the make program> # This is from: smake, gmake, sunpro
    
    _UNIQ= .XxZzy-
    

    现在使用上面的宏定义的makefile:

    _NORULE=    $(_UNIQ)$(MAKEPROG)
    __NORULE=   $(_NORULE:$(_UNIQ)gmake=)
    NORULE=     $(__NORULE:$(_UNIQ)%=%)
    
    install: dir $(WAIT) dir/file
    
    dir/file: source
            cp source dir/file
    
    dir:
            mkdir -p dir
    
    $(NORULE)dir/file: | dir
    

    $(NORULE)sunpro使用 gmake 和SunPro Make扩展至无。

    在 gmake 的情况下,整个 makefile 扩展为:

    install: dir dir/file
    
    dir/file: source
            cp source dir/file
    
    dir:
            mkdir -p dir
    
    dir/file: | dir
    

    对于 SunPro Make,整个 makefile 扩展为:

    install: dir .WAIT dir/file
    
    dir/file: source
            cp source dir/file
    
    dir:
            mkdir -p dir
    
    sunprodir/file: | dir
    

    最后一行被视为没有相关性的垃圾规则。

    • 1

相关问题

  • 从源代码编译时应该何时构建“lib”和“include”目录?

  • GNU make dep 究竟做了什么?

  • Makefile中的引用函数?

  • bsdtar:如何避免覆盖现有文件信息?

  • gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve