0

我在下面的第 139 行遇到了 make file 错误,$(eval $(RULES)) 因为我对 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))
4

3 回答 3

6

我在尝试配置 ffmpeg 时遇到了同样的问题make。对于 ffmpeg 的 master 分支的当前版本,common.mak的问题出现在第 160 行。

为了解决这个问题,我尝试了以下步骤:

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

仅这些步骤并不能完全解决我的问题。根据关于 TAB ( \t ) 字符的提示,我将第 160 行从

来自 git repo 的原始文件

修改过的文件

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

由于 ffmpeg 需要一段时间来构建我决定分享我的解决方案......

于 2015-05-21T14:08:32.657 回答
5

我遇到了同样的问题 - 当也在 Windows 上检查 FFMPEG但使用 git时。

运行后configure和尝试运行时,make我得到了同一行:

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

正如@MadScientist 所建议的那样——Makefile 不仅对制表符(\t)而且对行尾的选择(LFCRLF )都特别挑剔)都特别挑剔。

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

因此,像这样的 *nix 版本将起作用:

在此处输入图像描述

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

在此处输入图像描述

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

底线(可以这么说)是您可能必须重新格式化您的文件 - 也许通过使用dos2unix命令。

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

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

这里有一个关于这意味着什么的完整描述: //adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/

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

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

在此处输入图像描述

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

于 2013-10-02T16:10:33.973 回答
1

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

我不知道你的意思:我试图用单个空格删除选项卡,\t 没有任何效果;那句话对我没有意义。希望以上段落将帮助您了解您需要做什么。

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

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

于 2013-07-26T19:12:53.773 回答