Как выполнить некоторые команды глобально в файле Gnu Make - PullRequest
2 голосов
/ 30 января 2012

У меня есть Make-файл GNU, который собирает информацию о версии через переменные среды. Теперь я хочу сделать «что-то» глобально, прежде чем любая цель будет построена с использованием синтаксиса gnumake. В качестве псевдокода это означает:

  • когда указанный файл существует, удалите его
  • запустить массив строк и поместить их значение в указанный файл

Я пробовал это:

$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h))
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h))

это дает мне ошибку:

C:\temp\Makefile.mak:72: *** missing separator.  Stop.

где строка 72 - это строка $(shell .... Если я помещу это в define раздел:

define foobar
$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h))
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h))
endef

и назовите это для цели, она работает нормально:

$(products)$test.o : test.c $(commons)
$(call foobar)
$(cc) $(cflags_m) test.c -o$@ 

и делает то, что должно ... но как только я хочу вызвать его изнутри другого define, он снова выходит из строя с отсутствующим разделителем.

Что это значит и как я могу это исправить?

Компиляция происходит на платформе Win32 и не обязательно должна быть мультиплатформенной.

1 Ответ

6 голосов
/ 30 января 2012

Если один раз для вызова Make достаточно, вы можете поместить его в глобальное назначение.

# Ignore the value, calling for side effects
IGNORE := $(shell commands with side effects)

Я бы рекомендовал против этого хака, но я могу представить себе ситуации, когда он может пригодиться.

...