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 会递归搜索吗? wildcardmake 内置插件之一。没有指定目录,它搜索当前目录,指定一个目录,它搜索那个目录。它不会对子目录执行递归搜索。建议阅读make 实用程序的教程,例如:gnu.org/software/make/manual/make.html>

以上是关于Makefile空白参数导致shell错误的主要内容,如果未能解决你的问题,请参考以下文章

《GNU_makefile》第五章——为规则书写命令

Linux:怎么显示Makefile中的变量?

Makefile导致编译错误

Linux中make

Shell脚本——make命令和Makefile文件

如何调试makefile