无法使用makefile创建多个目录

时间:2018-03-04 19:47:59

标签: shell makefile

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

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

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

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

2 个答案:

答案 0 :(得分:3)

默认情况下,make的所有版本都使用/bin/sh而不是bash用于shell命令,而在大多数情况下bash是您在命令中使用的交互式shell线。这解释了为什么在bash中没有sh特征的大括号扩展适用于后一种情况,而不适用于前者。

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

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.

答案 1 :(得分:2)

不是,因此大括号展开无效,所以:

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