Ошибка синтаксиса файла - отсутствует разделитель

Я получаю ошибку make file в строке 139 ниже по адресу $(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))

3 ответа

У меня возникла та же проблема при попытке настроить ffmpeg для make, В текущей версии главной ветки ffmpeg проблема для common.mak возникает в строке 160.

Чтобы решить эту проблему, я попытался следующие шаги:

  • git config core.autocrlf false
  • удалить все *.mak файлы
  • git reset --hard

Эти шаги не полностью решили мою проблему. Основываясь на подсказках относительно символов TAB (\ t), я изменил строку 160 с

оригинальный файл из git repo

в

измененный файл

Обратите внимание на стрелку (указывающую на табуляцию) в строке 160 между $( а также eval $(RULES)), Этот TAB решил проблему для меня. Я должен был сделать это изменение в дальнейшем *.mak файл. Там было то же сообщение об ошибке для другого файла. Кстати, Notepad ++ - отличный инструмент для вставки табуляции, а также для изменения концов строк.

Поскольку ffmpeg требует времени для сборки, я решил поделиться своим решением...

У меня была точно такая же проблема - при проверке FFMPEG в Windows, но с использованием git.

После запуска configure и при попытке бежать make Я получил ту же строку:

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

Как подсказывает @MadScientist, Makefiles особенно суетливы не только в отношении табуляции (\t), но и в выборе конца строки (LF или CRLF).

Это до GNU make команда, которая должна их запустить - которая, кажется, уважает только LF.

Так что версия *nix, такая как эта, будет работать:

И вот тот же файл под Windows, который не будет работать:

(Еще одна дешевая вещь - это то, что он также больше с двойными байтами в конце каждой строки!)

Суть в том, что вам, возможно, придется переформатировать файлы - возможно, с помощью dos2unix команда.

Это все равно будет иметь место, даже если не клонировать напрямую из git, а вместо этого загрузить tar/zip, который сам был создан из клона git. Конец строк будет сохранен.

Или, если вы используете Git (прямо как я), вы должны указать ему, как обрабатывать символы конца строки. Когда это проверяет / клонирует и когда это фиксирует.

Вот полное описание того, что это значит здесь: http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/

И как это можно настроить (для старой версии git) через [core].eol установка.

Это также очевидно в Windows, когда при запуске установщика (например, http://git-scm.com/downloads) вы получаете такой диалог:

Выбор последней опции "оформить как есть, зафиксировать как есть" исправил это для меня. Возможно, не самый принципиальный способ, но он заставил сохранить окончания LF.

В make-файлах строки рецепта ДОЛЖНЫ начинаться с символа TAB (TAB должен быть первым символом в строке). Вы не можете иметь один или несколько пробелов в начале строки, с или без следующей TAB.

Я не знаю, что вы имеете в виду: я пытался удалить вкладку одним пробелом, \t ничего не работает; это предложение не имеет смысла для меня. Надеемся, что приведенный выше параграф поможет вам понять, что вам нужно сделать.

Убедитесь, что вы используете текстовый редактор (а не текстовый процессор) и что ваш редактор не пытается "услужливо" изменить форматирование в ваших файлах.

В общем, если у вас нет опыта работы с make-файлами, я не рекомендую использовать eval Функция, которая требует довольно четкого понимания правил, использует для расширения переменные и функции для правильного использования. Я не совсем уверен, почему вы используете eval в контексте RULES переменная, в любом случае; почему бы просто не написать правило напрямую без eval?

Другие вопросы по тегам