Makefile 生成文件语法错误-缺少分隔符
我在下面第139行的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
$(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)
这取决于必须运行它们的GNUmake
命令,它似乎只尊重LF
所以像这样的*nix版本可以工作:
下面是Windows下的同一个文件,它不起作用:
(另一个好处是,它也更大,每行末尾的字节数增加了一倍!)
底线(可以这么说)是您可能必须重新格式化您的文件-可能需要使用dos2unix
命令
这仍然是