我在$(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))
答案 0 :(得分:5)
我有同样的问题 - 在Windows 上检查FFMPEG但是使用git 。
运行configure
并尝试运行make
后,我得到了同样的话:
common.mak:139: *** missing separator. Stop.
正如@MadScientist所建议的那样 - Makefiles尤其挑剔tab(\ t)以及行结尾的选择( LF 与 CRLF )。 / p>
这取决于GNU make
命令,它必须运行它们 - 这似乎只是尊重 LF 。
所以* nix版本,例如这个,将起作用:
这是Windows下的同一个文件,不起作用:
(另一个赠品是它也更大,每行末尾的字节加倍!)
底线(可以这么说)是你可能需要重新格式化你的文件 - 也许是使用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),你会得到如下对话:
选择“按原样结帐,按原样提交”的最终选项为我修复了它。不是最原则的方式,但它强制保留LF结尾。
答案 1 :(得分:5)
尝试为make
配置ffmpeg时遇到了同样的问题。
使用当前版本的ffmpeg主分支时,第160行的 common.mak 会出现问题。
要解决此问题,我尝试了以下步骤:
git config core.autocrlf false
*.mak
个文件git reset --hard
单独这些步骤并未完全解决我的问题。根据有关TAB( \ t )字符的提示,我改变了第160行
以强>
请注意$(
和eval $(RULES))
之间第160行的箭头(表示TAB)。
这个TAB为我解决了这个问题。我必须将此更改更改为另一个*.mak
文件。另一个文件有相同的错误消息。顺便说一句, Notepad ++ 是一个很好的工具,可以插入TAB以及更改行结尾。
由于ffmpeg需要一段时间才能建造,我决定分享我的解决方案......
答案 2 :(得分:1)
在makefile中,配方行必须以TAB字符开头(TAB必须是该行的第一个字符)。您不能在该行的开头有一个或多个空格,无论是否有以下TAB。
我不知道你的意思是:我试图用单个空格删除标签,\ t无效;那句话对我没有意义。希望上面的段落可以帮助您了解您需要做什么。
确保您使用的是文本编辑器(不是文字处理程序),并且您的编辑器不会尝试“帮助”更改文件中的格式。
一般情况下,除非您对makefile更有经验,否则我不建议使用eval
函数,这需要非常清楚地理解规则,以便扩展变量和函数以正确使用。我不确定你为什么在eval
变量的上下文中使用RULES
,无论如何;为什么不直接编写规则而不用eval
?