Makefile空白参数导致shell错误
Posted
技术标签:
【中文标题】Makefile空白参数导致shell错误【英文标题】:Makefile blank arguments causing errors in shell 【发布时间】:2015-12-05 01:01:55 【问题描述】:所以我正在编写一个通用的 makefile 来编译 C/C++ 程序。您可以填写一系列变量,我希望可以选择将它们留空。但是,如果我将它们留空,则会导致我稍后在 shell 搜索中出现一些错误。
例如:
FILESDIR =
FILES = $(shell find $(FILESDIR) -type -f -name "*.cpp")
NOTFILES = $(shell find . -not -path *$(FILESDIR)* -type f - name "*.cpp")
但是,这会引发错误。我猜这是因为 shell 行被评估为shell find -type -name "*.cpp"
,这在语法上是错误的。
我目前的工作是分配FILESDIR = /dev/null
,但我希望能够将其留空。
如何进行检查,或者更好地进行 shell 搜索,以便它可以容纳空行?
【问题讨论】:
在没有文件要处理的情况下,什么情况下有效? 我有一些 3rd 方的东西,每次我make clean
时都不需要重新编译。所以它几乎是在设置一个“忽略”文件。但它并不总是适用。
在不存在的目录中查找文件是什么意思?如果我让你在任何地方列出所有长颈鹿,如果你回答我的问题是荒谬的,我不应该感到惊讶。
【参考方案1】:
这个发布的makefile内容:
FILESDIR =
FILES = $(shell find $(FILESDIR) -type -f -name "*.cpp")
NOTFILES = $(shell find . -not -path *$(FILESDIR)* -type f - name "*.cpp")
如您所见,有一些问题。
更好的实现可能是:
FILESDIR = .
FILES := $(wildcard $(FILESDIR)/*.cpp )
NOTFILES := $(shell find . -not -path *$(FILESDIR)/* -type f -name "*.cpp")
然后可以通过 make 调用行上的 -D
参数覆盖宏 FILESDIR
。
【讨论】:
wildcard
会递归搜索吗?
wildcard
是 make
内置插件之一。没有指定目录,它搜索当前目录,指定一个目录,它搜索那个目录。它不会对子目录执行递归搜索。建议阅读make
实用程序的教程,例如:gnu.org/software/make/manual/make.html>以上是关于Makefile空白参数导致shell错误的主要内容,如果未能解决你的问题,请参考以下文章