Makefile 生成文件语法错误-缺少分隔符

Makefile 生成文件语法错误-缺少分隔符,makefile,Makefile,我在下面第139行的$(eval$(RULES)) 我在生成文件语法方面真的没有经验。 这是我输入make命令时它给我的错误 common.mak:139: *** missing separator. Stop. 我试图用一个空格删除选项卡,\t但没有任何效果。 你知道原因是什么吗 谢谢 # # common bits used by all libraries # # first so "all" becomes default target all: all-yes ifndef

我在下面第139行的
$(eval$(RULES))
我在生成文件语法方面真的没有经验。 这是我输入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))
#
#所有库使用的公共位
#
#首先,“全部”成为默认目标
全部:全部是的
ifndef细分
ifndef V
Q=@
ECHO=printf“$(1)\t%s\n“$(2)
简略=CC CXX HOSTCC HOSTLD AS YASM AR LD带CP
SILENT=DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM
味精=$@
M=@$(呼叫回音,$(标记),$@);
$(foreach VAR,$(简介)\
$(eval override$(VAR)=@$$(调用ECHO,$(VAR),$$(MSG));$($(VAR)))
$(foreach变量,$(无提示),$(eval override$(VAR)=@$($(VAR)))
$(eval INSTALL=@$(调用ECHO,INSTALL,$$(^:$(SRC_DIR)/%=%);$(INSTALL))
恩迪夫
ALLFFLIBS=avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample
#NASM要求-I路径以/
IFLAGS:=-I.-I$(SRC\u路径)/
CPPFLAGS:=$(IFLAGS)$(CPPFLAGS)
CFLAGS+=$(ECFLAGS)
CCFLAGS=$(CPPFLAGS)$(CFLAGS)
ASFLAGS:=$(CPPFLAGS)$(ASFLAGS)
CXXFLAGS+=$(CPPFLAGS)$(CFLAGS)
YASMFLAGS+=$(IFLAGS:%=%/)-Pconfig.asm
HOSTCCFLAGS=$(IFLAGS)$(HOSTCPPFLAGS)$(HOSTCFLAGS)
LDFLAGS:=$(所有FFLIBS:%=$(LD_路径)lib%)$(LDFLAGS)
定义编译
$(致电$(1)部门,$(1))
$($(1))$($(1)标志)$($(1)标志)$($(1)C)$($(1)O)$<
恩德夫
COMPILE_C=$(调用COMPILE,CC)
COMPILE_CXX=$(调用COMPILE,CXX)
COMPILE_S=$(调用COMPILE,AS)
%.o:%.c
$(编译C)
%.o:%.cpp
$(编译\u CXX)
%.s:%
$(CC)$(CPPFLAGS)$(CFLAGS)-S-o$@$<
%.o:%.S
$(编译)
%.i:%.c
$(CC)$(CCFLAGS)$(CC_E)$<
%.h.c.:
$(Q)echo'#包括“$*.h”>$@
%.版本:%
$(Q)sed的/$$MAJOR/$($(basename$(@F))_VERSION_MAJOR)/'$^>$@
%.c%.h:TAG=GEN
#用于停止尝试重新生成已删除或重命名的标题的虚拟规则
%.h:
@:
#禁用后缀规则。大多数内置规则都是后缀规则,
#因此,这在速度较慢的系统上节省了一些时间。
.后缀:
#不要从隐式规则链中删除中间文件
$(OBJS):
恩迪夫
包括$(SRC_PATH)/arch.mak
OBJS+=$(OBJS是)
FFLIBS:=$(FFLIBS是)$(FFLIBS)
TESTPROGS+=$(TESTPROGS是)
LDLIBS=$(FFLIBS:%=%%$(BUILDSUF))
FFEXTRALIBS:=$(LDLIBS:%=$(LD_LIB))$(EXTRALIBS)
示例:=$(示例:%=$(细分利率)%-示例$(EXESSUF))
OBJS:=$(排序$(OBJS:%=$(细分利率)%)
TESTOBJS:=$(TESTOBJS:%=$(SUBDIR)%)$(TESTPROGS:%=$(SUBDIR)%-test.o)
TESTPROGS:=$(TESTPROGS:%=$(细分利率)%-测试$(EXESUF))
HOSTOBJS:=$(HOSTPROGS:%=$(子目录)%.o)
HOSTPROGS:=$(HOSTPROGS:%=$(子目录)%$(hostxesuf))
工具+=$(工具是)
TOOLOBJS:=$(工具:%=TOOLS/%.o)
工具:=$(工具:%=TOOLS/%$(EXESUF))
页眉+=$(页眉是)
DEP_LIBS:=$(foreach NAME,$(FFLIBS),lib$(NAME)/$($(CONFIG_SHARED:yes=S)LIBNAME))
SRC_DIR:=$(SRC_路径)/lib$(名称)
AllHeader:=$(subst$(SRC_DIR)/,$(SUBDIR),$(通配符$(SRC_DIR)/*.h$(SRC_DIR)/$(ARCH)/*.h))
SKIPHEADERS+=$(拱形标题:%=$(拱形)/%)$(SKIPHEADERS-)
SkipHeader:=$(SkipHeader:%=$(细分利率)%)
HOBJS=$(过滤掉$(SKIPHEADERS.h=.h.o),$(所有头文件:.h=.h.o))
checkheaders:$(HOBJS)
.SECONDARY:$(HOBJS:.o=.c)
所有工具:$(工具)
$(HOSTOBJS):%.o:%.c
$(调用编译,HOSTCC)
$(HOSTPROGS):%%$(hostxesuf):%.o
$(HOSTLD)$(HOSTLDFLAGS)$(HOSTLD_O)$<$(HOSTLIBS)
$(OBJS):|$(排序$(目录$(OBJS)))
$(HOBJS):|$(sort$(dir$(HOBJS)))
$(HOSTOBJS):|$(sort$(dir$(HOSTOBJS)))
$(TESTOBJS):|$(sort$(dir$(TESTOBJS)))
$(TOOLOBJS):|工具
OBJDIRS:=$(OBJDIRS)$(dir$(OBJS)$(HOBJS)$(HOSTOBJS)$(TESTOBJS))
cleansaffixes=*.d*.o*~*.h.c*.map*.ver*.ho*.gcno*.gcda
DistCleanSaffixes=*.pc
libsuffix=*.a*.lib*.so*.so.*.dylib*.dll*.def*.dll.a
定义规则
清洁::
$(RM)$(OBJS)$(OBJS:.o=.d)
$(RM)$(主机程序)
$(RM)$(工具)
恩德夫
$(评估$(规则))
-包括$(通配符$(OBJS:.o=.d)$(HOSTOBJS:.o=.d)$(TESTOBJS:.o=.d)$(HOBJS:.o=.d))

在makefiles中,配方行必须以制表符开头(制表符必须是行中的第一个字符)。行的开头不能有一个或多个空格,包括或不包括以下选项卡

我不知道你的意思是什么:我试图用一个空格来删除标签,\n但没有任何效果;那句话对我来说毫无意义。希望上面的段落能帮助你理解你需要做什么

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


一般来说,除非您对makefile有更丰富的经验,否则我不建议您使用
eval
函数,该函数需要非常清楚地了解用于扩展变量和函数以正确使用的规则。我不太清楚为什么在
规则
变量的上下文中使用
eval
;为什么不直接编写规则而不使用
eval

我也遇到了同样的问题——在Windows上签出FFMPEG时使用git

在运行
configure
和尝试运行
make
之后,我得到了相同的结果:

  common.mak:139: *** missing separator.  Stop.
正如@MadScientist所建议的,Makefiles不仅对制表符(\t)特别挑剔,而且对行尾的选择也特别挑剔(LFvs.CRLF

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

所以像这样的*nix版本可以工作:

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

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

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

这仍然是