“Makefile:26:***缺少分隔符” - Makefile条件

时间:2015-09-12 20:04:00

标签: gcc makefile conditional-statements

我在编译GCC时遇到了一些麻烦。当我尝试编译它时,会出现此错误:

  

Makefile:26:***缺少分隔符。停止。

第26行指的是这种情况的第一行:

@if gcc
ifeq (,$(.VARIABLES)) # The variable .VARIABLES, new with 3.80, is never empty.
$(error GNU make version 3.80 or newer is required.)
endif
@endif gcc

我已经尝试在关键字之间插入TAB,但它不起作用。我尝试过但似乎唯一有用的就是将条件改为:

ifeq ($(gcc),)
ifeq (,$(.VARIABLES)) # The variable .VARIABLES, new with 3.80, is never empty.
$(error GNU make version 3.80 or newer is required.)
endif
endif

信息:

制作日志:http://pastebin.com/t5eNYJd5

创建日志(更改条件后):http://pastebin.com/HHjQKdDx

我的制作版本是:4.0。

GCC版本我正在尝试构建:5.2.0

我正在使用fedora 22。

我有一个解决方法。问题是Makefile包含数百个'@if',因此,我想知道为什么它使用'@if'如果它们不起作用?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我偶然发现了同样的问题。这个问题有点陈旧,看起来你找到了一个解决方法,但我会在这里记录我的发现以及未来的人。

背景

GCC目前要求您执行源外构建。根据显示的命令,一些文档和在线QA暗示这是有效的:

svn checkout svn://gcc.gnu.org/svn/gcc/trunk gcc;
gcc/configure <configure options>;
make -j 8 && make install;

这会将源目录嵌入到构建目录中,但我希望将其视为&#34; out-of-source。&#34;在没有-j 8的情况下运行仍然会产生问题。我是在RHEL6系统上使用GNU make 4.2完成的。我正在尝试构建GCC 8.0.0。

解决方案

我发现使源和构建目录相邻而不是创建builddir/sourcedir解决了这个问题。

其他信息

以下是来自GCC build instructions的相关摘录:

  

我们使用srcdir来引用GCC的顶级源目录;我们使用objdir来引用toplevel build / object目录。

     

...

     

如果您通过SVN获取了源代码,srcdir必须引用顶级gcc目录,即可以找到MAINTAINERS文件的目录,而不是它的gcc子目录,否则构建将失败。

     

...

     

首先,我们高度建议将GCC构建到与驻留在源树中的源不同的目录中。这就是我们一般建立GCC的方式;构建srcdir == objdir应该仍然可以工作,但没有得到广泛的测试;构建objdir是srcdir的子目录的构建不受支持。

根据您对&#34;源树&#34;的定义,这些说明可能会或可能不会构建我首次尝试的方式。它们应该更新以澄清这种情况。

关于Makefile不会运行的具体原因,该代码段无效make语法 - if不是make关键字,必须附上引用的变量像这样:$(varname)@只是阻止命令被回显。

相反,这应该是多行插值bashThis StackOverflow answer显示这是在Makefile中完成的,但它是作为配方的一部分完成的。我没有看到证据证明这是一个独立的实体。

在正确生成的Makefile中,您发布的部分不存在,并且所有插值的bash都出现在配方中。