使文件语法错误 - 缺少分隔符

时间:2013-07-26 18:32:50

标签: makefile

我在$(eval $(RULES))下面第139行收到了make file error 我对make文件语法缺乏经验。 这是我输入make命令时给出的错误。

common.mak:139: *** missing separator.  Stop.

我试图通过单个空格删除标签,\ t无效。 你知道原因是什么吗?

由于

#
# common bits used by all libraries
#

# first so "all" becomes default target
all: all-yes

ifndef SUBDIR

ifndef V
Q      = @
ECHO   = printf "$(1)\t%s\n" $(2)
BRIEF  = CC CXX HOSTCC HOSTLD AS YASM AR LD STRIP CP
SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM

MSG    = $@
M      = @$(call ECHO,$(TAG),$@);
$(foreach VAR,$(BRIEF), \
    $(eval override $(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR))))
$(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR))))
$(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_DIR)/%=%)); $(INSTALL))
endif

ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample

# NASM requires -I path terminated with /
IFLAGS     := -I. -I$(SRC_PATH)/
CPPFLAGS   := $(IFLAGS) $(CPPFLAGS)
CFLAGS     += $(ECFLAGS)
CCFLAGS     = $(CPPFLAGS) $(CFLAGS)
ASFLAGS    := $(CPPFLAGS) $(ASFLAGS)
CXXFLAGS   += $(CPPFLAGS) $(CFLAGS)
YASMFLAGS  += $(IFLAGS:%=%/) -Pconfig.asm

HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)

define COMPILE
       $(call $(1)DEP,$(1))
       $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
endef

COMPILE_C = $(call COMPILE,CC)
COMPILE_CXX = $(call COMPILE,CXX)
COMPILE_S = $(call COMPILE,AS)

%.o: %.c
    $(COMPILE_C)

%.o: %.cpp
    $(COMPILE_CXX)

%.s: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -S -o $@ $<

%.o: %.S
    $(COMPILE_S)

%.i: %.c
    $(CC) $(CCFLAGS) $(CC_E) $<

%.h.c:
    $(Q)echo '#include "$*.h"' >$@

%.ver: %.v
    $(Q)sed 's/$$MAJOR/$($(basename $(@F))_VERSION_MAJOR)/' $^ > $@

%.c %.h: TAG = GEN

# Dummy rule to stop make trying to rebuild removed or renamed headers
%.h:
    @:

# Disable suffix rules.  Most of the builtin rules are suffix rules,
# so this saves some time on slow systems.
.SUFFIXES:

# Do not delete intermediate files from chains of implicit rules
$(OBJS):
endif

include $(SRC_PATH)/arch.mak

OBJS      += $(OBJS-yes)
FFLIBS    := $(FFLIBS-yes) $(FFLIBS)
TESTPROGS += $(TESTPROGS-yes)

LDLIBS       = $(FFLIBS:%=%$(BUILDSUF))
FFEXTRALIBS := $(LDLIBS:%=$(LD_LIB)) $(EXTRALIBS)

EXAMPLES  := $(EXAMPLES:%=$(SUBDIR)%-example$(EXESUF))
OBJS      := $(sort $(OBJS:%=$(SUBDIR)%))
TESTOBJS  := $(TESTOBJS:%=$(SUBDIR)%) $(TESTPROGS:%=$(SUBDIR)%-test.o)
TESTPROGS := $(TESTPROGS:%=$(SUBDIR)%-test$(EXESUF))
HOSTOBJS  := $(HOSTPROGS:%=$(SUBDIR)%.o)
HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF))
TOOLS     += $(TOOLS-yes)
TOOLOBJS  := $(TOOLS:%=tools/%.o)
TOOLS     := $(TOOLS:%=tools/%$(EXESUF))
HEADERS   += $(HEADERS-yes)

DEP_LIBS := $(foreach NAME,$(FFLIBS),lib$(NAME)/$($(CONFIG_SHARED:yes=S)LIBNAME))

SRC_DIR    := $(SRC_PATH)/lib$(NAME)
ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)/$(ARCH)/*.h))
SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-)
SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%)
HOBJS        = $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o))
checkheaders: $(HOBJS)
.SECONDARY:   $(HOBJS:.o=.c)

alltools: $(TOOLS)

$(HOSTOBJS): %.o: %.c
    $(call COMPILE,HOSTCC)

$(HOSTPROGS): %$(HOSTEXESUF): %.o
    $(HOSTLD) $(HOSTLDFLAGS) $(HOSTLD_O) $< $(HOSTLIBS)

$(OBJS):     | $(sort $(dir $(OBJS)))
$(HOBJS):    | $(sort $(dir $(HOBJS)))
$(HOSTOBJS): | $(sort $(dir $(HOSTOBJS)))
$(TESTOBJS): | $(sort $(dir $(TESTOBJS)))
$(TOOLOBJS): | tools

OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(TESTOBJS))

CLEANSUFFIXES     = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda
DISTCLEANSUFFIXES = *.pc
LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a

define RULES
clean::
    $(RM) $(OBJS) $(OBJS:.o=.d)
    $(RM) $(HOSTPROGS)
    $(RM) $(TOOLS)
endef

$(eval $(RULES))

-include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d))

3 个答案:

答案 0 :(得分:5)

我有同样的问题 - 在Windows 上检查FFMPEG但是使用git

运行configure并尝试运行make后,我得到了同样的话:

  common.mak:139: *** missing separator.  Stop.

正如@MadScientist所建议的那样 - Makefiles尤其挑剔tab(\ t)以及行结尾的选择( LF CRLF )。 / p>

这取决于GNU make命令,它必须运行它们 - 这似乎只是尊重 LF

所以* nix版本,例如这个,将起作用:

enter image description here

这是Windows下的同一个文件,不起作用:

enter image description here

(另一个赠品是它也更大,每行末尾的字节加倍!)

底线(可以这么说)是你可能需要重新格式化你的文件 - 也许是使用dos2unix命令。

即使不直接从git克隆,情况仍然如此 - 而是下载一个本身是从git clone创建的tar / zip。行的结尾将被保留。

或者,如果使用Git(就像我一样),你必须告诉它如何处理行尾字符。当它检出/克隆以及何时提交。

这里有完整的描述:http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/

如何通过[core].eol设置配置(对于旧版本的git)。

这在Windows上也很明显,如果你运行安装程序(例如http://git-scm.com/downloads),你会得到如下对话:

enter image description here

选择“按原样结帐,按原样提交”的最终选项为我修复了它。不是最原则的方式,但它强制保留LF结尾。

答案 1 :(得分:5)

尝试为make配置ffmpeg时遇到了同样的问题。 使用当前版本的ffmpeg主分支时,第160行的 common.mak 会出现问题。

要解决此问题,我尝试了以下步骤:

  • git config core.autocrlf false
  • 删除所有*.mak个文件
  • git reset --hard

单独这些步骤并未完全解决我的问题。根据有关TAB( \ t )字符的提示,我改变了第160行

original file from git repo

altered file

请注意$(eval $(RULES))之间第160行的箭头(表示TAB)。 这个TAB为我解决了这个问题。我必须将此更改更改为另一个*.mak文件。另一个文件有相同的错误消息。顺便说一句, Notepad ++ 是一个很好的工具,可以插入TAB以及更改行结尾。

由于ffmpeg需要一段时间才能建造,我决定分享我的解决方案......

答案 2 :(得分:1)

在makefile中,配方行必须以TAB字符开头(TAB必须是该行的第一个字符)。您不能在该行的开头有一个或多个空格,无论是否有以下TAB。

我不知道你的意思是:我试图用单个空格删除标签,\ t无效;那句话对我没有意义。希望上面的段落可以帮助您了解您需要做什么。

确保您使用的是文本编辑器(不是文字处理程序),并且您的编辑器不会尝试“帮助”更改文件中的格式。

一般情况下,除非您对makefile更有经验,否则我不建议使用eval函数,这需要非常清楚地理解规则,以便扩展变量和函数以正确使用。我不确定你为什么在eval变量的上下文中使用RULES,无论如何;为什么不直接编写规则而不用eval