2015-04-28 2 views
1
CFormat: 

define Format_File := 
    @echo Formatting 
ifneq ("$(wildcard $(1))","") 
    @echo if1 

    # The default extensions for intermediate files are not used, 
    # to avoid collisions with backup files open in the editor, etc. 
    # Save the original source file with an '_X' suffix on the extension. 
ifneq("$(wildcard $(1)_X)","") 
    @echo if2 
else 
    @echo else2 
endif 
    @ren $(1) $(1)_X 
    # C-Comment is invoked separately, due to pathing limitations 
    # The redirection is a means to suppress blabbering. 
    @echo Formatting $(1) . . . 
    $(CFORMAT_PATH)\Cformat -h$(CFORMAT_PATH) $(1)_X -o$[Base, $(1)].tmp -ino >temp.tmp; 
    $(CFORMAT_PATH)\Ccomment -h$(CFORMAT_PATH) $[Base, $(1)].tmp -o$(1) >temp.tmp; 
else 
    @echo else1 
endif 
endef 


FormatAll: CFormat 
$(foreach loopFile,$(ALL_S_SOURCES),$(eval $(call Format_File,$(loopFile)))) 


.PHONY: FormatAll 

Когда я заменил eval информацией, он правильно распечатал вызов функции, но каждый раз, когда я пытаюсь на самом деле обрисовать форматтер, он дает мне ошибку в заголовке ,

Редактировать: Этот вопрос страдал от ошибок синтаксиса всюду, но, следуя советам @MadScientist, я в конечном итоге смог заставить его работать с использованием циклов оболочки.

+0

Что такое 'ALL_S_SOURCES'? Что еще в этом make-файле? Какая версия make? С этим точным фрагментом я не делаю этой ошибки с несколькими разными версиями make. (Как в стороне, что такое '$ [Base, $ (1)]. Tmp' должен был делать в этой строке рецепта для вас?) –

+0

И если я заполню' ALL_S_SOURCES' с именем файла (который существует), я получаю ошибка отсутствия разделителя. Этот параметр выглядит так, будто он хочет выводить строки рецептов, но '$ (eval)' не генерирует никакого вывода. Также присваивание определения с помощью:: = вызывает его сразу ** **, что означает, что все ваши '$ 1' ссылки будут пустыми. Короче говоря, это даже не близко к тому, чтобы работать как есть. –

+0

Даже если я заменил весь define одним выражением echo, я все равно не могу его эхо один раз для каждого файла в списке. – Dakota

ответ

1

Самый короткий ответ, вы не можете сделать это таким образом. Одна функция, такая как $(foreach ...), или одно расширение переменной, может никогда развернуть до нескольких логических строк в make-файле. Это не так, как работает парсер.

Кроме того, $(eval ...) может использоваться для построения полного правила, но вы не можете использовать его для построения только части правила: перед тем, как make начнет анализировать выходные данные оценки, он «закроет» любое правило, которое в настоящее время (так же, как вы не можете ввести введение правила в один файл и рецепт в другой файл и использовать include, чтобы включить рецепт).

Вы действительно не объяснили, почему вы хотите так поступать. Один простой ответ заключается в использовании петель оболочки, а не Makefile петли, как это:

FormatAll: CFormat 
     @for f in $(ALL_S_SOURCES); do \ 
      echo Formatting; \ 
      if [ -f $$f ]; then \ 
       echo if1; \ 
       if [ -f $${f}_X ]; then \ 
        echo if2; \ 
       else \ 
        echo else2; \ 
       fi; \ 
       ren $$f $${f}_X; \ 
       echo Formatting $$f . . .; \ 
       $(CFORMAT_PATH)\Cformat -h$(CFORMAT_PATH) $F{f}_X -o$[Base, $$f].tmp -ino >temp.tmp; \ 
       $(CFORMAT_PATH)\Ccomment -h$(CFORMAT_PATH) $[Base, $$f].tmp -o$$f >temp.tmp; \ 
      else \ 
       echo else1; \ 
      fi; \ 
     done 

Я согласен с Этан, что синтаксис $[Base ...] странно и, конечно, это не так.

Если вы хотите получить более подробную информацию о eval и отладке, вы можете проверить this post и более ранние из серии.

0

Сообщение об ошибке довольно ясно: цикл foreach выплевывает команды рецептов перед/за пределами целевого определения рецепта.

Вы можете попробовать что-то вроде:

all: 
    $(foreach loopFile,$(ALL_S_SOURCES),$(eval $(call Format_File,$(loopFile)))) 

.PHONY: all 
+0

Я получаю ту же ошибку с добавленной в нижней части, я скорректировал код выше, чтобы отразить изменение. – Dakota

Смежные вопросы