Makefile-如何在if endif中有条件地执行mkdir



我是makefile域的初学者。我需要检查变量并确定是否需要创建一个文件夹。

当我运行make命令时;终端弹出错误消息如下:

Makefile:6: *** recipe commences before first target.  Stop.

有人能帮我评论一下吗?

感谢

## Pass OUTPUTDIR from parent makefile
OUTPUTDIR          ?=
ifeq ($(OUTPUTDIR),)
    OUTPUTDIR := $(CURDIR)/tmp
        mkdir -p $(OUTPUTDIR)
endif

更新

如果OUTPUTDIR不包含任何字符串,我会尝试在currecnt目录下创建一个tmp文件夹;但它失败了。因为我没有看到tmp文件夹被创建。似乎ifeq($(OUTPUTDIR(,(是不正确的语句;这里有什么建议吗?

感谢

.PHONY: all
CP := /bin/cp
## Pass OUTPUTDIR from parent makefile
OUTPUTDIR          ?=
ifeq ($(OUTPUTDIR),)
    OUTPUTDIR := $(CURDIR)/tmp
target:    
        mkdir -p $(OUTPUTDIR)
endif
all:
        $(CP) -f test.txt $(OUTPUTDIR)/test.txt

mkdir-p选项在这里很有用,因为如果目录已经存在,mkdir -p不会引发错误。

如果你使用GNU make,你可以将目录声明为最终目标的仅限订单的先决条件(要理解为什么将其声明为常规先决条件是错误的,请参阅手册(:

OUTPUTDIR ?= $(CURDIR)/tmp
.PHONY: all
all: $(OUTPUTDIR)/test.txt
$(OUTPUTDIR)/test.txt: test.txt | $(OUTPUTDIR)
    cp -f '$<' '$@'
$(OUTPUTDIR):
    mkdir -p '$@'

一个更简单的解决方案是使用shell GNU make函数来系统地创建目录,但这就不那么优雅了:

OUTPUTDIR ?= $(CURDIR)/tmp
DUMMY := $(shell mkdir -p '$(OUTPUTDIR)')

如果你不使用GNU,只需在最终目标的配方中创建目录:

OUTPUTDIR ?= $(CURDIR)/tmp
.PHONY: all
all: $(OUTPUTDIR)/test.txt
$(OUTPUTDIR)/test.txt: test.txt
    mkdir -p '$(@D)'
    cp -f '$<' '$@'

请注意,OUTPUTDIR ?= $(CURDIR)/tmp仅在尚未分配OUTPUTDIR的情况下才分配它,这会使ifeq测试变得无用(除非它首先被分配了空字符串(。

最新更新