无法使用makefile创建多个目录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法使用makefile创建多个目录相关的知识,希望对你有一定的参考价值。

我的makefile中的这个语句有什么问题?

folder: @mkdir -vp ".cache/vim/"{backup,swap}

我可以在命令行上运行mkdir -vp ".cache/vim/"{backup,swap},它完全按照它应该做的,即。创建两个文件夹,备份和交换。

但是当我用上面的代码运行make folder时,它确实创建了一个文件夹名称{backup,swap}

答案

默认情况下,所有版本的make都使用/bin/sh而不是bash来获取shell命令,而在大多数情况下,bash是您从命令行使用的交互式shell。这解释了为什么支撑膨胀,bash中没有的sh特征,适用于后一种情况但不适用于前者。

如果你想让你的makefile可移植到最高程度,你唯一的选择是完整地编写命令:

folder:
        @mkdir -vp '.cache/vim/backup' '.cache/vim/swap'

但是,如果您想使用GNU make的功能(可用于现有的每个平台,但不一定默认安装),您可以使用addprefix函数,其方式与此类似:

# Quotes aren’t necessary in this case, this is just to show how to use them
BASEDIR = './cache/vim'
FILES   = 'backup' 'swap'

folder:
        @mkdir -vp $(addprefix $(BASEDIR)/,$(FILES))

或者您可以指示GNU make使用/bin/bash并使用您在命令行上使用的相同命令:

SHELL   = /bin/bash
BASEDIR = './cache/vim'

folder:
        @mkdir -vp $(BASEDIR)/{backup,swap}

关于GNU make如何使用SHELL变量的讨论可以在here.找到

另一答案

不是,所以大括号扩展不起作用,所以:

folder:
  @mkdir -vp '.cache/vim/backup' '.cache/vim/backupswap'

以上是关于无法使用makefile创建多个目录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用子目录中的源代码为 C 和 C++ 创建 makefile

如何创建用于从子目录中的其他 Makefile 编译多个驱动程序的 Makeflow

使用带有 NMake 样式 Makefile 的 clang-cl 无法回显

eclipse 创建Makefile工程生成多个执行文件

多个子目录中源的单个 Makefile

如何正确地将多个片段添加到片段过渡?