我是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
测试变得无用(除非它首先被分配了空字符串(。